diff --git a/examples/build.sh b/examples/build.sh
index 2bd398ef..e4c412d 100755
--- a/examples/build.sh
+++ b/examples/build.sh
@@ -8,7 +8,7 @@
 
 cd $ROOT_DIR
 
-gyp -Ilibweave_common.gypi --toplevel-dir=. --depth=. -f ninja $DIR/daemon/daemon.gyp
+gyp -Ilibweave_common.gypi --toplevel-dir=. --depth=. -f ninja $DIR/daemon/examples.gyp
 
 if [ -z "$BUILD_CONFIG" ]; then
    export BUILD_CONFIG=Debug
@@ -16,7 +16,7 @@
 
 export BUILD_TARGET=$*
 if [ -z "$BUILD_TARGET" ]; then
-   export BUILD_TARGET="weave_daemon libweave_testrunner libweave_exports_testrunner"
+   export BUILD_TARGET="weave_daemon_examples libweave_testrunner libweave_exports_testrunner"
 fi
 
 export CORES=`cat /proc/cpuinfo | grep processor | wc -l`
diff --git a/examples/daemon/README b/examples/daemon/README
index 4743883..287459f 100644
--- a/examples/daemon/README
+++ b/examples/daemon/README
@@ -84,16 +84,16 @@
         Enter request body:
         {
           "deviceId": "0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d",
-          "name": "_greeter._greet",
+          "name": "_sample._hello",
           "parameters": { "_name": "cloud user" }
         }
    "Send the request", you command will be "queued" as its "state"
 
   - verify the command execution with weave daemon
        in terminal running the daemon, observe something similar to
-         New command '_greeter._greet' arrived, ...
-         received command: _greeter._greet
-         _greeter._greet command: finished
+         New command '_sample._hello' arrived, ...
+         received command: _sample._hello
+         _sample._hello command: finished
   - verify the command history with oauthplayground
        Similar to "Acquire Registration Ticket" section in this document,
        except in "step 3", do:
@@ -104,9 +104,9 @@
        "Send the request", you get all of the commands executed on your
        device, find something like
           "kind": "clouddevices#command",
-          "name": "_greeter._greet",
+          "name": "_sample._hello",
           "results": {
-            "_greeting": "Hello cloud user"
+            "_reply": "Hello cloud user"
           },
           ...
 
diff --git a/examples/daemon/common/daemon.h b/examples/daemon/common/daemon.h
new file mode 100644
index 0000000..0e05b88
--- /dev/null
+++ b/examples/daemon/common/daemon.h
@@ -0,0 +1,124 @@
+// Copyright 2015 The Weave 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 <weave/device.h>
+#include <weave/error.h>
+
+#include <base/bind.h>
+
+#include "examples/provider/avahi_client.h"
+#include "examples/provider/bluez_client.h"
+#include "examples/provider/curl_http_client.h"
+#include "examples/provider/event_http_server.h"
+#include "examples/provider/event_network.h"
+#include "examples/provider/event_task_runner.h"
+#include "examples/provider/file_config_store.h"
+#include "examples/provider/wifi_manager.h"
+
+class Daemon {
+ public:
+  struct Options {
+    bool force_bootstrapping_ = false;
+    bool disable_security_ = false;
+    bool disable_privet_ = false;
+    std::string registration_ticket_;
+
+    static void ShowUsage(const std::string& name) {
+      LOG(ERROR) << "\nUsage: " << name << " <option(s)>"
+                 << "\nOptions:\n"
+                 << "\t-h,--help                    Show this help message\n"
+                 << "\t--v=LEVEL                    Logging level\n"
+                 << "\t-b,--bootstrapping           Force WiFi bootstrapping\n"
+                 << "\t-d,--disable_security        Disable privet security\n"
+                 << "\t--registration_ticket=TICKET Register device with the "
+                    "given ticket\n"
+                 << "\t--disable_privet             Disable local privet\n";
+    }
+
+    bool Parse(int argc, char** argv) {
+      for (int i = 1; i < argc; ++i) {
+        std::string arg = argv[i];
+        if (arg == "-h" || arg == "--help") {
+          return false;
+        } else if (arg == "-b" || arg == "--bootstrapping") {
+          force_bootstrapping_ = true;
+        } else if (arg == "-d" || arg == "--disable_security") {
+          disable_security_ = true;
+        } else if (arg == "--disable_privet") {
+          disable_privet_ = true;
+        } else if (arg.find("--registration_ticket") != std::string::npos) {
+          auto pos = arg.find("=");
+          if (pos == std::string::npos) {
+            return false;
+          }
+          registration_ticket_ = arg.substr(pos + 1);
+        } else if (arg.find("--v") != std::string::npos) {
+          auto pos = arg.find("=");
+          if (pos == std::string::npos) {
+            return false;
+          }
+          logging::SetMinLogLevel(-std::stoi(arg.substr(pos + 1)));
+        } else {
+          return false;
+        }
+      }
+      return true;
+    }
+  };
+
+  Daemon(const Options& opts)
+      : config_store_{new weave::examples::FileConfigStore(
+            opts.disable_security_)},
+        task_runner_{new weave::examples::EventTaskRunner},
+        http_client_{new weave::examples::CurlHttpClient(task_runner_.get())},
+        network_{new weave::examples::EventNetworkImpl(task_runner_.get())},
+        bluetooth_{new weave::examples::BluetoothImpl} {
+    if (!opts.disable_privet_) {
+      network_->SetSimulateOffline(opts.force_bootstrapping_);
+
+      dns_sd_.reset(new weave::examples::AvahiClient);
+      http_server_.reset(
+          new weave::examples::HttpServerImpl{task_runner_.get()});
+      if (weave::examples::WifiImpl::HasWifiCapability())
+        wifi_.reset(
+            new weave::examples::WifiImpl{task_runner_.get(), network_.get()});
+    }
+    device_ = weave::Device::Create(config_store_.get(), task_runner_.get(),
+                                    http_client_.get(), network_.get(),
+                                    dns_sd_.get(), http_server_.get(),
+                                    wifi_.get(), bluetooth_.get());
+
+    if (!opts.registration_ticket_.empty()) {
+      device_->Register(opts.registration_ticket_,
+                        base::Bind(&OnRegisterDeviceDone, device_.get()));
+    }
+  }
+
+  void Run() { task_runner_->Run(); }
+
+  weave::Device* GetDevice() const { return device_.get(); }
+
+  weave::examples::EventTaskRunner* GetTaskRunner() const {
+    return task_runner_.get();
+  }
+
+ private:
+  static void OnRegisterDeviceDone(weave::Device* device,
+                                   weave::ErrorPtr error) {
+    if (error)
+      LOG(ERROR) << "Fail to register device: " << error->GetMessage();
+    else
+      LOG(INFO) << "Device registered: " << device->GetSettings().cloud_id;
+  }
+
+  std::unique_ptr<weave::examples::FileConfigStore> config_store_;
+  std::unique_ptr<weave::examples::EventTaskRunner> task_runner_;
+  std::unique_ptr<weave::examples::CurlHttpClient> http_client_;
+  std::unique_ptr<weave::examples::EventNetworkImpl> network_;
+  std::unique_ptr<weave::examples::BluetoothImpl> bluetooth_;
+  std::unique_ptr<weave::examples::AvahiClient> dns_sd_;
+  std::unique_ptr<weave::examples::HttpServerImpl> http_server_;
+  std::unique_ptr<weave::examples::WifiImpl> wifi_;
+  std::unique_ptr<weave::Device> device_;
+};
diff --git a/examples/daemon/examples.gyp b/examples/daemon/examples.gyp
new file mode 100644
index 0000000..8fee90d
--- /dev/null
+++ b/examples/daemon/examples.gyp
@@ -0,0 +1,14 @@
+{
+  'targets': [
+    {
+      'target_name': 'weave_daemon_examples',
+      'type': 'none',
+      'dependencies': [
+        'sample/daemon.gyp:weave_daemon_sample',
+        'light/daemon.gyp:weave_daemon_light',
+        'lock/daemon.gyp:weave_daemon_lock',
+        'ledflasher/daemon.gyp:weave_daemon_ledflasher'
+      ]
+    }
+  ]
+}
diff --git a/examples/daemon/daemon.gyp b/examples/daemon/ledflasher/daemon.gyp
similarity index 84%
copy from examples/daemon/daemon.gyp
copy to examples/daemon/ledflasher/daemon.gyp
index c6f8837..5abfcd6 100644
--- a/examples/daemon/daemon.gyp
+++ b/examples/daemon/ledflasher/daemon.gyp
@@ -4,10 +4,10 @@
 {
   'targets': [
     {
-      'target_name': 'weave_daemon',
+      'target_name': 'weave_daemon_ledflasher',
       'type': 'executable',
       'sources': [
-        'main.cc',
+        'ledflasher.cc',
       ],
       'dependencies': [
         '<@(DEPTH)/libweave_standalone.gyp:libweave',
diff --git a/examples/daemon/ledflasher_handler.h b/examples/daemon/ledflasher/ledflasher.cc
similarity index 78%
rename from examples/daemon/ledflasher_handler.h
rename to examples/daemon/ledflasher/ledflasher.cc
index 812a3d4..38314f5 100644
--- a/examples/daemon/ledflasher_handler.h
+++ b/examples/daemon/ledflasher/ledflasher.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "examples/daemon/common/daemon.h"
+
 #include <weave/device.h>
 
 #include <base/bind.h>
@@ -9,10 +11,6 @@
 
 #include <bitset>
 
-namespace weave {
-namespace examples {
-namespace daemon {
-
 namespace {
 // Supported LED count on this device
 const size_t kLedCount = 3;
@@ -23,7 +21,7 @@
 class LedFlasherHandler {
  public:
   LedFlasherHandler() {}
-  void Register(Device* device) {
+  void Register(weave::Device* device) {
     device_ = device;
 
     device->AddStateDefinitionsFromJson(R"({
@@ -60,7 +58,7 @@
   }
 
  private:
-  void OnFlasherSetCommand(const std::weak_ptr<Command>& command) {
+  void OnFlasherSetCommand(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -84,13 +82,13 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    ErrorPtr error;
-    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                 "Invalid parameters");
+    weave::ErrorPtr error;
+    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                        "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void OnFlasherToggleCommand(const std::weak_ptr<Command>& command) {
+  void OnFlasherToggleCommand(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -105,13 +103,13 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    ErrorPtr error;
-    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                 "Invalid parameters");
+    weave::ErrorPtr error;
+    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                        "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void UpdateLedState(void) {
+  void UpdateLedState() {
     base::ListValue list;
     for (uint32_t i = 0; i < led_status_.size(); i++)
       list.AppendBoolean(led_status_[i] ? true : false);
@@ -119,7 +117,7 @@
     device_->SetStateProperty("_ledflasher._leds", list, nullptr);
   }
 
-  Device* device_{nullptr};
+  weave::Device* device_{nullptr};
 
   // Simulate LED status on this device so client app could explore
   // Each bit represents one device, indexing from LSB
@@ -127,6 +125,15 @@
   base::WeakPtrFactory<LedFlasherHandler> weak_ptr_factory_{this};
 };
 
-}  // namespace daemon
-}  // namespace examples
-}  // namespace weave
+int main(int argc, char** argv) {
+  Daemon::Options opts;
+  if (!opts.Parse(argc, argv)) {
+    Daemon::Options::ShowUsage(argv[0]);
+    return 1;
+  }
+  Daemon daemon{opts};
+  LedFlasherHandler handler;
+  handler.Register(daemon.GetDevice());
+  daemon.Run();
+  return 0;
+}
diff --git a/examples/daemon/daemon.gyp b/examples/daemon/light/daemon.gyp
similarity index 86%
copy from examples/daemon/daemon.gyp
copy to examples/daemon/light/daemon.gyp
index c6f8837..e8bb646 100644
--- a/examples/daemon/daemon.gyp
+++ b/examples/daemon/light/daemon.gyp
@@ -4,10 +4,10 @@
 {
   'targets': [
     {
-      'target_name': 'weave_daemon',
+      'target_name': 'weave_daemon_light',
       'type': 'executable',
       'sources': [
-        'main.cc',
+        'light.cc',
       ],
       'dependencies': [
         '<@(DEPTH)/libweave_standalone.gyp:libweave',
diff --git a/examples/daemon/light_handler.h b/examples/daemon/light/light.cc
similarity index 68%
rename from examples/daemon/light_handler.h
rename to examples/daemon/light/light.cc
index 33b440a..484b9e1 100644
--- a/examples/daemon/light_handler.h
+++ b/examples/daemon/light/light.cc
@@ -2,21 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "examples/daemon/common/daemon.h"
+
 #include <weave/device.h>
 
 #include <base/bind.h>
 #include <base/memory/weak_ptr.h>
 
-namespace weave {
-namespace examples {
-namespace daemon {
-
 // LightHandler is a command handler example that shows
 // how to handle commands for a Weave light.
 class LightHandler {
  public:
   LightHandler() = default;
-  void Register(Device* device) {
+  void Register(weave::Device* device) {
     device_ = device;
 
     device->AddStateDefinitionsFromJson(R"({
@@ -50,18 +48,16 @@
         }
       }
     })");
-    device->AddCommandHandler(
-        "onOff.setConfig",
-        base::Bind(&LightHandler::OnOnOffSetConfig,
-                   weak_ptr_factory_.GetWeakPtr()));
-    device->AddCommandHandler(
-        "brightness.setConfig",
-         base::Bind(&LightHandler::OnBrightnessSetConfig,
-                    weak_ptr_factory_.GetWeakPtr()));
+    device->AddCommandHandler("onOff.setConfig",
+                              base::Bind(&LightHandler::OnOnOffSetConfig,
+                                         weak_ptr_factory_.GetWeakPtr()));
+    device->AddCommandHandler("brightness.setConfig",
+                              base::Bind(&LightHandler::OnBrightnessSetConfig,
+                                         weak_ptr_factory_.GetWeakPtr()));
   }
 
  private:
-  void OnBrightnessSetConfig(const std::weak_ptr<Command>& command) {
+  void OnBrightnessSetConfig(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -78,13 +74,13 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    ErrorPtr error;
-    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                 "Invalid parameters");
+    weave::ErrorPtr error;
+    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                        "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void OnOnOffSetConfig(const std::weak_ptr<Command>& command) {
+  void OnOnOffSetConfig(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -103,20 +99,20 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    ErrorPtr error;
-    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                 "Invalid parameters");
+    weave::ErrorPtr error;
+    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                        "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void UpdateLightState(void) {
+  void UpdateLightState() {
     base::DictionaryValue state;
     state.SetString("onOff.state", light_status_ ? "on" : "standby");
     state.SetInteger("brightness.brightness", brightness_state_);
     device_->SetStateProperties(state, nullptr);
   }
 
-  Device* device_{nullptr};
+  weave::Device* device_{nullptr};
 
   // Simulate the state of the light.
   bool light_status_;
@@ -124,6 +120,15 @@
   base::WeakPtrFactory<LightHandler> weak_ptr_factory_{this};
 };
 
-}  // namespace daemon
-}  // namespace examples
-}  // namespace weave
+int main(int argc, char** argv) {
+  Daemon::Options opts;
+  if (!opts.Parse(argc, argv)) {
+    Daemon::Options::ShowUsage(argv[0]);
+    return 1;
+  }
+  Daemon daemon{opts};
+  LightHandler handler;
+  handler.Register(daemon.GetDevice());
+  daemon.Run();
+  return 0;
+}
diff --git a/examples/daemon/daemon.gyp b/examples/daemon/lock/daemon.gyp
similarity index 86%
rename from examples/daemon/daemon.gyp
rename to examples/daemon/lock/daemon.gyp
index c6f8837..0402a29 100644
--- a/examples/daemon/daemon.gyp
+++ b/examples/daemon/lock/daemon.gyp
@@ -4,10 +4,10 @@
 {
   'targets': [
     {
-      'target_name': 'weave_daemon',
+      'target_name': 'weave_daemon_lock',
       'type': 'executable',
       'sources': [
-        'main.cc',
+        'lock.cc',
       ],
       'dependencies': [
         '<@(DEPTH)/libweave_standalone.gyp:libweave',
diff --git a/examples/daemon/lock_handler.h b/examples/daemon/lock/lock.cc
similarity index 63%
rename from examples/daemon/lock_handler.h
rename to examples/daemon/lock/lock.cc
index b2fd9b5..e1ca2d9 100644
--- a/examples/daemon/lock_handler.h
+++ b/examples/daemon/lock/lock.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "examples/daemon/common/daemon.h"
+
 #include <weave/device.h>
 #include <weave/enum_to_string.h>
 
@@ -9,29 +11,26 @@
 #include <base/memory/weak_ptr.h>
 
 namespace weave {
-
 namespace lockstate {
 enum class LockState { kUnlocked, kLocked, kPartiallyLocked };
 
 const weave::EnumToStringMap<LockState>::Map kLockMapMethod[] = {
-  {LockState::kLocked, "locked"},
-  {LockState::kUnlocked, "unlocked"},
-  {LockState::kPartiallyLocked, "partiallyLocked"}};
+    {LockState::kLocked, "locked"},
+    {LockState::kUnlocked, "unlocked"},
+    {LockState::kPartiallyLocked, "partiallyLocked"}};
 }  // namespace lockstate
 
 template <>
 EnumToStringMap<lockstate::LockState>::EnumToStringMap()
-  : EnumToStringMap(lockstate::kLockMapMethod) {}
-
-namespace examples {
-namespace daemon {
+    : EnumToStringMap(lockstate::kLockMapMethod) {}
+}  // namespace weave
 
 // LockHandler is a command handler example that shows
 // how to handle commands for a Weave lock.
 class LockHandler {
  public:
   LockHandler() = default;
-  void Register(Device* device) {
+  void Register(weave::Device* device) {
     device_ = device;
 
     device->AddStateDefinitionsFromJson(R"({
@@ -52,14 +51,13 @@
           }
         }
     })");
-    device->AddCommandHandler(
-        "lock.setConfig",
-        base::Bind(&LockHandler::OnLockSetConfig,
-                   weak_ptr_factory_.GetWeakPtr()));
+    device->AddCommandHandler("lock.setConfig",
+                              base::Bind(&LockHandler::OnLockSetConfig,
+                                         weak_ptr_factory_.GetWeakPtr()));
   }
 
  private:
-  void OnLockSetConfig(const std::weak_ptr<Command>& command) {
+  void OnLockSetConfig(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -68,13 +66,13 @@
     if (cmd->GetParameters()->GetString("lockedState", &requested_state)) {
       LOG(INFO) << cmd->GetName() << " state: " << requested_state;
 
-      lockstate::LockState new_lock_status;
+      weave::lockstate::LockState new_lock_status;
 
       if (!weave::StringToEnum(requested_state, &new_lock_status)) {
         // Invalid lock state was specified.
-        ErrorPtr error;
-        Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                     "Invalid parameters");
+        weave::ErrorPtr error;
+        weave::Error::AddTo(&error, FROM_HERE, "example",
+                            "invalid_parameter_value", "Invalid parameters");
         cmd->Abort(error.get(), nullptr);
         return;
       }
@@ -88,26 +86,35 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    ErrorPtr error;
-    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                 "Invalid parameters");
+    weave::ErrorPtr error;
+    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                        "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void UpdateLockState(void) {
+  void UpdateLockState() {
     base::DictionaryValue state;
     std::string updated_state = weave::EnumToString(lock_state_);
     state.SetString("lock.lockedState", updated_state);
     device_->SetStateProperties(state, nullptr);
   }
 
-  Device* device_{nullptr};
+  weave::Device* device_{nullptr};
 
   // Simulate the state of the light.
-  lockstate::LockState lock_state_{lockstate::LockState::kLocked};
+  weave::lockstate::LockState lock_state_{weave::lockstate::LockState::kLocked};
   base::WeakPtrFactory<LockHandler> weak_ptr_factory_{this};
 };
 
-}  // namespace daemon
-}  // namespace examples
-}  // namespace weave
+int main(int argc, char** argv) {
+  Daemon::Options opts;
+  if (!opts.Parse(argc, argv)) {
+    Daemon::Options::ShowUsage(argv[0]);
+    return 1;
+  }
+  Daemon daemon{opts};
+  LockHandler handler;
+  handler.Register(daemon.GetDevice());
+  daemon.Run();
+  return 0;
+}
diff --git a/examples/daemon/main.cc b/examples/daemon/main.cc
deleted file mode 100644
index a4ec366..0000000
--- a/examples/daemon/main.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2015 The Weave 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 <weave/device.h>
-#include <weave/error.h>
-
-#include <base/bind.h>
-
-#include "examples/daemon/ledflasher_handler.h"
-#include "examples/daemon/light_handler.h"
-#include "examples/daemon/lock_handler.h"
-#include "examples/daemon/sample_handler.h"
-
-#include "examples/provider/avahi_client.h"
-#include "examples/provider/bluez_client.h"
-#include "examples/provider/curl_http_client.h"
-#include "examples/provider/event_http_server.h"
-#include "examples/provider/event_network.h"
-#include "examples/provider/event_task_runner.h"
-#include "examples/provider/file_config_store.h"
-#include "examples/provider/wifi_manager.h"
-
-namespace {
-
-// Supported LED count on this device
-const size_t kLedCount = 3;
-
-void ShowUsage(const std::string& name) {
-  LOG(ERROR) << "\nUsage: " << name << " <option(s)>"
-             << "\nOptions:\n"
-             << "\t-h,--help                    Show this help message\n"
-             << "\t--v=LEVEL                    Logging level\n"
-             << "\t-b,--bootstrapping           Force WiFi bootstrapping\n"
-             << "\t-d,--disable_security        Disable privet security\n"
-             << "\t--registration_ticket=TICKET Register device with the "
-                "given ticket\n"
-             << "\t--disable_privet             Disable local privet\n"
-             << "\t--type=UIDEVICEKIND          Create a device with the "
-                "specified ui device kind\n";
-}
-
-void OnRegisterDeviceDone(weave::Device* device, weave::ErrorPtr error) {
-  if (error)
-    LOG(ERROR) << "Fail to register device: " << error->GetMessage();
-  else
-    LOG(INFO) << "Device registered: " << device->GetSettings().cloud_id;
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  bool force_bootstrapping = false;
-  bool disable_security = false;
-  bool disable_privet = false;
-  std::string registration_ticket;
-  std::string ui_device_kind;
-  for (int i = 1; i < argc; ++i) {
-    std::string arg = argv[i];
-    if (arg == "-h" || arg == "--help") {
-      ShowUsage(argv[0]);
-      return 0;
-    } else if (arg == "-b" || arg == "--bootstrapping") {
-      force_bootstrapping = true;
-    } else if (arg == "-d" || arg == "--disable_security") {
-      disable_security = true;
-    } else if (arg == "--disable_privet") {
-      disable_privet = true;
-    } else if (arg.find("--registration_ticket") != std::string::npos) {
-      auto pos = arg.find("=");
-      if (pos == std::string::npos) {
-        ShowUsage(argv[0]);
-        return 1;
-      }
-      registration_ticket = arg.substr(pos + 1);
-    } else if (arg.find("--v") != std::string::npos) {
-      auto pos = arg.find("=");
-      if (pos == std::string::npos) {
-        ShowUsage(argv[0]);
-        return 1;
-      }
-      logging::SetMinLogLevel(-std::stoi(arg.substr(pos + 1)));
-    } else if (arg.find("--type") != std::string::npos) {
-      auto pos = arg.find("=");
-      if (pos == std::string::npos) {
-        ShowUsage(argv[0]);
-        return 1;
-      }
-      ui_device_kind = arg.substr(pos + 1);
-    } else {
-      ShowUsage(argv[0]);
-      return 1;
-    }
-  }
-
-  weave::examples::FileConfigStore config_store{disable_security};
-  weave::examples::EventTaskRunner task_runner;
-  weave::examples::CurlHttpClient http_client{&task_runner};
-  weave::examples::EventNetworkImpl network{&task_runner};
-  weave::examples::BluetoothImpl bluetooth;
-  std::unique_ptr<weave::examples::AvahiClient> dns_sd;
-  std::unique_ptr<weave::examples::HttpServerImpl> http_server;
-  std::unique_ptr<weave::examples::WifiImpl> wifi;
-
-  if (!disable_privet) {
-    network.SetSimulateOffline(force_bootstrapping);
-
-    dns_sd.reset(new weave::examples::AvahiClient);
-    http_server.reset(new weave::examples::HttpServerImpl{&task_runner});
-    if (weave::examples::WifiImpl::HasWifiCapability())
-      wifi.reset(new weave::examples::WifiImpl{&task_runner, &network});
-  }
-  std::unique_ptr<weave::Device> device{weave::Device::Create(
-      &config_store, &task_runner, &http_client, &network, dns_sd.get(),
-      http_server.get(), wifi.get(), &bluetooth)};
-
-  if (!registration_ticket.empty()) {
-    device->Register(registration_ticket,
-                     base::Bind(&OnRegisterDeviceDone, device.get()));
-  }
-
-  weave::examples::daemon::SampleHandler sample{&task_runner};
-  weave::examples::daemon::LedFlasherHandler ledFlasher;
-  sample.Register(device.get());
-  ledFlasher.Register(device.get());
-
-  // If the caller specified a particular ui device kind, register the
-  // correspoinding device handlers
-  // TODO: move this to before device registration, as this should also
-  // cause a particular model manifest to be used.
-  weave::examples::daemon::LightHandler lightHandler;
-  weave::examples::daemon::LockHandler lockHandler;
-  if (!ui_device_kind.empty()) {
-    if (ui_device_kind == "light") {
-      lightHandler.Register(device.get());
-    } else if (ui_device_kind == "lock") {
-      lockHandler.Register(device.get());
-    }
-  }
-
-  task_runner.Run();
-
-  LOG(INFO) << "exit";
-  return 0;
-}
diff --git a/examples/daemon/daemon.gyp b/examples/daemon/sample/daemon.gyp
similarity index 86%
copy from examples/daemon/daemon.gyp
copy to examples/daemon/sample/daemon.gyp
index c6f8837..29d8235 100644
--- a/examples/daemon/daemon.gyp
+++ b/examples/daemon/sample/daemon.gyp
@@ -4,10 +4,10 @@
 {
   'targets': [
     {
-      'target_name': 'weave_daemon',
+      'target_name': 'weave_daemon_sample',
       'type': 'executable',
       'sources': [
-        'main.cc',
+        'sample.cc',
       ],
       'dependencies': [
         '<@(DEPTH)/libweave_standalone.gyp:libweave',
diff --git a/examples/daemon/sample_handler.h b/examples/daemon/sample/sample.cc
similarity index 80%
rename from examples/daemon/sample_handler.h
rename to examples/daemon/sample/sample.cc
index eca3452..905a977 100644
--- a/examples/daemon/sample_handler.h
+++ b/examples/daemon/sample/sample.cc
@@ -2,16 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "examples/daemon/common/daemon.h"
+
 #include <weave/device.h>
 #include <weave/provider/task_runner.h>
 
 #include <base/bind.h>
 #include <base/memory/weak_ptr.h>
 
-namespace weave {
-namespace examples {
-namespace daemon {
-
 // SampleHandler is a command handler example.
 // It implements the following commands:
 // - _hello: handle a command with an argument and set its results.
@@ -19,9 +17,9 @@
 // - _countdown: handle long running command and report progress.
 class SampleHandler {
  public:
-  SampleHandler(provider::TaskRunner* task_runner)
+  SampleHandler(weave::provider::TaskRunner* task_runner)
       : task_runner_{task_runner} {}
-  void Register(Device* device) {
+  void Register(weave::Device* device) {
     device_ = device;
 
     device->AddCommandDefinitionsFromJson(R"({
@@ -69,7 +67,7 @@
   }
 
  private:
-  void OnHelloCommand(const std::weak_ptr<Command>& command) {
+  void OnHelloCommand(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -77,9 +75,9 @@
 
     std::string name;
     if (!cmd->GetParameters()->GetString("_name", &name)) {
-      ErrorPtr error;
-      Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                   "Name is missing");
+      weave::ErrorPtr error;
+      weave::Error::AddTo(&error, FROM_HERE, "example",
+                          "invalid_parameter_value", "Name is missing");
       cmd->Abort(error.get(), nullptr);
       return;
     }
@@ -90,7 +88,7 @@
     LOG(INFO) << cmd->GetName() << " command finished: " << result;
   }
 
-  void OnPingCommand(const std::weak_ptr<Command>& command) {
+  void OnPingCommand(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -107,7 +105,7 @@
     LOG(INFO) << cmd->GetName() << " command finished: " << result;
   }
 
-  void OnCountdownCommand(const std::weak_ptr<Command>& command) {
+  void OnCountdownCommand(const std::weak_ptr<weave::Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -121,7 +119,7 @@
     DoTick(cmd, seconds);
   }
 
-  void DoTick(const std::weak_ptr<Command>& command, int seconds) {
+  void DoTick(const std::weak_ptr<weave::Command>& command, int seconds) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -148,13 +146,22 @@
     LOG(INFO) << cmd->GetName() << " command finished: " << result;
   }
 
-  Device* device_{nullptr};
-  provider::TaskRunner* task_runner_{nullptr};
+  weave::Device* device_{nullptr};
+  weave::provider::TaskRunner* task_runner_{nullptr};
 
   int ping_count_{0};
   base::WeakPtrFactory<SampleHandler> weak_ptr_factory_{this};
 };
 
-}  // namespace daemon
-}  // namespace examples
-}  // namespace weave
+int main(int argc, char** argv) {
+  Daemon::Options opts;
+  if (!opts.Parse(argc, argv)) {
+    Daemon::Options::ShowUsage(argv[0]);
+    return 1;
+  }
+  Daemon daemon{opts};
+  SampleHandler handler{daemon.GetTaskRunner()};
+  handler.Register(daemon.GetDevice());
+  daemon.Run();
+  return 0;
+}
