diff --git a/docs/reference/gdk/tmpl/event_structs.sgml b/docs/reference/gdk/tmpl/event_structs.sgml
index 42c54b0..4de4820 100644
--- a/docs/reference/gdk/tmpl/event_structs.sgml
+++ b/docs/reference/gdk/tmpl/event_structs.sgml
@@ -195,6 +195,8 @@ Shift and Alt) and the pointer buttons. See #GdkModifierType.
 @device: the device where the event originated.
 @x_root: the x coordinate of the pointer relative to the root of the screen.
 @y_root: the y coordinate of the pointer relative to the root of the screen.
+@delta: the distance scrolled by the wheel (1.0 by default and on backends
+  that don't report scrolling speeds).
 
 <!-- ##### STRUCT GdkEventMotion ##### -->
 <para>
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index 53833a0..9205c2c 100644
--- a/gdk/gdkevents.c
+++ b/gdk/gdkevents.c
@@ -392,6 +392,7 @@ gdk_event_new (GdkEventType type)
       new_event->scroll.y = 0.;
       new_event->scroll.x_root = 0.;
       new_event->scroll.y_root = 0.;
+      new_event->scroll.delta = 1.;
       break;
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h
index e6c516c..cfd5035 100644
--- a/gdk/gdkevents.h
+++ b/gdk/gdkevents.h
@@ -337,6 +337,7 @@ struct _GdkEventScroll
   GdkScrollDirection direction;
   GdkDevice *device;
   gdouble x_root, y_root;
+  gdouble delta;
 };
 
 struct _GdkEventKey
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index f058570..1c9a6bc 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -10794,6 +10794,7 @@ proxy_button_event (GdkEvent *source_event,
       event->scroll.y_root = source_event->scroll.y_root;
       event->scroll.state = state;
       event->scroll.device = source_event->scroll.device;
+      event->scroll.delta = source_event->scroll.delta;
       return TRUE;
 
     default:
diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
index 9e27329..be1eef6 100644
--- a/gdk/quartz/gdkevents-quartz.c
+++ b/gdk/quartz/gdkevents-quartz.c
@@ -845,6 +845,7 @@ fill_scroll_event (GdkWindow          *window,
                    gint                y,
                    gint                x_root,
                    gint                y_root,
+                   gdouble             delta,
                    GdkScrollDirection  direction)
 {
   GdkWindowObject *private;
@@ -864,6 +865,7 @@ fill_scroll_event (GdkWindow          *window,
   event->scroll.state = get_keyboard_modifiers_from_ns_event (nsevent);
   event->scroll.direction = direction;
   event->scroll.device = _gdk_display->core_pointer;
+  event->scroll.delta = delta;
 }
 
 static void
@@ -1259,28 +1261,40 @@ gdk_event_translate (GdkEvent *event,
 
     case NSScrollWheel:
       {
-	float dx = [nsevent deltaX];
-	float dy = [nsevent deltaY];
 	GdkScrollDirection direction;
+	float dx;
+	float dy;
 
-        if (dy != 0)
+	if (gdk_quartz_osx_version() >= GDK_OSX_LION &&
+	    [nsevent hasPreciseScrollingDeltas])
+	  {
+	    dx = [nsevent scrollingDeltaX] / 40.0;
+	    dy = [nsevent scrollingDeltaY] / 40.0;
+	  }
+	else
+	  {
+	    dx = [nsevent deltaX];
+	    dy = [nsevent deltaY];
+	  }
+
+        if (dy != 0.0)
           {
             if (dy < 0.0)
               direction = GDK_SCROLL_DOWN;
             else
               direction = GDK_SCROLL_UP;
 
-            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, direction);
+            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, fabs (dy), direction);
           }
 
-        if (dx != 0)
+        if (dx != 0.0)
           {
             if (dx < 0.0)
               direction = GDK_SCROLL_RIGHT;
             else
               direction = GDK_SCROLL_LEFT;
 
-            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, direction);
+            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, fabs (dx), direction);
           }
       }
       break;
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 3932976..bbd4971 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -2546,7 +2546,7 @@ gtk_range_button_release (GtkWidget      *widget,
 /**
  * _gtk_range_get_wheel_delta:
  * @range: a #GtkRange
- * @direction: A #GdkScrollDirection
+ * @event: A #GdkEventScroll
  * 
  * Returns a good step value for the mouse wheel.
  * 
@@ -2555,8 +2555,8 @@ gtk_range_button_release (GtkWidget      *widget,
  * Since: 2.4
  **/
 gdouble
-_gtk_range_get_wheel_delta (GtkRange           *range,
-			    GdkScrollDirection  direction)
+_gtk_range_get_wheel_delta (GtkRange       *range,
+                            GdkEventScroll *event)
 {
   GtkAdjustment *adj = range->adjustment;
   gdouble delta;
@@ -2566,13 +2566,18 @@ _gtk_range_get_wheel_delta (GtkRange           *range,
   else
     delta = adj->step_increment * 2;
   
-  if (direction == GDK_SCROLL_UP ||
-      direction == GDK_SCROLL_LEFT)
+  if (event->direction == GDK_SCROLL_UP ||
+      event->direction == GDK_SCROLL_LEFT)
     delta = - delta;
   
   if (range->inverted)
     delta = - delta;
 
+  if (event->delta != 1.0)
+    delta *= event->delta;
+
+  g_printerr ("%s: event->delta = %f   delta = %f\n", G_STRFUNC, event->delta, delta);
+
   return delta;
 }
       
@@ -2588,7 +2593,7 @@ gtk_range_scroll_event (GtkWidget      *widget,
       gdouble delta;
       gboolean handled;
 
-      delta = _gtk_range_get_wheel_delta (range, event->direction);
+      delta = _gtk_range_get_wheel_delta (range, event);
 
       g_signal_emit (range, signals[CHANGE_VALUE], 0,
                      GTK_SCROLL_JUMP, adj->value + delta,
diff --git a/gtk/gtkrange.h b/gtk/gtkrange.h
index a708879..3131fbe 100644
--- a/gtk/gtkrange.h
+++ b/gtk/gtkrange.h
@@ -199,8 +199,8 @@ gint                gtk_range_get_round_digits             (GtkRange      *range
 
 
 /* internal API */
-gdouble            _gtk_range_get_wheel_delta              (GtkRange      *range,
-                                                            GdkScrollDirection direction);
+gdouble            _gtk_range_get_wheel_delta              (GtkRange       *range,
+                                                            GdkEventScroll *event);
 
 void               _gtk_range_set_stop_values              (GtkRange      *range,
                                                             gdouble       *values,
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 05389fa..245d679 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1583,7 +1583,7 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
       GtkAdjustment *adj = GTK_RANGE (range)->adjustment;
       gdouble delta, new_value;
 
-      delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event->direction);
+      delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event);
 
       new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size);
       
