diff --git a/tests/PictureStateTreeTest.cpp b/tests/PictureStateTreeTest.cpp
new file mode 100644
index 0000000..e6cf553
--- /dev/null
+++ b/tests/PictureStateTreeTest.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkBBHFactory.h"
+#include "SkCanvas.h"
+#include "SkPictureRecorder.h"
+#include "SkPictureStateTree.h"
+#include "Test.h"
+
+static SkPicture* draw_scene(SkBBHFactory* bbhFactory) {
+    SkPictureRecorder recorder;
+    SkCanvas* canvas = recorder.beginRecording(200, 200, bbhFactory, 0);
+
+    SkPaint p1, p2;
+    p1.setStyle(SkPaint::kFill_Style);
+    p1.setARGB(0x80, 0, 0xff, 0);
+    p2.setStyle(SkPaint::kFill_Style);
+    p2.setARGB(0x80, 0xff, 0, 0);
+
+    canvas->drawColor(SK_ColorWHITE);
+
+    // This is intended to exercise some tricky SkPictureStateTree code paths when
+    // played back with various clips:
+    //
+    //   * cleanup/rewind when the last draw is not at the root of the state tree.
+    //   * state nodes with both kSave_Flag & kSaveLayer_Flag set.
+    //   * state tree transitions which implicitly reset the matrix via. restore().
+
+    canvas->save();
+      canvas->translate(10, 10);
+
+      canvas->drawRect(SkRect::MakeWH(100, 50), p1);
+      canvas->drawRect(SkRect::MakeWH(50, 100), p2);
+
+      SkRect layerBounds = SkRect::MakeXYWH(0, 0, 90, 90);
+      canvas->saveLayer(&layerBounds, NULL);
+        canvas->save();
+          canvas->clipRect(layerBounds);
+
+          canvas->save();
+            canvas->clipRect(SkRect::MakeWH(25, 25));
+            canvas->rotate(90);
+            canvas->drawRect(SkRect::MakeWH(100, 50), p1);
+          canvas->restore();
+
+          canvas->save();
+            canvas->clipRect(SkRect::MakeWH(25, 25));
+            canvas->save();
+              canvas->rotate(90);
+              canvas->drawRect(SkRect::MakeWH(50, 100), p2);
+            canvas->restore();
+            canvas->drawRect(SkRect::MakeWH(100, 50), p1);
+          canvas->restore();
+          canvas->drawRect(SkRect::MakeXYWH(99, 99, 1, 1), p1);
+        canvas->restore();
+      canvas->restore();
+
+    canvas->restore();
+
+    return recorder.endRecording();
+}
+
+static void check_bms(skiatest::Reporter* reporter, const SkBitmap& bm1, const SkBitmap& bm2) {
+    SkASSERT(bm1.getSize() == bm2.getSize());
+    REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getAddr(0, 0), bm2.getAddr(0, 0), bm1.getSize()));
+}
+
+static void test_reference_picture(skiatest::Reporter* reporter) {
+    SkRTreeFactory bbhFactory;
+
+    SkAutoTUnref<SkPicture> bbhPicture(draw_scene(&bbhFactory));
+    SkAutoTUnref<SkPicture> referencePicture(draw_scene(NULL));
+
+    SkBitmap referenceBitmap;
+    referenceBitmap.allocN32Pixels(100, 100);
+    SkCanvas referenceCanvas(referenceBitmap);
+
+    SkBitmap bbhBitmap;
+    bbhBitmap.allocN32Pixels(100, 100);
+    SkCanvas bbhCanvas(bbhBitmap);
+
+    referenceCanvas.drawColor(SK_ColorTRANSPARENT);
+    referenceCanvas.drawPicture(*referencePicture.get());
+    bbhCanvas.drawColor(SK_ColorTRANSPARENT);
+    bbhCanvas.drawPicture(*bbhPicture.get());
+    REPORTER_ASSERT(reporter,
+                    referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount());
+    REPORTER_ASSERT(reporter,
+                    referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix());
+    check_bms(reporter, referenceBitmap, bbhBitmap);
+
+    referenceCanvas.drawColor(SK_ColorTRANSPARENT);
+    referenceCanvas.clipRect(SkRect::MakeWH(50, 50));
+    referenceCanvas.drawPicture(*referencePicture.get());
+    bbhCanvas.drawColor(SK_ColorTRANSPARENT);
+    bbhCanvas.clipRect(SkRect::MakeWH(50, 50));
+    bbhCanvas.drawPicture(*bbhPicture.get());
+    REPORTER_ASSERT(reporter,
+                    referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount());
+    REPORTER_ASSERT(reporter,
+                    referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix());
+    check_bms(reporter, referenceBitmap, bbhBitmap);
+
+    referenceCanvas.drawColor(SK_ColorTRANSPARENT);
+    referenceCanvas.clipRect(SkRect::MakeWH(10, 10));
+    referenceCanvas.drawPicture(*referencePicture.get());
+    bbhCanvas.drawColor(SK_ColorTRANSPARENT);
+    bbhCanvas.clipRect(SkRect::MakeWH(10, 10));
+    bbhCanvas.drawPicture(*bbhPicture.get());
+    REPORTER_ASSERT(reporter,
+                    referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount());
+    REPORTER_ASSERT(reporter,
+                    referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix());
+    check_bms(reporter, referenceBitmap, bbhBitmap);
+}
+
+DEF_TEST(PictureStateTree, reporter) {
+    test_reference_picture(reporter);
+}
