diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 7ab6609..bbde414 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -284,6 +284,7 @@
     bool fRotate;
     bool fScale;
     bool fRequestGrabImage;
+    bool fUsePipe;
     bool fMeasureFPS;
     SkMSec fMeasureFPS_Time;
 
@@ -423,6 +424,7 @@
     fRotate = false;
     fScale = false;
     fRequestGrabImage = false;
+    fUsePipe = false;
     fMeasureFPS = false;
     fLCDState = kUnknown_SkTriState;
     fAAState = kUnknown_SkTriState;
@@ -861,6 +863,7 @@
     } else {
         (void)SampleView::SetRepeatDraw(child, 1);
     }
+    (void)SampleView::SetUsePipe(child, fUsePipe);
 }
 
 void SampleWindow::afterChild(SkView* child, SkCanvas* canvas) {
@@ -1034,6 +1037,10 @@
         case 'o':
             this->zoomOut();
             break;
+        case 'p':
+            fUsePipe = !fUsePipe;
+            this->inval(NULL);
+            break;
         case 'r':
             fRotate = !fRotate;
             this->inval(NULL);
@@ -1315,6 +1322,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 static const char repeat_count_tag[] = "sample-set-repeat-count";
+static const char set_use_pipe_tag[] = "sample-set-use-pipe";
 
 bool SampleView::SetRepeatDraw(SkView* view, int count) {
     SkEvent evt(repeat_count_tag);
@@ -1322,11 +1330,21 @@
     return view->doEvent(evt);
 }
 
+bool SampleView::SetUsePipe(SkView* view, bool pred) {
+    SkEvent evt(set_use_pipe_tag);
+    evt.setFast32(pred);
+    return view->doEvent(evt);
+}
+
 bool SampleView::onEvent(const SkEvent& evt) {
     if (evt.isType(repeat_count_tag)) {
         fRepeatCount = evt.getFast32();
         return true;
     }
+    if (evt.isType(set_use_pipe_tag)) {
+        fUsePipe = !!evt.getFast32();
+        return true;
+    }
     return this->INHERITED::onEvent(evt);
 }
 
@@ -1370,8 +1388,10 @@
 //    SkASSERT(SkGPipeReader::kDone_Status == fStatus);
     sk_free(fBlock);
 
-    SkDebugf("--- %d bytes %d atoms, status %d\n", fTotalWritten,
-             fAtomsWritten, fStatus);
+    if (fTotalWritten) {
+        SkDebugf("--- %d bytes %d atoms, status %d\n", fTotalWritten,
+                 fAtomsWritten, fStatus);
+    }
 }
 
 void* SimplePC::requestBlock(size_t minRequest, size_t* actual) {
@@ -1404,7 +1424,9 @@
 #ifdef TEST_GPIPE
     SimplePC controller(canvas);
     SkGPipeWriter writer;
-    canvas = writer.startRecording(&controller);
+    if (fUsePipe) {
+        canvas = writer.startRecording(&controller);
+    }
 #endif
 
     for (int i = 0; i < fRepeatCount; i++) {
diff --git a/samplecode/SampleBigGradient.cpp b/samplecode/SampleBigGradient.cpp
index 5d6d247..5ebb516 100644
--- a/samplecode/SampleBigGradient.cpp
+++ b/samplecode/SampleBigGradient.cpp
@@ -10,7 +10,7 @@
                                           SkShader::kClamp_TileMode);
 }
 
-class BigGradientView : public SkView {
+class BigGradientView : public SampleView {
 public:
 	BigGradientView() {}
 
@@ -24,10 +24,7 @@
         return this->INHERITED::onQuery(evt);
     }
 
-    void drawBG(SkCanvas* canvas) {
-    }
-
-    virtual void onDraw(SkCanvas* canvas) {
+    virtual void onDrawContent(SkCanvas* canvas) {
         SkRect r;
         r.set(0, 0, this->width(), this->height());
         SkPaint p;
@@ -36,7 +33,7 @@
     }
 
 private:
-    typedef SkView INHERITED;
+    typedef SampleView INHERITED;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SampleCode.h b/samplecode/SampleCode.h
index 0c706ee..de40d1e 100644
--- a/samplecode/SampleCode.h
+++ b/samplecode/SampleCode.h
@@ -49,11 +49,14 @@
 
 class SampleView : public SkView {
 public:
-    SampleView() : fRepeatCount(1), fBGColor(SK_ColorWHITE) {}
+    SampleView() : fRepeatCount(1), fBGColor(SK_ColorWHITE) {
+        fUsePipe = false;
+    }
 
     void setBGColor(SkColor color) { fBGColor = color; }
 
     static bool SetRepeatDraw(SkView*, int count);
+    static bool SetUsePipe(SkView*, bool);
 
 protected:
     virtual void onDrawBackground(SkCanvas*);
@@ -68,6 +71,8 @@
     int fRepeatCount;
     SkColor fBGColor;
 
+    bool fUsePipe;
+
     typedef SkView INHERITED;
 };
 
diff --git a/samplecode/SampleComplexClip.cpp b/samplecode/SampleComplexClip.cpp
index 29bc805..8ee078b 100644
--- a/samplecode/SampleComplexClip.cpp
+++ b/samplecode/SampleComplexClip.cpp
@@ -136,10 +136,6 @@
         canvas->restore();
     }
 
-    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
-        this->inval(NULL);
-        return this->INHERITED::onFindClickHandler(x, y);
-    }
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleDitherBitmap.cpp b/samplecode/SampleDitherBitmap.cpp
index 1000fdf..91199c2 100644
--- a/samplecode/SampleDitherBitmap.cpp
+++ b/samplecode/SampleDitherBitmap.cpp
@@ -70,7 +70,7 @@
     return bm;
 }
 
-class DitherBitmapView : public SkView {
+class DitherBitmapView : public SampleView {
     SkBitmap    fBM8;
     SkBitmap    fBM32;
 public:
@@ -78,6 +78,8 @@
         test_pathregion();
         fBM8 = make_bitmap();
         fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
+        
+        this->setBGColor(0xFFDDDDDD);
     }
     
 protected:
@@ -90,10 +92,6 @@
         return this->INHERITED::onQuery(evt);
     }
     
-    void drawBG(SkCanvas* canvas) {
-        canvas->drawColor(0xFFDDDDDD);
-    }
-    
     static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) {
         SkAutoLockPixels alp(*bm);  // needed for ctable
         bm->setIsOpaque(isOpaque);
@@ -121,9 +119,7 @@
         canvas->drawBitmap(bitmap, x, SkIntToScalar(bm.height() + 10), &paint);
     }
     
-    virtual void onDraw(SkCanvas* canvas) {
-        drawBG(canvas);
-        
+    virtual void onDrawContent(SkCanvas* canvas) {
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
 
         draw2(canvas, fBM8);
@@ -135,7 +131,7 @@
     }
     
 private:
-    typedef SkView INHERITED;
+    typedef SampleView INHERITED;
 };
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SampleEncode.cpp b/samplecode/SampleEncode.cpp
index b09b2eb..f4ea195 100644
--- a/samplecode/SampleEncode.cpp
+++ b/samplecode/SampleEncode.cpp
@@ -106,7 +106,7 @@
 
 #include <sys/stat.h>
 
-class EncodeView : public SkView {
+class EncodeView : public SampleView {
 public:
     SkBitmap*   fBitmaps;
     size_t      fBitmapCount;
@@ -140,6 +140,7 @@
         fBitmaps = NULL;
         fBitmapCount = 0;
     #endif
+        this->setBGColor(0xFFDDDDDD);
     }
     
     virtual ~EncodeView() {
@@ -156,38 +157,12 @@
         return this->INHERITED::onQuery(evt);
     }
     
-    void drawBG(SkCanvas* canvas) {
-        canvas->drawColor(0xFFDDDDDD);
-//        canvas->drawColor(SK_ColorWHITE);
-    }
-    
-    virtual void onDraw(SkCanvas* canvas) {
-        this->drawBG(canvas);
-        
+    virtual void onDrawContent(SkCanvas* canvas) {
         if (fBitmapCount == 0) {
             return;
         }
         
         SkPaint paint;
-        if (false) {
-//            SkColor colors[] = { 0xFE000000, SK_ColorWHITE };
-            SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
-            SkShader* shader = SkGradientShader::CreateSweep(SkIntToScalar(50), SkIntToScalar(50),
-                                                             colors, NULL, 2);
-            paint.setShader(shader)->unref();
-
-            SkRect r;
-            r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
-            canvas->drawRect(r, paint);
-            
-            canvas->translate(SkIntToScalar(200), SkIntToScalar(200));
-            paint.setAntiAlias(true);
-            paint.setStyle(SkPaint::kStroke_Style);
-            paint.setStrokeWidth(SkIntToScalar(10));
-            canvas->drawOval(r, paint);
-            return;
-        }
-        
         paint.setAntiAlias(true);
         paint.setTextAlign(SkPaint::kCenter_Align);
         
@@ -238,12 +213,8 @@
         return this->INHERITED::onFindClickHandler(x, y);
     }
     
-    virtual bool onClick(Click* click) {
-        return this->INHERITED::onClick(click);
-    }
-    
 private:
-    typedef SkView INHERITED;
+    typedef SampleView INHERITED;
 };
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SampleExtractAlpha.cpp b/samplecode/SampleExtractAlpha.cpp
index 928f2ca..860272d 100644
--- a/samplecode/SampleExtractAlpha.cpp
+++ b/samplecode/SampleExtractAlpha.cpp
@@ -40,7 +40,7 @@
     return bm;
 }
 
-class ExtractAlphaView : public SkView {
+class ExtractAlphaView : public SampleView {
     SkBitmap    fBM8;
     SkBitmap    fBM32;
     SkBitmap    fBM4;
@@ -49,6 +49,8 @@
         fBM8 = make_bitmap();
         fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
         fBM8.copyTo(&fBM4, SkBitmap::kARGB_4444_Config);
+        
+        this->setBGColor(0xFFDDDDDD);
     }
     
 protected:
@@ -61,13 +63,7 @@
         return this->INHERITED::onQuery(evt);
     }
     
-    void drawBG(SkCanvas* canvas) {
-        canvas->drawColor(0xFFDDDDDD);
-    }
-    
-    virtual void onDraw(SkCanvas* canvas) {
-        drawBG(canvas);
-
+    virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
@@ -84,7 +80,7 @@
     }
     
 private:
-    typedef SkView INHERITED;
+    typedef SampleView INHERITED;
 };
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SampleGM.cpp b/samplecode/SampleGM.cpp
index 5c9ea76..2f9f046 100644
--- a/samplecode/SampleGM.cpp
+++ b/samplecode/SampleGM.cpp
@@ -44,13 +44,15 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-class GMView : public SkView {
+class GMView : public SampleView {
     Iter fIter;
     GM*  fGM;
 public:
 	GMView() {
         fGM = fIter.next();
         this->postNextGM();
+        
+        this->setBGColor(0xFFDDDDDD);
     }
     
 protected:
@@ -77,11 +79,7 @@
         return this->INHERITED::onEvent(evt);
     }
 
-    void drawBG(SkCanvas* canvas) {
-        canvas->drawColor(0xFFDDDDDD);
-    }
-    
-    virtual void onDraw(SkCanvas* canvas) {
+    virtual void onDrawContent(SkCanvas* canvas) {
         fGM->draw(canvas);
     }
     
@@ -90,7 +88,7 @@
         (new SkEvent("next-gm"))->post(this->getSinkID(), 1500);
     }
 
-    typedef SkView INHERITED;
+    typedef SampleView INHERITED;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index 187de22..4fef377 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -74,7 +74,7 @@
     canvas.drawPath(path, paint);
 }
 
-class PathView : public SkView {
+class PathView : public SampleView {
 public:
     int fDStroke, fStroke, fMinStroke, fMaxStroke;
     SkPath fPath[6];
@@ -116,14 +116,11 @@
         fPath[5].moveTo(SkIntToScalar(52), SkIntToScalar(50));
         fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(V));
         fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(50));
+        
+        this->setBGColor(0xFFDDDDDD);
     }
     
-    virtual ~PathView()
-    {
-    }
-    
-    void nextStroke()
-    {
+    void nextStroke() {
         fStroke += fDStroke;
         if (fStroke > fMaxStroke || fStroke < fMinStroke)
             fDStroke = -fDStroke;
@@ -131,24 +128,15 @@
     
 protected:
     // overrides from SkEventSink
-    virtual bool onQuery(SkEvent* evt)
-    {
-        if (SampleCode::TitleQ(*evt))
-        {
+    virtual bool onQuery(SkEvent* evt) {
+        if (SampleCode::TitleQ(*evt)) {
             SampleCode::TitleR(evt, "Paths");
             return true;
         }
         return this->INHERITED::onQuery(evt);
     }
     
-    void drawBG(SkCanvas* canvas)
-    {
-        canvas->drawColor(0xFFDDDDDD);
-//        canvas->drawColor(SK_ColorWHITE);
-    }
-    
-    void drawPath(SkCanvas* canvas, const SkPath& path, SkPaint::Join j)
-    {
+    void drawPath(SkCanvas* canvas, const SkPath& path, SkPaint::Join j) {
         SkPaint paint;
         
         paint.setAntiAlias(true);
@@ -156,26 +144,22 @@
         paint.setStrokeJoin(j);
         paint.setStrokeWidth(SkIntToScalar(fStroke));
 
-        if (fShowHairline)
-        {
+        if (fShowHairline) {
             SkPath  fill;
             
             paint.getFillPath(path, &fill);            
             paint.setStrokeWidth(0);
             canvas->drawPath(fill, paint);
-        }
-        else
+        } else {
             canvas->drawPath(path, paint);
+        }
         
         paint.setColor(SK_ColorRED);
         paint.setStrokeWidth(0);
         canvas->drawPath(path, paint);
     }
     
-    virtual void onDraw(SkCanvas* canvas)
-    {
-        this->drawBG(canvas);
-        
+    virtual void onDrawContent(SkCanvas* canvas) {        
         canvas->translate(SkIntToScalar(50), SkIntToScalar(50));
 
         static const SkPaint::Join gJoins[] = {
@@ -184,11 +168,9 @@
             SkPaint::kRound_Join
         };
 
-        for (int i = 0; i < SK_ARRAY_COUNT(gJoins); i++)
-        {
+        for (int i = 0; i < SK_ARRAY_COUNT(gJoins); i++) {
             canvas->save();
-            for (int j = 0; j < SK_ARRAY_COUNT(fPath); j++)
-            {
+            for (int j = 0; j < SK_ARRAY_COUNT(fPath); j++) {
                 this->drawPath(canvas, fPath[j], gJoins[i]);
                 canvas->translate(SkIntToScalar(200), 0);
             }
@@ -201,20 +183,14 @@
         this->inval(NULL);
     }
     
-    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) 
-    {
+    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
         fShowHairline = !fShowHairline;
         this->inval(NULL);
         return this->INHERITED::onFindClickHandler(x, y);
     }
     
-    virtual bool onClick(Click* click) 
-    {
-        return this->INHERITED::onClick(click);
-    }
-    
 private:
-    typedef SkView INHERITED;
+    typedef SampleView INHERITED;
 };
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp
index ccfe430..29a47f7 100644
--- a/samplecode/SamplePolyToPoly.cpp
+++ b/samplecode/SamplePolyToPoly.cpp
@@ -8,7 +8,7 @@
 
 extern bool SkSetPoly3To3(SkMatrix* matrix, const SkPoint src[3], const SkPoint dst[3]);
 
-class PolyToPolyView : public SkView {
+class PolyToPolyView : public SampleView {
 public:
 	PolyToPolyView() {
         // tests
@@ -72,10 +72,6 @@
         return this->INHERITED::onQuery(evt);
     }
 
-    void drawBG(SkCanvas* canvas) {
-        canvas->drawColor(SK_ColorWHITE);
-    }
-
     static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[],
                        const int idst[], int count) {
         SkMatrix matrix;
@@ -110,9 +106,7 @@
         canvas->restore();
     }
 
-    virtual void onDraw(SkCanvas* canvas) {
-        this->drawBG(canvas);
-
+    virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStrokeWidth(SkIntToScalar(4));
@@ -153,7 +147,7 @@
     }
 
 private:
-    typedef SkView INHERITED;
+    typedef SampleView INHERITED;
 };
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/samplecode/SampleTiling.cpp b/samplecode/SampleTiling.cpp
index 025049e..b3c73d7 100644
--- a/samplecode/SampleTiling.cpp
+++ b/samplecode/SampleTiling.cpp
@@ -151,15 +151,6 @@
         canvas->drawPicture(fTextPicture);
     }
     
-    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
-        this->inval(NULL);
-        return this->INHERITED::onFindClickHandler(x, y);
-    }
-    
-    virtual bool onClick(Click* click) {
-        return this->INHERITED::onClick(click);
-    }
-    
 private:
     typedef SampleView INHERITED;
 };
