Index: System.Windows.Forms/Control.cs
===================================================================
--- System.Windows.Forms/Control.cs	(revision 73643)
+++ System.Windows.Forms/Control.cs	(working copy)
@@ -3857,7 +3857,11 @@
 			switch (msg.Msg) {
 				case (int)Msg.WM_SYSKEYDOWN:
 				case (int)Msg.WM_KEYDOWN: {
-					key_event = new KeyEventArgs ((Keys)msg.WParam.ToInt32 ());
+                    Keys key_data = (Keys)msg.WParam.ToInt32 ();
+#if NET_2_0
+                    OnPreviewKeyDown(new PreviewKeyDownEventArgs(key_data));
+#endif
+					key_event = new KeyEventArgs (key_data);
 					OnKeyDown (key_event);
 					return key_event.Handled;
 				}
@@ -5365,7 +5369,15 @@
 			}
 		}
 
-		[EditorBrowsable(EditorBrowsableState.Advanced)]
+#if NET_2_0
+        protected virtual void OnPreviewKeyDown(PreviewKeyDownEventArgs e) {
+            PreviewKeyDownEventHandler eh = (PreviewKeyDownEventHandler)(Events[PreviewKeyDownEvent]);
+            if (eh != null)
+                eh(this, e);
+        }
+#endif
+
+        [EditorBrowsable(EditorBrowsableState.Advanced)]
 		protected virtual void OnQueryContinueDrag(QueryContinueDragEventArgs e) {
 			QueryContinueDragEventHandler eh = (QueryContinueDragEventHandler)(Events [QueryContinueDragEvent]);
 			if (eh != null)
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/SystemInformation.cs
===================================================================
--- System.Windows.Forms/SystemInformation.cs	(revision 73643)
+++ System.Windows.Forms/SystemInformation.cs	(working copy)
@@ -364,7 +364,16 @@
 			}
 		}
 
-		public static Size ToolWindowCaptionButtonSize {
+#if NET_2_0
+        public static bool TerminalServerSession {
+            get {
+                return false;
+
+            }
+        }
+#endif
+
+        public static Size ToolWindowCaptionButtonSize {
 			get {
 				return ThemeEngine.Current.ToolWindowCaptionButtonSize;
 			}
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 != TreeViewDrawMode.Normal
+#endif
+                ) {
 					invalid.X = 0;
 					invalid.Width = ViewportRectangle.Width;
 				}
@@ -792,7 +805,15 @@
 				eh (this, e);
 		}
 
-		protected override void OnHandleCreated (EventArgs 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,10 +1341,10 @@
 				DrawNodeLines (node, dc, clip, dash, node.GetLinesX (), y, middle);
 
 			if (ImageList != null)
-                                DrawNodeImage (node, dc, clip, node.GetImageX (), y);
-
-			if (!node.IsEditing)
-				DrawStaticNode (node, dc);
+                DrawNodeImage (node, dc, clip, node.GetImageX (), y);
+ 
+			if (!node.IsEditing) 
+			    DrawStaticNode (node, dc);
 		}
 
 		internal void UpdateScrollBars ()
@@ -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,7 +1832,14 @@
 			add { base.TextChanged += value; }
 			remove { base.TextChanged -= value; }
 		}
-		#endregion	// Events
+
+#if NET_2_0
+        public event DrawTreeNodeEventHandler DrawNode {
+            add { Events.AddHandler(DrawNodeEvent, value); }
+            remove { Events.RemoveHandler(DrawNodeEvent, value); }
+        }
+#endif
+        #endregion	// Events
 	}
 }
 
