Index: class/Managed.Windows.Forms/System.Windows.Forms/TreeNodeCollection.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/TreeNodeCollection.cs	(revision 74202)
+++ class/Managed.Windows.Forms/System.Windows.Forms/TreeNodeCollection.cs	(working copy)
@@ -409,11 +409,11 @@
 		}
 
 		// Would be nice to do this without running through the collection twice
-		internal void Sort () {
-			Array.Sort (nodes, 0, count, new TreeNodeComparer (Application.CurrentCulture.CompareInfo));
+		internal void Sort (IComparer sorter) {
+			Array.Sort (nodes, 0, count, sorter == null ? new TreeNodeComparer (Application.CurrentCulture.CompareInfo) : sorter);
 
 			for (int i = 0; i < count; i++) {
-				nodes [i].Nodes.Sort ();
+				nodes [i].Nodes.Sort (sorter);
 			}
 		}
 
Index: class/Managed.Windows.Forms/System.Windows.Forms/TreeView.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/TreeView.cs	(revision 74202)
+++ class/Managed.Windows.Forms/System.Windows.Forms/TreeView.cs	(working copy)
@@ -96,6 +96,9 @@
 
 		private TreeViewDrawMode draw_mode;
 
+#if NET_2_0
+		IComparer tree_view_node_sorter;
+#endif
 		#endregion	// Fields
 
 		#region Public Constructors	
@@ -433,11 +436,21 @@
 		public bool Sorted {
 			get { return sorted; }
 			set {
+#if NET_2_0
+				if (sorted == value)
+					return;
+				sorted = value;
+				//LAMESPEC: The documentation says that setting this to true should sort alphabetically if TreeViewNodeSorter is set.
+				if (sorted && tree_view_node_sorter == null) {
+					Sort (null);
+				}
+#else
 				if (sorted != value)
 					sorted = value;
 				if (sorted) {
-					Sort ();
+					Sort (null);
 				}
+#endif
 			}
 		}
 
@@ -468,6 +481,20 @@
 #endif
 		}
 
+#if NET_2_0
+		public IComparer TreeViewNodeSorter {
+			get {
+				return tree_view_node_sorter;
+			}
+			set {
+				tree_view_node_sorter = value;
+				Sort();
+				//LAMESPEC: The documentation says that setting this should set Sorted to false.
+				sorted = true;
+			}
+		}
+#endif
+
 		[Browsable(false)]
 		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 		public int VisibleCount {
@@ -591,7 +618,16 @@
 #endif
 		void Sort ()
 		{
-			Nodes.Sort ();
+#if NET_2_0
+			Sort (Nodes.Count >= 2 ? tree_view_node_sorter : null);
+#else
+			Sort (null);
+#endif
+		}
+
+		void Sort (IComparer sorter) 
+		{
+			Nodes.Sort (sorter);
 			RecalculateVisibleOrder (root_node);
 			UpdateScrollBars ();
 			Invalidate ();
