diff --git a/gm/simpleaaclip.cpp b/gm/simpleaaclip.cpp
new file mode 100644
index 0000000..6873816
--- /dev/null
+++ b/gm/simpleaaclip.cpp
@@ -0,0 +1,209 @@
+/*
+ * 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 "SkCanvas.h"
+#include "SkAAClip.h"
+
+namespace skiagm {
+
+static void paint_rgn(SkCanvas* canvas, const SkAAClip& clip,
+                      const SkPaint& paint) {
+    SkMask mask;
+    SkBitmap bm;
+
+    clip.copyToMask(&mask);
+
+    SkAutoMaskFreeImage amfi(mask.fImage);
+
+    bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
+                 mask.fBounds.height(), mask.fRowBytes);
+    bm.setPixels(mask.fImage);
+
+    // need to copy for deferred drawing test to work
+    SkBitmap bm2;
+
+    bm.deepCopyTo(&bm2, SkBitmap::kA8_Config);
+
+    canvas->drawBitmap(bm2,
+                       SK_Scalar1 * mask.fBounds.fLeft,
+                       SK_Scalar1 * mask.fBounds.fTop,
+                       &paint);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/*
+ * This GM tests anti aliased single operation booleans with SkAAClips, 
+ * SkRect and SkPaths.
+ */
+class SimpleClipGM : public GM {
+public:
+    enum SkGeomTypes {
+        kRect_GeomType,
+        kPath_GeomType,
+        kAAClip_GeomType
+    };
+
+    SimpleClipGM(SkGeomTypes geomType)
+    : fGeomType(geomType) {
+
+        // offset the rects a bit so we get anti-aliasing in the rect case
+        fBase.set(SkFloatToScalar(100.5f), 
+                  SkFloatToScalar(100.5f), 
+                  SkFloatToScalar(150.5f), 
+                  SkFloatToScalar(150.5f));
+        fRect = fBase;
+        fRect.inset(5, 5);
+        fRect.offset(25, 25);
+
+        fBasePath.addRoundRect(fBase, SkIntToScalar(5), SkIntToScalar(5));
+        fRectPath.addRoundRect(fRect, SkIntToScalar(5), SkIntToScalar(5));
+        INHERITED::setBGColor(0xFFDDDDDD);
+    }
+
+protected:
+    void buildRgn(SkAAClip* clip, SkRegion::Op op) {
+        clip->setPath(fBasePath, NULL, true);
+
+        SkAAClip clip2;
+        clip2.setPath(fRectPath, NULL, true);
+        clip->op(clip2, op);
+    }
+
+    void drawOrig(SkCanvas* canvas) {
+        SkPaint     paint;
+        
+        paint.setStyle(SkPaint::kStroke_Style);
+        paint.setColor(SK_ColorBLACK);
+        
+        canvas->drawRect(fBase, paint);
+        canvas->drawRect(fRect, paint);
+    }
+    
+    void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
+
+        SkAAClip clip;
+
+        this->buildRgn(&clip, op);
+        this->drawOrig(canvas);
+
+        SkPaint paint;
+        paint.setColor(color);
+        paint_rgn(canvas, clip, paint);
+    }
+
+    void drawPathsOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
+
+        this->drawOrig(canvas);
+
+        canvas->save();
+
+        // create the clip mask with the supplied boolean op
+        if (kPath_GeomType == fGeomType) {
+            // path-based case
+            canvas->clipPath(fBasePath, SkRegion::kReplace_Op, true);
+            canvas->clipPath(fRectPath, op, true);
+        } else {
+            // rect-based case
+            canvas->clipRect(fBase, SkRegion::kReplace_Op, true);
+            canvas->clipRect(fRect, op, true);
+        }
+
+        // draw a rect that will entirely cover the clip mask area
+        SkPaint paint;
+        paint.setColor(color);
+
+        SkRect r = SkRect::MakeLTRB(SkIntToScalar(90),  SkIntToScalar(90),
+                                    SkIntToScalar(180), SkIntToScalar(180));
+
+        canvas->drawRect(r, paint);
+
+        canvas->restore();
+    }
+
+    virtual SkString onShortName() {
+        SkString str;
+        str.printf("simpleaaclip_%s", 
+                    kRect_GeomType == fGeomType ? "rect" :
+                    (kPath_GeomType == fGeomType ? "path" : 
+                    "aaclip"));
+        return str;
+    }
+
+    virtual SkISize onISize() {
+        return make_isize(640, 480);
+    }
+
+    virtual void onDraw(SkCanvas* canvas) {
+
+        static const struct {
+            SkColor         fColor;
+            const char*     fName;
+            SkRegion::Op    fOp;
+        } gOps[] = {
+            { SK_ColorBLACK,    "Difference", SkRegion::kDifference_Op    },
+            { SK_ColorRED,      "Intersect",  SkRegion::kIntersect_Op     },
+            { 0xFF008800,       "Union",      SkRegion::kUnion_Op         },
+            { SK_ColorBLUE,     "XOR",        SkRegion::kXOR_Op           },
+            { SK_ColorGREEN,    "Rev Diff",   SkRegion::kReverseDifference_Op },
+            { SK_ColorYELLOW,   "Replace",    SkRegion::kReplace_Op       }
+        };
+
+        SkPaint textPaint;
+        textPaint.setAntiAlias(true);
+        textPaint.setTextSize(SK_Scalar1*24);
+
+        for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
+            canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
+                             SkIntToScalar(75), SkIntToScalar(50), 
+                             textPaint);
+
+            if (kAAClip_GeomType == fGeomType) {
+                this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor);
+            } else {
+                this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor);
+            }
+
+            if (op && !(op % 3)) {
+                canvas->translate(SkIntToScalar(-600), SkIntToScalar(250));
+            } else {
+                canvas->translate(SkIntToScalar(200), 0);
+            }
+        }
+    }
+private:
+
+    SkGeomTypes fGeomType;
+
+    SkRect fBase;
+    SkRect fRect;
+
+    SkPath fBasePath;       // fBase as a round rect
+    SkPath fRectPath;       // fRect as a round rect
+
+    typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+// rects
+static GM* MyFactory(void*) { return new SimpleClipGM(
+                                            SimpleClipGM::kRect_GeomType); }
+static GMRegistry reg(MyFactory);
+
+// paths
+static GM* MyFactory2(void*) { return new SimpleClipGM(
+                                            SimpleClipGM::kPath_GeomType); }
+static GMRegistry reg2(MyFactory2);
+
+// aa clip
+static GM* MyFactory3(void*) { return new SimpleClipGM(
+                                            SimpleClipGM::kAAClip_GeomType); }
+static GMRegistry reg3(MyFactory3);
+
+}
diff --git a/gyp/SampleApp.gyp b/gyp/SampleApp.gyp
index a9af72a..8452488 100644
--- a/gyp/SampleApp.gyp
+++ b/gyp/SampleApp.gyp
@@ -24,7 +24,6 @@
         '../samplecode/OverView.cpp',
         '../samplecode/Sample2PtRadial.cpp',
         '../samplecode/SampleAAClip.cpp',
-        '../samplecode/SampleAAClip2.cpp',
         '../samplecode/SampleAARects.cpp',
         '../samplecode/SampleAARectModes.cpp',
         '../samplecode/SampleAll.cpp',
diff --git a/gyp/gm.gyp b/gyp/gm.gyp
index 9e3eaac..b333130 100644
--- a/gyp/gm.gyp
+++ b/gyp/gm.gyp
@@ -7,6 +7,9 @@
     {
       'target_name': 'gm',
       'type': 'executable',
+      'include_dirs' : [
+        '../src/core',
+      ],
       'includes': [
         'gmslides.gypi',
       ],
diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi
index 659fe9f..2b64074 100644
--- a/gyp/gmslides.gypi
+++ b/gyp/gmslides.gypi
@@ -46,6 +46,7 @@
     '../gm/shadertext.cpp',
     '../gm/shadows.cpp',
     '../gm/shapes.cpp',
+    '../gm/simpleaaclip.cpp',
     '../gm/strokefill.cpp',
     '../gm/strokerects.cpp',
     '../gm/strokes.cpp',
diff --git a/samplecode/SampleAAClip2.cpp b/samplecode/SampleAAClip2.cpp
deleted file mode 100644
index 6000da0..0000000
--- a/samplecode/SampleAAClip2.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include "SkAAClip.h"
-#include "SampleCode.h"
-#include "SkView.h"
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkPath.h"
-#include "SkRegion.h"
-#include "SkShader.h"
-#include "SkUtils.h"
-#include "SkImageDecoder.h"
-
-#define USE_PATHS 1
-
-#ifdef SK_BUILD_FOR_WIN
-// windows doesn't have roundf
-inline float roundf(float x) { return (x-floor(x))>0.5 ? ceil(x) : floor(x); }
-#endif
-
-static void drawClip(SkCanvas* canvas, const SkAAClip& clip) {
-    SkMask mask;
-    SkBitmap bm;
-    
-    clip.copyToMask(&mask);
-    SkAutoMaskFreeImage amfi(mask.fImage);
-
-    bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
-                 mask.fBounds.height(), mask.fRowBytes);
-    bm.setPixels(mask.fImage);
-    
-    SkPaint paint;
-    canvas->drawBitmap(bm,
-                       SK_Scalar1 * mask.fBounds.fLeft,
-                       SK_Scalar1 * mask.fBounds.fTop,
-                       &paint);
-}
-
-static void paint_rgn(SkCanvas* canvas, const SkAAClip& clip,
-                      const SkPaint& paint) {
-    SkMask mask;
-    SkBitmap bm;
-    
-    clip.copyToMask(&mask);
-    SkAutoMaskFreeImage amfi(mask.fImage);
-
-    bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
-                 mask.fBounds.height(), mask.fRowBytes);
-    bm.setPixels(mask.fImage);
-    
-    canvas->drawBitmap(bm,
-                       SK_Scalar1 * mask.fBounds.fLeft,
-                       SK_Scalar1 * mask.fBounds.fTop,
-                       &paint);
-}
-
-class AAClipView2 : public SampleView {
-public:
-        AAClipView2() {
-        fBase.set(100, 100, 150, 150);
-        fRect = fBase;
-        fRect.inset(5, 5);
-        fRect.offset(25, 25);
-        this->setBGColor(0xFFDDDDDD);
-    }
-
-    static void setAAClip(SkAAClip* clip, const SkIRect& rect) {
-        SkRect r;
-        r.set(rect);
-        SkPath path;
-        path.addRoundRect(r, SkIntToScalar(5), SkIntToScalar(5));
-        clip->setPath(path, NULL, true);
-    }
-
-    void build_rgn(SkAAClip* clip, SkRegion::Op op) {
-        setAAClip(clip, fBase);
-
-        SkAAClip clip2;
-        setAAClip(&clip2, fRect);
-        clip->op(clip2, op);
-    }
-
-protected:
-    // overrides from SkEventSink
-    virtual bool onQuery(SkEvent* evt) {
-        if (SampleCode::TitleQ(*evt)) {
-            SampleCode::TitleR(evt, "AAClips");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
-    
-    void drawOrig(SkCanvas* canvas, bool bg) {
-        SkRect      r;
-        SkPaint     paint;
-        
-        paint.setStyle(SkPaint::kStroke_Style);
-        if (bg)
-            paint.setColor(0xFFBBBBBB);
-        
-        r.set(fBase);
-        canvas->drawRect(r, paint);
-        r.set(fRect);
-        canvas->drawRect(r, paint);
-    }
-    
-    static void outer_frame(SkCanvas* canvas, const SkIRect& rect) {
-        SkRect r;
-        r.set(rect);
-        r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
-        
-        SkPaint paint;
-        paint.setColor(SK_ColorGRAY);
-        paint.setStyle(SkPaint::kStroke_Style);
-        canvas->drawRect(r, paint);
-    }
-
-    void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
-
-        SkAAClip clip;
-
-        this->build_rgn(&clip, op);
-        this->drawOrig(canvas, true);
-
-        SkPaint paint;
-        paint.setColor((color & ~(0xFF << 24)) | (0x44 << 24));
-        paint_rgn(canvas, clip, paint);
-
-        paint.setStyle(SkPaint::kStroke_Style);
-        paint.setColor(color);
-        paint_rgn(canvas, clip, paint);
-        SkAAClip clip2(clip);
-        clip2.translate(0, 80);
-        outer_frame(canvas, clip2.getBounds());
-        paint_rgn(canvas, clip2, paint);
-    }
-    
-    static void createPath(SkPath *path, const SkIRect& rect) {
-        SkRect r;
-        r.set(rect);
-        path->addRoundRect(r, SkIntToScalar(5), SkIntToScalar(5));
-    }
-
-    void drawPathsOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
-
-        this->drawOrig(canvas, true);
-
-        canvas->save();
-
-        // create the clip mask with the supplied boolean op
-
-#if USE_PATHS
-        // path-based case
-        SkPath base;
-        createPath(&base, fBase);
-
-        canvas->clipPath(base, SkRegion::kReplace_Op, true);
-#else
-        // rect-based case
-        SkRect base;
-        base.set(fBase);
-        // offset the rects so we get a bit of anti-aliasing
-        base.offset(SkFloatToScalar(0.5f), SkFloatToScalar(0.5f));
-        canvas->clipRect(base, SkRegion::kReplace_Op, true);
-
-#endif
-
-#if USE_PATHS
-        // path-based case
-        SkPath rect;
-        createPath(&rect, fRect);
-
-        canvas->clipPath(rect, op, true);
-#else
-        // rect-based case
-        SkRect rect;
-        rect.set(fRect);
-        // offset the rects so we get a bit of anti-aliasing
-        rect.offset(SkFloatToScalar(0.5f), SkFloatToScalar(0.5f));
-        canvas->clipRect(rect, op, true);
-#endif
-
-        // draw a rect that will entirely cover the clip mask area
-        SkPaint paint;
-        paint.setColor(color);
-
-        SkRect r = SkRect::MakeLTRB(SkIntToScalar(90),  SkIntToScalar(90),
-                                    SkIntToScalar(180), SkIntToScalar(180));
-
-        canvas->drawRect(r, paint);
-
-        canvas->restore();
-    }
-
-    virtual void onDrawContent(SkCanvas* canvas) {
-
-        static const struct {
-            SkColor         fColor;
-            const char*     fName;
-            SkRegion::Op    fOp;
-        } gOps[] = {
-            { SK_ColorBLACK,    "Difference", SkRegion::kDifference_Op    },
-            { SK_ColorRED,      "Intersect",  SkRegion::kIntersect_Op     },
-            { 0xFF008800,       "Union",      SkRegion::kUnion_Op         },
-            { SK_ColorBLUE,     "XOR",        SkRegion::kXOR_Op           },
-            { SK_ColorGREEN,    "Rev Diff",   SkRegion::kReverseDifference_Op },
-            { SK_ColorYELLOW,   "Replace",    SkRegion::kReplace_Op       }
-        };
-
-        SkPaint textPaint;
-        textPaint.setAntiAlias(true);
-        textPaint.setTextSize(SK_Scalar1*24);
-
-        this->drawOrig(canvas, false);
-
-        canvas->translate(0, SkIntToScalar(200));
-
-        for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
-            canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
-                             SkIntToScalar(75), SkIntToScalar(50), textPaint);
-
-            this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor);
-
-            if (op && !(op % 3)) {
-                canvas->translate(SkIntToScalar(-600), SkIntToScalar(250));
-            } else {
-                canvas->translate(SkIntToScalar(200), 0);
-            }
-        }
-
-        canvas->translate(SkIntToScalar(int(SK_ARRAY_COUNT(gOps) / 3) * -200), 
-                          SkIntToScalar(250));
-
-        for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
-            canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
-                             SkIntToScalar(75), SkIntToScalar(50), textPaint);
-
-            this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor);
-
-            if (op && !(op % 3)) {
-                canvas->translate(SkIntToScalar(-600), SkIntToScalar(250));
-            } else {
-                canvas->translate(SkIntToScalar(200), 0);
-            }
-        }
-
-    }
-
-    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
-        return fRect.contains(SkScalarRound(x), SkScalarRound(y)) ? new Click(this) : NULL;
-    }
-    
-    virtual bool onClick(Click* click) {
-        fRect.offset(click->fICurr.fX - click->fIPrev.fX,
-                     click->fICurr.fY - click->fIPrev.fY);
-        this->inval(NULL);
-        return true;
-    }
-    
-private:
-    SkIRect    fBase, fRect;
-    
-    typedef SampleView INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-static SkView* MyFactory() { return new AAClipView2; }
-static SkViewRegister reg(MyFactory);
-
