diff --git a/samplecode/SampleSGInval.cpp b/samplecode/SampleSGInval.cpp
new file mode 100644
index 0000000..08bfd64
--- /dev/null
+++ b/samplecode/SampleSGInval.cpp
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2017 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 "SkCanvas.h"
+#include "SkSGColor.h"
+#include "SkSGDraw.h"
+#include "SkSGGroup.h"
+#include "SkSGInvalidationController.h"
+#include "SkSGRect.h"
+#include "SkSGTransform.h"
+#include "SkAnimTimer.h"
+
+#include <cmath>
+
+class SGInvalView final : public SampleView {
+public:
+    SGInvalView() {}
+
+protected:
+    void onOnceBeforeDraw() override {
+        fRect1 = sksg::Rect::Make(SkRect::MakeLTRB(100, 100, 100, 100));
+        fRect2 = sksg::Rect::Make(SkRect::MakeLTRB(300, 200, 300, 200));
+        fColor1 = sksg::Color::Make(0);
+        fColor2 = sksg::Color::Make(0);
+
+        fRoot = sksg::Group::Make();
+        fRoot->addChild(sksg::Draw::Make(fRect1, fColor1));
+        fRoot->addChild(sksg::Transform::Make(sksg::Draw::Make(fRect2, fColor2),
+                                              SkMatrix::MakeScale(1.5f, 1.5f)));
+    }
+
+    bool onQuery(SkEvent* evt) override {
+        if (SampleCode::TitleQ(*evt)) {
+            SampleCode::TitleR(evt, "SGInval");
+            return true;
+        }
+
+        return this->INHERITED::onQuery(evt);
+    }
+
+    void onDrawContent(SkCanvas* canvas) override {
+        sksg::InvalidationController ic;
+        fRoot->revalidate(&ic, SkMatrix::I());
+
+        // TODO: clip/cull
+        fRoot->render(canvas);
+
+        SkPaint p;
+        p.setColor(0xffff0000);
+        p.setStyle(SkPaint::kStroke_Style);
+        p.setAntiAlias(true);
+        p.setStrokeWidth(0);
+
+        for (const auto& r : ic) {
+            canvas->drawRect(r, p);
+        }
+    }
+
+    bool onAnimate(const SkAnimTimer& timer) override {
+        static constexpr SkScalar kSize = 50;
+        static constexpr SkScalar kRate = 1.0f / 500;
+        const auto t = timer.msec() * kRate;
+
+        fRect1->setR(fRect1->getL() + kSize * (1 + std::sin(t)));
+        fRect1->setB(fRect1->getT() + kSize * (1 + std::cos(t)));
+        fRect2->setR(fRect2->getL() + kSize * (1 + std::cos(SK_ScalarPI / 2 + t)));
+        fRect2->setB(fRect2->getT() + kSize * (1 + std::sin(SK_ScalarPI / 2 + t)));
+
+        fColor1->setColor(SkColorSetARGB(128 * (1 + std::sin(t)), 0, 0x80, 0));
+        fColor2->setColor(SkColorSetARGB(128 * (1 + std::cos(t)), 0, 0, 0x80));
+        return true;
+    }
+
+private:
+    typedef SampleView INHERITED;
+
+    sk_sp<sksg::Rect>  fRect1,
+                       fRect2;
+    sk_sp<sksg::Color> fColor1,
+                       fColor2;
+    sk_sp<sksg::Group> fRoot;
+};
+
+static SkView* SGInvalFactory() { return new SGInvalView; }
+static SkViewRegister reg(SGInvalFactory);
