diff --git a/gm/poly2poly.cpp b/gm/poly2poly.cpp
index 20c117f..fda0474 100644
--- a/gm/poly2poly.cpp
+++ b/gm/poly2poly.cpp
@@ -1,25 +1,189 @@
-
 /*
  * 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 "gm.h"
 
-namespace skiagm {
+class SkJSCanvas {
+public:
+    SkJSCanvas(SkCanvas* target);
+    ~SkJSCanvas();
 
-class Poly2PolyGM : public GM {
+    void save();
+    void restore();
+    
+    double lineWidth;
+    void setLineWidth(double);
+    
+    void beginPath();
+    void moveTo(double x, double y);
+    void lineTo(double x, double y);
+    void closePath();
+    
+    void fill();
+    void stroke();
+    
+    void fillText(const char text[], double x, double y);
+
+private:
+    SkCanvas*   fTarget;
+    SkPaint     fFillPaint;
+    SkPaint     fStrokePaint;
+    SkPath      fPath;
+};
+
+SkJSCanvas::SkJSCanvas(SkCanvas* target) : fTarget(target) {
+    fFillPaint.setAntiAlias(true);
+    fStrokePaint.setAntiAlias(true);
+    fStrokePaint.setStyle(SkPaint::kStroke_Style);
+    fStrokePaint.setStrokeWidth(SK_Scalar1);
+}
+
+SkJSCanvas::~SkJSCanvas() {}
+
+void SkJSCanvas::save() { fTarget->save(); }
+void SkJSCanvas::restore() { fTarget->restore(); }
+
+void SkJSCanvas::beginPath() { fPath.reset(); }
+void SkJSCanvas::moveTo(double x, double y) {
+    fPath.moveTo(SkDoubleToScalar(x), SkDoubleToScalar(y));
+}
+
+void SkJSCanvas::lineTo(double x, double y) {
+    fPath.lineTo(SkDoubleToScalar(x), SkDoubleToScalar(y));
+}
+
+void SkJSCanvas::closePath() { fPath.close(); }
+
+void SkJSCanvas::fill() {
+    fTarget->drawPath(fPath, fFillPaint);
+}
+
+void SkJSCanvas::stroke() {
+    fStrokePaint.setStrokeWidth(SkDoubleToScalar(lineWidth));
+    fTarget->drawPath(fPath, fStrokePaint);
+}
+
+void SkJSCanvas::fillText(const char text[], double x, double y) {
+    fTarget->drawText(text, strlen(text),
+                      SkDoubleToScalar(x), SkDoubleToScalar(y), fFillPaint);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+static void dump(const SkPath& path) {
+    const SkRect& r = path.getBounds();
+    SkDebugf("isEmpty %d, bounds [%g %g %g %g]\n", path.isEmpty(),
+             r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+
+static void test_stroke(SkCanvas* canvas) {
+    if (true) {
+        SkPath path;
+        dump(path);
+        path.reset(); path.moveTo(0, 0);
+        dump(path);
+        path.reset(); path.moveTo(100, 100);
+        dump(path);
+        path.reset(); path.moveTo(0, 0); path.moveTo(100, 100);
+        dump(path);
+        path.reset(); path.moveTo(0, 0); path.lineTo(100, 100);
+        dump(path);
+        path.reset(); path.moveTo(0, 0); path.lineTo(100, 100); path.moveTo(200, 200);
+        dump(path);
+    }
+    
+#if 0
+    // TEST 1 - The rectangle as it's expected to look
+    var canvas = document.createElement('canvas');
+    document.body.appendChild(canvas);
+    var ctx = canvas.getContext("2d");
+#else
+    SkJSCanvas ctx(canvas);
+#endif
+
+    ctx.save();
+    ctx.lineWidth = 2;
+    ctx.beginPath();
+    ctx.moveTo(10, 100);
+    ctx.lineTo(150, 100);
+    ctx.lineTo(150, 15);
+    ctx.lineTo(10, 15);
+    ctx.closePath();
+    
+    // no extra moveTo here
+    // ctx.moveTo(175, 125);
+    
+    ctx.stroke();
+    ctx.restore();
+    
+    ctx.fillText("As Expected", 10, 10);
+    
+#if 0
+    // TEST 2 - Includes an extra moveTo call before stroke; the rectangle appears larger
+    canvas = document.createElement('canvas');
+    document.body.appendChild(canvas);
+    ctx = canvas.getContext("2d");
+#else
+    canvas->translate(200, 0);
+#endif
+
+    ctx.save();
+    ctx.lineWidth = 2;
+    ctx.beginPath();
+    ctx.moveTo(10, 100);
+    ctx.lineTo(150, 100);
+    ctx.lineTo(150, 15);
+    ctx.lineTo(10, 15);
+    ctx.closePath();
+    
+    ctx.moveTo(175, 125);
+    
+    ctx.stroke();
+    ctx.restore();
+    
+    ctx.fillText("Larger Rectangle", 10, 10);
+    
+#if 0
+    // TEST 3 - Identical to test 2 except the line width is 1
+    canvas = document.createElement('canvas');
+    document.body.appendChild(canvas);
+    ctx = canvas.getContext("2d");
+#else
+    canvas->translate(200, 0);
+#endif
+
+    ctx.save();
+    ctx.lineWidth = 1;
+    ctx.beginPath();
+    ctx.moveTo(10, 100);
+    ctx.lineTo(150, 100);
+    ctx.lineTo(150, 15);
+    ctx.lineTo(10, 15);
+    ctx.closePath();
+    
+    ctx.moveTo(175, 125);
+    
+    ctx.stroke();
+    ctx.restore();
+    
+    ctx.fillText("As Expected - line width 1", 10, 10);
+}
+
+class Poly2PolyGM : public skiagm::GM {
 public:
     Poly2PolyGM() {}
 
 protected:
-    virtual SkString onShortName() {
+    virtual SkString onShortName() SK_OVERRIDE {
         return SkString("poly2poly");
     }
 
-    virtual SkISize onISize() {
-        return make_isize(835, 840);
+    virtual SkISize onISize() SK_OVERRIDE {
+        return SkISize::Make(835, 840);
     }
 
     static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[],
@@ -56,7 +220,9 @@
         canvas->restore();
     }
 
-    virtual void onDraw(SkCanvas* canvas) {
+    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+        if (false) { test_stroke(canvas); return; }
+
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStrokeWidth(SkIntToScalar(4));
@@ -97,12 +263,10 @@
     }
 
 private:
-    typedef GM INHERITED;
+    typedef skiagm::GM INHERITED;
 };
 
 //////////////////////////////////////////////////////////////////////////////
 
-static GM* MyFactory(void*) { return new Poly2PolyGM; }
-static GMRegistry reg(MyFactory);
+DEF_GM( return new Poly2PolyGM; )
 
-}
