diff --git a/src/GroupSelector.cs b/src/GroupSelector.cs
index fbaf8c9..d195b01 100644
--- a/src/GroupSelector.cs
+++ b/src/GroupSelector.cs
@@ -171,10 +171,14 @@ namespace FSpot {
 			
 			Gdk.Rectangle box = new Box (this, position).Bounds;
 
-			if (box.Right > background.Right)
-			        Offset -= box.X + box.Width - (background.X + background.Width);
-			else if (box.X < background.X)
-				Offset += background.X - box.X;
+			// Only scroll to position if we are not dragging
+			if (!glass.Dragging)
+			{
+				if (box.Right > background.Right)
+			        	Offset -= box.X + box.Width - (background.X + background.Width);
+				else if (box.X < background.X)
+					Offset += background.X - box.X;
+			}
 		}
 
 		private int scroll_offset;
@@ -588,16 +592,33 @@ namespace FSpot {
 			public virtual void UpdateDrag (double x, double y)
 			{
 				Rectangle bounds = Bounds ();
-
-				int scroll = selector.background.X - bounds.Left;
-				if (scroll > 0 && selector.Offset < 0) {
-					selector.Offset = Math.Min (selector.Offset + scroll, 0);
-					if (selector.Offset == 0)
-						return;
+				double drag_lower_limit = (selector.background.Left) - (bounds.Width/2);
+				double drag_upper_limit = (selector.background.Right) - (bounds.Width/2);
+				double calX = DragStart.X + (x - DragStart.X);
+				
+				if ( calX >= drag_lower_limit && calX <= drag_upper_limit )
+				{
+					if( selector.right_delay.IsPending )
+						selector.right_delay.Stop();
+						
+					if( selector.left_delay.IsPending )
+						selector.left_delay.Stop();
+
+					DragOffset = (int)x - DragStart.X;
+				} else if ( calX >= drag_upper_limit && selector.right.Sensitive && !selector.right_delay.IsPending ) {
+					// Ensure selector is at the limit
+					if (bounds.Left != drag_upper_limit)
+						DragOffset = (int)drag_upper_limit - DragStart.X;
+					selector.Offset -= 10;
+					selector.right_delay.Start();
+				} else if ( calX <= drag_lower_limit && selector.left.Sensitive && !selector.left_delay.IsPending) {
+					// Ensure selector is at the limit
+					if (bounds.Left != drag_lower_limit)
+						DragOffset = (int)drag_lower_limit - DragStart.X;
+					selector.Offset += 10;
+					selector.left_delay.Start();
 				}
-
-				//System.Console.WriteLine ("scroll {0}, x {1}", scroll, x);
-				DragOffset = (int)x - DragStart.X;
+								
 			}
 
 			public virtual void EndDrag (double x, double y)
@@ -609,13 +630,13 @@ namespace FSpot {
 
 				int position;
 				DragOffset = 0;
+				Dragging = false;
 				if (selector.BoxXHit (middle, out position)) {
 					this.SetPosition (position);
 					State = StateType.Prelight;
 				} else {
 					State = selector.State;
-				}
-				Dragging = false;				
+				}								
 			}
 
 			private StateType state;
@@ -708,6 +729,21 @@ namespace FSpot {
 				popup_window.Move (x, y);
 			}
 
+			public void MaintainPosition()
+			{
+				Rectangle box = Bounds ();
+				double middle = box.X + (box.Width / 2.0);
+				int current_position;			
+				
+				if (selector.BoxXHit (middle, out current_position)) {
+					if (current_position != drag_position)
+						popup_label.Text = selector.Adaptor.GlassLabel (current_position);
+					drag_position = current_position;
+				}
+				UpdatePopupPosition ();
+				selector.ScrollTo (drag_position);
+			}
+
 			public override void StartDrag (double x, double y, uint time)
 			{
 				if (!PositionValid (Position))
@@ -726,14 +762,8 @@ namespace FSpot {
 				double middle = box.X + (box.Width / 2.0);
 				int current_position;
 				
-				base.UpdateDrag (x, y);				
-				if (selector.BoxXHit (middle, out current_position)) {
-					if (current_position != drag_position)
-						popup_label.Text = selector.Adaptor.GlassLabel (current_position);
-					drag_position = current_position;
-				}
-				UpdatePopupPosition ();
-				selector.ScrollTo (drag_position);
+				base.UpdateDrag (x, y);
+				MaintainPosition();
 			}
 
 			public override void EndDrag (double x, double y)
@@ -745,18 +775,22 @@ namespace FSpot {
 
 				int position;
 				DragOffset = 0;
-				
+				Dragging = false;
+								
 				selector.BoxXHitFilled (middle, out position);
 				this.SetPosition (position);
 				State = StateType.Prelight;
-				Dragging = false;
 				popup_window.Hide ();
 			}
 
 			private Rectangle InnerBounds ()
 			{
 				Rectangle box = new Box (selector, Position).Bounds;
-				box.X += DragOffset;
+				if(Dragging){
+					box.X = DragStart.X + DragOffset;
+				} else {
+					box.X += DragOffset;
+				}
 				return box;
 			}
 			
@@ -838,7 +872,12 @@ namespace FSpot {
 				int limit_offset = limit_type == LimitType.Max ? 1 : 0;
 
 				Rectangle bounds = new Rectangle (0, 0, width, selector.background.Height + handle_height);
-				bounds.X = DragOffset + selector.BoxX (Position + limit_offset) - bounds.Width /2;
+				
+				if ( Dragging ){
+					bounds.X = DragStart.X + DragOffset;
+				} else {
+					bounds.X = DragOffset + selector.BoxX (Position + limit_offset) - bounds.Width /2;
+				}
 				bounds.Y = selector.background.Y - handle_height/2;
 				return bounds;
 			}
@@ -998,12 +1037,19 @@ namespace FSpot {
 
 		private bool HandleScrollRight ()
 		{
+			
+			if (glass.Dragging)
+				glass.MaintainPosition ();			
+
 			Offset -= 10;
 			return true;
 		}
 
 		private bool HandleScrollLeft ()
 		{
+			if (glass.Dragging)
+				glass.MaintainPosition ();
+
 			Offset += 10;
 			return true;
 		}
