diff --git a/gyp/SampleApp.gyp b/gyp/SampleApp.gyp
index f49499a..0b2e4ca 100644
--- a/gyp/SampleApp.gyp
+++ b/gyp/SampleApp.gyp
@@ -65,7 +65,6 @@
         '../samplecode/SampleEmboss.cpp',
         '../samplecode/SampleEmptyPath.cpp',
         '../samplecode/SampleEncode.cpp',
-        '../samplecode/SampleExtractAlpha.cpp',
         '../samplecode/SampleFillType.cpp',
         '../samplecode/SampleFilter.cpp',
         '../samplecode/SampleFilter2.cpp',
diff --git a/samplecode/SampleAnimator.cpp b/samplecode/SampleAnimator.cpp
index 57e3dbd..09742a0 100644
--- a/samplecode/SampleAnimator.cpp
+++ b/samplecode/SampleAnimator.cpp
@@ -127,8 +127,8 @@
 #include "SkTime.h"
 
 void SkAnimatorView::onDraw(SkCanvas* canvas) {
+    canvas->drawColor(SK_ColorWHITE);
     if (fAnimator) {
-        canvas->drawColor(SK_ColorWHITE);
         fAnimator->draw(canvas, 0);
 #if 0
         canvas->save();
diff --git a/samplecode/SampleExtractAlpha.cpp b/samplecode/SampleExtractAlpha.cpp
deleted file mode 100644
index 9ae56ce..0000000
--- a/samplecode/SampleExtractAlpha.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-
-/*
- * 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 "SampleCode.h"
-#include "SkColorPriv.h"
-#include "SkGradientShader.h"
-#include "SkView.h"
-#include "SkCanvas.h"
-#include "SkUtils.h"
-
-static SkBitmap make_bitmap() {
-    SkBitmap bm;
-    SkColorTable* ctable = new SkColorTable(256);
-
-    SkPMColor* c = ctable->lockColors();
-    for (int i = 0; i < 256; i++) {
-        c[i] = SkPackARGB32(255 - i, 0, 0, 0);
-    }
-    ctable->unlockColors(true);
-    bm.setConfig(SkBitmap::kIndex8_Config, 256, 256);
-    bm.allocPixels(ctable);
-    ctable->unref();
-
-    bm.lockPixels();
-    const float cx = bm.width() * 0.5f;
-    const float cy = bm.height() * 0.5f;
-    for (int y = 0; y < bm.height(); y++) {
-        float dy = y - cy;
-        dy *= dy;
-        uint8_t* p = bm.getAddr8(0, y);
-        for (int x = 0; x < 256; x++) {
-            float dx = x - cx;
-            dx *= dx;
-            float d = (dx + dy) / (cx/2);
-            int id = (int)d;
-            if (id > 255) {
-                id = 255;
-            }
-            p[x] = id;
-        }
-    }
-    bm.unlockPixels();
-    return bm;
-}
-
-class ExtractAlphaView : public SampleView {
-    SkBitmap    fBM8;
-    SkBitmap    fBM32;
-    SkBitmap    fBM4;
-public:
-	ExtractAlphaView() {
-        fBM8 = make_bitmap();
-        fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
-        fBM8.copyTo(&fBM4, SkBitmap::kARGB_4444_Config);
-        
-        this->setBGColor(0xFFDDDDDD);
-    }
-    
-protected:
-    // overrides from SkEventSink
-    virtual bool onQuery(SkEvent* evt) {
-        if (SampleCode::TitleQ(*evt)) {
-            SampleCode::TitleR(evt, "DitherBitmap");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
-    
-    virtual void onDrawContent(SkCanvas* canvas) {
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        paint.setStyle(SkPaint::kStroke_Style);
-
-        SkMatrix matrix;
-        matrix.setScale(3.55f, 80.f);
-        canvas->setMatrix(matrix);
-        
-        paint.setStrokeWidth(0.0588f);
-        canvas->drawLine(10, 5, 30, 4.8f, paint);
-        
-        paint.setStrokeWidth(0.06f);
-        canvas->drawLine(20, 5, 40, 4.8f, paint);
-    }
-    
-private:
-    typedef SampleView INHERITED;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-static SkView* MyFactory() { return new ExtractAlphaView; }
-static SkViewRegister reg(MyFactory);
-
diff --git a/src/utils/mac/SampleAppDelegate.mm b/src/utils/mac/SampleAppDelegate.mm
index c54a8a3..91dcada 100644
--- a/src/utils/mac/SampleAppDelegate.mm
+++ b/src/utils/mac/SampleAppDelegate.mm
@@ -5,6 +5,7 @@
 -(void) applicationDidFinishLaunching:(NSNotification *)aNotification {
     //Load specified skia views after launching
     fView.fOptionsDelegate = fOptions;
+    [fWindow setAcceptsMouseMovedEvents:YES];
     [fOptions registerMenus:fView.fWind->getMenus()];
 }
 
diff --git a/src/utils/mac/SkNSView.h b/src/utils/mac/SkNSView.h
index 5ae7ad5..87c2727 100644
--- a/src/utils/mac/SkNSView.h
+++ b/src/utils/mac/SkNSView.h
@@ -35,6 +35,7 @@
 
 - (id)initWithDefaults;
 - (void)setUpWindow;
+- (void)resizeSkView:(NSSize)newSize;
 - (void)setSkTitle:(const char*)title;
 - (void)onAddMenu:(const SkOSMenu*)menu;
 - (void)onUpdateMenu:(const SkOSMenu*)menu;
diff --git a/src/utils/mac/SkNSView.mm b/src/utils/mac/SkNSView.mm
index 8e9e30f..c498bf5 100644
--- a/src/utils/mac/SkNSView.mm
+++ b/src/utils/mac/SkNSView.mm
@@ -53,17 +53,19 @@
     return YES;
 }
 
-- (void)viewDidEndLiveResize {
-    NSSize s = [self frame].size;
-    if (NULL != fWind && fWind->width() != s.width && fWind->height() != s.height) {
-        fWind->resize(s.width, s.height);
-        if (nil != fGLContext) {
-            [fGLContext update];
-            glClear(GL_STENCIL_BUFFER_BIT);
-        }
+- (void)resizeSkView:(NSSize)newSize {
+    if (NULL != fWind && (fWind->width() != newSize.width || fWind->height() != newSize.height)) {
+        fWind->resize(newSize.width, newSize.height);
+        glClear(GL_STENCIL_BUFFER_BIT);
+        [fGLContext update];
     }
 }
 
+- (void) setFrameSize:(NSSize)newSize {
+    [super setFrameSize:newSize];
+    [self resizeSkView:newSize];
+}
+
 - (void)dealloc {
     delete fWind;
     self.fGLContext = nil;
@@ -71,7 +73,7 @@
     [super dealloc];
 }
 
-/////////////////////////////////////////////0//////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
 
 - (void)drawSkia {
     fRedrawRequestPending = false;
@@ -204,6 +206,14 @@
     }
 }
 
+- (void)mouseMoved:(NSEvent *)event {
+    NSPoint p = [event locationInWindow];
+    if ([self mouse:p inRect:[self bounds]] && NULL != fWind) {
+        NSPoint loc = [self convertPoint:p fromView:nil];
+        fWind->handleClick(loc.x, loc.y, SkView::Click::kMoved_State, self);
+    }
+}
+
 - (void)mouseUp:(NSEvent *)event {
     NSPoint p = [event locationInWindow];
     if ([self mouse:p inRect:[self bounds]] && NULL != fWind) {
