=== modified file 'src/TagLib/CombinedTag.cs'
--- src/TagLib/CombinedTag.cs	2008-01-03 01:05:18 +0000
+++ src/TagLib/CombinedTag.cs	2009-01-16 06:09:28 +0000
@@ -276,6 +276,89 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names of the performers or artists
+		///    who performed in the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child tags are looped
+		///    through in order and the first non-<see langword="null" />
+		///    and non-empty value is returned.</para>
+		///    <para>When setting the value, it is stored in each child
+		///    tag.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.PerformersSort" />
+		public override string[] PerformersSort {
+			get {
+				foreach (Tag tag in tags) {
+					if (tag == null)
+						continue;
+					
+					string[] value = tag.PerformersSort;
+					
+					if (value != null && value.Length > 0)
+						return value;
+				}
+				
+				return new string[] { };
+			}
+			
+			set {
+				foreach (Tag tag in tags)
+					if (tag != null)
+						tag.PerformersSort = value;
+			}
+		}
+		
+		/// <summary>
+		///    Gets and sets the sort names for the band or artist who
+		///    is credited in the creation of the entire album or
+		///    collection containing the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the band or artist who is credited in the creation
+		///    of the entire album or collection containing the media
+		///    described by the current instance or an empty array if
+		///    no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child tags are looped
+		///    through in order and the first non-<see langword="null" />
+		///    and non-empty value is returned.</para>
+		///    <para>When setting the value, it is stored in each child
+		///    tag.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.AlbumArtistsSort" />
+		public override string[] AlbumArtistsSort {
+			get {
+				foreach (Tag tag in tags) {
+					if (tag == null)
+						continue;
+					
+					string[] value = tag.AlbumArtistsSort;
+					
+					if (value != null && value.Length > 0)
+						return value;
+				}
+				
+				return new string[] { };
+			}
+			
+			set {
+				foreach (Tag tag in tags)
+					if (tag != null)
+						tag.AlbumArtistsSort = value;
+			}
+		}
+		
+		/// <summary>
 		///    Gets and sets the band or artist who is credited in the
 		///    creation of the entire album or collection containing the
 		///    media described by the current instance.
@@ -356,6 +439,123 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the composer of the 
+		///    media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the composers of the media described by the 
+		///    current instance or an empty array if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child tags are looped
+		///    through in order and the first non-<see langword="null" />
+		///    and non-empty value is returned.</para>
+		///    <para>When setting the value, it is stored in each child
+		///    tag.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.ComposersSort" />
+		public override string[] ComposersSort {
+			get {
+				foreach (Tag tag in tags) {
+					if (tag == null)
+						continue;
+					
+					string[] value = tag.ComposersSort;
+					
+					if (value != null && value.Length > 0)
+						return value;
+				}
+				
+				return new string[] { };
+			}
+			
+			set {
+				foreach (Tag tag in tags)
+					if (tag != null)
+						tag.ComposersSort = value;
+			}
+		}
+		
+		/// <summary>
+		///    Gets and sets the sorting title for the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for
+		///    the media described by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child tags are looped
+		///    through in order and the first non-<see langword="null" />
+		///    value is returned.</para>
+		///    <para>When setting the value, it is stored in each child
+		///    tag.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.TitleSort" />
+		public override string TitleSort {
+			get {
+				foreach (Tag tag in tags) {
+					if (tag == null)
+						continue;
+					
+					string value = tag.TitleSort;
+					
+					if (value != null)
+						return value;
+				}
+				
+				return null;
+			}
+			
+			set {
+				foreach (Tag tag in tags)
+					if (tag != null)
+						tag.TitleSort = value;
+			}
+		}
+		
+		/// <summary>
+		///    Gets and sets the sorting title for the album of the media represented by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for the album of
+		///    the media represented by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child tags are looped
+		///    through in order and the first non-<see langword="null" />
+		///    value is returned.</para>
+		///    <para>When setting the value, it is stored in each child
+		///    tag.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.AlbumSort" />
+		public override string AlbumSort {
+			get {
+				foreach (Tag tag in tags) {
+					if (tag == null)
+						continue;
+					
+					string value = tag.AlbumSort;
+					
+					if (value != null)
+						return value;
+				}
+				
+				return null;
+			}
+			
+			set {
+				foreach (Tag tag in tags)
+					if (tag != null)
+						tag.AlbumSort = value;
+			}
+		}
+		
+		/// <summary>
 		///    Gets and sets the album of the media represented by the
 		///    current instance.
 		/// </summary>
@@ -930,4 +1130,4 @@
 		
 		#endregion
 	}
-}
\ No newline at end of file
+}

=== modified file 'src/TagLib/Id3v2/FrameTypes.cs'
--- src/TagLib/Id3v2/FrameTypes.cs	2007-12-30 01:26:31 +0000
+++ src/TagLib/Id3v2/FrameTypes.cs	2009-01-16 05:43:47 +0000
@@ -71,6 +71,11 @@
 		public static readonly ReadOnlyByteVector TRCK = "TRCK";
 		public static readonly ReadOnlyByteVector TRDA = "TRDA";
 		public static readonly ReadOnlyByteVector TSIZ = "TSIZ";
+		public static readonly ReadOnlyByteVector TSOA = "TSOA";
+		public static readonly ReadOnlyByteVector TSO2 = "TSO2";
+		public static readonly ReadOnlyByteVector TSOC = "TSOC";
+		public static readonly ReadOnlyByteVector TSOP = "TSOP";
+		public static readonly ReadOnlyByteVector TSOT = "TSOT";
 		public static readonly ReadOnlyByteVector TXXX = "TXXX";
 		public static readonly ReadOnlyByteVector TYER = "TYER";
 		public static readonly ReadOnlyByteVector UFID = "UFID";

=== modified file 'src/TagLib/Id3v2/Tag.cs'
--- src/TagLib/Id3v2/Tag.cs	2008-12-16 01:41:48 +0000
+++ src/TagLib/Id3v2/Tag.cs	2009-01-16 05:57:48 +0000
@@ -1131,6 +1131,24 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sorting title for the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for
+		///    the media described by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "TSOT" Text
+		///    Information Frame.
+		/// </remarks>
+		public override string TitleSort {
+			get {return GetTextAsString (FrameType.TSOT);}
+			set {SetTextFrame (FrameType.TSOT, value);}
+		}
+
+		/// <summary>
 		///    Gets and sets the performers or artists who performed in
 		///    the media described by the current instance.
 		/// </summary>
@@ -1150,6 +1168,45 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names of the performers or artists
+		///    who performed in the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present. 
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "TSOP" Text
+		///    Information Frame.
+		/// </remarks>
+		public override string [] PerformersSort {
+			get {return GetTextAsArray (FrameType.TSOP);}
+			set {SetTextFrame (FrameType.TSOP, value);}
+		}
+
+		/// <summary>
+		///    Gets and sets the sort names of the band or artist who is 
+		///    credited in the creation of the entire album or collection
+		///    containing the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present. 
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "TSO2" Text
+		///    Information Frame.
+		/// </remarks>
+		public override string [] AlbumArtistsSort {
+			get {return GetTextAsArray (FrameType.TSO2);}
+			set {SetTextFrame (FrameType.TSO2, value);}
+		}
+
+		/// <summary>
 		///    Gets and sets the band or artist who is credited in the
 		///    creation of the entire album or collection containing the
 		///    media described by the current instance.
@@ -1188,6 +1245,25 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names of the composers of the
+		///    media represented by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present. 
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "TSOC" Text
+		///    Information Frame.
+		/// </remarks>
+		public override string [] ComposersSort {
+			get {return GetTextAsArray (FrameType.TSOC);}
+			set {SetTextFrame (FrameType.TSOC, value);}
+		}
+
+		/// <summary>
 		///    Gets and sets the album of the media represented by the
 		///    current instance.
 		/// </summary>
@@ -1206,6 +1282,24 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sorting title for the album of the media represented by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for the album of
+		///    the media represented by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "TSOA" Text
+		///    Information Frame.
+		/// </remarks>
+		public override string AlbumSort {
+			get {return GetTextAsString (FrameType.TSOA);}
+			set {SetTextFrame (FrameType.TSOA, value);}
+		}
+
+		/// <summary>
 		///    Gets and sets a user comment on the media represented by
 		///    the current instance.
 		/// </summary>

=== modified file 'src/TagLib/Mpeg4/AppleTag.cs'
--- src/TagLib/Mpeg4/AppleTag.cs	2008-01-03 01:05:18 +0000
+++ src/TagLib/Mpeg4/AppleTag.cs	2009-01-16 05:57:29 +0000
@@ -505,6 +505,28 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sorting title for the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for
+		///    the media described by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "sonm" box type.
+		/// </remarks>
+		public override string TitleSort {
+			get {
+				string [] text = GetText (BoxType.Sonm);
+				return text.Length == 0 ? null : text [0];
+			}
+			set {
+				SetText (BoxType.Sonm, value);
+			}
+		}
+
+		/// <summary>
 		///    Gets and sets the performers or artists who performed in
 		///    the media described by the current instance.
 		/// </summary>
@@ -579,6 +601,26 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sorting title for the album of the media represented by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for the album of
+		///    the media represented by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "soal" box type.
+		/// </remarks>
+		public override string AlbumSort {
+			get {
+				string [] text = GetText (BoxType.Soal);
+				return text.Length == 0 ? null : text [0];
+			}
+			set {SetText (BoxType.Soal, value);}
+		}
+		
+		/// <summary>
 		///    Gets and sets a user comment on the media represented by
 		///    the current instance.
 		/// </summary>
@@ -958,6 +1000,63 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the band or artist who
+		///    is credited in the creation of the entire album or
+		///    collection containing the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the band or artist who is credited in the creation
+		///    of the entire album or collection containing the media
+		///    described by the current instance or an empty array if
+		///    no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "soaa"
+		///    Box type.
+		/// </remarks>
+		public override string [] AlbumArtistsSort {
+			get {return GetText (BoxType.Soaa);}
+			set {SetText (BoxType.Soaa, value);}
+		}
+		
+		/// <summary>
+		///    Gets and sets the sort names of the performers or artists
+		///    who performed in the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present. 
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "soar" box type.
+		/// </remarks>
+		public override string[] PerformersSort {
+			get {return GetText (BoxType.Soar);}
+			set {SetText (BoxType.Soar, value);}
+		}
+		
+		/// <summary>
+		///    Gets and sets the sort names of the Composer credited
+		///    in the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the Composers in the media described by the current instance,
+		///    or an empty array if no value is present. 
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "soar" box type.
+		/// </remarks>
+		public override string[] ComposersSort {
+			get {return GetText (BoxType.Soco);}
+			set {SetText (BoxType.Soco, value);}
+		}
+		
+		/// <summary>
 		///    Gets and sets a collection of pictures associated with
 		///    the media represented by the current instance.
 		/// </summary>

=== modified file 'src/TagLib/Mpeg4/BoxTypes.cs'
--- src/TagLib/Mpeg4/BoxTypes.cs	2007-12-30 01:26:31 +0000
+++ src/TagLib/Mpeg4/BoxTypes.cs	2009-01-16 05:43:47 +0000
@@ -69,6 +69,11 @@
 		public static readonly ReadOnlyByteVector Nam  = AppleTag.FixId ("nam");
 		public static readonly ReadOnlyByteVector Name = "name";
 		public static readonly ReadOnlyByteVector Skip = "skip";
+		public static readonly ReadOnlyByteVector Soaa = "soaa"; // Album Artist Sort
+		public static readonly ReadOnlyByteVector Soar = "soar"; // Performer Sort
+		public static readonly ReadOnlyByteVector Soco = "soco"; // Composer Sort
+		public static readonly ReadOnlyByteVector Sonm = "sonm"; // Track Title Sort
+		public static readonly ReadOnlyByteVector Soal = "soal"; // Album Title Sort
 		public static readonly ReadOnlyByteVector Stbl = "stbl";
 		public static readonly ReadOnlyByteVector Stco = "stco";
 		public static readonly ReadOnlyByteVector Stsd = "stsd";

=== modified file 'src/TagLib/Ogg/GroupedComment.cs'
--- src/TagLib/Ogg/GroupedComment.cs	2008-01-03 01:05:18 +0000
+++ src/TagLib/Ogg/GroupedComment.cs	2009-01-16 05:56:23 +0000
@@ -155,7 +155,7 @@
 				return types;
 			}
 		}
-
+		
 		/// <summary>
 		///    Gets and sets the title for the media described by the
 		///    current instance.
@@ -186,6 +186,35 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sorting title for the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for
+		///    the media described by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child comments are
+		///    looped through in order and the first non-<see
+		///    langword="null" /> value is returned.</para>
+		///    <para>When setting the value, it is stored in the first
+		///    comment.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.TitleSort" />
+		public override string TitleSort {
+			get {
+				string output = null;
+				foreach (XiphComment tag in tags)
+					if (tag != null && output == null)
+						output = tag.TitleSort;
+				
+				return output;
+			}
+			set {if (tags.Count > 0) tags [0].TitleSort = value;}
+		}
+		
+		/// <summary>
 		///    Gets and sets the performers or artists who performed in
 		///    the media described by the current instance.
 		/// </summary>
@@ -214,7 +243,37 @@
 			}
 			set {if (tags.Count > 0) tags [0].Performers = value;}
 		}
-
+		
+		/// <summary>
+		///    Gets and sets the sort names of the performers or artists
+		///    who performed in the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present. 
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child comments are
+		///    looped through in order and the first non-empty value is
+		///    returned.</para>
+		///    <para>When setting the value, it is stored in the first
+		///    comment.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.PerformersSort" />
+		public override string [] PerformersSort {
+			get {
+				string [] output = new string [0];
+				foreach (XiphComment tag in tags)
+					if (tag != null && output.Length == 0)
+						output = tag.PerformersSort;
+				
+				return output;
+			}
+			set {if (tags.Count > 0) tags [0].PerformersSort = value;}
+		}
+		
 		/// <summary>
 		///    Gets and sets the band or artist who is credited in the
 		///    creation of the entire album or collection containing the
@@ -245,7 +304,40 @@
 			}
 			set {if (tags.Count > 0) tags [0].AlbumArtists = value;}
 		}
-
+		
+		/// <summary>
+		///    Gets and sets the sort names for the band or artist who
+		///    is credited in the creation of the entire album or
+		///    collection containing the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the band or artist who is credited in the creation
+		///    of the entire album or collection containing the media
+		///    described by the current instance or an empty array if
+		///    no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child comments are
+		///    looped through in order and the first non-empty value is
+		///    returned.</para>
+		///    <para>When setting the value, it is stored in the first
+		///    comment.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.AlbumArtistsSort" />
+		public override string [] AlbumArtistsSort {
+			get {
+				string [] output = new string [0];
+				foreach (XiphComment tag in tags)
+					if (tag != null && output.Length == 0)
+						output = tag.AlbumArtistsSort;
+				
+				return output;
+			}
+			set {if (tags.Count > 0) tags [0].AlbumArtistsSort = value;}
+		}
+		
 		/// <summary>
 		///    Gets and sets the composers of the media represented by
 		///    the current instance.
@@ -276,6 +368,35 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the composer of
+		///    the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the composer of the media described by the current
+		///    instance or an empty array if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child comments are
+		///    looped through in order and the first non-empty value is
+		///    returned.</para>
+		///    <para>When setting the value, it is stored in the first
+		///    comment.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.ComposersSort" />
+		public override string [] ComposersSort {
+			get {
+				string [] output = new string [0];
+				foreach (XiphComment tag in tags)
+					if (tag != null && output.Length == 0)
+						output = tag.ComposersSort;
+				
+				return output;
+			}
+			set {if (tags.Count > 0) tags [0].ComposersSort = value;}
+		}
+		
+		/// <summary>
 		///    Gets and sets the album of the media represented by the
 		///    current instance.
 		/// </summary>
@@ -305,6 +426,35 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sorting title for the album of the media represented by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for the album of
+		///    the media represented by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>When getting the value, the child comments are
+		///    looped through in order and the first non-empty value is
+		///    returned.</para>
+		///    <para>When setting the value, it is stored in the first
+		///    comment.</para>
+		/// </remarks>
+		/// <seealso cref="Tag.AlbumSort" />
+		public override string AlbumSort {
+			get {
+				string output = null;
+				foreach (XiphComment tag in tags)
+					if (tag != null && output == null)
+						output = tag.AlbumSort;
+				
+				return output;
+			}
+			set {if (tags.Count > 0) tags [0].AlbumSort = value;}
+		}
+		
+		/// <summary>
 		///    Gets and sets a user comment on the media represented by
 		///    the current instance.
 		/// </summary>
@@ -596,7 +746,7 @@
 					tags [0].BeatsPerMinute = value;
 			}
 		}
-
+		
 		/// <summary>
 		///    Gets and sets the conductor or director of the media
 		///    represented by the current instance.

=== modified file 'src/TagLib/Ogg/XiphComment.cs'
--- src/TagLib/Ogg/XiphComment.cs	2008-01-03 01:05:18 +0000
+++ src/TagLib/Ogg/XiphComment.cs	2009-01-16 05:57:44 +0000
@@ -461,6 +461,24 @@
 			get {return GetFirstField ("TITLE");}
 			set {SetField ("TITLE", value);}
 		}
+		
+		/// <summary>
+		///    Gets and sets the sorting title for the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for
+		///    the media described by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "TITLESORT"
+		///    field.
+		/// </remarks>
+		public override string TitleSort {
+			get {return GetFirstField ("TITLESORT");}
+			set {SetField ("TITLESORT", value);}
+		}
 
 		/// <summary>
 		///    Gets and sets the performers or artists who performed in
@@ -481,6 +499,24 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names of the performers or artists
+		///    who performed in the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present. 
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "ARTISTSORT" field.
+		/// </remarks>
+		public override string [] PerformersSort {
+			get {return GetField ("ARTISTSORT");}
+			set {SetField ("ARTISTSORT", value);}
+		}
+		
+		/// <summary>
 		///    Gets and sets the band or artist who is credited in the
 		///    creation of the entire album or collection containing the
 		///    media described by the current instance.
@@ -501,6 +537,28 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the band or artist who
+		///    is credited in the creation of the entire album or
+		///    collection containing the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the band or artist who is credited in the creation
+		///    of the entire album or collection containing the media
+		///    described by the current instance or an empty array if
+		///    no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "ALBUMARTISTSORT"
+		///    field.
+		/// </remarks>
+		public override string [] AlbumArtistsSort {
+			get {return GetField ("ALBUMARTISTSORT");}
+			set {SetField ("ALBUMARTISTSORT", value);}
+		}
+		
+		/// <summary>
 		///    Gets and sets the composers of the media represented by
 		///    the current instance.
 		/// </summary>
@@ -518,6 +576,24 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the composers of
+		///    the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the composer of the media described by the current
+		///    instance or an empty array if no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "COMPOSERSORT"
+		///    field.
+		/// </remarks>
+		public override string [] ComposersSort {
+			get {return GetField ("COMPOSERSORT");}
+			set {SetField ("COMPOSERSORT", value);}
+		}
+
+		/// <summary>
 		///    Gets and sets the album of the media represented by the
 		///    current instance.
 		/// </summary>
@@ -535,6 +611,24 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sorting title for the album of the media represented by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sorting title for the album of
+		///    the media represented by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    This property is implemented using the "ALBUMSORT"
+		///    field.
+		/// </remarks>
+		public override string AlbumSort {
+			get {return GetFirstField ("ALBUMSORT");}
+			set {SetField ("ALBUMSORT", value);}
+		}
+
+		/// <summary>
 		///    Gets and sets a user comment on the media represented by
 		///    the current instance.
 		/// </summary>

=== modified file 'src/TagLib/Tag.cs'
--- src/TagLib/Tag.cs	2008-01-03 01:05:18 +0000
+++ src/TagLib/Tag.cs	2009-01-16 05:58:15 +0000
@@ -146,6 +146,23 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort name for the title of the media 
+		///    described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string" /> object containing the sort name for
+		///    the title of the media described by the current instance or <see
+		///    langword="null" /> if no value is present.
+		/// </value>
+		/// <remarks>
+		///    Possibly used to sort compilations, or episodic content.
+		/// </remarks>
+		public virtual string TitleSort {
+			get {return null;}
+			set {}
+		}
+		
+		/// <summary>
 		///    Gets and sets the performers or artists who performed in
 		///    the media described by the current instance.
 		/// </summary>
@@ -174,6 +191,28 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names of the performers or artists
+		///    who performed in the media described by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names for
+		///    the performers or artists who performed in the media
+		///    described by the current instance, or an empty array if
+		///    no value is present. 
+		/// </value>
+		/// <remarks>
+		///    <para>This is used to provide more control over how tracks
+		///    are sorted. Typical uses are to skip common prefixes or
+		///    sort by last name. For example, "The Beatles" might be
+		///    sorted as "Beatles, The".
+		///    </para>
+		/// </remarks>
+		public virtual string [] PerformersSort {
+			get {return new string [] {};}
+			set {}
+		}
+		
+		/// <summary>
 		///    Gets and sets the band or artist who is credited in the
 		///    creation of the entire album or collection containing the
 		///    media described by the current instance.
@@ -204,6 +243,38 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the band or artist who
+		///    is credited in the creation of the entire album or
+		///    collection containing the media described by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the band or artist who is credited in the creation
+		///    of the entire album or collection containing the media
+		///    described by the current instance or an empty array if
+		///    no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>This field is typically optional but aids in the
+		///    sorting of compilations or albums with multiple artists.
+		///    For example, if an album has several artists, sorting by
+		///    artist will split up the album and sorting by album will
+		///    split up albums by the same artist. Having a single album
+		///    artist for an entire album will solve this
+		///    problem.</para>
+		///    <para>As this value is to be used as a sorting key, it
+		///    should be used with less variation than <see
+		///    cref="Performers" />. Where performers can be broken into
+		///    muliple artist it is best to stick with a single band
+		///    name. For example, "Beatles, The".</para>
+		/// </remarks>
+		public virtual string [] AlbumArtistsSort {
+			get {return new string [] {};}
+			set {}
+		}
+		
+		/// <summary>
 		///    Gets and sets the composers of the media represented by
 		///    the current instance.
 		/// </summary>
@@ -223,6 +294,30 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the composers of the 
+		///    media represented by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the composers of the media represented by the 
+		///    current instance or an empty array if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>This field is typically optional but aids in the
+		///    sorting of compilations or albums with multiple Composers.
+		///    </para>
+		///    <para>As this value is to be used as a sorting key, it
+		///    should be used with less variation than <see
+		///    cref="Composers" />. Where performers can be broken into
+		///    muliple artist it is best to stick with a single composer.
+		///    For example, "McCartney, Paul".</para>
+		/// </remarks>
+		public virtual string [] ComposersSort {
+			get {return new string [] {};}
+			set {}
+		}
+		
+		/// <summary>
 		///    Gets and sets the album of the media represented by the
 		///    current instance.
 		/// </summary>
@@ -247,6 +342,25 @@
 		}
 		
 		/// <summary>
+		///    Gets and sets the sort names for the Album Title of the 
+		///    media represented by the current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="string[]" /> containing the sort names
+		///    for the Album Title of the media represented by the 
+		///    current instance or an empty array if no value is present.
+		/// </value>
+		/// <remarks>
+		///    <para>This field is typically optional but aids in the
+		///    sorting of compilations or albums with Similar Titles.
+		///    </para>
+		/// </remarks>
+		public virtual string AlbumSort {
+			get {return null;}
+			set {}
+		}
+		
+		/// <summary>
 		///    Gets and sets a user comment on the media represented by
 		///    the current instance.
 		/// </summary>
@@ -569,6 +683,23 @@
 		
 		/// <summary>
 		///    Gets the first value contained in <see
+		///    cref="AlbumArtistsSort" />.
+		/// </summary>
+		/// <value>
+		///    The first <see cref="string" /> object in <see
+		///    cref="AlbumArtistsSort" />, or <see langword="null" /> is it
+		///    contains no values.
+		/// </value>
+		/// <remarks>
+		///    This property is provided for convenience. Use <see
+		///    cref="AlbumArtistsSort" /> to set the value.
+		/// </remarks>
+		public string FirstAlbumArtistSort {
+			get {return FirstInGroup(AlbumArtistsSort);}
+		}
+		
+		/// <summary>
+		///    Gets the first value contained in <see
 		///    cref="Performers" />.
 		/// </summary>
 		/// <value>
@@ -583,6 +714,40 @@
 		public string FirstPerformer {
 			get {return FirstInGroup(Performers);}
 		}
+
+		/// <summary>
+		///    Gets the first value contained in <see
+		///    cref="PerformersSort" />.
+		/// </summary>
+		/// <value>
+		///    The first <see cref="string" /> object in <see
+		///    cref="PerformersSort" />, or <see langword="null" /> is it
+		///    contains no values.
+		/// </value>
+		/// <remarks>
+		///    This property is provided for convenience. Use <see
+		///    cref="PerformersSort" /> to set the value.
+		/// </remarks>
+		public string FirstPerformerSort {
+			get {return FirstInGroup(PerformersSort);}
+		}
+		
+		/// <summary>
+		///    Gets the first value contained in <see
+		///    cref="ComposersSort" />.
+		/// </summary>
+		/// <value>
+		///    The first <see cref="string" /> object in <see
+		///    cref="ComposersSort" />, or <see langword="null" /> is it
+		///    contains no values.
+		/// </value>
+		/// <remarks>
+		///    This property is provided for convenience. Use <see
+		///    cref="ComposersSort" /> to set the value.
+		/// </remarks>
+		public string FirstComposerSort {
+			get {return FirstInGroup(ComposersSort);}
+		}
 		
 		/// <summary>
 		///    Gets the first value contained in <see
@@ -667,6 +832,22 @@
 		
 		/// <summary>
 		///    Gets a semicolon separated string containing the values
+		///    in <see cref="PerformersSort" />.
+		/// </summary>
+		/// <value>
+		///    A semicolon separated <see cref="string" /> object
+		///    containing the values in <see cref="PerformersSort" />.
+		/// </value>
+		/// <remarks>
+		///    This property is provided for convenience. Use <see
+		///    cref="PerformersSort" /> to set the value.
+		/// </remarks>
+		public string JoinedPerformersSort {
+			get {return JoinGroup(PerformersSort);}
+		}
+		
+		/// <summary>
+		///    Gets a semicolon separated string containing the values
 		///    in <see cref="Composers" />.
 		/// </summary>
 		/// <value>

