Index: System.Windows.Forms/DrawTreeNodeEventArgs.cs
===================================================================
--- System.Windows.Forms/DrawTreeNodeEventArgs.cs	(revision 73643)
+++ System.Windows.Forms/DrawTreeNodeEventArgs.cs	(working copy)
@@ -42,7 +42,7 @@
 			Rectangle bounds, TreeNodeStates state)
 		{
 			this.bounds = bounds;
-			this.draw_default = true;
+			this.draw_default = false;
 			this.graphics = graphics;
 			this.node = node;
 			this.state = state;
Index: System.Windows.Forms/DrawTreeNodeEventHandler.cs
===================================================================
--- System.Windows.Forms/DrawTreeNodeEventHandler.cs	(revision 0)
+++ System.Windows.Forms/DrawTreeNodeEventHandler.cs	(revision 0)
@@ -0,0 +1,31 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) 2007 George Giolfan
+//
+// Authors:
+//	George Giolfan (georgegiolfan@yahoo.com)
+//
+
+
+#if NET_2_0
+namespace System.Windows.Forms {
+	public delegate	void DrawTreeNodeEventHandler (object sender, DrawTreeNodeEventArgs	e);
+}
+#endif
\ No newline at end of file
Index: System.Windows.Forms/TreeNode.cs
===================================================================
--- System.Windows.Forms/TreeNode.cs	(revision 73643)
+++ System.Windows.Forms/TreeNode.cs	(working copy)
@@ -272,8 +272,9 @@
 			get {
 				if (prop_bag != null)
 					return prop_bag.ForeColor;
-				if (TreeView != null)
-					return TreeView.ForeColor;
+				TreeView tree_view = TreeView;
+				if (tree_view != null)
+					return tree_view.ForeColor;
 				return Color.Empty;
 			}
 			set {
Index: System.Windows.Forms/TreeView.cs
===================================================================
--- System.Windows.Forms/TreeView.cs	(revision 73643)
+++ System.Windows.Forms/TreeView.cs	(working copy)
@@ -88,7 +88,9 @@
 		private int drag_begin_x = 0;
 		private int drag_begin_y = 0;
 		private long handle_count = 1;
-
+#if NET_2_0
+		TreeViewDrawMode draw_mode;
+#endif
 		#endregion	// Fields
 
 		#region Public Constructors	
@@ -178,6 +180,13 @@
 			}
 		}
 
+#if NET_2_0
+		public TreeViewDrawMode	DrawMode {
+			get { return draw_mode; }
+			set { draw_mode = value; }
+		}
+#endif
+
 		public override Color ForeColor {
 			get { return base.ForeColor; }
 			set { base.ForeColor = value; }
@@ -357,7 +366,11 @@
 				selected_node = value;
 				focused_node = value;
 
-				if (full_row_select) {
+				if (full_row_select
+#if	NET_2_0
+					|| draw_mode != reeViewDrawMode.Normal
+#endif
+				) {
 					invalid.X = 0;
 					invalid.Width = ViewportRectangle.Width;
 				}
@@ -792,6 +805,14 @@
 				eh (this, e);
 		}
 
+#if NET_2_0
+		protected virtual void OnDrawNode(DrawTreeNodeEventArgs e) {
+			DrawTreeNodeEventHandler eh = (DrawTreeNodeEventHandler)(Events[DrawNodeEvent]);
+			if (eh != null)
+				eh(this, e);
+		}
+#endif
+
 		protected override void OnHandleCreated (EventArgs e) {
 			base.OnHandleCreated (e);
 		}
@@ -1077,7 +1098,7 @@
 				if (current.GetY () > clip.Bottom)
 					break;
 
-				DrawNode (current, dc, clip);
+				DrawTreeNode (current, dc, clip);
 			}
 
 			if (hbar.Visible && vbar.Visible) {
@@ -1269,18 +1290,37 @@
 		{
 			if (!full_row_select)
 				DrawSelectionAndFocus(node, dc, node.Bounds);
-
+#if NET_2_0
+			if (draw_mode == TreeViewDrawMode.OwnerDrawText) {
+				dc.FillRectangle(Brushes.White, node.Bounds);
+				TreeNodeStates tree_node_state = (TreeNodeStates)0;
+				if (node.IsSelected)
+					tree_node_state = TreeNodeStates.Selected;
+				if (node.Checked)
+					tree_node_state |= TreeNodeStates.Checked;
+				if (node ==	focused_node)
+					tree_node_state |= TreeNodeStates.Focused;
+				if (tree_node_state == (TreeNodeStates)0)
+					tree_node_state = TreeNodeStates.Default;
+				DrawTreeNodeEventArgs e = new DrawTreeNodeEventArgs(dc, node, node.Bounds, tree_node_state);
+				OnDrawNode(e);
+				if (!e.DrawDefault)
+					return;
+			}
+#endif
 			Font font = node.NodeFont;
 			if (node.NodeFont == null)
 				font = Font;
 			Color text_color = (Focused && node == highlighted_node ?
 					ThemeEngine.Current.ColorHighlightText : node.ForeColor);
-			dc.DrawString (node.Text, font,
+			if (text_color.IsEmpty)
+				text_color = ForeColor;
+			dc.DrawString(node.Text, font,
 					ThemeEngine.Current.ResPool.GetSolidBrush (text_color),
 					node.Bounds, string_format);
 		}
 
-		private void DrawNode (TreeNode node, Graphics dc, Rectangle clip)
+		private void DrawTreeNode (TreeNode node, Graphics dc, Rectangle clip)
 		{
 			int child_count = node.nodes.Count;
 			int y = node.GetY ();
@@ -1301,9 +1341,9 @@
 				DrawNodeLines (node, dc, clip, dash, node.GetLinesX (), y, middle);
 
 			if (ImageList != null)
-                                DrawNodeImage (node, dc, clip, node.GetImageX (), y);
-
-			if (!node.IsEditing)
+				DrawNodeImage (node, dc, clip, node.GetImageX (), y);
+ 
+			if (!node.IsEditing) 
 				DrawStaticNode (node, dc);
 		}
 
@@ -1713,6 +1753,9 @@
 		static object BeforeExpandEvent = new object ();
 		static object BeforeLabelEditEvent = new object ();
 		static object BeforeSelectEvent = new object ();
+#if NET_2_0
+		static object DrawNodeEvent = new object();
+#endif
 
 		public event ItemDragEventHandler ItemDrag {
 			add { Events.AddHandler (ItemDragEvent, value); }
@@ -1789,6 +1832,13 @@
 			add { base.TextChanged += value; }
 			remove { base.TextChanged -= value; }
 		}
+
+#if NET_2_0
+		public event DrawTreeNodeEventHandler DrawNode {
+			add { Events.AddHandler(DrawNodeEvent, value); }
+			remove { Events.RemoveHandler(DrawNodeEvent, value); }
+		}
+#endif
 		#endregion	// Events
 	}
 }
