  				body = mixed;
  			}
 diff --git a/MimeKit/MimePart.cs b/MimeKit/MimePart.cs
-index e1b5de0..bdb9fca 100644
+index 69eca986..56e87984 100644
 --- a/MimeKit/MimePart.cs
 +++ b/MimeKit/MimePart.cs
-@@ -100,36 +100,31 @@ namespace MimeKit {
- 			if (args == null)
- 				throw new ArgumentNullException ("args");
- 
--			IContentObject content = null;
--
- 			foreach (object obj in args) {
- 				if (obj == null || TryInit (obj))
- 					continue;
- 
- 				var co = obj as IContentObject;
- 				if (co != null) {
--					if (content != null)
-+					if (ContentObject != null)
- 						throw new ArgumentException ("ContentObject should not be specified more than once.");
- 
--					content = co;
-+					ContentObject = co;
- 					continue;
- 				}
- 
- 				var stream = obj as Stream;
- 				if (stream != null) {
--					if (content != null)
-+					if (ContentObject != null)
- 						throw new ArgumentException ("Stream (used as content) should not be specified more than once.");
- 
- 					// Use default as specified by ContentObject ctor when building a new MimePart.
--					content = new ContentObject (stream);
-+					ContentObject = new ContentObject (stream);
- 					continue;
- 				}
- 
- 				throw new ArgumentException ("Unknown initialization parameter: " + obj.GetType ());
- 			}
--
--			if (content != null)
--				ContentObject = content;
- 		}
- 
- 		/// <summary>
-@@ -194,6 +189,12 @@ namespace MimeKit {
+@@ -194,6 +194,11 @@ namespace MimeKit {
  		{
  		}
  
 +		void CheckDisposed ()
 +		{
-+			if (IsDisposed)
-+				throw new ObjectDisposedException ("MimePart");
++			CheckDisposed (nameof (MimePart));
 +		}
 +
  		/// <summary>
- 		/// Gets or sets the duration of the content if available.
+ 		/// Gets or sets the description of the content if available.
  		/// </summary>
-@@ -336,11 +337,16 @@ namespace MimeKit {
+@@ -204,8 +209,13 @@ namespace MimeKit {
+ 		/// <exception cref="System.ArgumentOutOfRangeException">
+ 		/// <paramref name="value"/> is negative.
+ 		/// </exception>
++		/// <exception cref="System.ObjectDisposedException">
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		public string ContentDescription {
+ 			get {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentDescription) == 0) {
+ 					if (Headers.TryGetHeader (HeaderId.ContentDescription, out var header))
+ 						description = header.Value.Trim ();
+@@ -216,6 +226,8 @@ namespace MimeKit {
+ 				return description;
+ 			}
+ 			set {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentDescription) != 0 && description == value)
+ 					return;
+ 
+@@ -242,8 +254,13 @@ namespace MimeKit {
+ 		/// <exception cref="System.ArgumentOutOfRangeException">
+ 		/// <paramref name="value"/> is negative.
+ 		/// </exception>
++		/// <exception cref="System.ObjectDisposedException">
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		public int? ContentDuration {
+ 			get {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentDuration) == 0) {
+ 					if (Headers.TryGetHeader (HeaderId.ContentDuration, out var header)) {
+ 						if (int.TryParse (header.Value.Trim (), out var value))
+@@ -256,6 +273,8 @@ namespace MimeKit {
+ 				return duration;
+ 			}
+ 			set {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentDuration) != 0 && duration == value)
+ 					return;
+ 
+@@ -283,8 +302,13 @@ namespace MimeKit {
+ 		/// <para>For more information, see <a href="https://tools.ietf.org/html/rfc1864">rfc1864</a>.</para>
+ 		/// </remarks>
+ 		/// <value>The md5sum of the content.</value>
++		/// <exception cref="System.ObjectDisposedException">
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		public string ContentMd5 {
+ 			get {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentMd5) == 0) {
+ 					if (Headers.TryGetHeader (HeaderId.ContentMd5, out var header))
+ 						md5sum = header.Value.Trim ();
+@@ -295,6 +319,8 @@ namespace MimeKit {
+ 				return md5sum;
+ 			}
+ 			set {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentMd5) != 0 && md5sum == value)
+ 					return;
+ 
+@@ -326,8 +352,13 @@ namespace MimeKit {
+ 		/// <exception cref="System.ArgumentOutOfRangeException">
+ 		/// <paramref name="value"/> is not a valid content encoding.
+ 		/// </exception>
++		/// <exception cref="System.ObjectDisposedException">
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		public ContentEncoding ContentTransferEncoding {
+ 			get {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentTransferEncoding) == 0) {
+ 					if (Headers.TryGetHeader (HeaderId.ContentTransferEncoding, out var header))
+ 						MimeUtils.TryParse (header.Value, out encoding);
+@@ -338,6 +369,8 @@ namespace MimeKit {
+ 				return encoding;
+ 			}
+ 			set {
++				CheckDisposed ();
++
+ 				if ((LazyLoaded & LazyLoadedFields.ContentTransferEncoding) != 0 && encoding == value)
+ 					return;
+ 
+@@ -373,6 +406,9 @@ namespace MimeKit {
+ 		/// <code language="c#" source="Examples\AttachmentExamples.cs" region="SaveAttachments" />
+ 		/// </example>
+ 		/// <value>The name of the file.</value>
++		/// <exception cref="System.ObjectDisposedException">
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		public string FileName {
+ 			get {
+ 				string filename = null;
+@@ -427,11 +463,16 @@ namespace MimeKit {
  		/// <exception cref="System.ArgumentNullException">
  		/// <paramref name="visitor"/> is <c>null</c>.
  		/// </exception>
 +		/// <exception cref="System.ObjectDisposedException">
-+		/// The object has been disposed.
++		/// The <see cref="MimePart"/> has been disposed.
 +		/// </exception>
  		public override void Accept (MimeVisitor visitor)
  		{
  			if (visitor == null)
- 				throw new ArgumentNullException ("visitor");
+ 				throw new ArgumentNullException (nameof (visitor));
  
 +			CheckDisposed ();
 +
  			visitor.VisitMimePart (this);
  		}
  
-@@ -356,6 +362,9 @@ namespace MimeKit {
+@@ -447,6 +488,9 @@ namespace MimeKit {
  		/// <exception cref="System.ArgumentOutOfRangeException">
  		/// <paramref name="constraint"/> is not a valid value.
  		/// </exception>
 +		/// <exception cref="System.ObjectDisposedException">
-+		/// The object has been disposed.
-+		/// </exception>
- 		/// <exception cref="System.OperationCanceledException">
- 		/// The operation was canceled via the cancellation token.
- 		/// </exception>
-@@ -382,6 +391,9 @@ namespace MimeKit {
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		/// <exception cref="System.OperationCanceledException">
+ 		/// The operation was canceled via the cancellation token.
+ 		/// </exception>
+@@ -473,6 +517,9 @@ namespace MimeKit {
  		/// <para>-or-</para>
  		/// <para><paramref name="constraint"/> is not a valid value.</para>
  		/// </exception>
 +		/// <exception cref="System.ObjectDisposedException">
-+		/// The object has been disposed.
-+		/// </exception>
- 		/// <exception cref="System.OperationCanceledException">
- 		/// The operation was canceled via the cancellation token.
- 		/// </exception>
-@@ -390,6 +402,8 @@ namespace MimeKit {
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		/// <exception cref="System.OperationCanceledException">
+ 		/// The operation was canceled via the cancellation token.
+ 		/// </exception>
+@@ -481,6 +528,8 @@ namespace MimeKit {
  		/// </exception>
  		public ContentEncoding GetBestEncoding (EncodingConstraint constraint, int maxLineLength, CancellationToken cancellationToken = default (CancellationToken))
  		{
 +			CheckDisposed ();
 +
- 			if (ContentObject == null)
- 				return ContentEncoding.SevenBit;
- 
-@@ -417,8 +431,13 @@ namespace MimeKit {
+ 			if (ContentType.IsMimeType ("text", "*") || ContentType.IsMimeType ("message", "*")) {
+ 				if (Content == null)
+ 					return ContentEncoding.SevenBit;
+@@ -509,11 +558,16 @@ namespace MimeKit {
+ 		/// format and then base64-encodes the result.
+ 		/// </remarks>
+ 		/// <returns>The md5sum of the content.</returns>
++		/// <exception cref="System.ObjectDisposedException">
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
  		/// <exception cref="System.InvalidOperationException">
- 		/// The <see cref="ContentObject"/> is <c>null</c>.
- 		/// </exception>
-+		/// <exception cref="System.ObjectDisposedException">
-+		/// The object has been disposed.
-+		/// </exception>
+ 		/// The <see cref="Content"/> is <c>null</c>.
+ 		/// </exception>
  		public string ComputeContentMd5 ()
  		{
 +			CheckDisposed ();
 +
- 			if (ContentObject == null)
+ 			if (Content == null)
  				throw new InvalidOperationException ("Cannot compute Md5 checksum without a ContentObject.");
  
-@@ -463,8 +482,13 @@ namespace MimeKit {
+@@ -545,8 +599,13 @@ namespace MimeKit {
  		/// the values match.
  		/// </remarks>
  		/// <returns><c>true</c>, if content MD5 checksum was verified, <c>false</c> otherwise.</returns>
 +		/// <exception cref="System.ObjectDisposedException">
-+		/// The object has been disposed.
++		/// The <see cref="MimePart"/> has been disposed.
 +		/// </exception>
  		public bool VerifyContentMd5 ()
  		{
 +			CheckDisposed ();
 +
- 			if (IsNullOrWhiteSpace (md5sum) || ContentObject == null)
+ 			if (string.IsNullOrWhiteSpace (md5sum) || Content == null)
  				return false;
  
-@@ -496,11 +520,16 @@ namespace MimeKit {
+@@ -566,11 +625,16 @@ namespace MimeKit {
  		/// <para>-or-</para>
  		/// <para><paramref name="constraint"/> is not a valid value.</para>
  		/// </exception>
 +		/// <exception cref="System.ObjectDisposedException">
-+		/// The object has been disposed.
++		/// The <see cref="MimePart"/> has been disposed.
 +		/// </exception>
  		public override void Prepare (EncodingConstraint constraint, int maxLineLength = 78)
  		{
- 			if (maxLineLength < 72 || maxLineLength > 998)
- 				throw new ArgumentOutOfRangeException ("maxLineLength");
+ 			if (maxLineLength < FormatOptions.MinimumLineLength || maxLineLength > FormatOptions.MaximumLineLength)
+ 				throw new ArgumentOutOfRangeException (nameof (maxLineLength));
  
 +			CheckDisposed ();
 +
  			switch (ContentTransferEncoding) {
  			case ContentEncoding.QuotedPrintable:
  			case ContentEncoding.UUEncode:
-@@ -537,6 +566,9 @@ namespace MimeKit {
+@@ -608,6 +672,9 @@ namespace MimeKit {
  		/// <para>-or-</para>
  		/// <para><paramref name="stream"/> is <c>null</c>.</para>
  		/// </exception>
 +		/// <exception cref="System.ObjectDisposedException">
-+		/// The object has been disposed.
-+		/// </exception>
- 		/// <exception cref="System.OperationCanceledException">
- 		/// The operation was canceled via the cancellation token.
- 		/// </exception>
-@@ -656,5 +688,23 @@ namespace MimeKit {
- 				throw new ArgumentOutOfRangeException ("action");
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		/// <exception cref="System.OperationCanceledException">
+ 		/// The operation was canceled via the cancellation token.
+ 		/// </exception>
+@@ -697,6 +764,9 @@ namespace MimeKit {
+ 		/// <para>-or-</para>
+ 		/// <para><paramref name="stream"/> is <c>null</c>.</para>
+ 		/// </exception>
++		/// <exception cref="System.ObjectDisposedException">
++		/// The <see cref="MimePart"/> has been disposed.
++		/// </exception>
+ 		/// <exception cref="System.OperationCanceledException">
+ 		/// The operation was canceled via the cancellation token.
+ 		/// </exception>
+@@ -801,5 +871,23 @@ namespace MimeKit {
+ 				break;
  			}
  		}
 +

 	}
 }
diff --git a/MimeKit/MultipartAlternative.cs b/MimeKit/MultipartAlternative.cs
index 15cc761..15e8f00 100644
--- a/MimeKit/MultipartAlternative.cs
+++ b/MimeKit/MultipartAlternative.cs
@@ -82,6 +82,12 @@ namespace MimeKit {
 		{
 		}
 
+		void CheckDisposed ()
+		{
+			if (IsDisposed)
+				throw new ObjectDisposedException ("MultipartAlternative");
+		}
+
 		/// <summary>
 		/// Get the text of the text/plain alternative.
 		/// </summary>
@@ -89,6 +95,9 @@ namespace MimeKit {
 		/// Gets the text of the text/plain alternative, if it exists.
 		/// </remarks>
 		/// <value>The text if a text/plain alternative exists; otherwise, <c>null</c>.</value>
+		/// <exception cref="System.ObjectDisposedException">
+		/// The object has been disposed.
+		/// </exception>
 		public string TextBody {
 			get { return GetTextBody (TextFormat.Text); }
 		}
@@ -100,6 +109,9 @@ namespace MimeKit {
 		/// Gets the HTML-formatted text of the text/html alternative, if it exists.
 		/// </remarks>
 		/// <value>The HTML if a text/html alternative exists; otherwise, <c>null</c>.</value>
+		/// <exception cref="System.ObjectDisposedException">
+		/// The object has been disposed.
+		/// </exception>
 		public string HtmlBody {
 			get { return GetTextBody (TextFormat.Html); }
 		}
@@ -119,11 +131,16 @@ namespace MimeKit {
 		/// <exception cref="System.ArgumentNullException">
 		/// <paramref name="visitor"/> is <c>null</c>.
 		/// </exception>
+		/// <exception cref="System.ObjectDisposedException">
+		/// The object has been disposed.
+		/// </exception>
 		public override void Accept (MimeVisitor visitor)
 		{
 			if (visitor == null)
 				throw new ArgumentNullException ("visitor");
 
+			CheckDisposed ();
+
 			visitor.VisitMultipartAlternative (this);
 		}
 
@@ -150,8 +167,13 @@ namespace MimeKit {
 		/// </remarks>
 		/// <returns>The text body in the desired format if it exists; otherwise, <c>null</c>.</returns>
 		/// <param name="format">The desired text format.</param>
+		/// <exception cref="System.ObjectDisposedException">
+		/// The object has been disposed.
+		/// </exception>
 		public string GetTextBody (TextFormat format)
 		{

+							} catch {
+								alternative.Dispose ();
+								related.Dispose ();
+							}
 
 							if (resource.ContentLink != null)
 								part.ContentLocation = resource.ContentLink;
@@ -3224,8 +3283,14 @@ namespace MimeKit {
 				if (body != null)
 					mixed.Add (body);
 
