diff --git a/README b/README
index bf9b70b..b62b547 100644
--- a/README
+++ b/README
@@ -56,7 +56,7 @@
 
   examples/build.sh
 
-Execute example (check examples/daemon/README for details):
+Execute example:
 
   sudo out/Debug/weave_daemon
 
diff --git a/examples/build.sh b/examples/build.sh
index e4c412d..2bd398ef 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/examples.gyp
+gyp -Ilibweave_common.gypi --toplevel-dir=. --depth=. -f ninja $DIR/daemon/daemon.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_examples libweave_testrunner libweave_exports_testrunner"
+   export BUILD_TARGET="weave_daemon 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 287459f..4743883 100644
--- a/examples/daemon/README
+++ b/examples/daemon/README
@@ -84,16 +84,16 @@
         Enter request body:
         {
           "deviceId": "0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d",
-          "name": "_sample._hello",
+          "name": "_greeter._greet",
           "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 '_sample._hello' arrived, ...
-         received command: _sample._hello
-         _sample._hello command: finished
+         New command '_greeter._greet' arrived, ...
+         received command: _greeter._greet
+         _greeter._greet 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": "_sample._hello",
+          "name": "_greeter._greet",
           "results": {
-            "_reply": "Hello cloud user"
+            "_greeting": "Hello cloud user"
           },
           ...
 
diff --git a/examples/daemon/common/daemon.h b/examples/daemon/common/daemon.h
deleted file mode 100644
index 0e05b88..0000000
--- a/examples/daemon/common/daemon.h
+++ /dev/null
@@ -1,124 +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/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/lock/daemon.gyp b/examples/daemon/daemon.gyp
similarity index 86%
rename from examples/daemon/lock/daemon.gyp
rename to examples/daemon/daemon.gyp
index 0402a29..c6f8837 100644
--- a/examples/daemon/lock/daemon.gyp
+++ b/examples/daemon/daemon.gyp
@@ -4,10 +4,10 @@
 {
   'targets': [
     {
-      'target_name': 'weave_daemon_lock',
+      'target_name': 'weave_daemon',
       'type': 'executable',
       'sources': [
-        'lock.cc',
+        'main.cc',
       ],
       'dependencies': [
         '<@(DEPTH)/libweave_standalone.gyp:libweave',
diff --git a/examples/daemon/examples.gyp b/examples/daemon/examples.gyp
deleted file mode 100644
index 8fee90d..0000000
--- a/examples/daemon/examples.gyp
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  '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/ledflasher/daemon.gyp b/examples/daemon/ledflasher/daemon.gyp
deleted file mode 100644
index 5abfcd6..0000000
--- a/examples/daemon/ledflasher/daemon.gyp
+++ /dev/null
@@ -1,18 +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.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_ledflasher',
-      'type': 'executable',
-      'sources': [
-        'ledflasher.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/ledflasher/ledflasher.cc b/examples/daemon/ledflasher_handler.h
similarity index 78%
rename from examples/daemon/ledflasher/ledflasher.cc
rename to examples/daemon/ledflasher_handler.h
index 38314f5..812a3d4 100644
--- a/examples/daemon/ledflasher/ledflasher.cc
+++ b/examples/daemon/ledflasher_handler.h
@@ -2,8 +2,6 @@
 // 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>
@@ -11,6 +9,10 @@
 
 #include <bitset>
 
+namespace weave {
+namespace examples {
+namespace daemon {
+
 namespace {
 // Supported LED count on this device
 const size_t kLedCount = 3;
@@ -21,7 +23,7 @@
 class LedFlasherHandler {
  public:
   LedFlasherHandler() {}
-  void Register(weave::Device* device) {
+  void Register(Device* device) {
     device_ = device;
 
     device->AddStateDefinitionsFromJson(R"({
@@ -58,7 +60,7 @@
   }
 
  private:
-  void OnFlasherSetCommand(const std::weak_ptr<weave::Command>& command) {
+  void OnFlasherSetCommand(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -82,13 +84,13 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                        "Invalid parameters");
+    ErrorPtr error;
+    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                 "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void OnFlasherToggleCommand(const std::weak_ptr<weave::Command>& command) {
+  void OnFlasherToggleCommand(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -103,13 +105,13 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                        "Invalid parameters");
+    ErrorPtr error;
+    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                 "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void UpdateLedState() {
+  void UpdateLedState(void) {
     base::ListValue list;
     for (uint32_t i = 0; i < led_status_.size(); i++)
       list.AppendBoolean(led_status_[i] ? true : false);
@@ -117,7 +119,7 @@
     device_->SetStateProperty("_ledflasher._leds", list, nullptr);
   }
 
-  weave::Device* device_{nullptr};
+  Device* device_{nullptr};
 
   // Simulate LED status on this device so client app could explore
   // Each bit represents one device, indexing from LSB
@@ -125,15 +127,6 @@
   base::WeakPtrFactory<LedFlasherHandler> weak_ptr_factory_{this};
 };
 
-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;
-}
+}  // namespace daemon
+}  // namespace examples
+}  // namespace weave
diff --git a/examples/daemon/light/daemon.gyp b/examples/daemon/light/daemon.gyp
deleted file mode 100644
index e8bb646..0000000
--- a/examples/daemon/light/daemon.gyp
+++ /dev/null
@@ -1,18 +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.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_light',
-      'type': 'executable',
-      'sources': [
-        'light.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/light/light.cc b/examples/daemon/light_handler.h
similarity index 68%
rename from examples/daemon/light/light.cc
rename to examples/daemon/light_handler.h
index 484b9e1..33b440a 100644
--- a/examples/daemon/light/light.cc
+++ b/examples/daemon/light_handler.h
@@ -2,19 +2,21 @@
 // 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(weave::Device* device) {
+  void Register(Device* device) {
     device_ = device;
 
     device->AddStateDefinitionsFromJson(R"({
@@ -48,16 +50,18 @@
         }
       }
     })");
-    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<weave::Command>& command) {
+  void OnBrightnessSetConfig(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -74,13 +78,13 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                        "Invalid parameters");
+    ErrorPtr error;
+    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                 "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void OnOnOffSetConfig(const std::weak_ptr<weave::Command>& command) {
+  void OnOnOffSetConfig(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -99,20 +103,20 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                        "Invalid parameters");
+    ErrorPtr error;
+    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                 "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void UpdateLightState() {
+  void UpdateLightState(void) {
     base::DictionaryValue state;
     state.SetString("onOff.state", light_status_ ? "on" : "standby");
     state.SetInteger("brightness.brightness", brightness_state_);
     device_->SetStateProperties(state, nullptr);
   }
 
-  weave::Device* device_{nullptr};
+  Device* device_{nullptr};
 
   // Simulate the state of the light.
   bool light_status_;
@@ -120,15 +124,6 @@
   base::WeakPtrFactory<LightHandler> weak_ptr_factory_{this};
 };
 
-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;
-}
+}  // namespace daemon
+}  // namespace examples
+}  // namespace weave
diff --git a/examples/daemon/lock/lock.cc b/examples/daemon/lock_handler.h
similarity index 63%
rename from examples/daemon/lock/lock.cc
rename to examples/daemon/lock_handler.h
index e1ca2d9..b2fd9b5 100644
--- a/examples/daemon/lock/lock.cc
+++ b/examples/daemon/lock_handler.h
@@ -2,8 +2,6 @@
 // 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>
 
@@ -11,26 +9,29 @@
 #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 weave
+  : EnumToStringMap(lockstate::kLockMapMethod) {}
+
+namespace examples {
+namespace daemon {
 
 // LockHandler is a command handler example that shows
 // how to handle commands for a Weave lock.
 class LockHandler {
  public:
   LockHandler() = default;
-  void Register(weave::Device* device) {
+  void Register(Device* device) {
     device_ = device;
 
     device->AddStateDefinitionsFromJson(R"({
@@ -51,13 +52,14 @@
           }
         }
     })");
-    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<weave::Command>& command) {
+  void OnLockSetConfig(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -66,13 +68,13 @@
     if (cmd->GetParameters()->GetString("lockedState", &requested_state)) {
       LOG(INFO) << cmd->GetName() << " state: " << requested_state;
 
-      weave::lockstate::LockState new_lock_status;
+      lockstate::LockState new_lock_status;
 
       if (!weave::StringToEnum(requested_state, &new_lock_status)) {
         // Invalid lock state was specified.
-        weave::ErrorPtr error;
-        weave::Error::AddTo(&error, FROM_HERE, "example",
-                            "invalid_parameter_value", "Invalid parameters");
+        ErrorPtr error;
+        Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                     "Invalid parameters");
         cmd->Abort(error.get(), nullptr);
         return;
       }
@@ -86,35 +88,26 @@
       cmd->Complete({}, nullptr);
       return;
     }
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
-                        "Invalid parameters");
+    ErrorPtr error;
+    Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                 "Invalid parameters");
     cmd->Abort(error.get(), nullptr);
   }
 
-  void UpdateLockState() {
+  void UpdateLockState(void) {
     base::DictionaryValue state;
     std::string updated_state = weave::EnumToString(lock_state_);
     state.SetString("lock.lockedState", updated_state);
     device_->SetStateProperties(state, nullptr);
   }
 
-  weave::Device* device_{nullptr};
+  Device* device_{nullptr};
 
   // Simulate the state of the light.
-  weave::lockstate::LockState lock_state_{weave::lockstate::LockState::kLocked};
+  lockstate::LockState lock_state_{lockstate::LockState::kLocked};
   base::WeakPtrFactory<LockHandler> weak_ptr_factory_{this};
 };
 
-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;
-}
+}  // namespace daemon
+}  // namespace examples
+}  // namespace weave
diff --git a/examples/daemon/main.cc b/examples/daemon/main.cc
new file mode 100644
index 0000000..a4ec366
--- /dev/null
+++ b/examples/daemon/main.cc
@@ -0,0 +1,145 @@
+// 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/sample/daemon.gyp b/examples/daemon/sample/daemon.gyp
deleted file mode 100644
index 29d8235..0000000
--- a/examples/daemon/sample/daemon.gyp
+++ /dev/null
@@ -1,18 +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.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_sample',
-      'type': 'executable',
-      'sources': [
-        'sample.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/sample/sample.cc b/examples/daemon/sample_handler.h
similarity index 80%
rename from examples/daemon/sample/sample.cc
rename to examples/daemon/sample_handler.h
index 905a977..eca3452 100644
--- a/examples/daemon/sample/sample.cc
+++ b/examples/daemon/sample_handler.h
@@ -2,14 +2,16 @@
 // 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.
@@ -17,9 +19,9 @@
 // - _countdown: handle long running command and report progress.
 class SampleHandler {
  public:
-  SampleHandler(weave::provider::TaskRunner* task_runner)
+  SampleHandler(provider::TaskRunner* task_runner)
       : task_runner_{task_runner} {}
-  void Register(weave::Device* device) {
+  void Register(Device* device) {
     device_ = device;
 
     device->AddCommandDefinitionsFromJson(R"({
@@ -67,7 +69,7 @@
   }
 
  private:
-  void OnHelloCommand(const std::weak_ptr<weave::Command>& command) {
+  void OnHelloCommand(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -75,9 +77,9 @@
 
     std::string name;
     if (!cmd->GetParameters()->GetString("_name", &name)) {
-      weave::ErrorPtr error;
-      weave::Error::AddTo(&error, FROM_HERE, "example",
-                          "invalid_parameter_value", "Name is missing");
+      ErrorPtr error;
+      Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+                   "Name is missing");
       cmd->Abort(error.get(), nullptr);
       return;
     }
@@ -88,7 +90,7 @@
     LOG(INFO) << cmd->GetName() << " command finished: " << result;
   }
 
-  void OnPingCommand(const std::weak_ptr<weave::Command>& command) {
+  void OnPingCommand(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -105,7 +107,7 @@
     LOG(INFO) << cmd->GetName() << " command finished: " << result;
   }
 
-  void OnCountdownCommand(const std::weak_ptr<weave::Command>& command) {
+  void OnCountdownCommand(const std::weak_ptr<Command>& command) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -119,7 +121,7 @@
     DoTick(cmd, seconds);
   }
 
-  void DoTick(const std::weak_ptr<weave::Command>& command, int seconds) {
+  void DoTick(const std::weak_ptr<Command>& command, int seconds) {
     auto cmd = command.lock();
     if (!cmd)
       return;
@@ -146,22 +148,13 @@
     LOG(INFO) << cmd->GetName() << " command finished: " << result;
   }
 
-  weave::Device* device_{nullptr};
-  weave::provider::TaskRunner* task_runner_{nullptr};
+  Device* device_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
 
   int ping_count_{0};
   base::WeakPtrFactory<SampleHandler> weak_ptr_factory_{this};
 };
 
-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;
-}
+}  // namespace daemon
+}  // namespace examples
+}  // namespace weave
diff --git a/src/commands/schema_utils.h b/src/commands/schema_utils.h
index 0c1d1b3..826bab8 100644
--- a/src/commands/schema_utils.h
+++ b/src/commands/schema_utils.h
@@ -5,7 +5,6 @@
 #ifndef LIBWEAVE_SRC_COMMANDS_SCHEMA_UTILS_H_
 #define LIBWEAVE_SRC_COMMANDS_SCHEMA_UTILS_H_
 
-#include <cmath>
 #include <limits>
 #include <map>
 #include <memory>
diff --git a/src/privet/wifi_bootstrap_manager.cc b/src/privet/wifi_bootstrap_manager.cc
index 292622d..4f46ea4 100644
--- a/src/privet/wifi_bootstrap_manager.cc
+++ b/src/privet/wifi_bootstrap_manager.cc
@@ -20,10 +20,7 @@
 
 namespace {
 
-const int kMonitoringWithSsidTimeoutSeconds = 15;
 const int kMonitoringTimeoutSeconds = 120;
-const int kBootstrapTimeoutSeconds = 600;
-const int kConnectingTimeoutSeconds = 180;
 
 const EnumToStringMap<WifiBootstrapManager::State>::Map kWifiSetupStateMap[] = {
     {WifiBootstrapManager::State::kDisabled, "disabled"},
@@ -58,8 +55,7 @@
                  lifetime_weak_factory_.GetWeakPtr()));
   if (config_->GetSettings().last_configured_ssid.empty()) {
     // Give implementation some time to figure out state.
-    StartMonitoring(
-        base::TimeDelta::FromSeconds(kMonitoringWithSsidTimeoutSeconds));
+    StartMonitoring(base::TimeDelta::FromSeconds(15));
   } else {
     StartMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds));
   }
@@ -84,30 +80,28 @@
     task_runner_->PostDelayedTask(
         FROM_HERE, base::Bind(&WifiBootstrapManager::OnBootstrapTimeout,
                               tasks_weak_factory_.GetWeakPtr()),
-        base::TimeDelta::FromSeconds(kBootstrapTimeoutSeconds));
+        base::TimeDelta::FromMinutes(10));
   }
   // TODO(vitalybuka): Add SSID probing.
   privet_ssid_ = GenerateSsid();
   CHECK(!privet_ssid_.empty());
-
-  VLOG(1) << "Starting AP with SSID: " << privet_ssid_;
   wifi_->StartAccessPoint(privet_ssid_);
 }
 
 void WifiBootstrapManager::EndBootstrapping() {
-  VLOG(1) << "Stopping AP";
   wifi_->StopAccessPoint();
   privet_ssid_.clear();
 }
 
 void WifiBootstrapManager::StartConnecting(const std::string& ssid,
                                            const std::string& passphrase) {
-  VLOG(1) << "Attempting connect to SSID:" << ssid;
+  VLOG(1) << "WiFi is attempting to connect. (ssid=" << ssid
+          << ", pass=" << passphrase << ").";
   UpdateState(State::kConnecting);
   task_runner_->PostDelayedTask(
       FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout,
                             tasks_weak_factory_.GetWeakPtr()),
-      base::TimeDelta::FromSeconds(kConnectingTimeoutSeconds));
+      base::TimeDelta::FromMinutes(3));
   wifi_->Connect(ssid, passphrase,
                  base::Bind(&WifiBootstrapManager::OnConnectDone,
                             tasks_weak_factory_.GetWeakPtr(), ssid));
@@ -116,11 +110,6 @@
 void WifiBootstrapManager::EndConnecting() {}
 
 void WifiBootstrapManager::StartMonitoring(const base::TimeDelta& timeout) {
-  monitor_until_ = {};
-  ContinueMonitoring(timeout);
-}
-
-void WifiBootstrapManager::ContinueMonitoring(const base::TimeDelta& timeout) {
   VLOG(1) << "Monitoring connectivity.";
   // We already have a callback in place with |network_| to update our
   // connectivity state.  See OnConnectivityChange().
@@ -145,8 +134,8 @@
 void WifiBootstrapManager::EndMonitoring() {}
 
 void WifiBootstrapManager::UpdateState(State new_state) {
-  VLOG(3) << "Switching state from " << EnumToString(state_) << " to "
-          << EnumToString(new_state);
+  VLOG(3) << "Switching state from " << static_cast<int>(state_) << " to "
+          << static_cast<int>(new_state);
   // Abort irrelevant tasks.
   tasks_weak_factory_.InvalidateWeakPtrs();
 
@@ -238,26 +227,29 @@
 }
 
 void WifiBootstrapManager::OnConnectivityChange() {
+  VLOG(3) << "ConnectivityChanged: "
+          << EnumToString(network_->GetConnectionState());
   UpdateConnectionState();
 
-  if (state_ == State::kMonitoring ||
+  if (state_ == State::kMonitoring ||  // Reset monitoring timeout.
       (state_ != State::kDisabled &&
        network_->GetConnectionState() == Network::State::kOnline)) {
-    ContinueMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds));
+    StartMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds));
   }
 }
 
 void WifiBootstrapManager::OnMonitorTimeout() {
-  VLOG(1) << "Spent too long offline. Entering bootstrap mode.";
+  VLOG(1) << "Spent too long offline.  Entering bootstrap mode.";
   // TODO(wiley) Retrieve relevant errors from shill.
   StartBootstrapping();
 }
 
 void WifiBootstrapManager::UpdateConnectionState() {
   connection_state_ = ConnectionState{ConnectionState::kUnconfigured};
+  if (config_->GetSettings().last_configured_ssid.empty())
+    return;
 
   Network::State service_state{network_->GetConnectionState()};
-  VLOG(3) << "New network state: " << EnumToString(service_state);
   switch (service_state) {
     case Network::State::kOffline:
       connection_state_ = ConnectionState{ConnectionState::kOffline};
diff --git a/src/privet/wifi_bootstrap_manager.h b/src/privet/wifi_bootstrap_manager.h
index 62a77c2..71dbb49 100644
--- a/src/privet/wifi_bootstrap_manager.h
+++ b/src/privet/wifi_bootstrap_manager.h
@@ -74,7 +74,6 @@
   void EndConnecting();
 
   void StartMonitoring(const base::TimeDelta& timeout);
-  void ContinueMonitoring(const base::TimeDelta& timeout);
   void EndMonitoring();
 
   // Update the current state, post tasks to notify listeners accordingly to
diff --git a/src/weave_unittest.cc b/src/weave_unittest.cc
index fb00cc9..6ff3f6d 100644
--- a/src/weave_unittest.cc
+++ b/src/weave_unittest.cc
@@ -21,14 +21,13 @@
 #include "src/bind_lambda.h"
 
 using testing::_;
-using testing::AtLeast;
 using testing::AtMost;
 using testing::HasSubstr;
-using testing::InSequence;
 using testing::Invoke;
 using testing::InvokeWithoutArgs;
 using testing::MatchesRegex;
 using testing::Mock;
+using testing::AtLeast;
 using testing::Return;
 using testing::ReturnRefOfCopy;
 using testing::StartsWith;
@@ -267,13 +266,10 @@
 
   void NotifyNetworkChanged(provider::Network::State state,
                             base::TimeDelta delay) {
-    auto task = [this, state] {
-      EXPECT_CALL(network_, GetConnectionState()).WillRepeatedly(Return(state));
-      for (const auto& cb : network_callbacks_)
-        cb.Run();
-    };
-
-    task_runner_.PostDelayedTask(FROM_HERE, base::Bind(task), delay);
+    EXPECT_CALL(network_, GetConnectionState()).WillRepeatedly(Return(state));
+    for (const auto& cb : network_callbacks_) {
+      task_runner_.PostDelayedTask(FROM_HERE, cb, delay);
+    }
   }
 
   std::map<std::string, provider::HttpServer::RequestHandlerCallback>
@@ -464,67 +460,4 @@
   StartDevice();
 }
 
-TEST_F(WeaveWiFiSetupTest, OfflineLongTimeWithNoSsid) {
-  EXPECT_CALL(network_, GetConnectionState())
-      .WillRepeatedly(Return(Network::State::kOffline));
-  NotifyNetworkChanged(provider::Network::State::kOnline,
-                       base::TimeDelta::FromHours(15));
-
-  {
-    InSequence s;
-    auto time_stamp = task_runner_.GetClock()->Now();
-
-    EXPECT_CALL(wifi_, StartAccessPoint(MatchesRegex("TEST_NAME.*prv")))
-        .WillOnce(InvokeWithoutArgs([this, &time_stamp]() {
-          EXPECT_LE(task_runner_.GetClock()->Now() - time_stamp,
-                    base::TimeDelta::FromMinutes(1));
-          time_stamp = task_runner_.GetClock()->Now();
-        }));
-
-    EXPECT_CALL(wifi_, StopAccessPoint())
-        .WillOnce(InvokeWithoutArgs([this, &time_stamp]() {
-          EXPECT_GT(task_runner_.GetClock()->Now() - time_stamp,
-                    base::TimeDelta::FromMinutes(5));
-          time_stamp = task_runner_.GetClock()->Now();
-          task_runner_.Break();
-        }));
-  }
-
-  StartDevice();
-}
-
-TEST_F(WeaveWiFiSetupTest, OfflineLongTimeWithSsid) {
-  EXPECT_CALL(config_store_, LoadSettings())
-      .WillRepeatedly(Return(R"({"last_configured_ssid": "TEST_ssid"})"));
-  EXPECT_CALL(network_, GetConnectionState())
-      .WillRepeatedly(Return(Network::State::kOffline));
-  NotifyNetworkChanged(provider::Network::State::kOnline,
-                       base::TimeDelta::FromHours(15));
-
-  {
-    InSequence s;
-    auto time_stamp = task_runner_.GetClock()->Now();
-    for (size_t i = 0; i < 10; ++i) {
-      EXPECT_CALL(wifi_, StartAccessPoint(MatchesRegex("TEST_NAME.*prv")))
-          .WillOnce(InvokeWithoutArgs([this, &time_stamp]() {
-            EXPECT_GT(task_runner_.GetClock()->Now() - time_stamp,
-                      base::TimeDelta::FromMinutes(1));
-            time_stamp = task_runner_.GetClock()->Now();
-          }));
-
-      EXPECT_CALL(wifi_, StopAccessPoint())
-          .WillOnce(InvokeWithoutArgs([this, &time_stamp]() {
-            EXPECT_GT(task_runner_.GetClock()->Now() - time_stamp,
-                      base::TimeDelta::FromMinutes(5));
-            time_stamp = task_runner_.GetClock()->Now();
-          }));
-    }
-
-    EXPECT_CALL(wifi_, StartAccessPoint(MatchesRegex("TEST_NAME.*prv")))
-        .WillOnce(InvokeWithoutArgs([this]() { task_runner_.Break(); }));
-  }
-
-  StartDevice();
-}
-
 }  // namespace weave
