diff --git a/README b/README
index b62b547..bf9b70b 100644
--- a/README
+++ b/README
@@ -56,7 +56,7 @@
 
   examples/build.sh
 
-Execute example:
+Execute example (check examples/daemon/README for details):
 
   sudo out/Debug/weave_daemon
 
diff --git a/examples/build.sh b/examples/build.sh
index 2bd398e..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;
+}
diff --git a/src/commands/schema_utils.h b/src/commands/schema_utils.h
index 826bab8..0c1d1b3 100644
--- a/src/commands/schema_utils.h
+++ b/src/commands/schema_utils.h
@@ -5,6 +5,7 @@
 #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 4f46ea4..292622d 100644
--- a/src/privet/wifi_bootstrap_manager.cc
+++ b/src/privet/wifi_bootstrap_manager.cc
@@ -20,7 +20,10 @@
 
 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"},
@@ -55,7 +58,8 @@
                  lifetime_weak_factory_.GetWeakPtr()));
   if (config_->GetSettings().last_configured_ssid.empty()) {
     // Give implementation some time to figure out state.
-    StartMonitoring(base::TimeDelta::FromSeconds(15));
+    StartMonitoring(
+        base::TimeDelta::FromSeconds(kMonitoringWithSsidTimeoutSeconds));
   } else {
     StartMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds));
   }
@@ -80,28 +84,30 @@
     task_runner_->PostDelayedTask(
         FROM_HERE, base::Bind(&WifiBootstrapManager::OnBootstrapTimeout,
                               tasks_weak_factory_.GetWeakPtr()),
-        base::TimeDelta::FromMinutes(10));
+        base::TimeDelta::FromSeconds(kBootstrapTimeoutSeconds));
   }
   // 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) << "WiFi is attempting to connect. (ssid=" << ssid
-          << ", pass=" << passphrase << ").";
+  VLOG(1) << "Attempting connect to SSID:" << ssid;
   UpdateState(State::kConnecting);
   task_runner_->PostDelayedTask(
       FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout,
                             tasks_weak_factory_.GetWeakPtr()),
-      base::TimeDelta::FromMinutes(3));
+      base::TimeDelta::FromSeconds(kConnectingTimeoutSeconds));
   wifi_->Connect(ssid, passphrase,
                  base::Bind(&WifiBootstrapManager::OnConnectDone,
                             tasks_weak_factory_.GetWeakPtr(), ssid));
@@ -110,6 +116,11 @@
 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().
@@ -134,8 +145,8 @@
 void WifiBootstrapManager::EndMonitoring() {}
 
 void WifiBootstrapManager::UpdateState(State new_state) {
-  VLOG(3) << "Switching state from " << static_cast<int>(state_) << " to "
-          << static_cast<int>(new_state);
+  VLOG(3) << "Switching state from " << EnumToString(state_) << " to "
+          << EnumToString(new_state);
   // Abort irrelevant tasks.
   tasks_weak_factory_.InvalidateWeakPtrs();
 
@@ -227,29 +238,26 @@
 }
 
 void WifiBootstrapManager::OnConnectivityChange() {
-  VLOG(3) << "ConnectivityChanged: "
-          << EnumToString(network_->GetConnectionState());
   UpdateConnectionState();
 
-  if (state_ == State::kMonitoring ||  // Reset monitoring timeout.
+  if (state_ == State::kMonitoring ||
       (state_ != State::kDisabled &&
        network_->GetConnectionState() == Network::State::kOnline)) {
-    StartMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds));
+    ContinueMonitoring(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 71dbb49..62a77c2 100644
--- a/src/privet/wifi_bootstrap_manager.h
+++ b/src/privet/wifi_bootstrap_manager.h
@@ -74,6 +74,7 @@
   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 6ff3f6d..fb00cc9 100644
--- a/src/weave_unittest.cc
+++ b/src/weave_unittest.cc
@@ -21,13 +21,14 @@
 #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;
@@ -266,10 +267,13 @@
 
   void NotifyNetworkChanged(provider::Network::State state,
                             base::TimeDelta delay) {
-    EXPECT_CALL(network_, GetConnectionState()).WillRepeatedly(Return(state));
-    for (const auto& cb : network_callbacks_) {
-      task_runner_.PostDelayedTask(FROM_HERE, cb, 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);
   }
 
   std::map<std::string, provider::HttpServer::RequestHandlerCallback>
@@ -460,4 +464,67 @@
   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
