diff --git a/tools/VisualBench/VisualDebugModule.cpp b/tools/VisualBench/VisualDebugModule.cpp
new file mode 100644
index 0000000..e4e70dd
--- /dev/null
+++ b/tools/VisualBench/VisualDebugModule.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "VisualDebugModule.h"
+
+#include "SkCanvas.h"
+
+VisualDebugModule::VisualDebugModule(VisualBench* owner)
+    : fState(kInit_State)
+    , fIndex(0)
+    , fOwner(owner) {
+    // VisualDebugModule only really makes sense for SKPs
+    fBenchmarkStream.reset(new VisualBenchmarkStream(owner->getSurfaceProps(), true));
+}
+
+bool VisualDebugModule::advanceIfNecessary(SkCanvas* canvas) {
+    Benchmark* benchmark = fBenchmarkStream->current();
+    switch (fState) {
+        case kInit_State: {
+            // setup new benchmark
+            benchmark->delayedSetup();
+            fOwner->clear(canvas, SK_ColorWHITE, 3);
+            benchmark->preTimingHooks(canvas);
+
+            // reset debug canvas
+            SkIPoint size = benchmark->getSize();
+            fDebugCanvas.reset(new SkDebugCanvas(size.fX, size.fY));
+
+            // pour benchmark into canvas
+            benchmark->draw(1, fDebugCanvas);
+            fIndex = fDebugCanvas->getSize() - 1;
+            fState = kPlay_State;
+            break;
+        }
+        case kPlay_State: break;
+        case kNext_State:
+            // cleanup after the last SKP
+            benchmark->postTimingHooks(canvas);
+            fOwner->reset();
+            if (!fBenchmarkStream->next()) {
+                SkDebugf("Exiting VisualBench successfully\n");
+                fOwner->closeWindow();
+                return false;
+            }
+            fState = kInit_State;
+            break;
+    }
+    return true;
+}
+
+void VisualDebugModule::draw(SkCanvas* canvas) {
+    if (!fBenchmarkStream->current() || !this->advanceIfNecessary(canvas)) {
+        return;
+    }
+
+    fDebugCanvas->drawTo(canvas, fIndex);
+    canvas->flush();
+    fOwner->present();
+}
+
+bool VisualDebugModule::onHandleChar(SkUnichar c) {
+    switch (c) {
+        case ' ': fState = kNext_State; break;
+        case 'a': fIndex = (fIndex + 1) % (fDebugCanvas->getSize() - 1); break;
+        case 's': fIndex = fIndex <= 0 ? fDebugCanvas->getSize() - 1 : fIndex - 1; break;
+        default: break;
+    }
+
+    return true;
+}
