Index: class/Managed.Windows.Forms/System.Windows.Forms.Theming/Default/TabControlPainter.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms.Theming/Default/TabControlPainter.cs	(revision 109241)
+++ class/Managed.Windows.Forms/System.Windows.Forms.Theming/Default/TabControlPainter.cs	(working copy)
@@ -26,6 +26,7 @@
 using System.Drawing;
 using System.Drawing.Text;
 using System.Windows.Forms;
+using System.Windows.Forms.VisualStyles;
 
 namespace System.Windows.Forms.Theming.Default
 {
@@ -294,11 +295,26 @@
 			if (tab.ShowSlider) {
 				Rectangle right = GetRightScrollRect (tab);
 				Rectangle left = GetLeftScrollRect (tab);
-				ControlPaint.DrawScrollButton (dc, right, ScrollButton.Right, tab.RightSliderState);
-				ControlPaint.DrawScrollButton (dc, left, ScrollButton.Left, tab.LeftSliderState);
+				DrawScrollButton (dc, right, area, ScrollButton.Right, tab.RightSliderState);
+				DrawScrollButton (dc, left, area, ScrollButton.Left, tab.LeftSliderState);
 			}
 		}
 
+		protected virtual void DrawScrollButton (Graphics dc, Rectangle bounds, Rectangle clippingArea, ScrollButton button, PushButtonState state)
+		{
+			ControlPaint.DrawScrollButton (dc, bounds, button, GetButtonState (state));
+		}
+
+		static ButtonState GetButtonState (PushButtonState state)
+		{
+			switch (state) {
+			case PushButtonState.Pressed:
+				return ButtonState.Pushed;
+			default:
+				return ButtonState.Normal;
+			}
+		}
+
 		protected virtual void DrawBackground (Graphics dc, Rectangle area, TabControl tab)
 		{
 			Brush brush = SystemBrushes.Control;
Index: class/Managed.Windows.Forms/System.Windows.Forms.Theming/VisualStyles/TabControlPainter.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms.Theming/VisualStyles/TabControlPainter.cs	(revision 109241)
+++ class/Managed.Windows.Forms/System.Windows.Forms.Theming/VisualStyles/TabControlPainter.cs	(working copy)
@@ -198,5 +198,68 @@
 				return base.HasHotElementStyles (tabControl);
 			return true;
 		}
+		protected override void DrawScrollButton (Graphics dc, Rectangle bounds, Rectangle clippingArea, ScrollButton button, PushButtonState state)
+		{
+			if (!ThemeVisualStyles.RenderClientAreas) {
+				base.DrawScrollButton (dc, bounds, clippingArea, button, state);
+				return;
+			}
+			VisualStyleElement element;
+			if (button == ScrollButton.Left)
+				switch (state) {
+				case PushButtonState.Hot:
+					element = VisualStyleElement.Spin.DownHorizontal.Hot;
+					break;
+				case PushButtonState.Pressed:
+					element = VisualStyleElement.Spin.DownHorizontal.Pressed;
+					break;
+				default:
+					element = VisualStyleElement.Spin.DownHorizontal.Normal;
+					break;
+				}
+			else
+				switch (state) {
+				case PushButtonState.Hot:
+					element = VisualStyleElement.Spin.UpHorizontal.Hot;
+					break;
+				case PushButtonState.Pressed:
+					element = VisualStyleElement.Spin.UpHorizontal.Pressed;
+					break;
+				default:
+					element = VisualStyleElement.Spin.UpHorizontal.Normal;
+					break;
+				}
+			if (!VisualStyleRenderer.IsElementDefined (element)) {
+				if (button == ScrollButton.Left)
+					switch (state) {
+					case PushButtonState.Hot:
+						element = VisualStyleElement.ScrollBar.ArrowButton.LeftHot;
+						break;
+					case PushButtonState.Pressed:
+						element = VisualStyleElement.ScrollBar.ArrowButton.LeftPressed;
+						break;
+					default:
+						element = VisualStyleElement.ScrollBar.ArrowButton.LeftNormal;
+						break;
+					}
+				else
+					switch (state) {
+					case PushButtonState.Hot:
+						element = VisualStyleElement.ScrollBar.ArrowButton.RightHot;
+						break;
+					case PushButtonState.Pressed:
+						element = VisualStyleElement.ScrollBar.ArrowButton.RightPressed;
+						break;
+					default:
+						element = VisualStyleElement.ScrollBar.ArrowButton.RightNormal;
+						break;
+					}
+				if (!VisualStyleRenderer.IsElementDefined (element)) {
+					base.DrawScrollButton (dc, bounds, clippingArea, button, state);
+					return;
+				}
+			}
+			new VisualStyleRenderer (element).DrawBackground (dc, bounds, clippingArea);
+		}
 	}
 }
Index: class/Managed.Windows.Forms/System.Windows.Forms/TabControl.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/TabControl.cs	(revision 109241)
+++ class/Managed.Windows.Forms/System.Windows.Forms/TabControl.cs	(working copy)
@@ -30,6 +30,7 @@
 using System.Drawing;
 using System.Runtime.InteropServices;
 using System.Windows.Forms.Theming;
+using System.Windows.Forms.VisualStyles;
 
 namespace System.Windows.Forms {
 #if NET_2_0
@@ -55,10 +56,11 @@
 		private bool show_tool_tips;
 		private TabSizeMode size_mode;
 		private bool show_slider = false;
-		private ButtonState right_slider_state;
-		private ButtonState left_slider_state;
+		private PushButtonState right_slider_state = PushButtonState.Normal;
+		private PushButtonState left_slider_state = PushButtonState.Normal;
 		private int slider_pos = 0;
 		TabPage entered_tab_page;
+		bool mouse_down_on_a_tab_page;
 #if NET_2_0
 		private bool rightToLeftLayout;
 #endif		
@@ -315,7 +317,7 @@
 
 				if (new_index != -1) {
 					int le = TabPages[new_index].TabBounds.Right;
-					int re = ThemeEngine.Current.TabControlGetLeftScrollRect (this).Left;
+					int re = LeftScrollButtonArea.Left;
 					if (show_slider && le > re) {
 						int i = 0;
 						for (i = 0; i < new_index - 1; i++) {
@@ -451,20 +453,44 @@
 			get { return slider_pos; }
 		}
 
-		internal ButtonState RightSliderState {
+		internal PushButtonState RightSliderState {
 			get { return right_slider_state; }
+			private set {
+				if (right_slider_state == value)
+					return;
+				PushButtonState old_value = right_slider_state;
+				right_slider_state = value;
+				if (NeedsToInvalidateScrollButton (old_value, value))
+					Invalidate (RightScrollButtonArea);
+			}
 		}
 
-		internal ButtonState LeftSliderState {
+		internal PushButtonState LeftSliderState {
 			get { return left_slider_state; }
+			set {
+				if (left_slider_state == value)
+					return;
+				PushButtonState old_value = left_slider_state;
+				left_slider_state = value;
+				if (NeedsToInvalidateScrollButton (old_value, value))
+					Invalidate (LeftScrollButtonArea);
+			}
 		}
 
+		bool NeedsToInvalidateScrollButton (PushButtonState oldState, PushButtonState newState)
+		{
+			if ((oldState == PushButtonState.Hot && newState == PushButtonState.Normal) ||
+				(oldState == PushButtonState.Normal && newState == PushButtonState.Hot))
+				return HasHotElementStyles;
+			return true;
+		}
+
 		internal TabPage EnteredTabPage {
 			get { return entered_tab_page; }
 			private set {
 				if (entered_tab_page == value)
 					return;
-				if (ThemeElements.CurrentTheme.TabControlPainter.HasHotElementStyles (this)) {
+				if (HasHotElementStyles) {
 					Region area_to_invalidate = new Region ();
 					area_to_invalidate.MakeEmpty ();
 					if (entered_tab_page != null)
@@ -882,10 +908,10 @@
 				return;
 
 			if (ShowSlider) {
-				Rectangle right = ThemeEngine.Current.TabControlGetRightScrollRect (this);
-				Rectangle left = ThemeEngine.Current.TabControlGetLeftScrollRect (this);
+				Rectangle right = RightScrollButtonArea;
+				Rectangle left = LeftScrollButtonArea;
 				if (right.Contains (e.X, e.Y)) {
-					right_slider_state = ButtonState.Pushed;
+					right_slider_state = PushButtonState.Pressed;
 					if (CanScrollRight) {
 						slider_pos++;
 						SizeTabs ();
@@ -910,7 +936,7 @@
 					}
 					return;
 				} else if (left.Contains (e.X, e.Y)) {
-					left_slider_state = ButtonState.Pushed;
+					left_slider_state = PushButtonState.Pressed;
 					if (CanScrollLeft) {
 						slider_pos--;
 						SizeTabs ();
@@ -941,25 +967,50 @@
 				if (!GetTabRect (i).Contains (e.X, e.Y))
 					continue;
 				SelectedIndex = i;
+				mouse_down_on_a_tab_page = true;
 				break;
 			}
 		}
 
 		private void MouseUpHandler (object sender, MouseEventArgs e)
 		{
-			if (ShowSlider && (left_slider_state == ButtonState.Pushed || right_slider_state == ButtonState.Pushed)) {
+			mouse_down_on_a_tab_page = false;
+			if (ShowSlider && (left_slider_state == PushButtonState.Pressed || right_slider_state == PushButtonState.Pressed)) {
 				Rectangle invalid;
-				if (left_slider_state == ButtonState.Pushed)
-					invalid = ThemeEngine.Current.TabControlGetLeftScrollRect (this);
-				else
-					invalid = ThemeEngine.Current.TabControlGetRightScrollRect (this);
-				left_slider_state = ButtonState.Normal;
-				right_slider_state = ButtonState.Normal;
-
+				if (left_slider_state == PushButtonState.Pressed) {
+					invalid = LeftScrollButtonArea;
+					left_slider_state = GetScrollButtonState (invalid, e.Location);
+				} else {
+					invalid = RightScrollButtonArea;
+					right_slider_state = GetScrollButtonState (invalid, e.Location);
+				}
 				Invalidate (invalid);
 			}
 		}
 
+		bool HasHotElementStyles {
+			get {
+				return ThemeElements.CurrentTheme.TabControlPainter.HasHotElementStyles (this);
+			}
+		}
+
+		Rectangle LeftScrollButtonArea {
+			get {
+				return ThemeElements.CurrentTheme.TabControlPainter.GetLeftScrollRect (this);
+			}
+		}
+
+		Rectangle RightScrollButtonArea {
+			get {
+				return ThemeElements.CurrentTheme.TabControlPainter.GetRightScrollRect (this);
+			}
+		}
+
+		static PushButtonState GetScrollButtonState (Rectangle scrollButtonArea, Point cursorLocation)
+		{
+			return scrollButtonArea.Contains (cursorLocation) ? PushButtonState.Hot : PushButtonState.Normal;
+		}
+
 		private void SizeChangedHandler (object sender, EventArgs e)
 		{
 			Redraw ();
@@ -1384,6 +1435,25 @@
 
 		void OnMouseMove (object sender, MouseEventArgs e)
 		{
+			if (!mouse_down_on_a_tab_page && ShowSlider) {
+				if (LeftSliderState == PushButtonState.Pressed ||
+					RightSliderState == PushButtonState.Pressed)
+					return;
+				if (LeftScrollButtonArea.Contains (e.Location)) {
+					LeftSliderState = PushButtonState.Hot;
+					RightSliderState = PushButtonState.Normal;
+					EnteredTabPage = null;
+					return;
+				}
+				if (RightScrollButtonArea.Contains (e.Location)) {
+					RightSliderState = PushButtonState.Hot;
+					LeftSliderState = PushButtonState.Normal;
+					EnteredTabPage = null;
+					return;
+				}
+				LeftSliderState = PushButtonState.Normal;
+				RightSliderState = PushButtonState.Normal;
+			}
 			if (EnteredTabPage != null && EnteredTabPage.TabBounds.Contains (e.Location))
 				return;
 			for (int index = 0; index < TabCount; index++) {
@@ -1398,6 +1468,10 @@
 
 		void OnMouseLeave (object sender, EventArgs e)
 		{
+			if (ShowSlider) {
+				LeftSliderState = PushButtonState.Normal;
+				RightSliderState = PushButtonState.Normal;
+			}
 			EnteredTabPage = null;
 		}
 		#endregion	// Internal & Private Methods
Index: class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs	(revision 109241)
+++ class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs	(working copy)
@@ -945,8 +945,6 @@
 		public abstract Point TabControlImagePadding { get; }
 		public abstract int TabControlScrollerWidth { get; }
 
-		public abstract Rectangle TabControlGetLeftScrollRect (TabControl tab);
-		public abstract Rectangle TabControlGetRightScrollRect (TabControl tab);
 		public abstract Rectangle TabControlGetDisplayRectangle (TabControl tab);
 		public abstract Rectangle TabControlGetPanelRect (TabControl tab);
 		public abstract Size TabControlGetSpacing (TabControl tab);
Index: class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs
===================================================================
--- class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs	(revision 109241)
+++ class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs	(working copy)
@@ -4988,16 +4988,6 @@
 			ThemeElements.CurrentTheme.TabControlPainter.Draw (dc, area, tab);
 		}
 
-		public override Rectangle TabControlGetLeftScrollRect (TabControl tab)
-		{
-			return ThemeElements.CurrentTheme.TabControlPainter.GetLeftScrollRect (tab);
-		}
-
-		public override Rectangle TabControlGetRightScrollRect (TabControl tab)
-		{
-			return ThemeElements.CurrentTheme.TabControlPainter.GetRightScrollRect (tab);
-		}
-
 		public override Rectangle TabControlGetDisplayRectangle (TabControl tab)
 		{
 			return ThemeElements.CurrentTheme.TabControlPainter.GetDisplayRectangle (tab);
