diff --git a/gm/gm.h b/gm/gm.h
index bec29bf..d75a1c1 100644
--- a/gm/gm.h
+++ b/gm/gm.h
@@ -45,15 +45,7 @@
         uint32_t getFlags() const {
             return this->onGetFlags();
         }
-
-        // TODO(vandebo) Instead of exposing this, we should run all the GMs
-        // with and without an initial transform.
-        // Most GMs will return the identity matrix, but some PDFs tests
-        // require setting the initial transform.
-        SkMatrix getInitialTransform() const {
-            return this->onGetInitialTransform();
-        }
-
+        
         SkColor getBGColor() const { return fBGColor; }
         void setBGColor(SkColor);
 
@@ -73,8 +65,7 @@
         virtual SkISize onISize() = 0;
         virtual SkString onShortName() = 0;
         virtual uint32_t onGetFlags() const { return 0; }
-        virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); }
-
+        
     private:
         SkString fShortName;
         SkColor  fBGColor;
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 1e63bb6..61095e1 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -264,10 +264,7 @@
     }
 }
 
-static void invokeGM(GM* gm, SkCanvas* canvas, bool isPDF = false) {
-    if (!isPDF) {
-        canvas->setMatrix(gm->getInitialTransform());
-    }
+static void invokeGM(GM* gm, SkCanvas* canvas) {
     installFilter(canvas);
     gm->draw(canvas);
     canvas->setDrawFilter(NULL);
@@ -326,26 +323,14 @@
 
 static void generate_pdf(GM* gm, SkDynamicMemoryWStream& pdf) {
 #ifdef SK_SUPPORT_PDF
-    SkMatrix initialTransform = gm->getInitialTransform();
-    SkISize pageSize = gm->getISize();
-    SkPDFDevice* dev = NULL;
-    if (initialTransform.isIdentity()) {
-        dev = new SkPDFDevice(pageSize, pageSize, initialTransform);
-    } else {
-        SkRect content = SkRect::MakeWH(SkIntToScalar(pageSize.width()),
-                                        SkIntToScalar(pageSize.height()));
-        initialTransform.mapRect(&content);
-        content.intersect(0, 0, SkIntToScalar(pageSize.width()),
-                                SkIntToScalar(pageSize.height()));
-        SkISize contentSize =
-            SkISize::Make(SkScalarRoundToInt(content.width()),
-                          SkScalarRoundToInt(content.height()));
-        dev = new SkPDFDevice(pageSize, contentSize, initialTransform);
-    }
+    SkISize size = gm->getISize();
+    SkMatrix identity;
+    identity.reset();
+    SkPDFDevice* dev = new SkPDFDevice(size, size, identity);
     SkAutoUnref aur(dev);
 
     SkCanvas c(dev);
-    invokeGM(gm, &c, true);
+    invokeGM(gm, &c);
 
     SkPDFDocument doc;
     doc.appendPage(dev);
diff --git a/gm/shaderbounds.cpp b/gm/shaderbounds.cpp
deleted file mode 100644
index d301f6c..0000000
--- a/gm/shaderbounds.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include "gm.h"
-#include "SkGradientShader.h"
-
-namespace skiagm {
-
-static SkShader* MakeLinear(SkScalar width, SkScalar height, bool alternate) {
-  SkPoint pts[2] = { {0, 0}, {width, height}};
-  SkColor colors[2] = {SK_ColorRED, SK_ColorGREEN};
-  if (alternate) {
-    pts[1].fY = 0;
-    colors[0] = SK_ColorBLUE;
-    colors[1] = SK_ColorYELLOW;
-  }
-  return SkGradientShader::CreateLinear(pts, colors, NULL, 2,
-                                        SkShader::kClamp_TileMode, NULL);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-class ShaderBoundsGM : public GM {
-public:
-    typedef SkShader* (*ShaderGenFunc)(SkScalar width, SkScalar height,
-                                       bool alternate);
-    ShaderBoundsGM(ShaderGenFunc maker, const SkString& name)
-        : fShaderMaker(maker),
-          fName(name) {
-    }
-
-protected:
-    SkString onShortName() {
-        return fName;
-    }
-
-    virtual SkISize onISize() { return make_isize(320, 240); }
-
-    virtual SkMatrix onGetInitialTransform() const SK_OVERRIDE {
-        SkMatrix result;
-        SkScalar scale = SkFloatToScalar(0.8f);
-        result.setScale(scale, scale);
-        result.postTranslate(7, 23);
-        return result;
-    }
-
-    virtual void onDraw(SkCanvas* canvas) {
-        // The PDF device has already clipped to the content area, but we
-        // do it again here so that the raster and pdf results are consistent.
-        canvas->clipRect(SkRect::MakeWH(320, 240));
-
-        SkMatrix canvasScale;
-        SkScalar scale = SkFloatToScalar(0.7f);
-        canvasScale.setScale(scale, scale);
-        canvas->concat(canvasScale);
-
-        // Background shader.
-        SkPaint paint;
-        paint.setShader(MakeShader(559, 387, false))->unref();
-        SkRect r = SkRect::MakeXYWH(SkIntToScalar(-12), SkIntToScalar(-41),
-                                    SkIntToScalar(571), SkIntToScalar(428));
-        canvas->drawRect(r, paint);
-
-        // Constrained shader.
-        paint.setShader(MakeShader(101, 151, true))->unref();
-        r = SkRect::MakeXYWH(SkIntToScalar(43), SkIntToScalar(71),
-                             SkIntToScalar(101), SkIntToScalar(151));
-        canvas->clipRect(r);
-        canvas->drawRect(r, paint);
-    }
-
-    SkShader* MakeShader(int width, int height, bool background) {
-        SkScalar scale = SkFloatToScalar(0.5f);
-        if (background) {
-            scale = SkFloatToScalar(0.6f);
-        }
-        SkScalar shaderWidth = SkIntToScalar(width)/scale;
-        SkScalar shaderHeight = SkIntToScalar(height)/scale;
-        SkShader* shader = fShaderMaker(shaderWidth, shaderHeight, background);
-        SkMatrix shaderScale;
-        shaderScale.setScale(scale, scale);
-        shader->setLocalMatrix(shaderScale);
-        return shader;
-    }
-
-private:
-    typedef GM INHERITED;
-
-    ShaderGenFunc fShaderMaker;
-    SkString fName;
-
-    SkShader* MakeShader(bool background);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-static GM* MyFactory(void*) {
-    return new ShaderBoundsGM(MakeLinear, SkString("shaderbounds_linear"));
-}
-static GMRegistry reg(MyFactory);
-
-}
diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi
index 5beac2b..ec223fb 100644
--- a/gyp/gmslides.gypi
+++ b/gyp/gmslides.gypi
@@ -37,7 +37,6 @@
     '../gm/points.cpp',
     '../gm/poly2poly.cpp',
     '../gm/quadpaths.cpp',
-    '../gm/shaderbounds.cpp',
     '../gm/shadertext.cpp',
     '../gm/shadows.cpp',
     '../gm/shapes.cpp',
