diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index cfcef6f..84c9d23 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -9,7 +9,6 @@
 
   deps = [
     "//examples/apptest",
-    "//examples/browser",
     "//examples/content_handler_demo",
     "//examples/dart",
     "//examples/echo",
@@ -22,7 +21,6 @@
     "//examples/keyboard_client",
     "//examples/moterm_example_app",
     "//examples/native_run_app",
-    "//examples/nesting_app",
     "//examples/nfc_sender",
     "//examples/notification_generator",
     "//examples/png_viewer",
@@ -46,11 +44,7 @@
   }
 
   if (is_linux || is_android) {
-    deps += [
-      "//examples/surfaces_app",
-      "//examples/window_manager",
-      "//examples/wm_flow",
-    ]
+    deps += [ "//examples/surfaces_app" ]
   }
 
   if (defined(go_build_tool) && go_build_tool != "") {
diff --git a/examples/browser/BUILD.gn b/examples/browser/BUILD.gn
deleted file mode 100644
index 84dccc3..0000000
--- a/examples/browser/BUILD.gn
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ui.gni")
-import("//mojo/public/mojo_application.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
-
-mojo_native_application("browser") {
-  sources = [
-    "browser.cc",
-  ]
-
-  deps = [
-    ":bindings",
-    "//base",
-    "//examples/window_manager:bindings",
-    "//mojo/application",
-    "//mojo/converters/geometry",
-    "//mojo/services/geometry/interfaces",
-    "//mojo/services/navigation/interfaces",
-    "//mojo/services/view_manager/cpp",
-    "//mojo/services/view_manager/interfaces",
-    "//third_party/icu",
-    "//url",
-  ]
-}
-
-mojom("bindings") {
-  sources = [
-    "browser_host.mojom",
-  ]
-}
diff --git a/examples/browser/browser.cc b/examples/browser/browser.cc
deleted file mode 100644
index 33572c5..0000000
--- a/examples/browser/browser.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "examples/browser/browser_host.mojom.h"
-#include "examples/window_manager/window_manager.mojom.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/converters/geometry/geometry_type_converters.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_connection.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/connect.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/services/navigation/interfaces/navigation.mojom.h"
-#include "mojo/services/view_manager/cpp/view.h"
-#include "mojo/services/view_manager/cpp/view_manager.h"
-#include "mojo/services/view_manager/cpp/view_manager_client_factory.h"
-#include "mojo/services/view_manager/cpp/view_manager_delegate.h"
-#include "mojo/services/view_manager/cpp/view_observer.h"
-#include "url/gurl.h"
-
-namespace mojo {
-namespace examples {
-
-// This is the basics of creating a views widget with a textfield.
-// TODO: cleanup!
-class Browser : public ApplicationDelegate,
-                public ViewManagerDelegate,
-                public ViewObserver,
-                public examples::BrowserHost,
-                public mojo::InterfaceFactory<examples::BrowserHost> {
- public:
-  Browser() : shell_(nullptr), root_(NULL), binding_(this) {
-    browser_host_services_impl_.AddService(this);
-  }
-
-  ~Browser() override {
-    if (root_)
-      root_->RemoveObserver(this);
-  }
-
- private:
-  // Overridden from ApplicationDelegate:
-  void Initialize(ApplicationImpl* app) override {
-    shell_ = app->shell();
-    view_manager_client_factory_.reset(
-        new ViewManagerClientFactory(shell_, this));
-    app->ConnectToService("mojo:window_manager", &window_manager_);
-
-    // FIXME: Mojo applications don't know their URLs yet:
-    // https://docs.google.com/a/chromium.org/document/d/1AQ2y6ekzvbdaMF5WrUQmneyXJnke-MnYYL4Gz1AKDos
-    url_ = GURL(app->args()[1]);
-  }
-
-  bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
-    connection->AddService(view_manager_client_factory_.get());
-    return true;
-  }
-
-  // ViewManagerDelegate:
-  void OnEmbed(View* root,
-               InterfaceRequest<ServiceProvider> services,
-               ServiceProviderPtr exposed_services) override {
-    // TODO: deal with OnEmbed() being invoked multiple times.
-    ConnectToService(exposed_services.get(), &navigator_host_);
-    root_ = root;
-    root_->AddObserver(this);
-    root_->SetFocus();
-
-    // Create a child view for our sky document.
-    View* view = root->view_manager()->CreateView();
-    root->AddChild(view);
-    Rect bounds;
-    bounds.x = 0;
-    bounds.y = 0;
-    bounds.width = root->bounds().width;
-    bounds.height = root->bounds().height;
-    view->SetBounds(bounds);
-    view->SetVisible(true);
-    root->SetVisible(true);
-
-    ServiceProviderPtr browser_host_services;
-    browser_host_services_impl_.Bind(GetProxy(&browser_host_services));
-
-    GURL frame_url = url_.Resolve("/examples/browser/browser.sky");
-    view->Embed(frame_url.spec(), nullptr, browser_host_services.Pass());
-  }
-
-  void OnViewManagerDisconnected(ViewManager* view_manager) override {
-    base::MessageLoop::current()->Quit();
-  }
-
-  // ViewObserver:
-  void OnViewDestroyed(View* view) override {
-    DCHECK_EQ(root_, view);
-    view->RemoveObserver(this);
-    root_ = NULL;
-  }
-
-  // examples::BrowserHost:
-  void NavigateTo(const mojo::String& url) override {
-    URLRequestPtr request(URLRequest::New());
-    request->url = url;
-    navigator_host_->RequestNavigate(Target::NEW_NODE, request.Pass());
-  }
-
-  // mojo::InterfaceFactory<examples::BrowserHost> implementation.
-  void Create(mojo::ApplicationConnection* connection,
-              mojo::InterfaceRequest<examples::BrowserHost> request) override {
-    binding_.Bind(request.Pass());
-  }
-
-  Shell* shell_;
-
-  scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_;
-  View* root_;
-  NavigatorHostPtr navigator_host_;
-  ::examples::IWindowManagerPtr window_manager_;
-  ServiceProviderImpl browser_host_services_impl_;
-
-  GURL url_;
-
-  mojo::Binding<examples::BrowserHost> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(Browser);
-};
-
-}  // namespace examples
-}  // namespace mojo
-
-MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::examples::Browser);
-  return runner.Run(application_request);
-}
diff --git a/examples/browser/browser.sky b/examples/browser/browser.sky
deleted file mode 100644
index ce10859..0000000
--- a/examples/browser/browser.sky
+++ /dev/null
@@ -1,42 +0,0 @@
-#!mojo mojo:sky_viewer
-<!--
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
--->
-<sky>
-
-<import src="/gen/examples/browser/browser_host.mojom.sky" as="example" />
-
-<import src="/packages/sky/framework/embedder.sky" as="embedder" />
-<import src="/packages/sky/framework/sky-box.sky"/>
-<import src="/packages/sky/framework/sky-element/sky-element.sky" as="SkyElement" />
-<import src="/packages/sky/framework/sky-input.sky" />
-
-<sky-element name="browser-panel">
-<template>
-  <style>
-  div {
-    display: flex;
-  }
-  </style>
-
-  <sky-input id="text" value="{{ url }}" on-keydown="handleKeyDown" />
-</template>
-<script>
-module.exports = class extends SkyElement {
-  created() {
-    this.embedder = embedder.connectToEmbedderService(example.BrowserHost)
-    this.url = "http://";
-  }
-
-  handleKeyDown(event) {
-    if (event.key == 0xD)
-      this.embedder.navigateTo(this.url);
-  }
-}.register();
-</script>
-</sky-element>
-
-<browser-panel />
-</sky>
diff --git a/examples/browser/browser_host.mojom b/examples/browser/browser_host.mojom
deleted file mode 100644
index 04d789b..0000000
--- a/examples/browser/browser_host.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.examples;
-
-interface BrowserHost {
-  // Performs a navigation
-  NavigateTo(string url);
-};
diff --git a/examples/moterm_example_app/BUILD.gn b/examples/moterm_example_app/BUILD.gn
index 8ed0c0e..0737a99 100644
--- a/examples/moterm_example_app/BUILD.gn
+++ b/examples/moterm_example_app/BUILD.gn
@@ -11,7 +11,6 @@
 
   deps = [
     "//base",
-    "//examples/window_manager:bindings",
     "//mojo/application",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/utility",
diff --git a/examples/nesting_app/BUILD.gn b/examples/nesting_app/BUILD.gn
deleted file mode 100644
index 67107a1..0000000
--- a/examples/nesting_app/BUILD.gn
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/mojo_application.gni")
-
-mojo_native_application("nesting_app") {
-  sources = [
-    "nesting_app.cc",
-  ]
-
-  deps = [
-    "//base",
-    "//examples/bitmap_uploader",
-    "//examples/window_manager:bindings",
-    "//mojo/application",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/utility",
-    "//mojo/services/geometry/interfaces",
-    "//mojo/services/navigation/interfaces",
-    "//mojo/services/view_manager/cpp",
-    "//skia",
-    "//url",
-  ]
-}
diff --git a/examples/nesting_app/nesting_app.cc b/examples/nesting_app/nesting_app.cc
deleted file mode 100644
index a13b086..0000000
--- a/examples/nesting_app/nesting_app.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/strings/stringprintf.h"
-#include "examples/bitmap_uploader/bitmap_uploader.h"
-#include "examples/window_manager/window_manager.mojom.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_connection.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/interface_factory_impl.h"
-#include "mojo/services/view_manager/cpp/view.h"
-#include "mojo/services/view_manager/cpp/view_manager.h"
-#include "mojo/services/view_manager/cpp/view_manager_client_factory.h"
-#include "mojo/services/view_manager/cpp/view_manager_delegate.h"
-#include "mojo/services/view_manager/cpp/view_observer.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "url/gurl.h"
-
-namespace mojo {
-namespace examples {
-
-namespace {
-const char kEmbeddedAppURL[] = "mojo:embedded_app";
-}
-
-class NestingApp;
-
-// An app that embeds another app.
-// TODO(davemoore): Is this the right name?
-class NestingApp
-    : public ApplicationDelegate,
-      public ViewManagerDelegate,
-      public ViewObserver {
- public:
-  NestingApp() : nested_(nullptr), shell_(nullptr) {}
-  ~NestingApp() override {}
-
- private:
-  // Overridden from ApplicationDelegate:
-  void Initialize(ApplicationImpl* app) override {
-    shell_ = app->shell();
-    view_manager_client_factory_.reset(
-        new ViewManagerClientFactory(app->shell(), this));
-  }
-
-  // Overridden from ApplicationImpl:
-  bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
-    connection->ConnectToService(&window_manager_);
-    connection->AddService(view_manager_client_factory_.get());
-    return true;
-  }
-
-  // Overridden from ViewManagerDelegate:
-  void OnEmbed(View* root,
-               InterfaceRequest<ServiceProvider> services,
-               ServiceProviderPtr exposed_services) override {
-    root->AddObserver(this);
-    bitmap_uploader_.reset(new BitmapUploader(root));
-    bitmap_uploader_->Init(shell_);
-    bitmap_uploader_->SetColor(SK_ColorCYAN);
-
-    nested_ = root->view_manager()->CreateView();
-    root->AddChild(nested_);
-    Rect rect;
-    rect.x = rect.y = 20;
-    rect.width = rect.height = 50;
-    nested_->SetBounds(rect);
-    nested_->SetVisible(true);
-    nested_->Embed(kEmbeddedAppURL);
-  }
-  void OnViewManagerDisconnected(ViewManager* view_manager) override {
-   base::MessageLoop::current()->Quit();
-  }
-
-  // Overridden from ViewObserver:
-  void OnViewDestroyed(View* view) override {
-    // TODO(beng): reap views & child Views.
-    nested_ = NULL;
-  }
-  void OnViewInputEvent(View* view, const EventPtr& event) override {
-    if (event->action == EventType::POINTER_UP)
-      window_manager_->CloseWindow(view->id());
-  }
-
-  scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_;
-
-  View* nested_;
-  Shell* shell_;
-  ::examples::IWindowManagerPtr window_manager_;
-  scoped_ptr<BitmapUploader> bitmap_uploader_;
-
-  DISALLOW_COPY_AND_ASSIGN(NestingApp);
-};
-
-}  // namespace examples
-}  // namespace mojo
-
-MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::examples::NestingApp);
-  return runner.Run(application_request);
-}
diff --git a/examples/window_manager/BUILD.gn b/examples/window_manager/BUILD.gn
deleted file mode 100644
index 1e4ccc7..0000000
--- a/examples/window_manager/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ui.gni")
-import("//mojo/public/mojo_application.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
-
-mojo_native_application("window_manager") {
-  output_name = "example_window_manager"
-
-  sources = [
-    "window_manager.cc",
-  ]
-
-  deps = [
-    ":bindings",
-    "//base",
-    "//mojo/application",
-    "//mojo/common:common",
-    "//mojo/converters/geometry",
-    "//mojo/converters/input_events",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/utility",
-    "//mojo/services/geometry/interfaces",
-    "//mojo/services/input_events/interfaces",
-    "//mojo/services/navigation/interfaces",
-    "//mojo/services/view_manager/cpp",
-    "//services/window_manager:lib",
-    "//ui/events:events",
-    "//url:url",
-  ]
-}
-
-mojom("bindings") {
-  sources = [
-    "debug_panel_host.mojom",
-    "window_manager.mojom",
-  ]
-  import_dirs = [ get_path_info("../../mojo/services", "abspath") ]
-  deps = [
-    "//mojo/services/geometry/interfaces",
-    "//mojo/services/navigation/interfaces",
-    "//mojo/services/network/interfaces",
-  ]
-}
diff --git a/examples/window_manager/debug_panel.sky b/examples/window_manager/debug_panel.sky
deleted file mode 100644
index 4eb6eeb..0000000
--- a/examples/window_manager/debug_panel.sky
+++ /dev/null
@@ -1,70 +0,0 @@
-#!mojo mojo:sky_viewer
-<!--
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
--->
-<sky>
-
-<import src="/gen/examples/window_manager/debug_panel_host.mojom.sky" as="example" />
-<import src="/mojo/services/navigation/interfaces/navigation.mojom.sky" as="navigation" />
-
-<import src="/sky/framework/embedder.sky" as="embedder" />
-<import src="/sky/framework/sky-box.sky" as="SkyBox" />
-<import src="/sky/framework/sky-button.sky" as="SkyButton" />
-<import src="/sky/framework/sky-checkbox.sky" as="SkyCheckbox" />
-<import src="/sky/framework/sky-element/sky-element.sky" as="SkyElement" />
-<import src="/sky/framework/sky-radio.sky" as="SkyRadio" />
-
-<sky-element name="debug-panel">
-<template>
-  <style>
-  div { display: paragraph; }
-  </style>
-
-  <sky-box title='Navigation target:'>
-    <div><sky-radio group='nav-target' selected='true'
-                    on-click="handleRadioDefault"/>Default</div>
-    <div><sky-radio group='nav-target' on-click="handleRadioNewWindow"/>New window</div>
-    <div><sky-radio group='nav-target' on-click="handleRadioSourceWindow"/>Source window</div>
-  </sky-box>
-
-  <sky-button on-click="handleLocalNavClick">Local nav test</sky-button>
-  <sky-button on-click="handleCloseLastWindow">Close last window</sky-button>
-  <sky-button on-click="handleCrossAppNavTest">Cross-app nav test</sky-button>
-</template>
-<script>
-module.exports = class extends SkyElement {
-  created() {
-    this.embedder = embedder.connectToEmbedderService(example.DebugPanelHost)
-  }
-
-  handleRadioDefault(event) {
-    this.embedder.setNavigationTarget(navigation.Target.DEFAULT);
-  }
-
-  handleRadioNewWindow(event) {
-    this.embedder.setNavigationTarget(navigation.Target.NEW_NODE);
-  }
-
-  handleRadioSourceWindow(event) {
-    this.embedder.setNavigationTarget(navigation.Target.SOURCE_NODE);
-  }
-
-  handleLocalNavClick(event) {
-    this.embedder.navigateTo("mojo:embedded_app");
-  }
-
-  handleCloseLastWindow(event) {
-    this.embedder.closeTopWindow();
-  }
-
-  handleCrossAppNavTest(event) {
-    this.embedder.navigateTo("http://www.aaronboodman.com/z_dropbox/test.html");
-  }
-}.register();
-</script>
-</sky-element>
-
-<debug-panel />
-</sky>
diff --git a/examples/window_manager/debug_panel_host.mojom b/examples/window_manager/debug_panel_host.mojom
deleted file mode 100644
index 68073c8..0000000
--- a/examples/window_manager/debug_panel_host.mojom
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.examples;
-
-import "mojo/services/navigation/interfaces/navigation.mojom";
-
-interface DebugPanelHost {
-  // Closes the top.
-  CloseTopWindow();
-
-  // Sends a navigate request.
-  NavigateTo(string url);
-
-  // Sets the navigation target.
-  SetNavigationTarget(mojo.Target target);
-};
diff --git a/examples/window_manager/window_manager.cc b/examples/window_manager/window_manager.cc
deleted file mode 100644
index 1fbd491..0000000
--- a/examples/window_manager/window_manager.cc
+++ /dev/null
@@ -1,560 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "examples/window_manager/debug_panel_host.mojom.h"
-#include "examples/window_manager/window_manager.mojom.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/common/binding_set.h"
-#include "mojo/converters/geometry/geometry_type_converters.h"
-#include "mojo/converters/input_events/input_events_type_converters.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_connection.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/services/input_events/interfaces/input_events.mojom.h"
-#include "mojo/services/navigation/interfaces/navigation.mojom.h"
-#include "mojo/services/view_manager/cpp/view.h"
-#include "mojo/services/view_manager/cpp/view_manager.h"
-#include "mojo/services/view_manager/cpp/view_manager_delegate.h"
-#include "mojo/services/view_manager/cpp/view_observer.h"
-#include "services/window_manager/basic_focus_rules.h"
-#include "services/window_manager/view_target.h"
-#include "services/window_manager/window_manager_app.h"
-#include "services/window_manager/window_manager_delegate.h"
-#include "services/window_manager/window_manager_root.h"
-#include "ui/events/event.h"
-#include "ui/events/event_constants.h"
-#include "url/gurl.h"
-
-#if defined CreateWindow
-#undef CreateWindow
-#endif
-
-namespace mojo {
-namespace examples {
-
-class WindowManagerController;
-
-namespace {
-
-const int kBorderInset = 25;
-const int kControlPanelWidth = 200;
-const int kTextfieldHeight = 39;
-
-}  // namespace
-
-class WindowManagerConnection : public ::examples::IWindowManager {
- public:
-  WindowManagerConnection(WindowManagerController* window_manager,
-                          InterfaceRequest<::examples::IWindowManager> request)
-      : window_manager_(window_manager), binding_(this, request.Pass()) {}
-  ~WindowManagerConnection() override {}
-
- private:
-  // Overridden from ::examples::IWindowManager:
-  void CloseWindow(Id view_id) override;
-
-  WindowManagerController* window_manager_;
-  StrongBinding<::examples::IWindowManager> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowManagerConnection);
-};
-
-class NavigatorHostImpl : public NavigatorHost {
- public:
-  NavigatorHostImpl(WindowManagerController* window_manager, Id view_id)
-      : window_manager_(window_manager),
-        view_id_(view_id),
-        current_index_(-1) {}
-  ~NavigatorHostImpl() override {}
-
-  void Bind(InterfaceRequest<NavigatorHost> request) {
-    bindings_.AddBinding(this, request.Pass());
-  }
-
-  void RecordNavigation(const std::string& url);
-
- private:
-  void DidNavigateLocally(const mojo::String& url) override;
-  void RequestNavigate(Target target, URLRequestPtr request) override;
-  void RequestNavigateHistory(int32_t delta) override;
-
-  WindowManagerController* window_manager_;
-  Id view_id_;
-  std::vector<std::string> history_;
-  int32_t current_index_;
-
-  BindingSet<NavigatorHost> bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(NavigatorHostImpl);
-};
-
-class RootLayoutManager : public ViewObserver {
- public:
-  RootLayoutManager(ViewManager* view_manager,
-                    View* root,
-                    Id content_view_id,
-                    Id launcher_ui_view_id,
-                    Id control_panel_view_id)
-      : root_(root),
-        view_manager_(view_manager),
-        content_view_id_(content_view_id),
-        launcher_ui_view_id_(launcher_ui_view_id),
-        control_panel_view_id_(control_panel_view_id) {}
-  ~RootLayoutManager() override {
-    if (root_)
-      root_->RemoveObserver(this);
-  }
-
- private:
-  // Overridden from ViewObserver:
-  void OnViewBoundsChanged(View* view,
-                           const Rect& old_bounds,
-                           const Rect& new_bounds) override {
-    DCHECK_EQ(view, root_);
-
-    View* content_view = view_manager_->GetViewById(content_view_id_);
-    content_view->SetBounds(new_bounds);
-
-    int delta_width = new_bounds.width - old_bounds.width;
-    int delta_height = new_bounds.height - old_bounds.height;
-
-    View* launcher_ui_view = view_manager_->GetViewById(launcher_ui_view_id_);
-    Rect launcher_ui_bounds(launcher_ui_view->bounds());
-    launcher_ui_bounds.width += delta_width;
-    launcher_ui_view->SetBounds(launcher_ui_bounds);
-
-    View* control_panel_view =
-        view_manager_->GetViewById(control_panel_view_id_);
-    Rect control_panel_bounds(control_panel_view->bounds());
-    control_panel_bounds.x += delta_width;
-    control_panel_view->SetBounds(control_panel_bounds);
-
-    const View::Children& content_views = content_view->children();
-    View::Children::const_iterator iter = content_views.begin();
-    for (; iter != content_views.end(); ++iter) {
-      View* view = *iter;
-      if (view->id() == control_panel_view->id() ||
-          view->id() == launcher_ui_view->id())
-        continue;
-      Rect view_bounds(view->bounds());
-      view_bounds.width += delta_width;
-      view_bounds.height += delta_height;
-      view->SetBounds(view_bounds);
-    }
-  }
-  void OnViewDestroyed(View* view) override {
-    DCHECK_EQ(view, root_);
-    root_->RemoveObserver(this);
-    root_ = NULL;
-  }
-
-  View* root_;
-  ViewManager* view_manager_;
-  const Id content_view_id_;
-  const Id launcher_ui_view_id_;
-  const Id control_panel_view_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(RootLayoutManager);
-};
-
-class Window : public InterfaceFactory<NavigatorHost> {
- public:
-  Window(WindowManagerController* window_manager, View* view)
-      : window_manager_(window_manager),
-        view_(view),
-        navigator_host_(window_manager_, view_->id()) {
-    exposed_services_impl_.AddService<NavigatorHost>(this);
-  }
-
-  ~Window() override {}
-
-  View* view() const { return view_; }
-
-  NavigatorHost* navigator_host() { return &navigator_host_; }
-
-  void Embed(const std::string& url) {
-    // TODO: Support embedding multiple times?
-    ServiceProviderPtr exposed_services;
-    exposed_services_impl_.Bind(GetProxy(&exposed_services));
-    view_->Embed(url, nullptr, exposed_services.Pass());
-    navigator_host_.RecordNavigation(url);
-  }
-
- private:
-  // InterfaceFactory<NavigatorHost>
-  void Create(ApplicationConnection* connection,
-              InterfaceRequest<NavigatorHost> request) override {
-    navigator_host_.Bind(request.Pass());
-  }
-
-  WindowManagerController* window_manager_;
-  View* view_;
-  ServiceProviderImpl exposed_services_impl_;
-  NavigatorHostImpl navigator_host_;
-};
-
-class WindowManagerController
-    : public examples::DebugPanelHost,
-      public window_manager::WindowManagerController,
-      public ui::EventHandler,
-      public ui::AcceleratorTarget,
-      public mojo::InterfaceFactory<examples::DebugPanelHost>,
-      public InterfaceFactory<::examples::IWindowManager> {
- public:
-  WindowManagerController(Shell* shell,
-                          ApplicationImpl* app,
-                          ApplicationConnection* connection,
-                          window_manager::WindowManagerRoot* wm_root)
-      : shell_(shell),
-        launcher_ui_(NULL),
-        view_manager_(NULL),
-        window_manager_root_(wm_root),
-        navigation_target_(Target::DEFAULT),
-        app_(app),
-        binding_(this) {
-    connection->AddService<::examples::IWindowManager>(this);
-  }
-
-  ~WindowManagerController() override {
-    // host() may be destroyed by the time we get here.
-    // TODO: figure out a way to always cleanly remove handler.
-
-    // TODO(erg): In the aura version, we removed ourselves from the
-    // PreTargetHandler list here. We may need to do something analogous when
-    // we get event handling without aura working.
-  }
-
-  void CloseWindow(Id view_id) {
-    WindowVector::iterator iter = GetWindowByViewId(view_id);
-    DCHECK(iter != windows_.end());
-    Window* window = *iter;
-    windows_.erase(iter);
-    window->view()->Destroy();
-  }
-
-  void DidNavigateLocally(uint32 source_view_id, const mojo::String& url) {
-    LOG(ERROR) << "DidNavigateLocally: source_view_id: " << source_view_id
-               << " url: " << url.To<std::string>();
-  }
-
-  void RequestNavigate(uint32 source_view_id,
-                       Target target,
-                       const mojo::String& url) {
-    OnLaunch(source_view_id, target, url);
-  }
-
-  // Overridden from mojo::DebugPanelHost:
-  void CloseTopWindow() override {
-    if (!windows_.empty())
-      CloseWindow(windows_.back()->view()->id());
-  }
-
-  void NavigateTo(const String& url) override {
-    OnLaunch(control_panel_id_, Target::NEW_NODE, url);
-  }
-
-  void SetNavigationTarget(Target t) override { navigation_target_ = t; }
-
-  // mojo::InterfaceFactory<examples::DebugPanelHost> implementation.
-  void Create(
-      mojo::ApplicationConnection* connection,
-      mojo::InterfaceRequest<examples::DebugPanelHost> request) override {
-    binding_.Bind(request.Pass());
-  }
-
-  // mojo::InterfaceFactory<::examples::IWindowManager> implementation.
-  void Create(
-      mojo::ApplicationConnection* connection,
-      mojo::InterfaceRequest<::examples::IWindowManager> request) override {
-    new WindowManagerConnection(this, request.Pass());
-  }
-
- private:
-  typedef std::vector<Window*> WindowVector;
-
-  // Overridden from ViewManagerDelegate:
-  void OnEmbed(View* root,
-               InterfaceRequest<ServiceProvider> services,
-               ServiceProviderPtr exposed_services) override {
-    DCHECK(!view_manager_);
-    view_manager_ = root->view_manager();
-
-    View* view = view_manager_->CreateView();
-    root->AddChild(view);
-    Rect rect;
-    rect.width = root->bounds().width;
-    rect.height = root->bounds().height;
-    view->SetBounds(rect);
-    view->SetVisible(true);
-    content_view_id_ = view->id();
-
-    Id launcher_ui_id = CreateLauncherUI();
-    control_panel_id_ = CreateControlPanel(view);
-
-    root_layout_manager_.reset(
-        new RootLayoutManager(view_manager_, root, content_view_id_,
-                              launcher_ui_id, control_panel_id_));
-    root->AddObserver(root_layout_manager_.get());
-
-    // TODO(erg): In the aura version, we explicitly added ourselves as a
-    // PreTargetHandler to the window() here. We probably have to do something
-    // analogous here.
-
-    window_manager_root_->InitFocus(
-        make_scoped_ptr(new window_manager::BasicFocusRules(root)));
-    window_manager_root_->accelerator_manager()->Register(
-        ui::Accelerator(ui::VKEY_BROWSER_BACK, 0),
-        ui::AcceleratorManager::kNormalPriority, this);
-  }
-  void OnViewManagerDisconnected(ViewManager* view_manager) override {
-    DCHECK_EQ(view_manager_, view_manager);
-    view_manager_ = NULL;
-    base::MessageLoop::current()->Quit();
-  }
-
-  // Overridden from WindowManagerDelegate:
-  void Embed(const String& url,
-             InterfaceRequest<ServiceProvider> services,
-             ServiceProviderPtr exposed_services) override {
-    const Id kInvalidSourceViewId = 0;
-    OnLaunch(kInvalidSourceViewId, Target::DEFAULT, url);
-  }
-
-  // Overridden from ui::EventHandler:
-  void OnEvent(ui::Event* event) override {
-    View* view =
-        static_cast<window_manager::ViewTarget*>(event->target())->view();
-    if (event->type() == ui::ET_MOUSE_PRESSED)
-      view->SetFocus();
-  }
-
-  // Overriden from ui::AcceleratorTarget:
-  bool AcceleratorPressed(const ui::Accelerator& accelerator,
-                          mojo::View* view) override {
-    if (accelerator.key_code() != ui::VKEY_BROWSER_BACK)
-      return false;
-
-    WindowVector::iterator iter = GetWindowByViewId(view->id());
-    DCHECK(iter != windows_.end());
-    Window* window = *iter;
-    window->navigator_host()->RequestNavigateHistory(-1);
-    return true;
-  }
-
-  // Overriden from ui::AcceleratorTarget:
-  bool CanHandleAccelerators() const override { return true; }
-
-  void OnLaunch(uint32 source_view_id,
-                Target requested_target,
-                const mojo::String& url) {
-    Target target = navigation_target_;
-    if (target == Target::DEFAULT) {
-      if (requested_target != Target::DEFAULT) {
-        target = requested_target;
-      } else {
-        // TODO(aa): Should be Target::NEW_NODE if source origin and dest origin
-        // are different?
-        target = Target::SOURCE_NODE;
-      }
-    }
-
-    Window* dest_view = NULL;
-    if (target == Target::SOURCE_NODE) {
-      WindowVector::iterator source_view = GetWindowByViewId(source_view_id);
-      bool app_initiated = source_view != windows_.end();
-      if (app_initiated)
-        dest_view = *source_view;
-      else if (!windows_.empty())
-        dest_view = windows_.back();
-    }
-
-    if (!dest_view) {
-      dest_view = CreateWindow();
-      windows_.push_back(dest_view);
-    }
-
-    dest_view->Embed(url);
-  }
-
-  // TODO(beng): proper layout manager!!
-  Id CreateLauncherUI() {
-    View* view = view_manager_->GetViewById(content_view_id_);
-    Rect bounds = view->bounds();
-    bounds.x += kBorderInset;
-    bounds.y += kBorderInset;
-    bounds.width -= 2 * kBorderInset;
-    bounds.height = kTextfieldHeight;
-    launcher_ui_ = CreateWindow(bounds);
-    launcher_ui_->Embed("mojo:browser");
-    return launcher_ui_->view()->id();
-  }
-
-  Window* CreateWindow() {
-    View* view = view_manager_->GetViewById(content_view_id_);
-    Rect bounds;
-    bounds.x = kBorderInset;
-    bounds.y = 2 * kBorderInset + kTextfieldHeight;
-    bounds.width = view->bounds().width - 3 * kBorderInset - kControlPanelWidth;
-    bounds.height =
-        view->bounds().height - (3 * kBorderInset + kTextfieldHeight);
-    if (!windows_.empty()) {
-      bounds.x = windows_.back()->view()->bounds().x + 35;
-      bounds.y = windows_.back()->view()->bounds().y + 35;
-    }
-    return CreateWindow(bounds);
-  }
-
-  Window* CreateWindow(const Rect& bounds) {
-    View* content = view_manager_->GetViewById(content_view_id_);
-    View* view = view_manager_->CreateView();
-    content->AddChild(view);
-    view->SetBounds(bounds);
-    view->SetVisible(true);
-    view->SetFocus();
-    return new Window(this, view);
-  }
-
-  Id CreateControlPanel(View* root) {
-    View* view = view_manager_->CreateView();
-    root->AddChild(view);
-
-    Rect bounds;
-    bounds.x = root->bounds().width - kControlPanelWidth - kBorderInset;
-    bounds.y = kBorderInset * 2 + kTextfieldHeight;
-    bounds.width = kControlPanelWidth;
-    bounds.height = root->bounds().height - kBorderInset * 3 - kTextfieldHeight;
-    view->SetBounds(bounds);
-    view->SetVisible(true);
-
-    ServiceProviderPtr exposed_services;
-    control_panel_exposed_services_impl_.Bind(GetProxy(&exposed_services));
-    control_panel_exposed_services_impl_.AddService<::examples::IWindowManager>(
-        this);
-
-    GURL frame_url = url_.Resolve("/examples/window_manager/debug_panel.sky");
-    view->Embed(frame_url.spec(), nullptr, exposed_services.Pass());
-
-    return view->id();
-  }
-
-  WindowVector::iterator GetWindowByViewId(Id view_id) {
-    for (std::vector<Window*>::iterator iter = windows_.begin();
-         iter != windows_.end(); ++iter) {
-      if ((*iter)->view()->id() == view_id) {
-        return iter;
-      }
-    }
-    return windows_.end();
-  }
-
-  Shell* shell_;
-
-  Window* launcher_ui_;
-  WindowVector windows_;
-  ViewManager* view_manager_;
-  scoped_ptr<RootLayoutManager> root_layout_manager_;
-  ServiceProviderImpl control_panel_exposed_services_impl_;
-
-  window_manager::WindowManagerRoot* window_manager_root_;
-
-  // Id of the view most content is added to.
-  Id content_view_id_;
-
-  // Id of the debug panel.
-  Id control_panel_id_;
-
-  GURL url_;
-  Target navigation_target_;
-
-  ApplicationImpl* app_;
-
-  mojo::Binding<examples::DebugPanelHost> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowManagerController);
-};
-
-class WindowManager : public ApplicationDelegate,
-                      public window_manager::WindowManagerControllerFactory {
- public:
-  WindowManager()
-      : window_manager_app_(new window_manager::WindowManagerApp(this)) {}
-
-  scoped_ptr<window_manager::WindowManagerController>
-  CreateWindowManagerController(
-      ApplicationConnection* connection,
-      window_manager::WindowManagerRoot* wm_root) override {
-    return scoped_ptr<WindowManagerController>(
-        new WindowManagerController(shell_, app_, connection, wm_root));
-  }
-
- private:
-  // Overridden from ApplicationDelegate:
-  void Initialize(ApplicationImpl* app) override {
-    window_manager_app_.reset(new window_manager::WindowManagerApp(this));
-    shell_ = app->shell();
-    app_ = app;
-    // FIXME: Mojo applications don't know their URLs yet:
-    // https://docs.google.com/a/chromium.org/document/d/1AQ2y6ekzvbdaMF5WrUQmneyXJnke-MnYYL4Gz1AKDos
-    url_ = GURL(app->args()[1]);
-    window_manager_app_->Initialize(app);
-  }
-
-  bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
-    window_manager_app_->ConfigureIncomingConnection(connection);
-    return true;
-  }
-
-  ApplicationImpl* app_;
-  Shell* shell_;
-  GURL url_;
-
-  scoped_ptr<window_manager::WindowManagerApp> window_manager_app_;
-  DISALLOW_COPY_AND_ASSIGN(WindowManager);
-};
-
-void WindowManagerConnection::CloseWindow(Id view_id) {
-  window_manager_->CloseWindow(view_id);
-}
-
-void NavigatorHostImpl::DidNavigateLocally(const mojo::String& url) {
-  window_manager_->DidNavigateLocally(view_id_, url);
-  RecordNavigation(url);
-}
-
-void NavigatorHostImpl::RequestNavigate(Target target, URLRequestPtr request) {
-  window_manager_->RequestNavigate(view_id_, target, request->url);
-}
-
-void NavigatorHostImpl::RequestNavigateHistory(int32_t delta) {
-  if (history_.empty())
-    return;
-  current_index_ =
-      std::max(0, std::min(current_index_ + delta,
-                           static_cast<int32_t>(history_.size()) - 1));
-  window_manager_->RequestNavigate(view_id_, Target::SOURCE_NODE,
-                                   history_[current_index_]);
-}
-
-void NavigatorHostImpl::RecordNavigation(const std::string& url) {
-  if (current_index_ >= 0 && history_[current_index_] == url) {
-    // This is a navigation to the current entry, ignore.
-    return;
-  }
-  history_.erase(history_.begin() + (current_index_ + 1), history_.end());
-  history_.push_back(url);
-  ++current_index_;
-}
-
-}  // namespace examples
-}  // namespace mojo
-
-MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::examples::WindowManager);
-  return runner.Run(application_request);
-}
diff --git a/examples/window_manager/window_manager.mojom b/examples/window_manager/window_manager.mojom
deleted file mode 100644
index d2e161f..0000000
--- a/examples/window_manager/window_manager.mojom
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module examples;
-
-import "mojo/services/geometry/interfaces/geometry.mojom";
-
-interface IWindowManager {
-  CloseWindow(uint32 node_id);
-};
diff --git a/examples/wm_flow/BUILD.gn b/examples/wm_flow/BUILD.gn
deleted file mode 100644
index d2dab6f..0000000
--- a/examples/wm_flow/BUILD.gn
+++ /dev/null
@@ -1,99 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ui.gni")
-import("//mojo/public/mojo_application.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
-
-group("wm_flow") {
-  deps = [
-    ":app",
-    ":embedded",
-    ":wm",
-  ]
-}
-
-mojo_native_application("wm") {
-  output_name = "wm_flow_wm"
-
-  sources = [
-    "wm/frame_controller.cc",
-    "wm/frame_controller.h",
-    "wm/wm.cc",
-  ]
-
-  deps = [
-    ":wm_bindings",
-    "//base",
-    "//mojo/application",
-    "//mojo/converters/geometry",
-    "//mojo/public/interfaces/application",
-    "//mojo/services/input_events/interfaces",
-    "//mojo/services/view_manager/cpp",
-    "//services/window_manager:lib",
-    "//skia",
-    "//ui/gfx/geometry",
-    "//url",
-  ]
-}
-
-mojo_native_application("app") {
-  output_name = "wm_flow_app"
-
-  sources = [
-    "app/app.cc",
-  ]
-
-  deps = [
-    ":embedder_bindings",
-    ":embeddee_bindings",
-    "//base",
-    "//examples/bitmap_uploader",
-    "//mojo/application",
-    "//mojo/common",
-    "//mojo/public/interfaces/application:application",
-    "//mojo/services/view_manager/cpp",
-    "//services/window_manager:lib",
-    "//skia",
-    "//url",
-  ]
-}
-
-mojo_native_application("embedded") {
-  output_name = "wm_flow_embedded"
-
-  sources = [
-    "embedded/embedded.cc",
-  ]
-
-  deps = [
-    ":embeddee_bindings",
-    ":embedder_bindings",
-    "//base",
-    "//examples/bitmap_uploader",
-    "//mojo/application",
-    "//mojo/services/view_manager/cpp",
-    "//services/window_manager:lib",
-    "//skia",
-    "//url",
-  ]
-}
-
-mojom("wm_bindings") {
-  sources = [
-    "wm/window_frame_host.mojom",
-  ]
-}
-
-mojom("embedder_bindings") {
-  sources = [
-    "app/embedder.mojom",
-  ]
-}
-
-mojom("embeddee_bindings") {
-  sources = [
-    "embedded/embeddee.mojom",
-  ]
-}
diff --git a/examples/wm_flow/app/app.cc b/examples/wm_flow/app/app.cc
deleted file mode 100644
index 163bd1a..0000000
--- a/examples/wm_flow/app/app.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <map>
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/stl_util.h"
-#include "examples/bitmap_uploader/bitmap_uploader.h"
-#include "examples/wm_flow/app/embedder.mojom.h"
-#include "examples/wm_flow/embedded/embeddee.mojom.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/common/binding_set.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_connection.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/connect.h"
-#include "mojo/public/cpp/application/interface_factory_impl.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/interfaces/application/service_provider.mojom.h"
-#include "mojo/services/view_manager/cpp/view.h"
-#include "mojo/services/view_manager/cpp/view_manager.h"
-#include "mojo/services/view_manager/cpp/view_manager_client_factory.h"
-#include "mojo/services/view_manager/cpp/view_manager_context.h"
-#include "mojo/services/view_manager/cpp/view_manager_delegate.h"
-#include "mojo/services/view_manager/cpp/view_observer.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "url/gurl.h"
-
-namespace examples {
-namespace {
-
-// TODO(johngro) : investigate extending mojom with a formal flags type which it
-// generates good bindings for, so we don't need to resort to this.
-static inline constexpr bool operator &(const mojo::EventFlags& f1,
-                                        const mojo::EventFlags& f2) {
-  return ((static_cast<uint32_t>(f1) & static_cast<uint32_t>(f2)) != 0);
-}
-
-const SkColor kColors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorYELLOW };
-
-class EmbedderImpl : public Embedder {
- public:
-  explicit EmbedderImpl(mojo::InterfaceRequest<Embedder> request)
-      : binding_(this, request.Pass()) {}
-  ~EmbedderImpl() override {}
-
- private:
-  // Overridden from Embedder:
-  void HelloWorld(const mojo::Callback<void()>& callback) override {
-    callback.Run();
-  }
-
-  mojo::StrongBinding<Embedder> binding_;
-  DISALLOW_COPY_AND_ASSIGN(EmbedderImpl);
-};
-
-class EmbedderImplProvider : public mojo::ServiceProvider {
- public:
-  EmbedderImplProvider() {}
-  ~EmbedderImplProvider() override {}
-
-  void AddBinding(mojo::InterfaceRequest<mojo::ServiceProvider> request) {
-    embeddee_exposed_services_.AddBinding(this, request.Pass());
-  }
-
- private:
-  // mojo::ServiceProvider implementation
-  void ConnectToService(const mojo::String& interface_name,
-                        mojo::ScopedMessagePipeHandle pipe_handle) override {
-    if (interface_name != Embedder::Name_)
-      return;
-    new EmbedderImpl(mojo::MakeRequest<Embedder>(pipe_handle.Pass()));
-  }
-
-  mojo::BindingSet<mojo::ServiceProvider> embeddee_exposed_services_;
-
-  DISALLOW_COPY_AND_ASSIGN(EmbedderImplProvider);
-};
-
-}  // namespace
-
-// This app starts its life via Connect() rather than by being embed, so it does
-// not start with a connection to the ViewManager service. It has to obtain a
-// connection by connecting to the ViewManagerInit service and asking to be
-// embed without a view context.
-class WMFlowApp : public mojo::ApplicationDelegate,
-                  public mojo::ViewManagerDelegate,
-                  public mojo::ViewObserver {
- public:
-  WMFlowApp() : shell_(nullptr), embed_count_(0) {}
-  ~WMFlowApp() override { STLDeleteValues(&uploaders_); }
-
- private:
-  typedef std::map<mojo::View*, mojo::BitmapUploader*> ViewToUploader;
-
-  // Overridden from ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
-    shell_ = app->shell();
-    view_manager_client_factory_.reset(
-        new mojo::ViewManagerClientFactory(app->shell(), this));
-    view_manager_context_.reset(new mojo::ViewManagerContext(app));
-    // FIXME: Mojo applications don't know their URLs yet:
-    // https://docs.google.com/a/chromium.org/document/d/1AQ2y6ekzvbdaMF5WrUQmneyXJnke-MnYYL4Gz1AKDos
-    url_ = GURL(app->args()[1]);
-    OpenNewWindow();
-    OpenNewWindow();
-    OpenNewWindow();
-  }
-  bool ConfigureIncomingConnection(
-      mojo::ApplicationConnection* connection) override {
-    connection->AddService(view_manager_client_factory_.get());
-    return true;
-  }
-
-  // Overridden from mojo::ViewManagerDelegate:
-  void OnEmbed(mojo::View* root,
-               mojo::InterfaceRequest<mojo::ServiceProvider> services,
-               mojo::ServiceProviderPtr exposed_services) override {
-    root->AddObserver(this);
-    mojo::BitmapUploader* uploader = new mojo::BitmapUploader(root);
-    uploaders_[root] = uploader;
-    uploader->Init(shell_);
-    // BitmapUploader does not track view size changes, we would
-    // need to subscribe to OnViewBoundsChanged and tell the bitmap uploader
-    // to invalidate itself.  This is better done once if had a per-view
-    // object instead of holding per-view state on the ApplicationDelegate.
-    uploader->SetColor(kColors[embed_count_++ % arraysize(kColors)]);
-
-    mojo::View* embed = root->view_manager()->CreateView();
-    root->AddChild(embed);
-    mojo::Rect bounds;
-    bounds.x = bounds.y = 25;
-    bounds.width = root->bounds().width - 50;
-    bounds.height = root->bounds().height - 50;
-    embed->SetBounds(bounds);
-    embed->SetVisible(true);
-
-    mojo::ServiceProviderPtr embedee_exposed_services;
-    embeddee_provider_.AddBinding(GetProxy(&embedee_exposed_services));
-
-    GURL embedded_app_url = url_.Resolve("wm_flow_embedded.mojo");
-    mojo::ServiceProviderPtr imported;
-    embed->Embed(embedded_app_url.spec(), GetProxy(&imported),
-                 embedee_exposed_services.Pass());
-    // FIXME: This is wrong.  We're storing per-view state on this per-app
-    // delegate.  Every time a new view is created embedee_ is replaced
-    // causing the previous one to shut down.  This class should not
-    // be a ViewManagerDelegate, but rather a separate object should be
-    // created for each embedding.
-    mojo::ConnectToService(imported.get(), &embeddee_);
-    embeddee_->HelloBack(base::Bind(&WMFlowApp::HelloBackAck,
-                                    base::Unretained(this)));
-  }
-  void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override {
-    STLDeleteValues(&uploaders_);
-  }
-
-  // Overridden from mojo::ViewObserver:
-  void OnViewInputEvent(mojo::View* view,
-                        const mojo::EventPtr& event) override {
-    if (event->action == mojo::EventType::POINTER_UP &&
-        event->flags & mojo::EventFlags::LEFT_MOUSE_BUTTON) {
-      OpenNewWindow();
-    }
-  }
-  void OnViewDestroyed(mojo::View* view) override {
-    if (uploaders_.find(view) != uploaders_.end()) {
-      delete uploaders_[view];
-      uploaders_.erase(view);
-    }
-    --embed_count_;
-    view->RemoveObserver(this);
-  }
-
-  void HelloBackAck() {
-    printf("HelloBack() ack'ed\n");
-  }
-
-  void OpenNewWindow() { view_manager_context_->Embed(url_.spec()); }
-
-  mojo::Shell* shell_;
-  int embed_count_;
-  scoped_ptr<mojo::ViewManagerClientFactory> view_manager_client_factory_;
-  scoped_ptr<mojo::ViewManagerContext> view_manager_context_;
-  EmbeddeePtr embeddee_;
-  EmbedderImplProvider embeddee_provider_;
-  ViewToUploader uploaders_;
-  GURL url_;
-
-  DISALLOW_COPY_AND_ASSIGN(WMFlowApp);
-};
-
-}  // namespace examples
-
-MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new examples::WMFlowApp);
-  return runner.Run(application_request);
-}
diff --git a/examples/wm_flow/app/embedder.mojom b/examples/wm_flow/app/embedder.mojom
deleted file mode 100644
index ee9b4a7..0000000
--- a/examples/wm_flow/app/embedder.mojom
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module examples;
-
-interface Embedder {
-  HelloWorld() => ();
-};
diff --git a/examples/wm_flow/embedded/embedded.cc b/examples/wm_flow/embedded/embedded.cc
deleted file mode 100644
index f7c67f8..0000000
--- a/examples/wm_flow/embedded/embedded.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "examples/bitmap_uploader/bitmap_uploader.h"
-#include "examples/wm_flow/app/embedder.mojom.h"
-#include "examples/wm_flow/embedded/embeddee.mojom.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_connection.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/connect.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/services/view_manager/cpp/view.h"
-#include "mojo/services/view_manager/cpp/view_manager.h"
-#include "mojo/services/view_manager/cpp/view_manager_client_factory.h"
-#include "mojo/services/view_manager/cpp/view_manager_delegate.h"
-#include "third_party/skia/include/core/SkColor.h"
-
-namespace examples {
-
-namespace {
-
-class EmbeddeeImpl : public Embeddee {
- public:
-  explicit EmbeddeeImpl(mojo::InterfaceRequest<Embeddee> request)
-      : binding_(this, request.Pass()) {}
-  ~EmbeddeeImpl() override {}
-
- private:
-  // Overridden from Embeddee:
-  void HelloBack(const mojo::Callback<void()>& callback) override {
-    callback.Run();
-  }
-
-  mojo::StrongBinding<Embeddee> binding_;
-  DISALLOW_COPY_AND_ASSIGN(EmbeddeeImpl);
-};
-
-}  // namespace
-
-class WMFlowEmbedded : public mojo::ApplicationDelegate,
-                       public mojo::ViewManagerDelegate,
-                       public mojo::InterfaceFactory<Embeddee> {
- public:
-  WMFlowEmbedded() : shell_(nullptr) {
-    embeddee_provider_impl_.AddService(this);
-  }
-  ~WMFlowEmbedded() override {}
-
- private:
-  // Overridden from Application:
-  void Initialize(mojo::ApplicationImpl* app) override {
-    shell_ = app->shell();
-    view_manager_client_factory_.reset(
-        new mojo::ViewManagerClientFactory(app->shell(), this));
-  }
-  bool ConfigureIncomingConnection(
-      mojo::ApplicationConnection* connection) override {
-    connection->AddService(view_manager_client_factory_.get());
-    return true;
-  }
-
-  // Overridden from mojo::ViewManagerDelegate:
-  void OnEmbed(mojo::View* root,
-               mojo::InterfaceRequest<mojo::ServiceProvider> services,
-               mojo::ServiceProviderPtr exposed_services) override {
-    bitmap_uploader_.reset(new mojo::BitmapUploader(root));
-    bitmap_uploader_->Init(shell_);
-    // BitmapUploader does not track view size changes, we would
-    // need to subscribe to OnViewBoundsChanged and tell the bitmap uploader
-    // to invalidate itself.  This is better done once if had a per-view
-    // object instead of holding per-view state on the ApplicationDelegate.
-    bitmap_uploader_->SetColor(SK_ColorMAGENTA);
-
-    embeddee_provider_impl_.Bind(services.Pass());
-    // FIXME: embedder_ is wrong for the same reason the embedee_ storage is
-    // wrong in app.cc.  We need separate per-instance storage not on the
-    // application delegate.
-    mojo::ConnectToService(exposed_services.get(), &embedder_);
-    embedder_->HelloWorld(base::Bind(&WMFlowEmbedded::HelloWorldAck,
-                                     base::Unretained(this)));
-  }
-  void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override {}
-
-  // Overridden from mojo::InterfaceFactory<Embeddee>:
-  void Create(mojo::ApplicationConnection* app,
-              mojo::InterfaceRequest<Embeddee> request) override {
-    new EmbeddeeImpl(request.Pass());
-  }
-
-  void HelloWorldAck() {
-    printf("HelloWorld() ack'ed\n");
-  }
-
-  mojo::Shell* shell_;
-  scoped_ptr<mojo::ViewManagerClientFactory> view_manager_client_factory_;
-  EmbedderPtr embedder_;
-  mojo::ServiceProviderImpl embeddee_provider_impl_;
-  scoped_ptr<mojo::BitmapUploader> bitmap_uploader_;
-
-  DISALLOW_COPY_AND_ASSIGN(WMFlowEmbedded);
-};
-
-}  // namespace examples
-
-MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new examples::WMFlowEmbedded);
-  return runner.Run(application_request);
-}
-
diff --git a/examples/wm_flow/embedded/embeddee.mojom b/examples/wm_flow/embedded/embeddee.mojom
deleted file mode 100644
index 097efdf..0000000
--- a/examples/wm_flow/embedded/embeddee.mojom
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module examples;
-
-interface Embeddee {
-  HelloBack() => ();
-};
diff --git a/examples/wm_flow/wm/frame_controller.cc b/examples/wm_flow/wm/frame_controller.cc
deleted file mode 100644
index c3ec629..0000000
--- a/examples/wm_flow/wm/frame_controller.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "examples/wm_flow/wm/frame_controller.h"
-
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "mojo/converters/geometry/geometry_type_converters.h"
-#include "mojo/public/interfaces/application/service_provider.mojom.h"
-#include "mojo/services/view_manager/cpp/view.h"
-#include "mojo/services/view_manager/cpp/view_manager.h"
-#include "services/window_manager/capture_controller.h"
-#include "services/window_manager/window_manager_root.h"
-#include "url/gurl.h"
-
-////////////////////////////////////////////////////////////////////////////////
-// FrameController, public:
-
-FrameController::FrameController(
-    const GURL& frame_app_url,
-    mojo::View* view,
-    mojo::View** app_view,
-    window_manager::WindowManagerRoot* window_manager_root)
-    : view_(view),
-      app_view_(view->view_manager()->CreateView()),
-      maximized_(false),
-      window_manager_root_(window_manager_root),
-      binding_(this) {
-  view_->AddObserver(this);
-  view_->SetVisible(true);  // FIXME: This should not be our responsibility?
-  *app_view = app_view_;
-
-  viewer_services_impl_.AddService(this);
-  mojo::ServiceProviderPtr viewer_services;
-  viewer_services_impl_.Bind(GetProxy(&viewer_services));
-
-  view_->Embed(frame_app_url.spec(), nullptr, viewer_services.Pass());
-
-  // We weren't observing when our initial bounds was set:
-  OnViewBoundsChanged(view, view->bounds(), view->bounds());
-
-  // Add the child view after embedding sky, since embed clears children.
-  view_->AddChild(app_view_);
-  app_view_->SetVisible(true);
-}
-
-FrameController::~FrameController() {}
-
-void FrameController::Create(
-    mojo::ApplicationConnection* connection,
-    mojo::InterfaceRequest<examples::WindowFrameHost> request) {
-  binding_.Bind(request.Pass());
-}
-
-void FrameController::CloseWindow() {
-  // This destroys |app_view_| as it is a child of |view_|.
-  view_->Destroy();
-}
-
-void FrameController::ToggleMaximize() {
-  if (!maximized_)
-    restored_bounds_ = view_->bounds().To<gfx::Rect>();
-  maximized_ = !maximized_;
-  if (maximized_)
-    view_->SetBounds(view_->parent()->bounds());
-  else
-    view_->SetBounds(*mojo::Rect::From(restored_bounds_));
-}
-
-void FrameController::ActivateWindow() {
-  window_manager_root_->focus_controller()->ActivateView(view_);
-}
-
-void FrameController::SetCapture(bool frame_has_capture) {
-  if (frame_has_capture)
-    window_manager_root_->capture_controller()->SetCapture(view_);
-  else
-    window_manager_root_->capture_controller()->ReleaseCapture(view_);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// FrameController, mojo::ViewObserver implementation:
-
-void FrameController::OnViewDestroyed(mojo::View* view) {
-  view_->RemoveObserver(this);
-  delete this;
-}
-
-void FrameController::OnViewBoundsChanged(mojo::View* view,
-                                          const mojo::Rect& old_bounds,
-                                          const mojo::Rect& new_bounds) {
-  CHECK(view == view_);
-  // Statically size the embedded view.  Unclear if we should use a
-  // sky iframe to participate in sky layout or not.
-  const int kTopControlsAdditionalInset = 15;
-  const int kDefaultInset = 25;
-  mojo::Rect bounds;
-  bounds.x = bounds.y = kDefaultInset;
-  bounds.y += kTopControlsAdditionalInset;
-  bounds.width = view_->bounds().width - kDefaultInset * 2;
-  bounds.height =
-      view_->bounds().height - kDefaultInset * 2 - kTopControlsAdditionalInset;
-  app_view_->SetBounds(bounds);
-}
diff --git a/examples/wm_flow/wm/frame_controller.h b/examples/wm_flow/wm/frame_controller.h
deleted file mode 100644
index 5472459..0000000
--- a/examples/wm_flow/wm/frame_controller.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef EXAMPLES_WM_FLOW_WM_FRAME_CONTROLLER_H_
-#define EXAMPLES_WM_FLOW_WM_FRAME_CONTROLLER_H_
-
-#include "base/memory/scoped_ptr.h"
-#include "examples/wm_flow/wm/window_frame_host.mojom.h"
-#include "mojo/public/cpp/application/interface_factory.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/services/view_manager/cpp/view_observer.h"
-#include "services/window_manager/focus_controller.h"
-#include "ui/gfx/geometry/rect.h"
-
-class GURL;
-
-namespace mojo {
-class NativeWidgetViewManager;
-class View;
-}
-
-namespace window_manager {
-class WindowManagerRoot;
-}
-
-// FrameController encapsulates the window manager's frame additions to a window
-// created by an application. It renders the content of the frame and responds
-// to any events targeted at it.
-class FrameController
-    : public examples::WindowFrameHost,
-      public mojo::ViewObserver,
-      public mojo::InterfaceFactory<examples::WindowFrameHost> {
- public:
-  FrameController(const GURL& frame_app_url,
-                  mojo::View* view,
-                  mojo::View** app_view,
-                  window_manager::WindowManagerRoot* window_manager_root);
-  ~FrameController() override;
-
-  // mojo::InterfaceFactory<examples::WindowFrameHost> implementation.
-  void Create(
-      mojo::ApplicationConnection* connection,
-      mojo::InterfaceRequest<examples::WindowFrameHost> request) override;
-
-  // examples::WindowFrameHost
-  void CloseWindow() override;
-  void ToggleMaximize() override;
-  void ActivateWindow() override;
-  void SetCapture(bool frame_has_capture) override;
-
- private:
-  void OnViewDestroyed(mojo::View* view) override;
-  void OnViewBoundsChanged(mojo::View* view,
-                           const mojo::Rect& old_bounds,
-                           const mojo::Rect& new_bounds) override;
-
-  mojo::View* view_;
-  mojo::View* app_view_;
-  bool maximized_;
-  gfx::Rect restored_bounds_;
-  window_manager::WindowManagerRoot* window_manager_root_;
-  mojo::ServiceProviderImpl viewer_services_impl_;
-
-  mojo::Binding<examples::WindowFrameHost> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(FrameController);
-};
-
-#endif  // EXAMPLES_WM_FLOW_WM_FRAME_CONTROLLER_H_
diff --git a/examples/wm_flow/wm/window_frame.sky b/examples/wm_flow/wm/window_frame.sky
deleted file mode 100644
index 4e2267a..0000000
--- a/examples/wm_flow/wm/window_frame.sky
+++ /dev/null
@@ -1,84 +0,0 @@
-#!mojo mojo:sky_viewer
-<!--
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
--->
-<sky>
-<import src="/gen/examples/wm_flow/wm/window_frame_host.mojom.sky" as="example" />
-<import src="/sky/framework/embedder.sky" as="embedder" />
-<import src="/sky/framework/sky-button.sky"/>
-<import src="/sky/framework/sky-checkbox.sky"/>
-<import src="/sky/framework/sky-element/sky-element.sky" as="SkyElement"/>
-
-<style>
-/* FIXME: Hack until the requirement of a single root element is lifted. */
-sky { height: 100%; }
-</style>
-
-<sky-element name="window-frame">
-<template>
-  <style>
-  :host {
-    height: 100%;
-    background-color: lightgrey;
-  }
-  /* Nest two flexboxes and make the right side take up as much as possible */
-  window-bar {
-    display: flex;
-  }
-  left {
-    flex: 1;
-    display: flex;
-    align-content: flex-start;
-  }
-  /* Also making the checkbox and label a flexbox for convenience */
-  right {
-    display: flex;
-  }
-
-  /* Style sky controls to make them look more like ui/views */
-  sky-button {
-    border: none;
-    border: 1px solid blue;
-    padding: 2px;
-  }
-  sky-button:hover {
-    border: 1px solid lightblue;
-    background-color: darkgrey;
-  }
-  </style>
-  <window-bar>
-    <left>
-      <sky-checkbox on-click="handleCaptureClick" />Capture
-    </left>
-    <right>
-      <sky-button on-click="handleEmbiggenClick">Embiggen</sky-button>
-      <sky-button on-click="handleBegoneClick">Begone</sky-button>
-    </right>
-  </window-bar>
-</template>
-<script>
-module.exports = class extends SkyElement {
-  created() {
-    this.embedder = embedder.connectToEmbedderService(example.WindowFrameHost);
-    this.addEventListener('mousedown', function() {
-      this.embedder.activateWindow();
-    }.bind(this));
-  }
-  handleCaptureClick(event) {
-    this.embedder.setCapture(event.target.checked);
-  }
-  handleEmbiggenClick(event) {
-    this.embedder.toggleMaximize();
-  }
-  handleBegoneClick(event) {
-    this.embedder.closeWindow();
-  }
-}.register();
-</script>
-</sky-element>
-
-<window-frame />
-
-</sky>
diff --git a/examples/wm_flow/wm/window_frame_host.mojom b/examples/wm_flow/wm/window_frame_host.mojom
deleted file mode 100644
index 9b09fcd..0000000
--- a/examples/wm_flow/wm/window_frame_host.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module examples;
-
-interface WindowFrameHost {
-  ActivateWindow();
-  CloseWindow();
-  SetCapture(bool frame_has_capture);
-  ToggleMaximize();
-};
diff --git a/examples/wm_flow/wm/wm.cc b/examples/wm_flow/wm/wm.cc
deleted file mode 100644
index f5b4286..0000000
--- a/examples/wm_flow/wm/wm.cc
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "examples/wm_flow/wm/frame_controller.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/services/input_events/interfaces/input_events.mojom.h"
-#include "mojo/services/view_manager/cpp/view_manager.h"
-#include "mojo/services/view_manager/cpp/view_manager_delegate.h"
-#include "mojo/services/view_manager/cpp/view_observer.h"
-#include "services/window_manager/basic_focus_rules.h"
-#include "services/window_manager/window_manager_app.h"
-#include "services/window_manager/window_manager_delegate.h"
-#include "services/window_manager/window_manager_root.h"
-#include "url/gurl.h"
-
-namespace examples {
-
-// TODO(johngro) : investigate extending mojom with a formal flags type which it
-// generates good bindings for, so we don't need to resort to this.
-static inline constexpr bool operator &(const mojo::EventFlags& f1,
-                                        const mojo::EventFlags& f2) {
-  return ((static_cast<uint32_t>(f1) & static_cast<uint32_t>(f2)) != 0);
-}
-
-class SimpleWMController : public window_manager::WindowManagerController,
-                           public mojo::ViewObserver {
- public:
-  SimpleWMController(window_manager::WindowManagerRoot* wm_root)
-      : window_manager_root_(wm_root),
-        root_(NULL),
-        window_container_(NULL),
-        next_window_origin_(10, 10) {}
-  ~SimpleWMController() override {}
-
- private:
-  // Overridden from mojo::ViewManagerDelegate:
-  void OnEmbed(mojo::View* root,
-               mojo::InterfaceRequest<mojo::ServiceProvider> services,
-               mojo::ServiceProviderPtr exposed_services) override {
-    root_ = root;
-
-    window_container_ = root->view_manager()->CreateView();
-    window_container_->SetBounds(root_->bounds());
-    root_->AddChild(window_container_);
-    window_container_->SetVisible(true);
-
-    window_manager_root_->InitFocus(make_scoped_ptr(
-        new window_manager::BasicFocusRules(window_container_)));
-  }
-  void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override {
-    root_ = NULL;
-  }
-
-  // Overridden from mojo::WindowManagerDelegate:
-  void Embed(const mojo::String& url,
-             mojo::InterfaceRequest<mojo::ServiceProvider> services,
-             mojo::ServiceProviderPtr exposed_services) override {
-    DCHECK(root_);
-    mojo::View* app_view = NULL;
-    CreateTopLevelWindow(&app_view);
-    app_view->Embed(url, services.Pass(), exposed_services.Pass());
-  }
-
-  // Overridden from mojo::ViewObserver:
-  void OnViewInputEvent(mojo::View* view,
-                        const mojo::EventPtr& event) override {
-    if (event->action == mojo::EventType::POINTER_UP &&
-        event->flags & mojo::EventFlags::RIGHT_MOUSE_BUTTON &&
-        view->parent() == window_container_) {
-      CloseWindow(view);
-    }
-  }
-  void OnViewDestroyed(mojo::View* view) override {
-    view->RemoveObserver(this);
-  }
-
-  void CloseWindow(mojo::View* view) {
-    mojo::View* first_child = view->children().front();
-    first_child->Destroy();
-    view->Destroy();
-    next_window_origin_.Offset(-50, -50);
-  }
-
-  mojo::View* CreateTopLevelWindow(mojo::View** app_view) {
-    mojo::View* frame_view = root_->view_manager()->CreateView();
-    // Add the View to it's parent before showing so that animations can happen.
-    window_container_->AddChild(frame_view);
-    mojo::Rect rect;
-    rect.x = next_window_origin_.x();
-    rect.y = next_window_origin_.y();
-    rect.width = rect.height = 400;
-    frame_view->SetBounds(rect);
-    next_window_origin_.Offset(50, 50);
-
-    GURL frame_url = url_.Resolve("/examples/wm_flow/wm/window_frame.sky");
-    new FrameController(frame_url, frame_view, app_view, window_manager_root_);
-    return frame_view;
-  }
-
-  window_manager::WindowManagerRoot* window_manager_root_;
-
-  GURL url_;
-  mojo::View* root_;
-  mojo::View* window_container_;
-
-  gfx::Point next_window_origin_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleWMController);
-};
-
-class SimpleWM : public mojo::ApplicationDelegate,
-                 public window_manager::WindowManagerControllerFactory {
- public:
-  SimpleWM()
-      : window_manager_app_(new window_manager::WindowManagerApp(this)) {}
-
- protected:
-  ~SimpleWM() override {}
-
- private:
-  // Overridden from mojo::ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* impl) override {
-    // FIXME: Mojo applications don't know their URLs yet:
-    // https://docs.google.com/a/chromium.org/document/d/1AQ2y6ekzvbdaMF5WrUQmneyXJnke-MnYYL4Gz1AKDos
-    url_ = GURL(impl->args()[1]);
-    window_manager_app_->Initialize(impl);
-  }
-
-  bool ConfigureIncomingConnection(
-      mojo::ApplicationConnection* connection) override {
-    window_manager_app_->ConfigureIncomingConnection(connection);
-    return true;
-  }
-
-  scoped_ptr<window_manager::WindowManagerController>
-  CreateWindowManagerController(
-      mojo::ApplicationConnection* connection,
-      window_manager::WindowManagerRoot* wm_root) override {
-    return scoped_ptr<window_manager::WindowManagerController>(
-        new SimpleWMController(wm_root));
-  }
-
-  scoped_ptr<window_manager::WindowManagerApp> window_manager_app_;
-  GURL url_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleWM);
-};
-
-}  // namespace examples
-
-MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new examples::SimpleWM);
-  return runner.Run(application_request);
-}
