diff --git a/experimental/SkiaExamples/BaseExample.cpp b/experimental/SkiaExamples/BaseExample.cpp
deleted file mode 100644
index 7e4116a..0000000
--- a/experimental/SkiaExamples/BaseExample.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- */
-
-#include "BaseExample.h"
-
-#include "gl/GrGLUtil.h"
-#include "gl/GrGLDefines.h"
-#include "gl/GrGLInterface.h"
-#include "SkApplication.h"
-#include "SkGpuDevice.h"
-#include "SkGraphics.h"
-
-void application_init() {
-    SkGraphics::Init();
-    SkEvent::Init();
-}
-
-void application_term() {
-    SkEvent::Term();
-    SkGraphics::Term();
-}
-
-BaseExample::BaseExample(void* hWnd, int argc, char** argv)
-    : INHERITED(hWnd) {}
-
-void BaseExample::tearDownBackend() {
-  if (kGPU_DeviceType == fType) {
-        SkSafeUnref(fContext);
-        fContext = NULL;
-
-        SkSafeUnref(fInterface);
-        fInterface = NULL;
-
-        SkSafeUnref(fRenderTarget);
-        fRenderTarget = NULL;
-
-        detach();
-    }
-}
-
-bool BaseExample::setupBackend(DeviceType type) {
-    fType = type;
-
-    this->setConfig(SkBitmap::kARGB_8888_Config);
-    this->setVisibleP(true);
-    this->setClipToBounds(false);
-
-    bool result = attach(kNativeGL_BackEndType, 0 /*msaa*/, &fAttachmentInfo);
-    if (false == result) {
-        SkDebugf("Not possible to create backend.\n");
-        detach();
-        return false;
-    }
-
-    fInterface = GrGLCreateNativeInterface();
-
-    SkASSERT(NULL != fInterface);
-
-    fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fInterface);
-    SkASSERT(NULL != fContext);
-
-    setupRenderTarget();
-
-    return true;
-}
-
-void BaseExample::setupRenderTarget() {
-    GrBackendRenderTargetDesc desc;
-    desc.fWidth = SkScalarRound(width());
-    desc.fHeight = SkScalarRound(height());
-    desc.fConfig = kSkia8888_GrPixelConfig;
-    desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
-    desc.fSampleCnt = fAttachmentInfo.fSampleCount;
-    desc.fStencilBits = fAttachmentInfo.fStencilBits;
-
-    GrGLint buffer;
-    GR_GL_GetIntegerv(fInterface, GR_GL_FRAMEBUFFER_BINDING, &buffer);
-    desc.fRenderTargetHandle = buffer;
-
-    fRenderTarget = fContext->wrapBackendRenderTarget(desc);
-
-    fContext->setRenderTarget(fRenderTarget);
-}
-
-SkCanvas* BaseExample::createCanvas() {
-    if (fType == kGPU_DeviceType) {
-        if (NULL != fContext && NULL != fRenderTarget) {
-            SkAutoTUnref<SkDevice> device(new SkGpuDevice(fContext, fRenderTarget));
-            return new SkCanvas(device);
-        }
-        tearDownBackend();
-        setupBackend(kRaster_DeviceType);
-    }
-    return INHERITED::createCanvas();
-}
-
-void BaseExample::draw(SkCanvas* canvas) {
-    if (fType == kGPU_DeviceType) {
-
-        SkASSERT(NULL != fContext);
-        fContext->flush();
-    }
-    if (fType == kRaster_DeviceType) {
-        // need to send the raster bits to the (gpu) window
-        fContext->setRenderTarget(fRenderTarget);
-        const SkBitmap& bm = getBitmap();
-        fRenderTarget->writePixels(0, 0, bm.width(), bm.height(),
-                                      kSkia8888_GrPixelConfig,
-                                      bm.getPixels(),
-                                      bm.rowBytes());
-    }
-    INHERITED::present();
-}
-
-void BaseExample::onSizeChange() {
-    setupRenderTarget();
-}
-
-#ifdef SK_BUILD_FOR_WIN
-void BaseExample::onHandleInval(const SkIRect& rect) {
-    RECT winRect;
-    winRect.top = rect.top();
-    winRect.bottom = rect.bottom();
-    winRect.right = rect.right();
-    winRect.left = rect.left();
-    InvalidateRect((HWND)this->getHWND(), &winRect, false);
-}
-#endif
diff --git a/experimental/SkiaExamples/BaseExample.h b/experimental/SkiaExamples/BaseExample.h
deleted file mode 100644
index b9cc259..0000000
--- a/experimental/SkiaExamples/BaseExample.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- */
-
-#ifndef BaseExample_DEFINED
-#define BaseExample_DEFINED
-
-#include "SkWindow.h"
-
-class GrContext;
-struct GrGLInterface;
-class GrRenderTarget;
-class SkCanvas;
-
-class BaseExample : public SkOSWindow {
-public:
-    enum DeviceType {
-        kRaster_DeviceType,
-        kGPU_DeviceType,
-    };
-    BaseExample(void* hWnd, int argc, char** argv);
-
-    // Changes the device type of the object.
-    bool setupBackend(DeviceType type);
-    void tearDownBackend();
-
-    DeviceType getDeviceType() const { return fType; }
-
-protected:
-    // Your class should override this method to do its thing.
-    virtual void draw(SkCanvas* canvas) SK_OVERRIDE;
-
-    virtual void onSizeChange() SK_OVERRIDE;
-
-#ifdef SK_BUILD_FOR_WIN
-    virtual void onHandleInval(const SkIRect&) SK_OVERRIDE;
-#endif
-
-    SkCanvas* createCanvas() SK_OVERRIDE;
-
-private:
-    void setupRenderTarget();
-
-    DeviceType fType;
-
-    GrContext* fContext;
-    GrRenderTarget* fRenderTarget;
-    AttachmentInfo fAttachmentInfo;
-    const GrGLInterface* fInterface;
-    typedef SkOSWindow INHERITED;
-};
-#endif
diff --git a/experimental/SkiaExamples/HelloSkiaExample.cpp b/experimental/SkiaExamples/HelloSkiaExample.cpp
index f25cd76..2424b76 100644
--- a/experimental/SkiaExamples/HelloSkiaExample.cpp
+++ b/experimental/SkiaExamples/HelloSkiaExample.cpp
@@ -7,7 +7,7 @@
  *
  */
 
-#include "BaseExample.h"
+#include "SkExample.h"
 
 #include "SkApplication.h"
 #include "SkDraw.h"
@@ -15,98 +15,96 @@
 #include "SkGraphics.h"
 #include "SkUnitMappers.h"
 
-class HelloSkia : public BaseExample {
-    public:
-        HelloSkia(void* hWnd, int argc, char** argv)
-            : INHERITED(hWnd, argc, argv)
-        {
-            fBGColor = SK_ColorWHITE;
-            fRotationAngle = SkIntToScalar(0);
+class HelloSkia : public SkExample {
+public:
+    HelloSkia(SkExampleWindow* window) : SkExample(window) {
+        fName = "HelloSkia";
+        fBGColor = SK_ColorWHITE;
+        fRotationAngle = SkIntToScalar(0);
 
-            setupBackend(kGPU_DeviceType);
-            // Another option is software rendering:
-            // setupBackend(kRaster_DeviceType);
-        }
+        fWindow->setupBackend(SkExampleWindow::kGPU_DeviceType);
+        // Another option is software rendering:
+        // setupBackend(SkExampleWindow::kRaster_DeviceType);
+    }
 
-    protected:
-        virtual void draw(SkCanvas* canvas) SK_OVERRIDE {
-            // Clear background
-            canvas->drawColor(fBGColor);
+protected:
+    void draw(SkCanvas* canvas) {
+        // Clear background
+        canvas->drawColor(fBGColor);
 
-            SkPaint paint;
-            paint.setColor(SK_ColorRED);
+        SkPaint paint;
+        paint.setColor(SK_ColorRED);
 
-            // Draw a rectangle with blue paint
-            SkRect rect = {
+        // Draw a rectangle with blue paint
+        SkRect rect = {
                 SkIntToScalar(10), SkIntToScalar(10),
                 SkIntToScalar(128), SkIntToScalar(128)
-            };
-            canvas->drawRect(rect, paint);
+        };
+        canvas->drawRect(rect, paint);
 
-            // Set up a linear gradient and draw a circle
-            {
-                SkPoint linearPoints[] = {
+        // Set up a linear gradient and draw a circle
+        {
+            SkPoint linearPoints[] = {
                     {SkIntToScalar(0), SkIntToScalar(0)},
                     {SkIntToScalar(300), SkIntToScalar(300)}
-                };
-                SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK};
+            };
+            SkColor linearColors[] = {SK_ColorGREEN, SK_ColorBLACK};
 
-                SkUnitMapper* linearMapper = new SkDiscreteMapper(100);
-                SkAutoUnref lm_deleter(linearMapper);
+            SkUnitMapper* linearMapper = new SkDiscreteMapper(100);
+            SkAutoUnref lm_deleter(linearMapper);
 
-                SkShader* shader = SkGradientShader::CreateLinear(
-                        linearPoints, linearColors, NULL, 2,
-                        SkShader::kMirror_TileMode, linearMapper);
-                SkAutoUnref shader_deleter(shader);
+            SkShader* shader = SkGradientShader::CreateLinear(
+                    linearPoints, linearColors, NULL, 2,
+                    SkShader::kMirror_TileMode, linearMapper);
+            SkAutoUnref shader_deleter(shader);
 
-                paint.setShader(shader);
-                paint.setFlags(SkPaint::kAntiAlias_Flag);
+            paint.setShader(shader);
+            paint.setFlags(SkPaint::kAntiAlias_Flag);
 
-                canvas->drawCircle(SkIntToScalar(200), SkIntToScalar(200),
-                                   SkIntToScalar(64), paint);
+            canvas->drawCircle(SkIntToScalar(200), SkIntToScalar(200),
+                    SkIntToScalar(64), paint);
 
-                // Detach shader
-                paint.setShader(NULL);
-            }
-
-
-            // Draw a message with a nice black paint.
-            paint.setFlags(
-                    SkPaint::kAntiAlias_Flag |
-                    SkPaint::kSubpixelText_Flag |  // ... avoid waggly text when rotating.
-                    SkPaint::kUnderlineText_Flag);
-            paint.setColor(SK_ColorBLACK);
-            paint.setTextSize(SkIntToScalar(20));
-
-            canvas->save();
-
-            static const char message[] = "Hello Skia!!!";
-
-            // Translate and rotate
-            canvas->translate(SkIntToScalar(300), SkIntToScalar(300));
-            fRotationAngle += SkDoubleToScalar(0.2);
-            if (fRotationAngle > SkDoubleToScalar(360.0)) {
-                fRotationAngle -= SkDoubleToScalar(360.0);
-            }
-            canvas->rotate(fRotationAngle);
-
-            // Draw the text:
-            canvas->drawText(message, strlen(message), SkIntToScalar(0), SkIntToScalar(0), paint);
-
-            canvas->restore();
-
-            // Invalidate the window to force a redraw. Poor man's animation mechanism.
-            this->inval(NULL);
-
-            INHERITED::draw(canvas);
+            // Detach shader
+            paint.setShader(NULL);
         }
 
-    private:
-        SkScalar fRotationAngle;
-        SkColor fBGColor;
-        typedef BaseExample INHERITED;
+        // Draw a message with a nice black paint.
+        paint.setFlags(
+                SkPaint::kAntiAlias_Flag |
+                SkPaint::kSubpixelText_Flag |  // ... avoid waggly text when rotating.
+                SkPaint::kUnderlineText_Flag);
+        paint.setColor(SK_ColorBLACK);
+        paint.setTextSize(SkIntToScalar(20));
+
+        canvas->save();
+
+        static const char message[] = "Hello Skia!!!";
+
+        // Translate and rotate
+        canvas->translate(SkIntToScalar(300), SkIntToScalar(300));
+        fRotationAngle += SkDoubleToScalar(0.2);
+        if (fRotationAngle > SkDoubleToScalar(360.0)) {
+            fRotationAngle -= SkDoubleToScalar(360.0);
+        }
+        canvas->rotate(fRotationAngle);
+
+        // Draw the text:
+        canvas->drawText(message, strlen(message), SkIntToScalar(0), SkIntToScalar(0), paint);
+
+        canvas->restore();
+
+        // Invalidate the window to force a redraw. Poor man's animation mechanism.
+        this->fWindow->inval(NULL);
+    }
+
+private:
+    SkScalar fRotationAngle;
+    SkColor fBGColor;
 };
 
-SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) {
-    return new HelloSkia(hwnd, argc, argv);
+static SkExample* MyFactory(SkExampleWindow* window) {
+    return new HelloSkia(window);
 }
+
+// Register this class as a Skia Example.
+SkExample::Registry registry(MyFactory);
diff --git a/experimental/SkiaExamples/SkExample.cpp b/experimental/SkiaExamples/SkExample.cpp
new file mode 100644
index 0000000..387276a
--- /dev/null
+++ b/experimental/SkiaExamples/SkExample.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ */
+
+#include "SkExample.h"
+
+#include "gl/GrGLUtil.h"
+#include "gl/GrGLDefines.h"
+#include "gl/GrGLInterface.h"
+#include "SkApplication.h"
+#include "SkCommandLineFlags.h"
+#include "SkGpuDevice.h"
+#include "SkGraphics.h"
+
+DEFINE_string2(match, m, NULL, "[~][^]substring[$] [...] of test name to run.\n" \
+                               "Multiple matches may be separated by spaces.\n" \
+                               "~ causes a matching test to always be skipped\n" \
+                               "^ requires the start of the test to match\n" \
+                               "$ requires the end of the test to match\n" \
+                               "^ and $ requires an exact match\n" \
+                               "If a test does not match any list entry,\n" \
+                               "it is skipped unless some list entry starts with ~");
+
+void application_init() {
+    SkGraphics::Init();
+    SkEvent::Init();
+}
+
+void application_term() {
+    SkEvent::Term();
+    SkGraphics::Term();
+}
+
+SkExampleWindow::SkExampleWindow(void* hwnd)
+    : INHERITED(hwnd) {
+    fRegistry = SkExample::Registry::Head();
+    fCurrExample = fRegistry->factory()(this);
+
+    if (FLAGS_match.count()) {
+        for(int i = 0; i < FLAGS_match.count(); ++i) {
+            fMatchStrs.push(FLAGS_match[i]);
+        }
+        // Start with the a matching sample if possible.
+        bool found = this->findNextMatch();
+        if (!found) {
+            SkDebugf("No matching SkExample found.\n");
+        }
+    }
+}
+
+void SkExampleWindow::tearDownBackend() {
+  if (kGPU_DeviceType == fType) {
+        SkSafeUnref(fContext);
+        fContext = NULL;
+
+        SkSafeUnref(fInterface);
+        fInterface = NULL;
+
+        SkSafeUnref(fRenderTarget);
+        fRenderTarget = NULL;
+
+        detach();
+    }
+}
+
+bool SkExampleWindow::setupBackend(DeviceType type) {
+    fType = type;
+
+    this->setConfig(SkBitmap::kARGB_8888_Config);
+    this->setVisibleP(true);
+    this->setClipToBounds(false);
+
+    bool result = attach(kNativeGL_BackEndType, 0 /*msaa*/, &fAttachmentInfo);
+    if (false == result) {
+        SkDebugf("Not possible to create backend.\n");
+        detach();
+        return false;
+    }
+
+    fInterface = GrGLCreateNativeInterface();
+
+    SkASSERT(NULL != fInterface);
+
+    fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fInterface);
+    SkASSERT(NULL != fContext);
+
+    setupRenderTarget();
+
+    return true;
+}
+
+void SkExampleWindow::setupRenderTarget() {
+    GrBackendRenderTargetDesc desc;
+    desc.fWidth = SkScalarRound(width());
+    desc.fHeight = SkScalarRound(height());
+    desc.fConfig = kSkia8888_GrPixelConfig;
+    desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
+    desc.fSampleCnt = fAttachmentInfo.fSampleCount;
+    desc.fStencilBits = fAttachmentInfo.fStencilBits;
+
+    GrGLint buffer;
+    GR_GL_GetIntegerv(fInterface, GR_GL_FRAMEBUFFER_BINDING, &buffer);
+    desc.fRenderTargetHandle = buffer;
+
+    fRenderTarget = fContext->wrapBackendRenderTarget(desc);
+
+    fContext->setRenderTarget(fRenderTarget);
+}
+
+SkCanvas* SkExampleWindow::createCanvas() {
+    if (fType == kGPU_DeviceType) {
+        if (NULL != fContext && NULL != fRenderTarget) {
+            SkAutoTUnref<SkDevice> device(new SkGpuDevice(fContext, fRenderTarget));
+            return new SkCanvas(device);
+        }
+        tearDownBackend();
+        setupBackend(kRaster_DeviceType);
+    }
+    return INHERITED::createCanvas();
+}
+
+void SkExampleWindow::draw(SkCanvas* canvas) {
+    if (NULL != fCurrExample) {
+        fCurrExample->draw(canvas);
+    }
+    if (fType == kGPU_DeviceType) {
+
+        SkASSERT(NULL != fContext);
+        fContext->flush();
+    }
+    if (fType == kRaster_DeviceType) {
+        // need to send the raster bits to the (gpu) window
+        fContext->setRenderTarget(fRenderTarget);
+        const SkBitmap& bm = getBitmap();
+        fRenderTarget->writePixels(0, 0, bm.width(), bm.height(),
+                                      kSkia8888_GrPixelConfig,
+                                      bm.getPixels(),
+                                      bm.rowBytes());
+    }
+    INHERITED::present();
+}
+
+void SkExampleWindow::onSizeChange() {
+    setupRenderTarget();
+}
+
+#ifdef SK_BUILD_FOR_WIN
+void SkExampleWindow::onHandleInval(const SkIRect& rect) {
+    RECT winRect;
+    winRect.top = rect.top();
+    winRect.bottom = rect.bottom();
+    winRect.right = rect.right();
+    winRect.left = rect.left();
+    InvalidateRect((HWND)this->getHWND(), &winRect, false);
+}
+#endif
+
+bool SkExampleWindow::findNextMatch() {
+    bool found = false;
+    // Avoid infinite loop by knowing where we started.
+    const SkExample::Registry* begin = fRegistry;
+    while (!found) {
+        fRegistry = fRegistry->next();
+        if (NULL == fRegistry) {  // Reached the end of the registered samples. GOTO head.
+            fRegistry = SkExample::Registry::Head();
+        }
+        SkExample* next = fRegistry->factory()(this);
+        if (!SkCommandLineFlags::ShouldSkip(fMatchStrs, next->getName().c_str())) {
+            fCurrExample = next;
+            found = true;
+        }
+        if (begin == fRegistry) {  // We looped through every sample without finding anything.
+            break;
+        }
+    }
+    return found;
+}
+
+bool SkExampleWindow::onHandleChar(SkUnichar unichar) {
+    if ('n' == unichar) {
+        bool found = findNextMatch();
+        if (!found) {
+            SkDebugf("No SkExample that matches your query\n");
+        }
+    }
+    return true;
+}
+
+SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) {
+    SkCommandLineFlags::Parse(argc, argv);
+    return new SkExampleWindow(hwnd);
+}
diff --git a/experimental/SkiaExamples/SkExample.h b/experimental/SkiaExamples/SkExample.h
new file mode 100644
index 0000000..05b2ccd
--- /dev/null
+++ b/experimental/SkiaExamples/SkExample.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ */
+
+#ifndef SkExample_DEFINED
+#define SkExample_DEFINED
+
+#include "SkWindow.h"
+#include "SkTRegistry.h"
+
+class GrContext;
+struct GrGLInterface;
+class GrRenderTarget;
+class SkCanvas;
+class SkExampleWindow;
+
+class SkExample : public SkNoncopyable {
+public:
+    SkExample(SkExampleWindow* window) : fWindow(window) {}
+
+    // Your class should override this method to do its thing.
+    virtual void draw(SkCanvas* canvas) = 0;
+
+    SkString getName() { return fName; };
+    // Use this public registry to tell the world about your sample.
+    typedef SkTRegistry<SkExample*, SkExampleWindow*> Registry;
+
+protected:
+    SkExampleWindow* fWindow;
+    SkString fName;
+};
+
+class SkExampleWindow : public SkOSWindow {
+public:
+    enum DeviceType {
+        kRaster_DeviceType,
+        kGPU_DeviceType,
+    };
+    SkExampleWindow(void* hwnd);
+
+    // Changes the device type of the object.
+    bool setupBackend(DeviceType type);
+    void tearDownBackend();
+
+    DeviceType getDeviceType() const { return fType; }
+
+protected:
+    virtual void draw(SkCanvas* canvas) SK_OVERRIDE;
+
+    virtual void onSizeChange() SK_OVERRIDE;
+
+#ifdef SK_BUILD_FOR_WIN
+    virtual void onHandleInval(const SkIRect&) SK_OVERRIDE;
+#endif
+
+    SkCanvas* createCanvas() SK_OVERRIDE;
+
+private:
+    bool findNextMatch();  // Set example to the first one that matches FLAGS_match.
+    void setupRenderTarget();
+    bool onHandleChar(SkUnichar unichar) SK_OVERRIDE;
+
+    DeviceType fType;
+
+    SkExample* fCurrExample;
+    const SkExample::Registry* fRegistry;
+    SkTDArray<const char*> fMatchStrs;
+    GrContext* fContext;
+    GrRenderTarget* fRenderTarget;
+    AttachmentInfo fAttachmentInfo;
+    const GrGLInterface* fInterface;
+
+    typedef SkOSWindow INHERITED;
+};
+
+#endif
+
diff --git a/gyp/SkiaExamples.gyp b/gyp/SkiaExamples.gyp
deleted file mode 100644
index 8f26a8a..0000000
--- a/gyp/SkiaExamples.gyp
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  'targets' : [
-  {
-    'target_name': 'SkiaExamples',
-      'type': 'executable',
-      'mac_bundle' : 1,
-      'include_dirs' : [],
-      'includes': [],
-      'sources': [
-        '../experimental/SkiaExamples/HelloSkiaExample.cpp',
-        '../experimental/SkiaExamples/BaseExample.h',
-        '../experimental/SkiaExamples/BaseExample.cpp',
-      ],
-      'dependencies': [
-        'skia_lib.gyp:skia_lib',
-      'views.gyp:views',
-      'xml.gyp:xml',
-      ],
-      'conditions' : [
-        [ 'skia_gpu == 1', {
-          'include_dirs' : [
-            '../src/gpu',  #gl/GrGLUtil.h
-            ]
-        }],
-      [ 'skia_os == "win"', {
-        'sources' : [
-          '../src/views/win/SkOSWindow_Win.cpp',
-          '../src/views/win/skia_win.cpp',
-          ],
-        },
-      ],
-
-      [ 'skia_os == "mac"', {
-        'sources': [
-
-# SkiaExamples specific files
-        '../experimental/SkiaExamples/SkiaExamples-Info.plist',
-        '../experimental/SkiaExamples/SkExampleNSView.h',
-        '../experimental/SkiaExamples/SkExampleNSView.mm',
-
-# Mac files
-        '../src/views/mac/SampleAppDelegate.h',
-        '../src/views/mac/SampleAppDelegate.mm',
-        '../src/views/mac/SkEventNotifier.mm',
-        '../src/views/mac/skia_mac.mm',
-        '../src/views/mac/SkNSView.h',
-        '../src/views/mac/SkNSView.mm',
-        '../src/views/mac/SkOptionsTableView.h',
-        '../src/views/mac/SkOptionsTableView.mm',
-        '../src/views/mac/SkOSWindow_Mac.mm',
-        '../src/views/mac/SkTextFieldCell.h',
-        '../src/views/mac/SkTextFieldCell.m',
-        ],
-      'include_dirs' : [
-        '../src/views/mac/'
-        ],
-      'link_settings': {
-      },
-      'xcode_settings' : {
-        'INFOPLIST_FILE' : '../experimental/SkiaExamples/SkiaExamples-Info.plist',
-      },
-      'mac_bundle_resources' : [
-        '../experimental/SkiaExamples/SkiaExamples.xib'
-        ],
-      }
-    ],
-      ],
-  }
-  ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/gyp/experimental.gyp b/gyp/experimental.gyp
index 09711ac..5552b4c 100644
--- a/gyp/experimental.gyp
+++ b/gyp/experimental.gyp
@@ -18,6 +18,75 @@
         ],
       },
     },
+    {
+      'target_name': 'SkiaExamples',
+      'type': 'executable',
+      'mac_bundle' : 1,
+      'include_dirs' : [
+        '../tools/flags',
+        ],
+      'includes': [],
+       'sources': [
+         '../experimental/SkiaExamples/SkExample.h',
+         '../experimental/SkiaExamples/SkExample.cpp',
+         '../experimental/SkiaExamples/HelloSkiaExample.cpp',
+       ],
+       'dependencies': [
+         'skia_lib.gyp:skia_lib',
+         'views.gyp:views',
+         'xml.gyp:xml',
+         'flags.gyp:flags'
+       ],
+       'conditions' : [
+         [ 'skia_gpu == 1', {
+           'include_dirs' : [
+             '../src/gpu',  #gl/GrGLUtil.h
+             ]
+         }],
+        [ 'skia_os == "win"', {
+         'sources' : [
+           '../src/views/win/SkOSWindow_Win.cpp',
+           '../src/views/win/skia_win.cpp',
+           ],
+          },
+        ],
+
+        [ 'skia_os == "mac"', {
+          'sources': [
+
+# SkiaExamples specific files
+          '../experimental/SkiaExamples/SkiaExamples-Info.plist',
+          '../experimental/SkiaExamples/SkExampleNSView.h',
+          '../experimental/SkiaExamples/SkExampleNSView.mm',
+
+# Mac files
+          '../src/views/mac/SampleAppDelegate.h',
+          '../src/views/mac/SampleAppDelegate.mm',
+          '../src/views/mac/SkEventNotifier.mm',
+          '../src/views/mac/skia_mac.mm',
+          '../src/views/mac/SkNSView.h',
+          '../src/views/mac/SkNSView.mm',
+          '../src/views/mac/SkOptionsTableView.h',
+          '../src/views/mac/SkOptionsTableView.mm',
+          '../src/views/mac/SkOSWindow_Mac.mm',
+          '../src/views/mac/SkTextFieldCell.h',
+          '../src/views/mac/SkTextFieldCell.m',
+          ],
+        'include_dirs' : [
+          '../src/views/mac/'
+          ],
+        'link_settings': {
+        },
+        'xcode_settings' : {
+          'INFOPLIST_FILE' : '../experimental/SkiaExamples/SkiaExamples-Info.plist',
+        },
+        'mac_bundle_resources' : [
+          '../experimental/SkiaExamples/SkiaExamples.xib'
+          ],
+        }
+      ],
+     ],
+    }
   ],
 }
 
