Index: class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs	(revision 104512)
+++ class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs	(working copy)
@@ -152,9 +152,9 @@
 			format.FormatFlags = StringFormatFlags.NoWrap;
 
 			if (owner != null)
-				column_rect.Height = owner.Font.Height + 5;
+				column_rect.Height = ThemeEngine.Current.ListViewGetHeaderHeight (owner, owner.Font);
 			else
-				column_rect.Height = ThemeEngine.Current.DefaultFont.Height + 5;
+				column_rect.Height = ThemeEngine.Current.ListViewGetHeaderHeight (null, ThemeEngine.Current.DefaultFont);
 
 			if (width >= 0)
 				column_rect.Width = width;
Index: class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs	(revision 104512)
+++ class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs	(working copy)
@@ -81,7 +81,7 @@
 		private DataGridViewCellStyle defaultCellStyle;
 		//private Control editingControl;
 		private DataGridViewEditMode editMode;
-		private bool enableHeadersVisualStyles;
+		private bool enableHeadersVisualStyles = true;
 		private DataGridViewCell firstDisplayedCell;
 		private int firstDisplayedScrollingColumnHiddenWidth;
 		private int firstDisplayedScrollingColumnIndex;
@@ -134,6 +134,9 @@
 		private int gridWidth;
 		private int gridHeight;
 
+		DataGridViewHeaderCell pressed_header_cell;
+		DataGridViewHeaderCell entered_header_cell;
+
 		public DataGridView ()
 		{
 			SetStyle (ControlStyles.Opaque, true);
@@ -704,6 +707,26 @@
 			set { enableHeadersVisualStyles = value; }
 		}
 
+		internal DataGridViewHeaderCell EnteredHeaderCell {
+			get { return entered_header_cell; }
+			set {
+				if (entered_header_cell == value)
+					return;
+				if (ThemeEngine.Current.DataGridViewHeaderCellHasHotStyle (this)) {
+					Region area_to_invalidate = new Region ();
+					area_to_invalidate.MakeEmpty ();
+					if (entered_header_cell != null)
+						area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
+					entered_header_cell = value;
+					if (entered_header_cell != null)
+						area_to_invalidate.Union (GetHeaderCellBounds (entered_header_cell));
+					Invalidate (area_to_invalidate);
+					area_to_invalidate.Dispose ();
+				} else
+					entered_header_cell = value;
+			}
+		}
+
 		[Browsable (false)]
 		[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
 		public DataGridViewCell FirstDisplayedCell {
@@ -860,6 +883,10 @@
 			set { }
 		}
 
+		internal DataGridViewHeaderCell PressedHeaderCell {
+			get { return pressed_header_cell; }
+		}
+
 		[Browsable (true)]
 		[DefaultValue (false)]
 		public bool ReadOnly {
@@ -4015,6 +4042,10 @@
 			DoSelectionOnMouseDown (hitTest);
 			
 			if (hitTest.Type != DataGridViewHitTestType.Cell) {
+				if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)
+					pressed_header_cell = columns [hitTest.ColumnIndex].HeaderCell;
+				else if (hitTest.Type == DataGridViewHitTestType.RowHeader)
+					pressed_header_cell = rows [hitTest.RowIndex].HeaderCell;
 				Invalidate ();
 				return;
 			}
@@ -4050,6 +4081,8 @@
 				OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
 				hover_cell = null;
 			}
+			
+			EnteredHeaderCell = null;
 		}
 		
 		protected override void OnMouseMove (MouseEventArgs e)
@@ -4059,6 +4092,8 @@
 			HitTestInfo hit = this.HitTest (e.X, e.Y);
 			
 			if (hit.Type == DataGridViewHitTestType.Cell) {
+				EnteredHeaderCell = null;
+
 				DataGridViewCell new_cell = GetCellInternal (hit.ColumnIndex, hit.RowIndex);
 				
 				// Check if we have moved into an error icon area
@@ -4110,6 +4145,8 @@
 			} else if (hit.Type == DataGridViewHitTestType.RowHeader) {
 				DataGridViewRowHeaderCell new_cell = Rows[hit.RowIndex].HeaderCell;
 
+				EnteredHeaderCell = new_cell;
+
 				// Check if we have moved into an error icon area
 				Rectangle icon = new_cell.InternalErrorIconsBounds;
 
@@ -4126,6 +4163,8 @@
 						MouseLeftErrorIcon (new_cell);
 				}
 			} else if (hit.Type == DataGridViewHitTestType.TopLeftHeader) {
+				EnteredHeaderCell = null;
+
 				DataGridViewTopLeftHeaderCell new_cell = (DataGridViewTopLeftHeaderCell)TopLeftHeaderCell;
 
 				// Check if we have moved into an error icon area
@@ -4145,6 +4184,11 @@
 				}
 			
 			} else {
+				if (hit.Type == DataGridViewHitTestType.ColumnHeader)
+					EnteredHeaderCell = Columns [hit.ColumnIndex].HeaderCell;
+				else
+					EnteredHeaderCell = null;
+
 				// We have left the cell area
 				if (hover_cell != null) {
 					OnCellMouseLeave (new DataGridViewCellEventArgs (hover_cell.ColumnIndex, hover_cell.RowIndex));
@@ -4163,6 +4207,13 @@
 				Rectangle display = GetCellDisplayRectangle (hit.ColumnIndex, hit.RowIndex, false);
 				OnCellMouseUp (new DataGridViewCellMouseEventArgs (hit.ColumnIndex, hit.RowIndex, e.X - display.X, e.Y - display.Y, e));
 			}
+
+			if (pressed_header_cell != null) {
+				DataGridViewHeaderCell cell = pressed_header_cell;
+				pressed_header_cell = null;
+				if (ThemeEngine.Current.DataGridViewHeaderCellHasPressedStyle (this))
+					Invalidate (GetHeaderCellBounds (cell));
+			}
 		}
 
 		protected override void OnMouseWheel (MouseEventArgs e)
@@ -5359,6 +5410,32 @@
 			return result;
 		}
 
+		Rectangle GetHeaderCellBounds (DataGridViewHeaderCell cell)
+		{
+			Rectangle bounds = new Rectangle (ClientRectangle.Location, cell.Size);
+			if (cell is DataGridViewColumnHeaderCell) {
+				if (RowHeadersVisible)
+					bounds.X += RowHeadersWidth;
+				List<DataGridViewColumn> sortedColumns = columns.ColumnDisplayIndexSortedArrayList;
+				for (int index = first_col_index; index < sortedColumns.Count; index++) {
+					DataGridViewColumn column = sortedColumns [index];
+					if (column.Index == cell.ColumnIndex)
+						break;
+					bounds.X += column.Width;
+				}
+			} else {
+				if (ColumnHeadersVisible)
+					bounds.Y += ColumnHeadersHeight;
+				for (int index = first_row_index; index < Rows.Count; index++) {
+					DataGridViewRow row = GetRowInternal (index);
+					if (row.HeaderCell == cell)
+						break;
+					bounds.Y += row.Height;
+				}
+			}
+			return bounds;
+		}
+
 		private void PrepareEditingRow (bool cell_changed, bool column_changed)
 		{
 			bool show = false;
Index: class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewCell.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewCell.cs	(revision 104512)
+++ class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewCell.cs	(working copy)
@@ -1370,10 +1370,15 @@
 			Color color = style.BackColor;
 			graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (color), cellBounds);
 		}
+
+		internal Pen GetBorderPen ()
+		{
+			return ThemeEngine.Current.ResPool.GetPen (DataGridView.GridColor);
+		}
 		
-		private void PaintPartBorder (Graphics graphics, Rectangle cellBounds, int rowIndex)
+		internal virtual void PaintPartBorder (Graphics graphics, Rectangle cellBounds, int rowIndex)
 		{
-			Pen p = ThemeEngine.Current.ResPool.GetPen (DataGridView.GridColor);
+			Pen p = GetBorderPen ();
 
 			if (columnIndex == -1) {
 				graphics.DrawLine (p, cellBounds.Left, cellBounds.Top, cellBounds.Left, cellBounds.Bottom - 1);
Index: class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewColumnHeaderCell.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewColumnHeaderCell.cs	(revision 104512)
+++ class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewColumnHeaderCell.cs	(working copy)
@@ -228,6 +228,20 @@
 			base.Paint (graphics, clipBounds, cellBounds, rowIndex, dataGridViewElementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, post);
 		}
 
+		internal override void PaintPartBackground (Graphics graphics, Rectangle cellBounds, DataGridViewCellStyle style)
+		{
+			if (ThemeEngine.Current.DataGridViewColumnHeaderCellDrawBackground (this, graphics, cellBounds))
+				return;
+			base.PaintPartBackground (graphics, cellBounds, style);
+		}
+
+		internal override void PaintPartBorder (Graphics graphics, Rectangle cellBounds, int rowIndex)
+		{
+			if (ThemeEngine.Current.DataGridViewColumnHeaderCellDrawBorder (this, graphics, cellBounds))
+				return;
+			base.PaintPartBorder (graphics, cellBounds, rowIndex);
+		}
+
 		protected override bool SetValue (int rowIndex, object value) {
 			header_text = value;
 			return true;
Index: class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowHeaderCell.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowHeaderCell.cs	(revision 104512)
+++ class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowHeaderCell.cs	(working copy)
@@ -231,6 +231,27 @@
 			base.Paint (graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, post);
 		}
 
+		internal override void PaintPartBackground (Graphics graphics, Rectangle cellBounds, DataGridViewCellStyle style)
+		{
+			if (ThemeEngine.Current.DataGridViewRowHeaderCellDrawBackground (this, graphics, cellBounds))
+				return;
+			base.PaintPartBackground (graphics, cellBounds, style);
+		}
+
+		internal override void PaintPartSelectionBackground (Graphics graphics, Rectangle cellBounds, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle)
+		{
+			if (ThemeEngine.Current.DataGridViewRowHeaderCellDrawSelectionBackground (this))
+				return;
+			base.PaintPartSelectionBackground (graphics, cellBounds, cellState, cellStyle);
+		}
+
+		internal override void PaintPartBorder (Graphics graphics, Rectangle cellBounds, int rowIndex)
+		{
+			if (ThemeEngine.Current.DataGridViewRowHeaderCellDrawBorder (this, graphics, cellBounds))
+				return;
+			base.PaintPartBorder (graphics, cellBounds, rowIndex);
+		}
+
 		private void DrawRightArrowGlyph (Graphics g, Pen p, int x, int y)
 		{
 			g.DrawLine (p, x, y, x, y + 8);
Index: class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs	(revision 104512)
+++ class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs	(working copy)
@@ -398,6 +398,11 @@
 			}
 		}
 
+		internal ColumnHeader EnteredColumnHeader {
+			get {
+				return header_control.EnteredColumnHeader;
+			}
+		}
 		#endregion	// Private Internal Properties
 
 		#region	 Protected Properties
@@ -1922,7 +1927,7 @@
 				layout_wd = ClientRectangle.Width;
 			} else {
 				header_control.Width = x;
-				header_control.Height = columns.Count > 0 ? columns [0].Ht : Font.Height + 5;
+				header_control.Height = columns.Count > 0 ? columns [0].Ht : ThemeEngine.Current.ListViewGetHeaderHeight (this, Font);
 				header_control.Visible = true;
 			}
 		}
@@ -3969,6 +3974,7 @@
 			ColumnHeader drag_column;
 			int drag_x;
 			int drag_to_index = -1;
+			ColumnHeader entered_column_header;
 
 			public HeaderControl (ListView owner)
 			{
@@ -3977,8 +3983,34 @@
 				MouseDown += new MouseEventHandler (HeaderMouseDown);
 				MouseMove += new MouseEventHandler (HeaderMouseMove);
 				MouseUp += new MouseEventHandler (HeaderMouseUp);
+				MouseLeave += new EventHandler (OnMouseLeave);
 			}
 
+			internal ColumnHeader EnteredColumnHeader {
+				get { return entered_column_header; }
+				private set {
+					if (entered_column_header == value)
+						return;
+					if (ThemeEngine.Current.ListViewHasHotHeaderStyle) {
+						Region region_to_invalidate = new Region ();
+						region_to_invalidate.MakeEmpty ();
+						if (entered_column_header != null)
+							region_to_invalidate.Union (GetColumnHeaderInvalidateArea (entered_column_header));
+						entered_column_header = value;
+						if (entered_column_header != null)
+							region_to_invalidate.Union (GetColumnHeaderInvalidateArea (entered_column_header));
+						Invalidate (region_to_invalidate);
+						region_to_invalidate.Dispose ();
+					} else
+						entered_column_header = value;
+				}
+			}
+
+			void OnMouseLeave (object sender, EventArgs e)
+			{
+				EnteredColumnHeader = null;
+			}
+
 			private ColumnHeader ColumnAtX (int x)
 			{
 				Point pt = new Point (x, 0);
@@ -4022,13 +4054,23 @@
 						drag_to_index = GetReorderedIndex (clicked_column);
 					}
 					clicked_column.Pressed = true;
-					Rectangle bounds = clicked_column.Rect;
-					bounds.X -= owner.h_marker;
-					Invalidate (bounds);
+					Invalidate (clicked_column);
 					return;
 				}
 			}
 
+			void Invalidate (ColumnHeader columnHeader)
+			{
+				Invalidate (GetColumnHeaderInvalidateArea (columnHeader));
+			}
+
+			Rectangle GetColumnHeaderInvalidateArea (ColumnHeader columnHeader)
+			{
+				Rectangle bounds = columnHeader.Rect;
+				bounds.X -= owner.h_marker;
+				return bounds;
+			}
+
 			void StopResize ()
 			{
 				column_resize_active = false;
@@ -4077,17 +4119,16 @@
 						ColumnHeader over = ColumnAtX (me.X + owner.h_marker);
 						bool pressed = clicked_column.Pressed;
 						clicked_column.Pressed = over == clicked_column;
-						if (clicked_column.Pressed ^ pressed) {
-							Rectangle bounds = clicked_column.Rect;
-							bounds.X -= owner.h_marker;
-							Invalidate (bounds);
-						}
+						if (clicked_column.Pressed ^ pressed)
+							Invalidate (clicked_column);
 					}
 					return;
 				}
 
 				for (int i = 0; i < owner.Columns.Count; i++) {
 					Rectangle zone = owner.Columns [i].Rect;
+					if (zone.Contains (pt))
+						EnteredColumnHeader = owner.Columns [i];
 					zone.X = zone.Right - 5;
 					zone.Width = 10;
 					if (zone.Contains (pt)) {
@@ -4117,9 +4158,7 @@
 
 				if (clicked_column != null && clicked_column.Pressed) {
 					clicked_column.Pressed = false;
-					Rectangle bounds = clicked_column.Rect;
-					bounds.X -= owner.h_marker;
-					Invalidate (bounds);
+					Invalidate (clicked_column);
 					owner.OnColumnClick (new ColumnClickEventArgs (clicked_column.Index));
 				}
 
Index: class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs	(revision 104522)
+++ class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs	(working copy)
@@ -786,6 +786,24 @@
 		
 		#endregion // Datagrid
 
+#if NET_2_0
+		#region DataGridView
+		#region DataGridViewHeaderCell
+		#region DataGridViewRowHeaderCell
+		public abstract bool DataGridViewRowHeaderCellDrawBackground (DataGridViewRowHeaderCell cell, Graphics g, Rectangle bounds);
+		public abstract bool DataGridViewRowHeaderCellDrawSelectionBackground (DataGridViewRowHeaderCell cell);
+		public abstract bool DataGridViewRowHeaderCellDrawBorder (DataGridViewRowHeaderCell cell, Graphics g, Rectangle bounds);
+		#endregion
+		#region DataGridViewColumnHeaderCell
+		public abstract bool DataGridViewColumnHeaderCellDrawBackground (DataGridViewColumnHeaderCell cell, Graphics g, Rectangle bounds);
+		public abstract bool DataGridViewColumnHeaderCellDrawBorder (DataGridViewColumnHeaderCell cell, Graphics g, Rectangle bounds);
+		#endregion
+		public abstract bool DataGridViewHeaderCellHasPressedStyle (DataGridView dataGridView);
+		public abstract bool DataGridViewHeaderCellHasHotStyle (DataGridView dataGridView);
+		#endregion
+		#endregion
+#endif
+
 		#region DateTimePicker
 
 		public abstract void DrawDateTimePicker(Graphics dc, Rectangle clip_rectangle, DateTimePicker dtp);
@@ -814,8 +832,10 @@
 		public abstract void DrawListViewItems (Graphics dc, Rectangle clip_rectangle, ListView control);
 		public abstract void DrawListViewHeader (Graphics dc, Rectangle clip_rectangle, ListView control);
 		public abstract void DrawListViewHeaderDragDetails (Graphics dc, ListView control, ColumnHeader drag_column, int target_x);
+		public abstract bool ListViewHasHotHeaderStyle { get; }
 
 		// Sizing
+		public abstract int ListViewGetHeaderHeight (ListView listView, Font font);
 		public abstract Size ListViewCheckBoxSize { get; }
 		public abstract int ListViewColumnHeaderHeight { get; }
 		public abstract int ListViewDefaultColumnWidth { get; }
Index: class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs	(revision 104522)
+++ class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs	(working copy)
@@ -2162,7 +2162,52 @@
 		}
 		
 		#endregion // Datagrid
-		
+
+#if NET_2_0
+		#region DataGridView
+		#region DataGridViewHeaderCell
+		#region DataGridViewRowHeaderCell
+		public override bool DataGridViewRowHeaderCellDrawBackground (DataGridViewRowHeaderCell cell, Graphics g, Rectangle bounds)
+		{
+			return false;
+		}
+
+		public override bool DataGridViewRowHeaderCellDrawSelectionBackground (DataGridViewRowHeaderCell cell)
+		{
+			return false;
+		}
+
+		public override bool DataGridViewRowHeaderCellDrawBorder (DataGridViewRowHeaderCell cell, Graphics g, Rectangle bounds)
+		{
+			return false;
+		}
+		#endregion
+
+		#region DataGridViewColumnHeaderCell
+		public override bool DataGridViewColumnHeaderCellDrawBackground (DataGridViewColumnHeaderCell cell, Graphics g, Rectangle bounds)
+		{
+			return false;
+		}
+
+		public override bool DataGridViewColumnHeaderCellDrawBorder (DataGridViewColumnHeaderCell cell, Graphics g, Rectangle bounds)
+		{
+			return false;
+		}
+		#endregion
+
+		public override bool DataGridViewHeaderCellHasPressedStyle  (DataGridView dataGridView)
+		{
+			return false;
+		}
+
+		public override bool DataGridViewHeaderCellHasHotStyle (DataGridView dataGridView)
+		{
+			return false;
+		}
+		#endregion
+		#endregion
+#endif
+
 		#region DateTimePicker
 
 		public override void DrawDateTimePicker(Graphics dc, Rectangle clip_rectangle, DateTimePicker dtp)
@@ -2511,12 +2556,7 @@
 							continue;
 #endif
 
-						ButtonState state;
-						if (control.HeaderStyle == ColumnHeaderStyle.Clickable)
-							state = col.Pressed ? ButtonState.Pushed : ButtonState.Normal;
-						else
-							state = ButtonState.Flat;
-						CPDrawButton (dc, rect, state);
+						ListViewDrawColumnHeaderBackground (control, col, dc, rect, clip);
 						rect.X += 5;
 						rect.Width -= 10;
 						if (rect.Width <= 0)
@@ -2531,17 +2571,32 @@
 						Rectangle rect = control.Columns [0].Rect;
 						rect.X = right;
 						rect.Width = control.Right - right;
-						ButtonState state;
-						if (control.HeaderStyle == ColumnHeaderStyle.Clickable)
-							state = ButtonState.Normal;
-						else
-							state = ButtonState.Flat;
-						CPDrawButton (dc, rect, state);
+						ListViewDrawUnusedHeaderBackground (control, dc, rect, clip);
 					}
 				}
 			}
 		}
 
+		protected virtual void ListViewDrawColumnHeaderBackground (ListView listView, ColumnHeader columnHeader, Graphics g, Rectangle area, Rectangle clippingArea)
+		{
+			ButtonState state;
+			if (listView.HeaderStyle == ColumnHeaderStyle.Clickable)
+				state = columnHeader.Pressed ? ButtonState.Pushed : ButtonState.Normal;
+			else
+				state = ButtonState.Flat;
+			CPDrawButton (g, area, state);
+		}
+		
+		protected virtual void ListViewDrawUnusedHeaderBackground (ListView listView, Graphics g, Rectangle area, Rectangle clippingArea)
+		{
+			ButtonState state;
+			if (listView.HeaderStyle == ColumnHeaderStyle.Clickable)
+				state = ButtonState.Normal;
+			else
+				state = ButtonState.Flat;
+			CPDrawButton (g, area, state);
+		}
+
 		public override void DrawListViewHeaderDragDetails (Graphics dc, ListView view, ColumnHeader col, int target_x)
 		{
 			Rectangle rect = col.Rect;
@@ -2921,7 +2976,18 @@
 		}
 #endif
 
+		public override bool ListViewHasHotHeaderStyle {
+			get {
+				return false;
+			}
+		}
+
 		// Sizing
+		public override int ListViewGetHeaderHeight (ListView listView, Font font)
+		{
+			return font.Height + 5;
+		}
+
 		public override Size ListViewCheckBoxSize {
 			get { return new Size (16, 16); }
 		}
Index: class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewTest.cs
===================================================================
--- class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewTest.cs	(revision 104512)
+++ class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewTest.cs	(working copy)
@@ -1496,6 +1496,11 @@
 
 		class cust { public string Name { get { return "test"; } } }
 	
+		[Test]
+		public void EnableHeadersVisualStylesDefaultValue ()
+		{
+			Assert.AreEqual (true, new DataGridView ().EnableHeadersVisualStyles);
+		}
 	}
 	
 	[TestFixture]
