diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 17c0d6f..57d5ef1 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -53,7 +53,8 @@ enum {
   PROP_UPPER_STEPPER_SENSITIVITY,
   PROP_SHOW_FILL_LEVEL,
   PROP_RESTRICT_TO_FILL_LEVEL,
-  PROP_FILL_LEVEL
+  PROP_FILL_LEVEL,
+  PROP_JUMP_TO_POSITION
 };
 
 enum {
@@ -114,6 +115,7 @@ struct _GtkRangeLayout
   guint repaint_id;
 
   gdouble fill_level;
+  gboolean jump_to_position;
 
   GQuark slider_detail_quark;
   GQuark stepper_detail_quark;
@@ -447,6 +449,25 @@ gtk_range_class_init (GtkRangeClass *class)
                                                         G_MAXDOUBLE,
                                                         GTK_PARAM_READWRITE));
 
+  /**
+   * GtkRange:jump-to-position:
+   *
+   * Whether scrolling through user interaction should
+   * jump straight to the destined position as opposed
+   * to moving a number of steps.
+   *
+   * This is meant to be set in subclasses of #GtkRange.
+   *
+   * Since: 2.20
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_JUMP_TO_POSITION,
+                                   g_param_spec_boolean ("jump-to-position",
+                                                         P_("Jump to Position"),
+                                                         P_("Whether to jump to the destined position immediately instead of moving a number of steps"),
+                                                         FALSE,
+                                                         GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
   gtk_widget_class_install_style_property (widget_class,
 					   g_param_spec_int ("slider-width",
 							     P_("Slider Width"),
@@ -602,6 +623,9 @@ gtk_range_set_property (GObject      *object,
     case PROP_FILL_LEVEL:
       gtk_range_set_fill_level (range, g_value_get_double (value));
       break;
+    case PROP_JUMP_TO_POSITION:
+      range->layout->jump_to_position = g_value_get_boolean (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -645,6 +669,9 @@ gtk_range_get_property (GObject      *object,
     case PROP_FILL_LEVEL:
       g_value_set_double (value, gtk_range_get_fill_level (range));
       break;
+    case PROP_JUMP_TO_POSITION:
+      g_value_set_boolean (value, range->layout->jump_to_position);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -2046,7 +2073,7 @@ gtk_range_button_press (GtkWidget      *widget,
     gtk_widget_queue_draw (widget);
     
   if (range->layout->mouse_location == MOUSE_TROUGH  &&
-      event->button == 1)
+      event->button == 1 && !range->layout->jump_to_position)
     {
       /* button 1 steps by page increment, as with button 2 on a stepper
        */
@@ -2091,7 +2118,7 @@ gtk_range_button_press (GtkWidget      *widget,
       return TRUE;
     }
   else if ((range->layout->mouse_location == MOUSE_TROUGH &&
-            event->button == 2) ||
+            (event->button == 2 || range->layout->jump_to_position)) ||
            range->layout->mouse_location == MOUSE_SLIDER)
     {
       gboolean need_value_update = FALSE;
@@ -2102,7 +2129,7 @@ gtk_range_button_press (GtkWidget      *widget,
        * On button 2 press, we warp the slider to mouse position,
        * then begin the slider drag.
        */
-      if (event->button == 2)
+      if (event->button == 2 || range->layout->jump_to_position)
         {
           gdouble slider_low_value, slider_high_value, new_value;
           
