diff --git a/examples/daemon/oven/oven.cc b/examples/daemon/oven/oven.cc
deleted file mode 100644
index f92c838..0000000
--- a/examples/daemon/oven/oven.cc
+++ /dev/null
@@ -1,290 +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 "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 {
-// Time for sensor temperature to match setting temperature
-const double kWarmUpTime = 60.0;
-// Oven max temp
-const double kMaxTemp = 300.0;
-// Oven min temp
-const double kMinTemp = 20.0;
-
-const char kTraits[] = R"({
-  "temperatureSetting": {
-    "commands": {
-      "setConfig": {
-        "minimalRole": "user",
-        "parameters": {
-          "units": {
-            "type": "string"
-          },
-          "tempSetting": {
-            "type": "number"
-          }
-        },
-        "errors": ["tempOutOfRange", "unsupportedUnits"]
-      }
-    },
-    "state": {
-      "supportedUnits": {
-        "type": "array",
-        "items": {
-          "type": "string",
-          "enum": [ "celsius", "fahrenheit", "kelvin" ]
-        },
-        "minItems": 1,
-        "uniqueItems": true,
-        "isRequired": true
-      },
-      "units": {
-        "type": "string",
-        "enum": [ "celsius", "fahrenheit", "kelvin" ],
-        "isRequired": true
-      },
-      "tempSetting": {
-        "type": "number",
-        "isRequired": true
-      },
-      "maxTempSetting": {
-        "type": "number",
-        "isRequired": true
-      },
-      "minTempSetting": {
-        "type": "number",
-        "isRequired": true
-      }
-    }
-  },
-  "temperatureSensor": {
-    "commands": {
-      "setConfig": {
-        "minimalRole": "user",
-        "parameters": {
-          "units": {
-            "type": "string"
-          }
-        },
-        "errors": ["unsupportedUnits"]
-      }
-    },
-    "state": {
-      "supportedUnits": {
-        "type": "array",
-        "items": {
-          "type": "string",
-          "enum": [
-            "celsius",
-            "fahrenheit",
-            "kelvin"
-          ]
-        },
-        "minItems": 1,
-        "uniqueItems": true,
-        "isRequired": true
-      },
-      "units": {
-        "type": "string",
-        "enum": [ "celsius", "fahrenheit", "kelvin" ],
-        "isRequired": true
-      },
-      "value": {
-        "type": "number",
-        "isRequired": true
-      }
-    }
-  },
-  "brightness": {
-    "commands": {
-      "setConfig": {
-        "minimalRole": "user",
-        "parameters": {
-          "brightness": {
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 100
-          }
-        }
-      }
-    },
-    "state": {
-      "brightness": {
-        "type": "integer",
-        "isRequired": true,
-        "minimum": 0,
-        "maximum": 100
-      }
-    }
-  }
-})";
-
-const char kComponent[] = "oven";
-}  // anonymous namespace
-
-// OvenHandler is a virtual oven example
-// It implements the following commands from traits:
-// - temperatureSetting: sets the temperature for the oven
-// - brightness: sets the brightness of the oven light
-// It exposes the following states from traits:
-// - temperatureSetting: temperature setting for the oven
-// - temperatureSensor: current oven temperature
-// - brightness: current oven brightness
-class OvenHandler {
- public:
-  OvenHandler(weave::provider::TaskRunner* task_runner)
-      : task_runner_{task_runner} {}
-
-  void Register(weave::Device* device) {
-    device_ = device;
-
-    device->AddTraitDefinitionsFromJson(kTraits);
-    CHECK(device->AddComponent(
-        kComponent, {"temperatureSetting", "temperatureSensor", "brightness"},
-        nullptr));
-
-    UpdateOvenState();
-
-    device->AddCommandHandler(kComponent, "temperatureSetting.setConfig",
-                              base::Bind(&OvenHandler::OnSetTempCommand,
-                                         weak_ptr_factory_.GetWeakPtr()));
-
-    device->AddCommandHandler(kComponent, "brightness.setConfig",
-                              base::Bind(&OvenHandler::OnSetBrightnessCommand,
-                                         weak_ptr_factory_.GetWeakPtr()));
-  }
-
- private:
-  void OnSetTempCommand(const std::weak_ptr<weave::Command>& command) {
-    auto cmd = command.lock();
-    if (!cmd)
-      return;
-    LOG(INFO) << "received command: " << cmd->GetName();
-
-    const auto& params = cmd->GetParameters();
-    std::string units;
-    double temp;
-
-    if (params.GetString("units", &units) &&
-        params.GetDouble("tempSetting", &temp)) {
-      units_ = units;
-      target_temperature_ = temp;
-
-      UpdateOvenState();
-
-      cmd->Complete({}, nullptr);
-      LOG(INFO) << cmd->GetName() << " updated oven, matching temp";
-
-      if (target_temperature_ != current_temperature_ && !is_match_ticking_) {
-        double tickIncrement =
-            ((target_temperature_ - current_temperature_) / kWarmUpTime);
-        DoTick(tickIncrement);
-      }
-      return;
-    }
-
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "invalid_parameter_value",
-                        "Invalid parameters");
-    cmd->Abort(error.get(), nullptr);
-  }
-
-  void OnSetBrightnessCommand(const std::weak_ptr<weave::Command>& command) {
-    auto cmd = command.lock();
-    if (!cmd)
-      return;
-    LOG(INFO) << "received command: " << cmd->GetName();
-
-    const auto& params = cmd->GetParameters();
-
-    int brightness;
-    if (params.GetInteger("brightness", &brightness)) {
-      brightness_ = brightness;
-
-      UpdateOvenState();
-
-      cmd->Complete({}, nullptr);
-      return;
-    }
-
-    weave::ErrorPtr error;
-    weave::Error::AddTo(&error, FROM_HERE, "invalid_parameter_value",
-                        "Invalid parameters");
-    cmd->Abort(error.get(), nullptr);
-  }
-
-  void UpdateOvenState() {
-    base::DictionaryValue state;
-    base::ListValue supportedUnits;
-    supportedUnits.AppendStrings({"celsius"});
-
-    state.SetString("temperatureSensor.units", units_);
-    state.SetDouble("temperatureSensor.value", current_temperature_);
-    state.Set("temperatureSensor.supportedUnits",
-              supportedUnits.CreateDeepCopy());
-
-    state.SetString("temperatureSetting.units", units_);
-    state.SetDouble("temperatureSetting.tempSetting", target_temperature_);
-    state.Set("temperatureSetting.supportedUnits",
-              supportedUnits.CreateDeepCopy());
-    state.SetDouble("temperatureSetting.maxTempSetting", kMaxTemp);
-    state.SetDouble("temperatureSetting.minTempSetting", kMinTemp);
-
-    state.SetInteger("brightness.brightness", brightness_);
-
-    device_->SetStateProperties(kComponent, state, nullptr);
-  }
-
-  void DoTick(double tickIncrement) {
-    LOG(INFO) << "Oven matching temp tick";
-
-    if (std::fabs(target_temperature_ - current_temperature_) >=
-        tickIncrement) {
-      is_match_ticking_ = true;
-      current_temperature_ += tickIncrement;
-      UpdateOvenState();
-      task_runner_->PostDelayedTask(
-          FROM_HERE, base::Bind(&OvenHandler::DoTick,
-                                weak_ptr_factory_.GetWeakPtr(), tickIncrement),
-          base::TimeDelta::FromSeconds(1));
-      return;
-    }
-
-    is_match_ticking_ = false;
-    current_temperature_ = target_temperature_;
-    UpdateOvenState();
-
-    LOG(INFO) << "Oven temp matched";
-  }
-
-  weave::Device* device_{nullptr};
-  weave::provider::TaskRunner* task_runner_{nullptr};
-
-  std::string units_ = "celsius";
-  double target_temperature_ = 0.0;
-  double current_temperature_ = 0.0;
-  int brightness_ = 0;
-  bool is_match_ticking_ = false;
-
-  base::WeakPtrFactory<OvenHandler> 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};
-  OvenHandler handler{daemon.GetTaskRunner()};
-  handler.Register(daemon.GetDevice());
-  daemon.Run();
-  return 0;
-}
diff --git a/examples/daemon/speaker/speaker.cc b/examples/daemon/speaker/speaker.cc
deleted file mode 100644
index 56da840..0000000
--- a/examples/daemon/speaker/speaker.cc
+++ /dev/null
@@ -1,178 +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 "examples/daemon/common/daemon.h"
-
-#include <weave/device.h>
-
-#include <base/bind.h>
-#include <base/memory/weak_ptr.h>
-
-namespace {
-
-const char kTraits[] = R"({
-  "onOff": {
-    "commands": {
-      "setConfig": {
-        "minimalRole": "user",
-        "parameters": {
-          "state": {
-            "type": "string",
-            "enum": [ "on", "off" ]
-          }
-        }
-      }
-    },
-    "state": {
-      "state": {
-        "type": "string",
-        "enum": [ "on", "off" ],
-        "isRequired": true
-      }
-    }
-  },
-  "volume": {
-    "commands": {
-      "setConfig": {
-        "minimalRole": "user",
-        "parameters": {
-          "volume": {
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 100
-          },
-          "isMuted": { "type": "boolean" }
-        }
-      }
-    },
-    "state": {
-      "isMuted": {
-        "type": "boolean",
-        "isRequired": true
-      },
-      "volume": {
-        "type": "integer",
-        "minimum": 0,
-        "maximum": 100,
-        "isRequired": true
-      }
-    }
-  }
-})";
-
-const char kComponent[] = "speaker";
-
-}  // anonymous namespace
-
-// SpeakerHandler is a command handler example that shows
-// how to handle commands for a Weave speaker.
-class SpeakerHandler {
- public:
-  SpeakerHandler() = default;
-  void Register(weave::Device* device) {
-    device_ = device;
-
-    device->AddTraitDefinitionsFromJson(kTraits);
-    CHECK(device->AddComponent(kComponent, {"onOff", "volume"}, nullptr));
-    UpdateSpeakerState();
-
-    device->AddCommandHandler(kComponent, "onOff.setConfig",
-                              base::Bind(&SpeakerHandler::OnOnOffSetConfig,
-                                         weak_ptr_factory_.GetWeakPtr()));
-    device->AddCommandHandler(kComponent, "volume.setConfig",
-                              base::Bind(&SpeakerHandler::OnVolumeSetConfig,
-                                         weak_ptr_factory_.GetWeakPtr()));
-  }
-
- private:
-  void OnVolumeSetConfig(const std::weak_ptr<weave::Command>& command) {
-    auto cmd = command.lock();
-    if (!cmd)
-      return;
-    LOG(INFO) << "received command: " << cmd->GetName();
-
-    const auto& params = cmd->GetParameters();
-    // Handle volume parameter
-    int32_t volume_value = 0;
-    if (params.GetInteger("volume", &volume_value)) {
-      // Display this command in terminal.
-      LOG(INFO) << cmd->GetName() << " volume: " << volume_value;
-
-      if (volume_value_ != volume_value) {
-        volume_value_ = volume_value;
-        UpdateSpeakerState();
-      }
-      cmd->Complete({}, nullptr);
-      return;
-    }
-
-    // Handle isMuted parameter
-    bool isMuted_status = false;
-    if (params.GetBoolean("isMuted", &isMuted_status)) {
-      // Display this command in terminal.
-      LOG(INFO) << cmd->GetName() << " is "
-                << (isMuted_status ? "muted" : "not muted");
-
-      if (isMuted_status_ != isMuted_status) {
-        isMuted_status_ = isMuted_status;
-
-        LOG(INFO) << "Speaker is now: "
-                  << (isMuted_status ? "muted" : "not muted");
-        UpdateSpeakerState();
-      }
-    }
-
-    cmd->Complete({}, nullptr);
-  }
-
-  void OnOnOffSetConfig(const std::weak_ptr<weave::Command>& command) {
-    auto cmd = command.lock();
-    if (!cmd)
-      return;
-    LOG(INFO) << "received command: " << cmd->GetName();
-    const auto& params = cmd->GetParameters();
-    std::string requested_state;
-    if (params.GetString("state", &requested_state)) {
-      LOG(INFO) << cmd->GetName() << " state: " << requested_state;
-
-      bool new_speaker_status = requested_state == "on";
-      if (new_speaker_status != speaker_status_) {
-        speaker_status_ = new_speaker_status;
-
-        LOG(INFO) << "Speaker is now: " << (speaker_status_ ? "ON" : "OFF");
-        UpdateSpeakerState();
-      }
-    }
-    cmd->Complete({}, nullptr);
-  }
-
-  void UpdateSpeakerState() {
-    base::DictionaryValue state;
-    state.SetString("onOff.state", speaker_status_ ? "on" : "off");
-    state.SetBoolean("volume.isMuted", isMuted_status_);
-    state.SetInteger("volume.volume", volume_value_);
-    device_->SetStateProperties(kComponent, state, nullptr);
-  }
-
-  weave::Device* device_{nullptr};
-
-  // Simulate the state of the speaker.
-  bool speaker_status_;
-  bool isMuted_status_;
-  int32_t volume_value_;
-  base::WeakPtrFactory<SpeakerHandler> 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};
-  SpeakerHandler speaker;
-  speaker.Register(daemon.GetDevice());
-  daemon.Run();
-  return 0;
-}
diff --git a/examples/examples.mk b/examples/examples.mk
index 555322c..cb64e2b 100644
--- a/examples/examples.mk
+++ b/examples/examples.mk
@@ -21,9 +21,7 @@
 	examples/daemon/ledflasher/ledflasher.cc \
 	examples/daemon/light/light.cc \
 	examples/daemon/lock/lock.cc \
-	examples/daemon/oven/oven.cc \
-	examples/daemon/sample/sample.cc \
-	examples/daemon/speaker/speaker.cc
+	examples/daemon/sample/sample.cc
 
 examples_daemon_obj_files := $(EXAMPLES_DAEMON_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
 
@@ -62,16 +60,10 @@
 out/$(BUILD_MODE)/weave_daemon_lock : out/$(BUILD_MODE)/examples/daemon/lock/lock.o $(example_daemon_deps)
 	$(CXX) -o $@ $^ $(CFLAGS) $(example_daemon_common_flags)
 
-out/$(BUILD_MODE)/weave_daemon_oven : out/$(BUILD_MODE)/examples/daemon/oven/oven.o $(example_daemon_deps)
-	$(CXX) -o $@ $^ $(CFLAGS) $(example_daemon_common_flags)
-
 out/$(BUILD_MODE)/weave_daemon_sample : out/$(BUILD_MODE)/examples/daemon/sample/sample.o $(example_daemon_deps)
 	$(CXX) -o $@ $^ $(CFLAGS) $(example_daemon_common_flags)
 
-out/$(BUILD_MODE)/weave_daemon_speaker : out/$(BUILD_MODE)/examples/daemon/speaker/speaker.o $(example_daemon_deps)
-	$(CXX) -o $@ $^ $(CFLAGS) $(example_daemon_common_flags)
-
-all-examples : out/$(BUILD_MODE)/weave_daemon_ledflasher out/$(BUILD_MODE)/weave_daemon_light out/$(BUILD_MODE)/weave_daemon_lock out/$(BUILD_MODE)/weave_daemon_oven out/$(BUILD_MODE)/weave_daemon_sample out/$(BUILD_MODE)/weave_daemon_speaker
+all-examples : out/$(BUILD_MODE)/weave_daemon_ledflasher out/$(BUILD_MODE)/weave_daemon_light out/$(BUILD_MODE)/weave_daemon_lock out/$(BUILD_MODE)/weave_daemon_sample
 
 .PHONY : all-examples
 
