diff -r 3779720ff0be javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ScrollBarSkin.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ScrollBarSkin.java	Tue Oct 25 16:33:28 2011 -0700
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ScrollBarSkin.java	Thu Oct 27 14:41:16 2011 +0200
@@ -215,39 +215,28 @@
                 ** if the tracklength isn't greater then do nothing....
                 */
                 if (trackLength > thumbLength) {
-                    /*
-                    ** in 2.0 a horizontal scrollbar would scroll on a vertical 
-                    ** drag on a tracker-pad.
-                    ** Because of this we will scroll both horz and vertz scrollbars
-                    ** on the larger of either the vert or the horz deltas.
-                    **
-                    */
+
                     double dx = event.getDeltaX();
                     double dy = event.getDeltaY();
 
                     /*
-                    ** a scrollbar can only move in one direction, so
-                    ** let's go with the biggest delta.
+                    ** in 2.0 a horizontal scrollbar would scroll on a vertical
+                    ** drag on a tracker-pad. We need to keep this behavior.
+                    */
+                    dx = (Math.abs(dx) < Math.abs(dy) ? dy : dx);
+
+                    /*
                     ** we only consume an event that we've used.
                     */
                     ScrollBar sb = (ScrollBar) getSkinnable();
 
+                    double delta = (getSkinnable().getOrientation() == Orientation.VERTICAL ? dy : dx);
 
-                    /*
-                    ** see if we're more X than Y
-                    */
-                    double delta = (Math.abs(dx) > Math.abs(dy) ? dx : dy);
-                    if ((delta > 0.0 && sb.getValue() > sb.getMin()) || 
-                        (delta < 0.0 && sb.getValue() < sb.getMax())) {
-
-                        double pixelValue;
-                        if (getSkinnable().getOrientation() == Orientation.VERTICAL) {
-                            pixelValue = (sb.getMax()-sb.getMin()) / sb.getHeight();
-                        }
-                        else {
-                            pixelValue = (sb.getMax()-sb.getMin()) / sb.getWidth();
-                        }
-                        sb.setValue(sb.getValue()+(-delta)*pixelValue);
+                    if (delta > 0.0 && sb.getValue() > sb.getMin()) {
+                        sb.decrement();
+                        event.consume();
+                    } else if (delta < 0.0 && sb.getValue() < sb.getMax()) {
+                        sb.increment();
                         event.consume();
                     }
                 }
diff -r 3779720ff0be javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java	Tue Oct 25 16:33:28 2011 -0700
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java	Thu Oct 27 14:41:16 2011 +0200
@@ -284,7 +284,7 @@
            }
         });
 
-        viewRect.setOnScroll(new EventHandler<javafx.scene.input.ScrollEvent>() {
+        viewRect.addEventFilter(ScrollEvent.SCROLL, new EventHandler<javafx.scene.input.ScrollEvent>() {
             @Override public void handle(ScrollEvent event) {
                 /*
                 ** if we're completely visible then do nothing....
diff -r 3779720ff0be javafx-ui-controls/src/com/sun/javafx/scene/control/skin/VirtualFlow.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/VirtualFlow.java	Tue Oct 25 16:33:28 2011 -0700
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/VirtualFlow.java	Thu Oct 27 14:41:16 2011 +0200
@@ -53,6 +53,7 @@
 import com.sun.javafx.runnable.Runnable1;
 
 import com.javafx.buildtools.checkstyle.annotations.IgnoreCodeChecks;
+import javafx.event.EventType;
 
 /**
  * Implementation of a virtualized container using a cell based mechanism.
@@ -485,93 +486,35 @@
         accumCellParent.setVisible(false);
         getChildren().add(accumCellParent);
 
-        setOnScroll(new EventHandler<javafx.scene.input.ScrollEvent>() {
+        addEventFilter(ScrollEvent.SCROLL, new EventHandler<javafx.scene.input.ScrollEvent>() {
             @Override public void handle(ScrollEvent event) {
 
-                switch(event.getTextDeltaYUnits()) {
-                  case PAGES:
-                      double delta = event.getTextDeltaY() * (isVertical() ? lastHeight : lastWidth);
-                      adjustPixels(-delta);
-                      break;
+                double delta = 0.0;
+                if (isVertical()) {
+                    switch(event.getTextDeltaYUnits()) {
+                        case PAGES:
+                            delta = event.getTextDeltaY() * lastHeight;
+                            break;
+                        case LINES:
+                            delta = event.getTextDeltaY() * lastCellLength;
+                            break;
+                        case NONE:
+                            delta = event.getDeltaY();
+                    }
+                } else { // horizontal
+                    switch(event.getTextDeltaXUnits()) {
+                        case CHARACTERS:
+                            // can we get character size here?
+                            // for now, fall through to pixel values
+                        case NONE:
+                            double dx = event.getDeltaX();
+                            double dy = event.getDeltaY();
 
-                  case LINES:
-                    /*
-                    ** in 2.0 a horizontal flow would scroll with a
-                    ** vertical drag on a tracker-pad.
-                    ** Because of this we will scroll both horz and vertz flows
-                    ** on the larger of either the vert or the horz deltas.
-                    */
-                    double tdx = event.getTextDeltaX();
-                    double tdy = event.getTextDeltaY();
-                    double tpos = mapper.getPosition();
-                    /*
-                    ** a flow can only move in one direction, so
-                    ** let's go with the biggest delta
-                    ** We will only consume it if we use it.
-                    */
-                    if (Math.abs(tdx) > Math.abs(tdy)) {
-                        /*
-                        ** we're more X than Y
-                        */
-                        if ((tpos > 0.0 && tdx > 0.0) || (tpos < 1.0 && tdx < 0.0)) {
-                            /*
-                            ** line scroll
-                            */
-                            adjustPixels(-tdx*lastCellLength);
-                        }
+                            delta = (Math.abs(dx) > Math.abs(dy) ? dx : dy);
                     }
-                    else {
-                        /*
-                        ** we're more Y than X
-                        */
-                        if ((tpos > 0.0 && tdy > 0.0) || (tpos < 1.0 && tdy < 0.0)) {
-                            /*
-                            ** pixel scroll
-                            */
-                            adjustPixels(-tdy*lastCellLength);
-                        }
-                    }
-                    break;
-                  case NONE:
-                    /*
-                    ** in 2.0 a horizontal flow would scroll with a
-                    ** vertical drag on a tracker-pad.
-                    ** Because of this we will scroll both horz and vertz flows
-                    ** on the larger of either the vert or the horz deltas.
-                    **
-                    */
-                    double dx = event.getDeltaX();
-                    double dy = event.getDeltaY();
-                    double pos = mapper.getPosition();
-                    /*
-                    ** a flow can only move in one direction, so
-                    ** let's go with the biggest delta
-                    ** We will only consume it if we use it.
-                    */
-                    if (Math.abs(dx) > Math.abs(dy)) {
-                        /*
-                        ** we're more X than Y
-                        */
-                        if ((pos > 0.0 && dx > 0.0) || (pos < 1.0 && dx < 0.0)) {
-                            /*
-                            ** pixel scroll
-                            */
-                            adjustPixels(-dx);
-                        }
-                    }
-                    else {
-                        /*
-                        ** we're more Y than X
-                        */
-                        if ((pos > 0.0 && dy > 0.0) || (pos < 1.0 && dy < 0.0)) {
-                            /*
-                            ** pixel scroll
-                            */
-                            adjustPixels(-dy);
-                        }
-                    }
-                    break;
                 }
+
+                adjustPixels(-delta);
                 event.consume();
             }
         });
