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,22 @@
 #endif
 		}
 
+#if NET_2_0
+		public IComparer TreeViewNodeSorter {
+			get {
+				return tree_view_node_sorter;
+			}
+			set {
+				tree_view_node_sorter = value;
+				if (tree_view_node_sorter != null) {
+					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 +620,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 ();
Index: class/Managed.Windows.Forms/Test/System.Windows.Forms/TreeViewTest.cs
===================================================================
--- class/Managed.Windows.Forms/Test/System.Windows.Forms/TreeViewTest.cs	(revision 74202)
+++ class/Managed.Windows.Forms/Test/System.Windows.Forms/TreeViewTest.cs	(working copy)
@@ -367,4 +367,88 @@
 			Assert.AreSame (nodeB, tvw.SelectedNode, "#B7");
 		}
 	}
+
+#if NET_2_0
+	[TestFixture]
+	public class TreeViewNodeSorterTest {
+		static bool node_sorter_called;
+
+		[Test]
+		public void SortedAfterTreeViewNodeSorterIsSetToSomething() {
+			TreeView t = new TreeView();
+			t.TreeViewNodeSorter = new NodeSorter();
+			Assert.IsTrue(t.Sorted);
+		}
+
+		[Test]
+		public void SortedAfterTreeViewNodeSorterIsSetToNull() {
+			TreeView t = new TreeView();
+			t.TreeViewNodeSorter = null;
+			Assert.IsFalse(t.Sorted);
+		}
+
+		[Test]
+		public void NormalTreeViewNodeSorter() {
+			TreeView t = new TreeView();
+			t.Nodes.Add("2");
+			t.Nodes.Add("1");
+			node_sorter_called = false;
+			t.TreeViewNodeSorter = new NodeSorter();
+			Assert.IsTrue(node_sorter_called, "Node sorter called");
+			Assert.IsTrue(t.Nodes[0].Text == "2", "Order");
+		}
+
+		[Test]
+		public void NormalSorted() {
+			TreeView t = new TreeView();
+			t.Nodes.Add("2");
+			t.Nodes.Add("1");
+			t.Sorted = true;
+			Assert.IsTrue(t.Nodes[0].Text == "1", "Order");
+		}
+
+		[Test]
+		public void SortedDoesNotSortWhenTreeViewNodeSorterIsSet() {
+			TreeView t = new TreeView();
+			t.Nodes.Add("2");
+			t.Nodes.Add("1");
+			t.TreeViewNodeSorter = new NodeSorter();
+			t.Sorted = false;
+			t.Sorted = true;
+			Assert.IsTrue(t.Nodes[0].Text == "2", "Order");
+		}
+
+		[Test]
+		public void SortedDoesNotSortWhenItIsAlreadyTrue() {
+			TreeView t = new TreeView();
+			t.Nodes.Add("2");
+			t.Nodes.Add("1");
+			t.TreeViewNodeSorter = new NodeSorter();
+			t.TreeViewNodeSorter = null;
+			t.Sorted = true;
+			Assert.IsTrue(t.Nodes[0].Text == "2", "Order");
+		}
+
+		[Test]
+		public void SortedSorts() {
+			TreeView t = new TreeView();
+			t.Nodes.Add("2");
+			t.Nodes.Add("1");
+			t.TreeViewNodeSorter = new NodeSorter();
+			t.TreeViewNodeSorter = null;
+			t.Sorted = false;
+			t.Sorted = true;
+			Assert.IsTrue(t.Nodes[0].Text == "1", "Order");
+		}
+
+		class NodeSorter : IComparer {
+			public int Compare(object x, object y) {
+				node_sorter_called = true;
+				if (x == y)
+					return 0;
+				return ((TreeNode)x).Text == "2" ? -1 : 1;
+			}
+		}
+	}
+#endif
 }
