diff --git a/src/gpu/GrBatchedTextContext.cpp b/src/gpu/GrBatchedTextContext.cpp
index 9de2bad..666d894 100644
--- a/src/gpu/GrBatchedTextContext.cpp
+++ b/src/gpu/GrBatchedTextContext.cpp
@@ -26,7 +26,7 @@
                                 const GrMatrix* extMatrix) {
     this->INHERITED::init(context, grPaint, extMatrix);
     fGrPaint = grPaint;
-    fDrawTarget = fContext->getTextTarget(fGrPaint);
+    fDrawTarget = NULL;
 
     fMaxVertices = 0;
     fCurrTexture = NULL;
@@ -34,6 +34,10 @@
 }
 
 void GrBatchedTextContext::finish() {
+    GrAssert(fDrawTarget);
+    if (fDrawTarget) {
+        fDrawTarget->drawState()->disableStages();
+    }
     fDrawTarget = NULL;
 
     this->INHERITED::finish();
@@ -41,6 +45,7 @@
 
 void GrBatchedTextContext::reset() {
     GrAssert(this->isValid());
+    GrAssert(fDrawTarget);
     fDrawTarget->resetVertexSource();
     fMaxVertices = 0;
     fCurrVertex = 0;
@@ -61,6 +66,7 @@
 void GrBatchedTextContext::setupVertexBuff(void** vertexBuff,
                                            GrVertexLayout vertexLayout) {
     GrAssert(this->isValid());
+    GrAssert(fDrawTarget);
     if (NULL == *vertexBuff) {
         // If we need to reserve vertices allow the draw target to suggest
         // a number of verts to reserve and whether to perform a flush.
diff --git a/src/gpu/GrBatchedTextContext.h b/src/gpu/GrBatchedTextContext.h
index c0a136b..e1f4736 100644
--- a/src/gpu/GrBatchedTextContext.h
+++ b/src/gpu/GrBatchedTextContext.h
@@ -38,6 +38,8 @@
     };
 
     GrPaint         fGrPaint;
+
+    /** fDrawTarget is not set by init() - MUST be set by subclasses! */
     GrDrawTarget*   fDrawTarget;
 
     int32_t     fMaxVertices;
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index c426405..61f37ff 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -784,7 +784,7 @@
     SK_TRACE_EVENT0("GrContext::drawRect");
 
     GrDrawTarget* target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     int stageMask = paint.getActiveStageMask();
 
     GrRect devRect = rect;
@@ -904,7 +904,7 @@
 
 #if GR_STATIC_RECT_VB
     GrDrawTarget* target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     GrDrawState* drawState = target->drawState();
     GrVertexLayout layout = PaintStageVertexLayoutBits(paint, NULL);
     GrDrawState::AutoViewMatrixRestore avmr(drawState);
@@ -949,7 +949,7 @@
 #else
     target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
 #endif
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
 
     const GrRect* srcRects[GrDrawState::kNumStages] = {NULL};
     const GrMatrix* srcMatrices[GrDrawState::kNumStages] = {NULL};
@@ -973,7 +973,7 @@
     GrDrawTarget::AutoReleaseGeometry geo;
 
     GrDrawTarget* target = this->prepareToDraw(paint, kUnbuffered_DrawCategory);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
 
     bool hasTexCoords[GrPaint::kTotalStages] = {
         NULL != texCoords,   // texCoordSrc provides explicit stage 0 coords
@@ -1078,7 +1078,7 @@
     DrawCategory category = (DEFER_PATHS) ? kBuffered_DrawCategory :
                                             kUnbuffered_DrawCategory;
     GrDrawTarget* target = this->prepareToDraw(paint, category);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     GrDrawState* drawState = target->drawState();
     GrMatrix vm = drawState->getViewMatrix();
 
@@ -1187,7 +1187,7 @@
     DrawCategory category = (DEFER_PATHS) ? kBuffered_DrawCategory :
                                             kUnbuffered_DrawCategory;
     GrDrawTarget* target = this->prepareToDraw(paint, category);
-    GrDrawState::AutoTextureRelease atr(fDrawState);
+    GrDrawState::AutoStageDisable atr(fDrawState);
     GrDrawState::StageMask stageMask = paint.getActiveStageMask();
 
     bool prAA = paint.fAntiAlias && !this->getRenderTarget()->isMultisampled();
@@ -1588,6 +1588,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 void GrContext::setPaint(const GrPaint& paint) {
+    GrAssert(fDrawState->stagesDisabled());
 
     for (int i = 0; i < GrPaint::kMaxTextures; ++i) {
         int s = i + GrPaint::kFirstTextureStage;
diff --git a/src/gpu/GrDefaultTextContext.cpp b/src/gpu/GrDefaultTextContext.cpp
index 21cb990..c6f34e2 100644
--- a/src/gpu/GrDefaultTextContext.cpp
+++ b/src/gpu/GrDefaultTextContext.cpp
@@ -131,8 +131,6 @@
         }
     }
 
-    // this has been already done in the baseclass, but we need to repeat
-    // due to new matrix
     fDrawTarget = fContext->getTextTarget(fGrPaint);
 
     fVertices = NULL;
diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h
index 5feccb5..acfca8c 100644
--- a/src/gpu/GrDrawState.h
+++ b/src/gpu/GrDrawState.h
@@ -74,16 +74,18 @@
     }
 
     virtual ~GrDrawState() {
-        this->releaseTextures();
+        this->disableStages();
         GrSafeSetNull(fRenderTarget);
     }
 
     /**
-     * Resets to the default state. Sampler states will not be modified.
+     * Resets to the default state.
+     * Sampler states *will* be modified: textures or CustomStage objects
+     * will be released.
      */ 
     void reset() {
 
-        this->releaseTextures();
+        this->disableStages();
         GrSafeSetNull(fRenderTarget);
 
         // make sure any pad is zero for memcmp
@@ -213,21 +215,32 @@
         return fTextures[stage];
     }
 
+    bool stagesDisabled() {
+        for (int i = 0; i < kNumStages; ++i) {
+            if (NULL != fTextures[i] ||
+                NULL != fSamplerStates[i].getCustomStage()) {
+                return false;
+            }
+            return true;
+        }
+    }
     /**
-     * Release all the textures referred to by this draw state
+     * Release all the textures and custom stages referred to by this
+     * draw state.
      */
-    void releaseTextures() {
+    void disableStages() {
         for (int i = 0; i < kNumStages; ++i) {
             GrSafeSetNull(fTextures[i]);
+            fSamplerStates[i].setCustomStage(NULL);
         }
     }
 
-    class AutoTextureRelease : public ::GrNoncopyable {
+    class AutoStageDisable : public ::GrNoncopyable {
     public:
-        AutoTextureRelease(GrDrawState* ds) : fDrawState(ds) {}
-        ~AutoTextureRelease() {
+        AutoStageDisable(GrDrawState* ds) : fDrawState(ds) {}
+        ~AutoStageDisable() {
             if (NULL != fDrawState) {
-                fDrawState->releaseTextures();
+                fDrawState->disableStages();
             }
         }
     private:
