diff --git a/tools/skiaserve/Request.cpp b/tools/skiaserve/Request.cpp
index 2d956c9..a058075 100644
--- a/tools/skiaserve/Request.cpp
+++ b/tools/skiaserve/Request.cpp
@@ -12,6 +12,9 @@
 #include "SkPictureRecorder.h"
 #include "SkPixelSerializer.h"
 
+static int kDefaultWidth = 1920;
+static int kDefaultHeight = 1080;
+
 static void write_png_callback(png_structp png_ptr, png_bytep data, png_size_t length) {
     SkWStream* out = (SkWStream*) png_get_io_ptr(png_ptr);
     out->write(data, length);
@@ -59,7 +62,7 @@
 
 SkBitmap* Request::getBitmapFromCanvas(SkCanvas* canvas) {
     SkBitmap* bmp = new SkBitmap();
-    SkIRect bounds = fPicture->cullRect().roundOut();
+    SkIRect bounds = this->getBounds();
     SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(),
                                          kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
     bmp->setInfo(info);
@@ -108,7 +111,7 @@
 
 SkData* Request::writeOutSkp() {
     // Playback into picture recorder
-    SkIRect bounds = fPicture->cullRect().roundOut();
+    SkIRect bounds = this->getBounds();
     SkPictureRecorder recorder;
     SkCanvas* canvas = recorder.beginRecording(bounds.width(), bounds.height());
 
@@ -124,17 +127,41 @@
     return outStream.copyToData();
 }
 
+GrContext* Request::getContext() {
+  return fContextFactory->get(GrContextFactory::kNative_GLContextType,
+                              GrContextFactory::kNone_GLContextOptions);
+}
+
+SkIRect Request::getBounds() {
+    SkIRect bounds;
+    if (fPicture) {
+        bounds = fPicture->cullRect().roundOut();
+        if (fGPUEnabled) {
+            int maxRTSize = this->getContext()->caps()->maxRenderTargetSize();
+            bounds = SkIRect::MakeWH(SkTMin(bounds.width(), maxRTSize),
+                                     SkTMin(bounds.height(), maxRTSize));
+        }
+    } else {
+        bounds = SkIRect::MakeWH(kDefaultWidth, kDefaultHeight);
+    }
+
+    // We clip to kDefaultWidth / kDefaultHeight for performance reasons
+    // TODO make this configurable
+    bounds = SkIRect::MakeWH(SkTMin(bounds.width(), kDefaultWidth),
+                             SkTMin(bounds.height(), kDefaultHeight));
+    return bounds;
+}
+
 SkSurface* Request::createCPUSurface() {
-    SkIRect bounds = fPicture->cullRect().roundOut();
+    SkIRect bounds = this->getBounds();
     SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(), kN32_SkColorType,
                                          kPremul_SkAlphaType);
     return SkSurface::NewRaster(info);
 }
 
 SkSurface* Request::createGPUSurface() {
-    GrContext* context = fContextFactory->get(GrContextFactory::kNative_GLContextType,
-                                              GrContextFactory::kNone_GLContextOptions);
-    SkIRect bounds = fPicture->cullRect().roundOut();
+    GrContext* context = this->getContext();
+    SkIRect bounds = this->getBounds();
     SkImageInfo info = SkImageInfo::Make(bounds.width(), bounds.height(),
                                          kN32_SkColorType, kPremul_SkAlphaType);
     uint32_t flags = 0;
@@ -167,8 +194,11 @@
         return false;
     }
 
+    // reinitialize canvas with the new picture dimensions
+    this->enableGPU(fGPUEnabled);
+
     // pour picture into debug canvas
-    SkIRect bounds = fPicture->cullRect().roundOut();
+    SkIRect bounds = this->getBounds();
     fDebugCanvas.reset(new SkDebugCanvas(bounds.width(), bounds.height()));
     fDebugCanvas->drawPicture(fPicture);
 
@@ -178,28 +208,6 @@
     return true;
 }
 
-GrAuditTrail* Request::getAuditTrail(SkCanvas* canvas) {
-    GrAuditTrail* at = nullptr;
-#if SK_SUPPORT_GPU
-    GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
-    if (rt) {
-        GrContext* ctx = rt->getContext();
-        if (ctx) {
-            at = ctx->getAuditTrail();
-        }
-    }
-#endif
-    return at;
-}
-
-void Request::cleanupAuditTrail(SkCanvas* canvas) {
-    GrAuditTrail* at = this->getAuditTrail(canvas);
-    if (at) {
-        GrAuditTrail::AutoEnable ae(at);
-        at->fullReset();
-    }
-}
-
 SkData* Request::getJsonOps(int n) {
     SkCanvas* canvas = this->getCanvas();
     Json::Value root = fDebugCanvas->toJSON(fUrlDataManager, n, canvas);
@@ -208,8 +216,6 @@
     SkDynamicMemoryWStream stream;
     stream.writeText(Json::FastWriter().write(root).c_str());
 
-    this->cleanupAuditTrail(canvas);
-
     return stream.copyToData();
 }
 
@@ -217,24 +223,10 @@
     SkCanvas* canvas = this->getCanvas();
     SkASSERT(fGPUEnabled);
 
-    // TODO if this is inefficient we could add a method to GrAuditTrail which takes
-    // a Json::Value and is only compiled in this file
-    Json::Value parsedFromString;
-#if SK_SUPPORT_GPU
-    // we use the toJSON method on debug canvas, but then just ignore the results and pull
-    // the information we care about from the audit trail
-    fDebugCanvas->toJSON(fUrlDataManager, n, canvas); 
-
-    GrAuditTrail* at = this->getAuditTrail(canvas);
-    GrAuditTrail::AutoManageBatchList enable(at);
-    Json::Reader reader;
-    SkDEBUGCODE(bool parsingSuccessful = )reader.parse(at->toJson().c_str(),
-                                                       parsedFromString);
-    SkASSERT(parsingSuccessful);
-#endif
+    Json::Value result = fDebugCanvas->toJSONBatchList(n, canvas);
 
     SkDynamicMemoryWStream stream;
-    stream.writeText(Json::FastWriter().write(parsedFromString).c_str());
+    stream.writeText(Json::FastWriter().write(result).c_str());
 
     return stream.copyToData();
 }
