diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 9712b6b..09e34f6 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -671,7 +671,7 @@
     SkScalar    w, h;
 };
 
-static struct TilingInfo gTilingInfo[] = {
+static const struct TilingInfo gTilingInfo[] = {
     { "No tiling", SK_Scalar1        , SK_Scalar1         }, // kNo_Tiling
     { "128x128"  , SkIntToScalar(128), SkIntToScalar(128) }, // kAbs_128x128_Tiling
     { "256x256"  , SkIntToScalar(256), SkIntToScalar(256) }, // kAbs_256x256_Tiling
@@ -682,6 +682,12 @@
 SK_COMPILE_ASSERT((SK_ARRAY_COUNT(gTilingInfo) == kLast_TilingMode_Enum),
                   Incomplete_tiling_labels);
 
+SkSize SampleWindow::tileSize() const {
+    SkASSERT((TilingMode)fTilingMode < kLast_TilingMode_Enum);
+    const struct TilingInfo* info = gTilingInfo + fTilingMode;
+    return SkSize::Make(info->w > SK_Scalar1 ? info->w : this->width() * info->w,
+                        info->h > SK_Scalar1 ? info->h : this->height() * info->h);
+}
 //////////////////////////////////////////////////////////////////////////////
 
 static SkView* curr_view(SkWindow* wind) {
@@ -1222,11 +1228,7 @@
         if (bitmap_diff(canvas, orig, &diff)) {
         }
     } else {
-        SkSize tile;
-        SkASSERT((TilingMode)fTilingMode < kLast_TilingMode_Enum);
-        struct TilingInfo* info = gTilingInfo + fTilingMode;
-        tile.set(info->w > SK_Scalar1 ? info->w : width() * info->w,
-                 info->h > SK_Scalar1 ? info->h : height() * info->h);
+        SkSize tile = this->tileSize();
 
         for (SkScalar y = 0; y < height(); y += tile.height()) {
             for (SkScalar x = 0; x < width(); x += tile.width()) {
@@ -1760,8 +1762,15 @@
         SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) ||
         SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify) ||
         SkOSMenu::FindListIndex(evt, "Transition-Next", &fTransitionNext) ||
-        SkOSMenu::FindListIndex(evt, "Transition-Prev", &fTransitionPrev) ||
-        SkOSMenu::FindListIndex(evt, "Tiling", &fTilingMode)) {
+        SkOSMenu::FindListIndex(evt, "Transition-Prev", &fTransitionPrev)) {
+        this->inval(NULL);
+        this->updateTitle();
+        return true;
+    }
+    if (SkOSMenu::FindListIndex(evt, "Tiling", &fTilingMode)) {
+        if (SampleView::IsSampleView(curr_view(this))) {
+            ((SampleView*)curr_view(this))->onTileSizeChanged(this->tileSize());
+        }
         this->inval(NULL);
         this->updateTitle();
         return true;
@@ -2121,8 +2130,11 @@
     fSlideMenu->reset();
 
     (void)SampleView::SetUsePipe(view, fPipeState);
-    if (SampleView::IsSampleView(view))
-        ((SampleView*)view)->requestMenu(fSlideMenu);
+    if (SampleView::IsSampleView(view)) {
+        SampleView* sampleView = (SampleView*)view;
+        sampleView->requestMenu(fSlideMenu);
+        sampleView->onTileSizeChanged(this->tileSize());
+    }
     this->onUpdateMenu(fSlideMenu);
     this->updateTitle();
 }
@@ -2275,6 +2287,10 @@
 #endif
     this->updateTitle();    // to refresh our config
     fDevManager->windowSizeChanged(this);
+
+    if (fTilingMode != kNo_Tiling && SampleView::IsSampleView(view)) {
+        ((SampleView*)view)->onTileSizeChanged(this->tileSize());
+    }
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SampleApp.h b/samplecode/SampleApp.h
index 3e42dd6..106931c 100644
--- a/samplecode/SampleApp.h
+++ b/samplecode/SampleApp.h
@@ -243,6 +243,7 @@
     void installDrawFilter(SkCanvas*);
     int findByTitle(const char*);
     void listTitles();
+    SkSize tileSize() const;
 
     typedef SkOSWindow INHERITED;
 };
diff --git a/samplecode/SampleCode.h b/samplecode/SampleCode.h
index 2dacc1f..afca4d2 100644
--- a/samplecode/SampleCode.h
+++ b/samplecode/SampleCode.h
@@ -129,6 +129,8 @@
      */
     virtual void requestMenu(SkOSMenu* menu) {}
 
+    virtual void onTileSizeChanged(const SkSize& tileSize) {}
+
 protected:
     virtual void onDrawBackground(SkCanvas*);
     virtual void onDrawContent(SkCanvas*) = 0;
diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
index b8298d4..e81a1ad 100644
--- a/samplecode/SamplePictFile.cpp
+++ b/samplecode/SamplePictFile.cpp
@@ -19,6 +19,7 @@
 #include "SkRandom.h"
 #include "SkRegion.h"
 #include "SkShader.h"
+#include "SkTileGridPicture.h"
 #include "SkUtils.h"
 #include "SkColorPriv.h"
 #include "SkColorFilter.h"
@@ -31,12 +32,81 @@
 #include "SkXMLParser.h"
 
 class PictFileView : public SampleView {
-    SkString    fFilename;
-    SkPicture*  fPicture;
-    SkPicture*  fBBoxPicture;
-    bool        fUseBBox;
+public:
+    PictFileView(const char name[] = NULL)
+        : fFilename(name)
+        , fBBox(kNo_BBoxType)
+        , fTileSize(SkSize::Make(0, 0)) {
+        for (unsigned i = 0; i < kBBoxTypeCount; ++i) {
+            fPictures[i] = NULL;
+        }
+    }
 
-    static SkPicture* LoadPicture(const char path[], bool useBBox) {
+    virtual ~PictFileView() {
+        for (unsigned i = 0; i < kBBoxTypeCount; ++i) {
+            SkSafeUnref(fPictures[i]);
+        }
+    }
+
+    virtual void onTileSizeChanged(const SkSize &tileSize) SK_OVERRIDE {
+        if (tileSize != fTileSize) {
+            fTileSize = tileSize;
+            SkSafeSetNull(fPictures[kTileGrid_BBoxType]);
+        }
+    }
+
+protected:
+    // overrides from SkEventSink
+    virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
+        if (SampleCode::TitleQ(*evt)) {
+            SkString name("P:");
+            const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
+            name.append(basename ? basename+1: fFilename.c_str());
+            if (fBBox != kNo_BBoxType) {
+                name.append(fBBox == kRTree_BBoxType ? " <bbox: R>" : " <bbox: T>");
+            }
+            SampleCode::TitleR(evt, name.c_str());
+            return true;
+        }
+        return this->INHERITED::onQuery(evt);
+    }
+
+    virtual bool onEvent(const SkEvent& evt) SK_OVERRIDE {
+        if (evt.isType("PictFileView::toggleBBox")) {
+            fBBox = (BBoxType)((fBBox + 1) % kBBoxTypeCount);
+            return true;
+        }
+        return this->INHERITED::onEvent(evt);
+    }
+
+    virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE {
+        SkASSERT(fBBox < kBBoxTypeCount);
+        SkPicture** picture = fPictures + fBBox;
+
+        if (!*picture) {
+            *picture = LoadPicture(fFilename.c_str(), fBBox);
+        }
+        if (*picture) {
+            canvas->drawPicture(**picture);
+        }
+    }
+
+private:
+    enum BBoxType {
+        kNo_BBoxType,
+        kRTree_BBoxType,
+        kTileGrid_BBoxType,
+
+        kLast_BBoxType = kTileGrid_BBoxType
+    };
+    static const unsigned kBBoxTypeCount = kLast_BBoxType + 1;
+
+    SkString    fFilename;
+    SkPicture*  fPictures[kBBoxTypeCount];
+    BBoxType    fBBox;
+    SkSize      fTileSize;
+
+    SkPicture* LoadPicture(const char path[], BBoxType bbox) {
         SkPicture* pic = NULL;
 
         SkBitmap bm;
@@ -71,67 +141,41 @@
             }
         }
 
-        if (useBBox) {
-            SkPicture* bboxPicture = SkNEW(SkPicture);
+        if (!pic) {
+            return NULL;
+        }
+
+        SkPicture* bboxPicture = NULL;
+        switch (bbox) {
+        case kNo_BBoxType:
+            // no bbox playback necessary
+            break;
+        case kRTree_BBoxType:
+            bboxPicture = SkNEW(SkPicture);
+            break;
+        case kTileGrid_BBoxType: {
+            SkASSERT(!fTileSize.isEmpty());
+            SkTileGridPicture::TileGridInfo gridInfo;
+            gridInfo.fMargin = SkISize::Make(0, 0);
+            gridInfo.fOffset = SkIPoint::Make(0, 0);
+            gridInfo.fTileInterval = fTileSize.toRound();
+            bboxPicture = SkNEW_ARGS(SkTileGridPicture, (pic->width(), pic->height(), gridInfo));
+        } break;
+        default:
+            SkASSERT(false);
+        }
+
+        if (bboxPicture) {
             pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(),
-                    SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
+                      SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
             bboxPicture->endRecording();
             SkDELETE(pic);
             return bboxPicture;
-
-        } else {
-            return pic;
         }
+
+        return pic;
     }
 
-public:
-    PictFileView(const char name[] = NULL) : fFilename(name) {
-        fPicture = NULL;
-        fBBoxPicture = NULL;
-        fUseBBox = false;
-    }
-
-    virtual ~PictFileView() {
-        SkSafeUnref(fPicture);
-        SkSafeUnref(fBBoxPicture);
-    }
-
-protected:
-    // overrides from SkEventSink
-    virtual bool onQuery(SkEvent* evt) {
-        if (SampleCode::TitleQ(*evt)) {
-            SkString name("P:");
-            const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
-            name.append(basename ? basename+1: fFilename.c_str());
-            if (fUseBBox) {
-                name.append(" <bbox>");
-            }
-            SampleCode::TitleR(evt, name.c_str());
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
-
-    virtual bool onEvent(const SkEvent& evt) {
-        if (evt.isType("PictFileView::toggleBBox")) {
-            fUseBBox = !fUseBBox;
-            return true;
-        }
-        return this->INHERITED::onEvent(evt);
-    }
-
-    virtual void onDrawContent(SkCanvas* canvas) {
-        SkPicture** picture = fUseBBox ? &fBBoxPicture : &fPicture;
-
-        if (!*picture) {
-            *picture = LoadPicture(fFilename.c_str(), fUseBBox);
-        }
-        if (*picture) {
-            canvas->drawPicture(**picture);
-        }
-    }
-
-private:
     typedef SampleView INHERITED;
 };
 
