diff --git a/src/display/operations.js b/src/display/operations.js
index 566eb5aa853b6991526c28550f3000456b9bb0e9..15a041c6ab3167f2e622b25a23b6c20cb17572c9 100644
--- a/src/display/operations.js
+++ b/src/display/operations.js
@@ -7,9 +7,8 @@ import { finishOperation, pushOperation } from "../util/operation_group"
 
 import { ensureFocus } from "./focus"
 import { measureForScrollbars, updateScrollbars } from "./scrollbars"
-import { setScrollLeft, setScrollTop } from "./scroll_events"
 import { restartBlink } from "./selection"
-import { maybeScrollWindow, scrollPosIntoView } from "./scrolling"
+import { maybeScrollWindow, scrollPosIntoView, setScrollLeft, setScrollTop } from "./scrolling"
 import { DisplayUpdate, maybeClipScrollbars, postUpdateDisplay, setDocumentHeight, updateDisplayIfNeeded } from "./update_display"
 import { updateHeightsInViewport } from "./update_lines"
 
diff --git a/src/display/scroll_events.js b/src/display/scroll_events.js
index cc4b50b866e4c081d19639a0d5845bdb42d42f2a..d3902809e7c4a224d626bdc726ffbbd76bd604cb 100644
--- a/src/display/scroll_events.js
+++ b/src/display/scroll_events.js
@@ -1,37 +1,8 @@
 import { chrome, gecko, ie, mac, presto, safari, webkit } from "../util/browser"
 import { e_preventDefault } from "../util/event"
 
-import { startWorker } from "./highlight_worker"
-import { alignHorizontally } from "./line_numbers"
-import { updateDisplaySimple} from "./update_display"
-
-// Sync the scrollable area and scrollbars, ensure the viewport
-// covers the visible area.
-export function updateScrollTop(cm, val) {
-  if (Math.abs(cm.doc.scrollTop - val) < 2) return
-  if (!gecko) updateDisplaySimple(cm, {top: val})
-  setScrollTop(cm, val)
-  if (gecko) updateDisplaySimple(cm)
-  startWorker(cm, 100)
-}
-export function setScrollTop(cm, val, forceScroll) {
-  val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)
-  if (cm.display.scroller.scrollTop == val && !forceScroll) return
-  cm.doc.scrollTop = val
-  cm.display.scrollbars.setScrollTop(val)
-  cm.display.scroller.scrollTop = val
-}
-
-// Sync scroller and scrollbar, ensure the gutter elements are
-// aligned.
-export function setScrollLeft(cm, val, isScroller, forceScroll) {
-  val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)
-  if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) return
-  cm.doc.scrollLeft = val
-  alignHorizontally(cm)
-  if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val
-  cm.display.scrollbars.setScrollLeft(val)
-}
+import { updateDisplaySimple } from "./update_display"
+import { setScrollLeft, updateScrollTop } from "./scrolling"
 
 // Since the delta values reported on mouse wheel events are
 // unstandardized between browsers and even browser versions, and
diff --git a/src/display/scrollbars.js b/src/display/scrollbars.js
index d2f73c9154ebe10655075e78abab6483c595d880..27060d18ef130b5cfb4dfcc5630d2a6de72d855e 100644
--- a/src/display/scrollbars.js
+++ b/src/display/scrollbars.js
@@ -5,7 +5,7 @@ import { ie, ie_version, mac, mac_geMountainLion } from "../util/browser"
 import { updateHeightsInViewport } from "./update_lines"
 import { Delayed } from "../util/misc"
 
-import { setScrollLeft, updateScrollTop } from "./scroll_events"
+import { setScrollLeft, updateScrollTop } from "./scrolling"
 
 // SCROLLBARS
 
diff --git a/src/display/scrolling.js b/src/display/scrolling.js
index 5d06a63b500a375da0e739feddd2bf1fee472951..12a13b454a8c7bea2100c03f3be78aa89f3f8111 100644
--- a/src/display/scrolling.js
+++ b/src/display/scrolling.js
@@ -1,10 +1,12 @@
 import { Pos } from "../line/pos"
 import { cursorCoords, displayHeight, displayWidth, estimateCoords, paddingTop, paddingVert, scrollGap, textHeight } from "../measurement/position_measurement"
-import { phantom } from "../util/browser"
+import { gecko, phantom } from "../util/browser"
 import { elt } from "../util/dom"
 import { signalDOMEvent } from "../util/event"
 
-import { setScrollLeft, updateScrollTop } from "./scroll_events"
+import { startWorker } from "./highlight_worker"
+import { alignHorizontally } from "./line_numbers"
+import { updateDisplaySimple } from "./update_display"
 
 // SCROLLING THINGS INTO VIEW
 
@@ -135,3 +137,30 @@ export function resolveScrollToPos(cm) {
     cm.scrollTo(sPos.scrollLeft, sPos.scrollTop)
   }
 }
+// Sync the scrollable area and scrollbars, ensure the viewport
+// covers the visible area.
+export function updateScrollTop(cm, val) {
+  if (Math.abs(cm.doc.scrollTop - val) < 2) return
+  if (!gecko) updateDisplaySimple(cm, {top: val})
+  setScrollTop(cm, val)
+  if (gecko) updateDisplaySimple(cm)
+  startWorker(cm, 100)
+}
+export function setScrollTop(cm, val, forceScroll) {
+  val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)
+  if (cm.display.scroller.scrollTop == val && !forceScroll) return
+  cm.doc.scrollTop = val
+  cm.display.scrollbars.setScrollTop(val)
+  cm.display.scroller.scrollTop = val
+}
+
+// Sync scroller and scrollbar, ensure the gutter elements are
+// aligned.
+export function setScrollLeft(cm, val, isScroller, forceScroll) {
+  val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)
+  if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) return
+  cm.doc.scrollLeft = val
+  alignHorizontally(cm)
+  if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val
+  cm.display.scrollbars.setScrollLeft(val)
+}
diff --git a/src/edit/CodeMirror.js b/src/edit/CodeMirror.js
index 5f66c9f4f715a6b3ca0b9312889fc117d554bb52..1b2758ec019e7dcc68f9a1109a2fffeb8cd4d6b2 100644
--- a/src/edit/CodeMirror.js
+++ b/src/edit/CodeMirror.js
@@ -4,7 +4,8 @@ import { setGuttersForLineNumbers, updateGutters } from "../display/gutters"
 import { maybeUpdateLineNumberWidth } from "../display/line_numbers"
 import { endOperation, operation, startOperation } from "../display/operations"
 import { initScrollbars } from "../display/scrollbars"
-import { onScrollWheel, setScrollLeft, updateScrollTop } from "../display/scroll_events"
+import { onScrollWheel } from "../display/scroll_events"
+import { setScrollLeft, updateScrollTop } from "../display/scrolling"
 import { clipPos, Pos } from "../line/pos"
 import { posFromMouse } from "../measurement/position_measurement"
 import { eventInWidget } from "../measurement/widgets"