diff --git a/samplecode/OverView.cpp b/samplecode/OverView.cpp
index 5346c1a..bbf647a 100644
--- a/samplecode/OverView.cpp
+++ b/samplecode/OverView.cpp
@@ -6,24 +6,48 @@
  */
 
 #include "OverView.h"
-
 #include "SampleCode.h"
-
 #include "SkCanvas.h"
 #include "SkView.h"
 
-static const int N = 8;
-static const SkScalar kWidth = SkIntToScalar(640);
-static const SkScalar kHeight = SkIntToScalar(480);
 static const char gIsOverview[] = "is-overview";
 
+static int to_lower(int c) {
+    if ('A' <= c && c <= 'Z') {
+        c = c - 'A' + 'a';
+    }
+    return c;
+}
+
+static void make_lc(SkString* str) {
+    char* ptr = str->writable_str();
+    while (*ptr) {
+        *ptr = to_lower(*ptr);
+        ptr += 1;
+    }
+}
+
+static bool case_insensitive_find(const SkString& base, const SkString& sub) {
+    SkString lcBase(base);
+    SkString lcSub(sub);
+    make_lc(&lcBase);
+    make_lc(&lcSub);
+    return lcBase.find(lcSub.c_str()) >= 0;
+}
+
+static bool draw_this_name(const SkString& name, const SkString& filter) {
+    if (filter.isEmpty()) {
+        return true;
+    }
+    return case_insensitive_find(name, filter);
+}
+
 class OverView : public SkView {
 public:
     OverView(int count, const SkViewFactory* factories[]);
     virtual ~OverView();
 
 protected:
-    // Overridden from SkEventSink:
     bool onEvent(const SkEvent&) SK_OVERRIDE;
     bool onQuery(SkEvent* evt) SK_OVERRIDE {
         if (SampleCode::TitleQ(*evt)) {
@@ -33,29 +57,34 @@
         if (evt->isType(gIsOverview)) {
             return true;
         }
+        SkUnichar uni;
+        if (SampleCode::CharQ(*evt, &uni)) {
+            fMatchStr.appendUnichar(uni);
+            this->inval(NULL);
+            return true;
+        }
         return this->INHERITED::onQuery(evt);
     }
 
-
-    // Overridden from SkView:
-    void onSizeChange() SK_OVERRIDE;
-    void onDraw(SkCanvas* canvas) SK_OVERRIDE {
-        canvas->drawColor(SK_ColorLTGRAY);
-    }
-
-    SkCanvas* beforeChildren(SkCanvas*) SK_OVERRIDE;
+    void onDraw(SkCanvas* canvas) SK_OVERRIDE;
 
     bool onSendClickToChildren(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE {
         return false;
     }
 
-    Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE {
-        int ix = (int)(SkScalarDiv(x * N, kWidth));
-        int iy = (int)(SkScalarDiv(y * N, kHeight));
-        if (ix >= 0 && iy >= 0) {
-            SkEvent evt("set-curr-index");
-            evt.setFast32(iy * N + ix);
-            this->sendEventToParents(evt);
+    Click* onFindClickHandler(SkScalar cx, SkScalar cy, unsigned modi) SK_OVERRIDE {
+        const SkRect crect = SkRect::MakeXYWH(cx - 0.5f, cy - 0.5f, 1, 1);
+        SkPoint loc = this->start();
+        for (int i = 0; i < fCount; ++i) {
+            if (draw_this_name(fNames[i], fMatchStr)) {
+                if (this->bounds(loc).intersects(crect)) {
+                    SkEvent evt("set-curr-index");
+                    evt.setFast32(i);
+                    this->sendEventToParents(evt);
+                    break;
+                }
+                this->next(&loc);
+            }
         }
         return NULL;
     }
@@ -63,6 +92,28 @@
 private:
     int fCount;
     const SkViewFactory** fFactories;
+    SkString* fNames;
+    SkString fMatchStr;
+    SkPaint fNamePaint;
+    SkPaint::FontMetrics fNameMetrics;
+    SkScalar fNameW;
+    SkScalar fNameH;
+
+    SkRect bounds(const SkPoint& loc) const {
+        return SkRect::MakeXYWH(loc.x(), loc.y() + fNameMetrics.fAscent, fNameW, fNameH);
+    }
+
+    SkPoint start() const {
+        return SkPoint::Make(10, -fNameMetrics.fTop);
+    }
+
+    void next(SkPoint* loc) const {
+        loc->fY += fNameH;
+        if (loc->fY > this->height() - fNameMetrics.fBottom) {
+            loc->fY = -fNameMetrics.fTop;
+            loc->fX += fNameW;
+        }
+    }
 
     typedef SkView INHERITED;
 };
@@ -79,35 +130,44 @@
 OverView::OverView(int count, const SkViewFactory* factories[]) {
     fCount = count;
     fFactories = factories;
+
+    fNames = new SkString[count];
+    for (int i = 0; i < count; ++i) {
+        SkView* view = (*fFactories[i])();
+        if (view) {
+            (void)SampleCode::RequestTitle(view, &fNames[i]);
+            if (0 == fNames[i].find("GM:")) {
+                fNames[i].remove(0, 3);
+            }
+        }
+    }
+
+    fNamePaint.setAntiAlias(true);
+    fNamePaint.setTextSize(12);
+    fNameW = 160;
+    fNameH = fNamePaint.getFontMetrics(&fNameMetrics);
 }
 
 OverView::~OverView() {
+    delete[] fNames;
 }
 
 bool OverView::onEvent(const SkEvent& evt) {
     return this->INHERITED::onEvent(evt);
 }
 
-void OverView::onSizeChange() {
-    this->detachAllChildren();
+void OverView::onDraw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(0xFFF8F8F8);
+    canvas->drawPaint(paint);
 
-    SkScalar locX = 0;
-    SkScalar locY = 0;
-    for (int i = 0; i < fCount; i++) {
-        SkView* view = (*fFactories[i])();
-        view->setVisibleP(true);
-        this->attachChildToBack(view)->unref();
-        view->setLoc(locX, locY);
-        view->setSize(kWidth, kHeight);
-        locX += kWidth;
-        if ((i % N) == N - 1) {
-            locY += kHeight;
-            locX = 0;
+    SkPoint loc = this->start();
+    for (int i = 0; i < fCount; ++i) {
+        if (draw_this_name(fNames[i], fMatchStr)) {
+            canvas->drawRect(this->bounds(loc), paint);
+            canvas->drawText(fNames[i].c_str(), fNames[i].size(), loc.x(), loc.y(), fNamePaint);
+            this->next(&loc);
         }
     }
 }
 
-SkCanvas* OverView::beforeChildren(SkCanvas* canvas) {
-    canvas->scale(SK_Scalar1 / N, SK_Scalar1 / N);
-    return canvas;
-}
