diff --git a/buffet/COMMIT-QUEUE.ini b/buffet/COMMIT-QUEUE.ini
deleted file mode 100644
index f5a018a..0000000
--- a/buffet/COMMIT-QUEUE.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Per-project Commit Queue settings.
-# Documentation: http://goo.gl/5J7oND
-
-[GENERAL]
-
-# Board-specific pre-cq
-pre-cq-configs: gizmo-pre-cq
diff --git a/buffet/HACKING b/buffet/HACKING
deleted file mode 100644
index 95c6193..0000000
--- a/buffet/HACKING
+++ /dev/null
@@ -1,147 +0,0 @@
-This file is intended for onboarding new SWEs hacking on buffet.
-
- A. Common workflows.
- B. Registering your DUT.
-
----
-A. COMMON WORKFLOWS
----
-
-Some common workflows for developing with buffet:
-
-# Tell portage that you'd like to make local changes to Buffet:
-cros_workon start --board=${BOARD} buffet
-
-# Edit files in platform2/buffet/
-vim ...
-
-# Compile and install those changes into the chroot:
-USE=buffet emerge-${BOARD} buffet
-
-# Compile and run buffet unittests
-USE=buffet FEATURES=test emerge-${BOARD} buffet
-
-# Deploy the most recently built version of buffet to a DUT:
-cros deploy --board=${BOARD} <remote host> buffet
-
-#To enable additional debug logging in buffet daemon, run it as:
-# buffet --v=<level>, where <level> is verbosity level of debug info:
-#  1 - enable additional tracing of internal object construction and destruction
-#  2 - add tracing of request and response data sent over HTTP (beware of
-#      privacy concerns).
-#  3 - enable low-level CURL tracing for HTTP communication.
-buffet --v=2
-
----
-B. REGISTERING YOUR DUT
----
-
-This process in described in great detail at
-
- https://developers.google.com/cloud-devices/v1/dev-guides/getting-started/register
-
-but since these instructions are generic and comprehensive, here's
-exactly what you need to do to get started when working with
-buffet/Brillo, in ten simple steps.
-
-The word DUT in this context is meant as the device that you want to
-associate with the cloud - for most buffet/Brillo developers this will
-be a Chromebook or another embedded device. These notes assume you
-have shell access to the DUT and also have access to a normal Linux
-workstation with shell and browser access.
-
-1. Open an Incognito window in Chrome on your workstation, go to
-https://www.google.com and log in with your test google account (NEVER
-use @google.com credentials on DUTs). In the following we're using
-<GMAIL_TEST_ACCOUNT> which you should replace with whatever you're
-using, e.g. my-testing-account-xyz@gmail.com.
-
-2. First we need an Authorization Code for the test user. This is
-covered in more detail in
-
- https://developers.google.com/cloud-devices/v1/dev-guides/getting-started/authorizing#code
-
-but basically amounts to entering the following URL in the Incognito window
-
- https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/clouddevices&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=58855907228.apps.googleusercontent.com
-
-If you're not using the default buffet gcd-project, replace the
-client_id parameter in the URL with the one for the product you
-registered as per
-
- https://developers.google.com/cloud-devices/v1/dev-guides/getting-started/authorizing#setup
-
-3. The browser window should display a prompt saying that
-"clouddevicesclient" would like to "Manage your cloud device". Press
-the "Accept" button and write down the Authorization Code
-displayed. It should look something like this
-
- 4/J23qfSkXYFgF_0H7DCOtwS5O7HO69zF9LtnG9_ILIGA.QhJE9WLeqwcaJvIeHux6iLavlvowlwI
-
-4. Open a bash prompt on your Linux workstation and type the following
-
- export SETUP_USER=<GMAIL_TEST_ACCOUNT>
- export SETUP_CODE=4/J23qfSkXYFgF_0H7DCOtwS5O7HO69zF9LtnG9_ILIGA.QhJE9WLeqwcaJvIeHux6iLavlvowlwI
- export SETUP_CLIENT_ID=58855907228.apps.googleusercontent.com
- export SETUP_CLIENT_SECRET=eHSAREAHrIqPsHBxCE9zPPBi
-
-replacing the values for SETUP_USER and SETUP_CODE as
-appropriate. Again, if you're not using the default buffet gcd-project
-replace the values SETUP_CLIENT_ID and SETUP_CLIENT_SECRET as
-appropriate.
-
-5. Now we can get an Access Token. Run the following command from the shell:
-
- curl -d "code=${SETUP_CODE}&client_id=${SETUP_CLIENT_ID}&client_secret=${SETUP_CLIENT_SECRET}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token
-
-It should print out something like this:
-
- {
-   "access_token" : "ya29.HQE<...>",
-   "token_type" : "Bearer",
-   "expires_in" : 3600,
-   "refresh_token" : "1/iMq4<...>"
- }
-
-6. Export the access token in the shell:
-
- export SETUP_ACCESS_TOKEN=ya29.HQE<...>
-
-7. Now we can get the Registration Ticket Id for the device. Run the following
-
- curl --header "Authorization: Bearer ${SETUP_ACCESS_TOKEN}" --header "Content-Type: application/json; charset=UTF-8" --data "{ \"userEmail\": \"${SETUP_USER}\" }" https://www.googleapis.com/clouddevices/v1/registrationTickets
-
-It should print out something like this
-
- {
-  "kind": "clouddevices#registrationTicket",
-  "id": "453f1139-bd<...>",
-  "deviceId": "77500a3f-458b-<...>",
-  "userEmail": "<GMAIL_TEST_ACCOUNT>",
-  "creationTimeMs": "1424193538212",
-  "expirationTimeMs": "1424193778212"
- }
-
-8. Now, open a shell on the DUT and export the following
-
- export DUT_SETUP_TICKET_ID=453f1139-bd<...>
-
-9. Run the following command on the DUT shell
-
- buffet_client RegisterDevice ticket_id=${DUT_SETUP_TICKET_ID}
-
-appropriate. If you're not using the default buffet gcd-project you
-also need to pass other parameters such as client_id, client_secret
-and api_key.
-
-It should succeed and print the device-id
-
- Device registered: 77500a3f-458b-<...>
-
-10. The registered DUT should now show up in the Google account that
-you associated it with. In the Incognito window opened in step 1, go
-to
-
- https://security.google.com/settings/security/permissions
-
-where you can e.g. revoke access to the device.
diff --git a/buffet/OWNERS b/buffet/OWNERS
deleted file mode 100644
index 6000333..0000000
--- a/buffet/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-set noparent
-avakulenko@chromium.org
-sosa@chromium.org
-vitalybuka@chromium.org
-wiley@chromium.org
diff --git a/buffet/README b/buffet/README
deleted file mode 100644
index 9dc1e87..0000000
--- a/buffet/README
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-This directory contains the a Brillo service for registering a device and
-sending/receiving remote commands.
diff --git a/buffet/ap_manager_client.cc b/buffet/ap_manager_client.cc
deleted file mode 100644
index 6449c0f..0000000
--- a/buffet/ap_manager_client.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/ap_manager_client.h"
-
-namespace buffet {
-
-using org::chromium::apmanager::ConfigProxy;
-using org::chromium::apmanager::ManagerProxy;
-using org::chromium::apmanager::ServiceProxy;
-
-ApManagerClient::ApManagerClient(const scoped_refptr<dbus::Bus>& bus)
-    : bus_(bus) {}
-
-ApManagerClient::~ApManagerClient() {
-  Stop();
-}
-
-void ApManagerClient::Start(const std::string& ssid) {
-  if (service_path_.IsValid()) {
-    return;
-  }
-
-  ssid_ = ssid;
-
-  object_manager_proxy_.reset(
-      new org::chromium::apmanager::ObjectManagerProxy{bus_});
-  object_manager_proxy_->SetManagerAddedCallback(base::Bind(
-      &ApManagerClient::OnManagerAdded, weak_ptr_factory_.GetWeakPtr()));
-  object_manager_proxy_->SetServiceAddedCallback(base::Bind(
-      &ApManagerClient::OnServiceAdded, weak_ptr_factory_.GetWeakPtr()));
-
-  object_manager_proxy_->SetServiceRemovedCallback(base::Bind(
-      &ApManagerClient::OnServiceRemoved, weak_ptr_factory_.GetWeakPtr()));
-  object_manager_proxy_->SetManagerRemovedCallback(base::Bind(
-      &ApManagerClient::OnManagerRemoved, weak_ptr_factory_.GetWeakPtr()));
-}
-
-void ApManagerClient::Stop() {
-  if (manager_proxy_ && service_path_.IsValid()) {
-    RemoveService(service_path_);
-  }
-  service_path_ = dbus::ObjectPath();
-  service_proxy_ = nullptr;
-  manager_proxy_ = nullptr;
-  object_manager_proxy_.reset();
-  ssid_.clear();
-}
-
-void ApManagerClient::RemoveService(const dbus::ObjectPath& object_path) {
-  CHECK(object_path.IsValid());
-  chromeos::ErrorPtr error;
-  if (!manager_proxy_->RemoveService(object_path, &error)) {
-    LOG(ERROR) << "RemoveService failed: " << error->GetMessage();
-  }
-}
-
-void ApManagerClient::OnManagerAdded(ManagerProxy* manager_proxy) {
-  VLOG(1) << "manager added: " << manager_proxy->GetObjectPath().value();
-  manager_proxy_ = manager_proxy;
-
-  if (service_path_.IsValid())
-    return;
-
-  chromeos::ErrorPtr error;
-  if (!manager_proxy_->CreateService(&service_path_, &error)) {
-    LOG(ERROR) << "CreateService failed: " << error->GetMessage();
-  }
-}
-
-void ApManagerClient::OnServiceAdded(ServiceProxy* service_proxy) {
-  VLOG(1) << "service added: " << service_proxy->GetObjectPath().value();
-  if (service_proxy->GetObjectPath() != service_path_) {
-    RemoveService(service_proxy->GetObjectPath());
-    return;
-  }
-  service_proxy_ = service_proxy;
-
-  ConfigProxy* config_proxy =
-      object_manager_proxy_->GetConfigProxy(service_proxy->config());
-  ConfigProxy::PropertySet* properties = config_proxy->GetProperties();
-  properties->ssid.Set(ssid_, base::Bind(&ApManagerClient::OnSsidSet,
-                                         weak_ptr_factory_.GetWeakPtr()));
-}
-
-void ApManagerClient::OnSsidSet(bool success) {
-  if (!success || !service_proxy_) {
-    LOG(ERROR) << "Failed to set ssid.";
-    return;
-  }
-  VLOG(1) << "SSID is set: " << ssid_;
-
-  chromeos::ErrorPtr error;
-  if (!service_proxy_->Start(&error)) {
-    LOG(ERROR) << "Service start failed: " << error->GetMessage();
-  }
-}
-
-void ApManagerClient::OnServiceRemoved(const dbus::ObjectPath& object_path) {
-  VLOG(1) << "service removed: " << object_path.value();
-  if (object_path != service_path_)
-    return;
-  service_path_ = dbus::ObjectPath();
-  service_proxy_ = nullptr;
-}
-
-void ApManagerClient::OnManagerRemoved(const dbus::ObjectPath& object_path) {
-  VLOG(1) << "manager removed: " << object_path.value();
-  manager_proxy_ = nullptr;
-  Stop();
-}
-
-}  // namespace buffet
diff --git a/buffet/ap_manager_client.h b/buffet/ap_manager_client.h
deleted file mode 100644
index 8397587..0000000
--- a/buffet/ap_manager_client.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_AP_MANAGER_CLIENT_H_
-#define BUFFET_AP_MANAGER_CLIENT_H_
-
-#include <memory>
-#include <string>
-
-#include <base/callback.h>
-#include <base/memory/ref_counted.h>
-
-#include "apmanager/dbus-proxies.h"
-
-namespace buffet {
-
-// Manages soft AP for wifi bootstrapping.
-// Once created can handle multiple Start/Stop requests.
-class ApManagerClient final {
- public:
-  explicit ApManagerClient(const scoped_refptr<dbus::Bus>& bus);
-  ~ApManagerClient();
-
-  void Start(const std::string& ssid);
-  void Stop();
-
-  std::string GetSsid() const { return ssid_; }
-
- private:
-  void RemoveService(const dbus::ObjectPath& object_path);
-
-  void OnManagerAdded(org::chromium::apmanager::ManagerProxy* manager_proxy);
-  void OnServiceAdded(org::chromium::apmanager::ServiceProxy* service_proxy);
-
-  void OnSsidSet(bool success);
-
-  void OnServiceRemoved(const dbus::ObjectPath& object_path);
-  void OnManagerRemoved(const dbus::ObjectPath& object_path);
-
-  scoped_refptr<dbus::Bus> bus_;
-
-  std::unique_ptr<org::chromium::apmanager::ObjectManagerProxy>
-      object_manager_proxy_;
-  org::chromium::apmanager::ManagerProxy* manager_proxy_{nullptr};
-
-  dbus::ObjectPath service_path_;
-  org::chromium::apmanager::ServiceProxy* service_proxy_{nullptr};
-
-  std::string ssid_;
-
-  base::WeakPtrFactory<ApManagerClient> weak_ptr_factory_{this};
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_AP_MANAGER_CLIENT_H_
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
deleted file mode 100644
index 800737a..0000000
--- a/buffet/buffet.gyp
+++ /dev/null
@@ -1,157 +0,0 @@
-{
-  'target_defaults': {
-    'variables': {
-      'deps': [
-        'libchrome-<(libbase_ver)',
-        'libchromeos-<(libbase_ver)',
-        'system_api',
-      ],
-    },
-    'include_dirs': [
-      '.',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'buffet_common',
-      'type': 'static_library',
-      'variables': {
-        'dbus_adaptors_out_dir': 'include/buffet',
-        'dbus_service_config': 'dbus_bindings/dbus-service-config.json',
-        'exported_deps': [
-          'libwebserv-<(libbase_ver)',
-          'libweave-<(libbase_ver)',
-        ],
-        'deps': ['<@(exported_deps)'],
-      },
-      'all_dependent_settings': {
-        'variables': {
-          'deps': [
-            '<@(exported_deps)',
-          ],
-        },
-      },
-      'sources': [
-        'ap_manager_client.cc',
-        'dbus_bindings/org.chromium.Buffet.Command.xml',
-        'dbus_bindings/org.chromium.Buffet.Manager.xml',
-        'dbus_command_dispatcher.cc',
-        'dbus_command_proxy.cc',
-        'dbus_conversion.cc',
-        'dbus_constants.cc',
-        'manager.cc',
-        'peerd_client.cc',
-        'shill_client.cc',
-        'webserv_client.cc',
-      ],
-      'includes': ['../common-mk/generate-dbus-adaptors.gypi'],
-      'actions': [
-        {
-          'action_name': 'generate-buffet-proxies',
-          'variables': {
-            'dbus_service_config': 'dbus_bindings/dbus-service-config.json',
-            'proxy_output_file': 'include/buffet/dbus-proxies.h'
-          },
-          'sources': [
-            'dbus_bindings/org.chromium.Buffet.Command.xml',
-            'dbus_bindings/org.chromium.Buffet.Manager.xml',
-          ],
-          'includes': ['../common-mk/generate-dbus-proxies.gypi'],
-        },
-        {
-          # Import D-Bus bindings from peerd.
-          'action_name': 'generate-peerd-proxies',
-          'variables': {
-            'dbus_service_config': '../peerd/dbus_bindings/dbus-service-config.json',
-            'proxy_output_file': 'include/peerd/dbus-proxies.h'
-          },
-          'sources': [
-            '../peerd/dbus_bindings/org.chromium.peerd.Manager.xml',
-            '../peerd/dbus_bindings/org.chromium.peerd.Peer.xml',
-            '../peerd/dbus_bindings/org.chromium.peerd.Service.xml',
-          ],
-          'includes': ['../common-mk/generate-dbus-proxies.gypi'],
-        },
-        {
-          # Import D-Bus bindings from shill.
-          'action_name': 'generate-shill-proxies',
-          'variables': {
-            'dbus_service_config': '../shill/dbus_bindings/dbus-service-config.json',
-            'proxy_output_file': 'include/shill/dbus-proxies.h'
-          },
-          'sources': [
-            '../shill/dbus_bindings/org.chromium.flimflam.Device.xml',
-            '../shill/dbus_bindings/org.chromium.flimflam.Manager.xml',
-            '../shill/dbus_bindings/org.chromium.flimflam.Service.xml',
-          ],
-          'includes': ['../common-mk/generate-dbus-proxies.gypi'],
-        },
-        {
-          # Import D-Bus bindings from apmanager.
-          'action_name': 'generate-apmanager-proxies',
-          'variables': {
-            'dbus_service_config': '../apmanager/dbus_bindings/dbus-service-config.json',
-            'proxy_output_file': 'include/apmanager/dbus-proxies.h'
-          },
-          'sources': [
-            '../apmanager/dbus_bindings/org.chromium.apmanager.Config.xml',
-            '../apmanager/dbus_bindings/org.chromium.apmanager.Device.xml',
-            '../apmanager/dbus_bindings/org.chromium.apmanager.Manager.xml',
-            '../apmanager/dbus_bindings/org.chromium.apmanager.Service.xml',
-          ],
-          'includes': ['../common-mk/generate-dbus-proxies.gypi'],
-        },
-      ],
-    },
-    {
-      'target_name': 'buffet',
-      'type': 'executable',
-      'dependencies': [
-        'buffet_common',
-      ],
-      'sources': [
-        'main.cc',
-      ],
-    },
-    {
-      'target_name': 'buffet_test_daemon',
-      'type': 'executable',
-      'sources': [
-        'test_daemon/main.cc',
-      ],
-    },
-    {
-      'target_name': 'buffet_client',
-      'type': 'executable',
-      'sources': [
-        'buffet_client.cc',
-      ],
-    },
-  ],
-  'conditions': [
-    ['USE_test == 1', {
-      'targets': [
-        {
-          'target_name': 'buffet_testrunner',
-          'type': 'executable',
-          'dependencies': [
-            'buffet_common',
-          ],
-          'variables': {
-            'deps': [
-              'libchrome-test-<(libbase_ver)',
-              'libchromeos-test-<(libbase_ver)',
-              'libweave-test-<(libbase_ver)',
-            ],
-          },
-          'includes': ['../common-mk/common_test.gypi'],
-          'sources': [
-            'buffet_testrunner.cc',
-            'dbus_command_proxy_unittest.cc',
-            'dbus_conversion_unittest.cc',
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
deleted file mode 100644
index cf9928f..0000000
--- a/buffet/buffet_client.cc
+++ /dev/null
@@ -1,400 +0,0 @@
-// Copyright 2014 The Chromium OS 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 <memory>
-#include <string>
-#include <sysexits.h>
-
-#include <base/cancelable_callback.h>
-#include <base/command_line.h>
-#include <base/json/json_reader.h>
-#include <base/logging.h>
-#include <base/memory/ref_counted.h>
-#include <base/memory/weak_ptr.h>
-#include <base/strings/stringprintf.h>
-#include <base/values.h>
-#include <chromeos/any.h>
-#include <chromeos/daemons/dbus_daemon.h>
-#include <chromeos/data_encoding.h>
-#include <chromeos/dbus/data_serialization.h>
-#include <chromeos/dbus/dbus_method_invoker.h>
-#include <chromeos/errors/error.h>
-#include <chromeos/strings/string_utils.h>
-#include <chromeos/variant_dictionary.h>
-#include <dbus/bus.h>
-#include <dbus/message.h>
-#include <dbus/object_proxy.h>
-#include <dbus/object_manager.h>
-#include <dbus/values_util.h>
-
-#include "buffet/dbus-proxies.h"
-
-using chromeos::Error;
-using chromeos::ErrorPtr;
-using org::chromium::Buffet::ManagerProxy;
-
-namespace {
-
-void usage() {
-  printf(R"(Possible commands:
-  - TestMethod <message>
-  - CheckDeviceRegistered
-  - GetDeviceInfo
-  - RegisterDevice param1=val1&param2=val2...
-  - AddCommand '{"name":"command_name","parameters":{}}'
-  - UpdateState prop_name prop_value
-  - GetState
-  - PendingCommands
-  - SetCommandVisibility pkg1.cmd1[,pkg2.cm2,...] [all|cloud|local|none]
-)");
-}
-
-// Helpers for JsonToAny().
-template<typename T>
-chromeos::Any GetJsonValue(const base::Value& json,
-                           bool(base::Value::*fnc)(T*) const) {
-  T val;
-  CHECK((json.*fnc)(&val));
-  return val;
-}
-
-template<typename T>
-chromeos::Any GetJsonList(const base::ListValue& list);  // Prototype.
-
-// Converts a JSON value into an Any so it can be sent over D-Bus using
-// UpdateState D-Bus method from Buffet.
-chromeos::Any JsonToAny(const base::Value& json) {
-  chromeos::Any prop_value;
-  switch (json.GetType()) {
-    case base::Value::TYPE_NULL:
-      prop_value = nullptr;
-      break;
-    case base::Value::TYPE_BOOLEAN:
-      prop_value = GetJsonValue<bool>(json, &base::Value::GetAsBoolean);
-      break;
-    case base::Value::TYPE_INTEGER:
-      prop_value = GetJsonValue<int>(json, &base::Value::GetAsInteger);
-      break;
-    case base::Value::TYPE_DOUBLE:
-      prop_value = GetJsonValue<double>(json, &base::Value::GetAsDouble);
-      break;
-    case base::Value::TYPE_STRING:
-      prop_value = GetJsonValue<std::string>(json, &base::Value::GetAsString);
-      break;
-    case base::Value::TYPE_BINARY:
-      LOG(FATAL) << "Binary values should not happen";
-      break;
-    case base::Value::TYPE_DICTIONARY: {
-      const base::DictionaryValue* dict = nullptr;  // Still owned by |json|.
-      CHECK(json.GetAsDictionary(&dict));
-      chromeos::VariantDictionary var_dict;
-      base::DictionaryValue::Iterator it(*dict);
-      while (!it.IsAtEnd()) {
-        var_dict.emplace(it.key(), JsonToAny(it.value()));
-        it.Advance();
-      }
-      prop_value = var_dict;
-      break;
-    }
-    case base::Value::TYPE_LIST: {
-      const base::ListValue* list = nullptr;  // Still owned by |json|.
-      CHECK(json.GetAsList(&list));
-      CHECK(!list->empty()) << "Unable to deduce the type of list elements.";
-      switch ((*list->begin())->GetType()) {
-        case base::Value::TYPE_BOOLEAN:
-          prop_value = GetJsonList<bool>(*list);
-          break;
-        case base::Value::TYPE_INTEGER:
-          prop_value = GetJsonList<int>(*list);
-          break;
-        case base::Value::TYPE_DOUBLE:
-          prop_value = GetJsonList<double>(*list);
-          break;
-        case base::Value::TYPE_STRING:
-          prop_value = GetJsonList<std::string>(*list);
-          break;
-        case base::Value::TYPE_DICTIONARY:
-          prop_value = GetJsonList<chromeos::VariantDictionary>(*list);
-          break;
-        default:
-          LOG(FATAL) << "Unsupported JSON value type for list element: "
-                     << (*list->begin())->GetType();
-      }
-      break;
-    }
-    default:
-      LOG(FATAL) << "Unexpected JSON value type: " << json.GetType();
-      break;
-  }
-  return prop_value;
-}
-
-template<typename T>
-chromeos::Any GetJsonList(const base::ListValue& list) {
-  std::vector<T> val;
-  val.reserve(list.GetSize());
-  for (const base::Value* v : list)
-    val.push_back(JsonToAny(*v).Get<T>());
-  return val;
-}
-
-class Daemon final : public chromeos::DBusDaemon {
- public:
-  Daemon() = default;
-
- protected:
-  int OnInit() override {
-    int return_code = chromeos::DBusDaemon::OnInit();
-    if (return_code != EX_OK)
-      return return_code;
-
-    object_manager_.reset(new org::chromium::Buffet::ObjectManagerProxy{bus_});
-    return_code = ScheduleActions();
-    if (return_code == EX_USAGE) {
-      usage();
-    }
-    return return_code;
-  }
-
-  void OnShutdown(int* return_code) override {
-    if (*return_code == EX_OK)
-      *return_code = exit_code_;
-  }
-
- private:
-  int ScheduleActions() {
-    auto args = base::CommandLine::ForCurrentProcess()->GetArgs();
-
-    // Pop the command off of the args list.
-    std::string command = args.front();
-    args.erase(args.begin());
-    base::Callback<void(ManagerProxy*)> job;
-    if (command.compare("TestMethod") == 0) {
-      if (!args.empty() && !CheckArgs(command, args, 1))
-        return EX_USAGE;
-      std::string message;
-      if (!args.empty())
-        message = args.back();
-      job = base::Bind(&Daemon::CallTestMethod, weak_factory_.GetWeakPtr(),
-                       message);
-    } else if (command.compare("CheckDeviceRegistered") == 0 ||
-               command.compare("cr") == 0) {
-      if (!CheckArgs(command, args, 0))
-        return EX_USAGE;
-      job = base::Bind(&Daemon::CallCheckDeviceRegistered,
-                       weak_factory_.GetWeakPtr());
-    } else if (command.compare("GetDeviceInfo") == 0 ||
-               command.compare("di") == 0) {
-      if (!CheckArgs(command, args, 0))
-        return EX_USAGE;
-      job = base::Bind(&Daemon::CallGetDeviceInfo,
-                       weak_factory_.GetWeakPtr());
-    } else if (command.compare("RegisterDevice") == 0 ||
-               command.compare("rd") == 0) {
-      if (!args.empty() && !CheckArgs(command, args, 1))
-        return EX_USAGE;
-      std::string dict;
-      if (!args.empty())
-        dict = args.back();
-      job = base::Bind(&Daemon::CallRegisterDevice,
-                       weak_factory_.GetWeakPtr(), dict);
-    } else if (command.compare("UpdateState") == 0 ||
-               command.compare("us") == 0) {
-      if (!CheckArgs(command, args, 2))
-        return EX_USAGE;
-      job = base::Bind(&Daemon::CallUpdateState, weak_factory_.GetWeakPtr(),
-                       args.front(), args.back());
-    } else if (command.compare("GetState") == 0 ||
-               command.compare("gs") == 0) {
-      if (!CheckArgs(command, args, 0))
-        return EX_USAGE;
-      job = base::Bind(&Daemon::CallGetState, weak_factory_.GetWeakPtr());
-    } else if (command.compare("AddCommand") == 0 ||
-               command.compare("ac") == 0) {
-      if (!CheckArgs(command, args, 1))
-        return EX_USAGE;
-      job = base::Bind(&Daemon::CallAddCommand, weak_factory_.GetWeakPtr(),
-                       args.back());
-    } else if (command.compare("PendingCommands") == 0 ||
-               command.compare("pc") == 0) {
-      if (!CheckArgs(command, args, 0))
-        return EX_USAGE;
-      // CallGetPendingCommands relies on ObjectManager but it is being
-      // initialized asynchronously without a way to get a callback when
-      // it is ready to be used. So, just wait a bit before calling its
-      // methods.
-      base::MessageLoop::current()->PostDelayedTask(
-          FROM_HERE,
-          base::Bind(&Daemon::CallGetPendingCommands,
-                     weak_factory_.GetWeakPtr()),
-          base::TimeDelta::FromMilliseconds(100));
-    } else {
-      fprintf(stderr, "Unknown command: '%s'\n", command.c_str());
-      return EX_USAGE;
-    }
-    if (!job.is_null())
-      object_manager_->SetManagerAddedCallback(job);
-    timeout_task_.Reset(
-        base::Bind(&Daemon::OnJobTimeout, weak_factory_.GetWeakPtr()));
-    base::MessageLoop::current()->PostDelayedTask(
-        FROM_HERE,
-        timeout_task_.callback(),
-        base::TimeDelta::FromSeconds(10));
-
-    return EX_OK;
-  }
-
-  void OnJobComplete() {
-    timeout_task_.Cancel();
-    Quit();
-  }
-
-  void OnJobTimeout() {
-    fprintf(stderr, "Timed out before completing request.");
-    Quit();
-  }
-
-  void ReportError(Error* error) {
-    fprintf(stderr, "Failed to receive a response: %s\n",
-            error->GetMessage().c_str());
-    exit_code_ = EX_UNAVAILABLE;
-    OnJobComplete();
-  }
-
-  bool CheckArgs(const std::string& command,
-                 const std::vector<std::string>& args,
-                 size_t expected_arg_count) {
-    if (args.size() == expected_arg_count)
-      return true;
-    fprintf(stderr, "Invalid number of arguments for command '%s'\n",
-            command.c_str());
-    return false;
-  }
-
-  void CallTestMethod(const std::string& message, ManagerProxy* manager_proxy) {
-    ErrorPtr error;
-    std::string response_message;
-    if (!manager_proxy->TestMethod(message, &response_message, &error)) {
-      return ReportError(error.get());
-    }
-    printf("Received a response: %s\n", response_message.c_str());
-    OnJobComplete();
-  }
-
-  void CallCheckDeviceRegistered(ManagerProxy* manager_proxy) {
-    ErrorPtr error;
-    std::string device_id;
-    if (!manager_proxy->CheckDeviceRegistered(&device_id, &error)) {
-      return ReportError(error.get());
-    }
-
-    printf("Device ID: %s\n",
-           device_id.empty() ? "<unregistered>" : device_id.c_str());
-    OnJobComplete();
-  }
-
-  void CallGetDeviceInfo(ManagerProxy* manager_proxy) {
-    ErrorPtr error;
-    std::string device_info;
-    if (!manager_proxy->GetDeviceInfo(&device_info, &error)) {
-      return ReportError(error.get());
-    }
-
-    printf("%s\n", device_info.c_str());
-    OnJobComplete();
-  }
-
-  void CallRegisterDevice(const std::string& args,
-                          ManagerProxy* manager_proxy) {
-    std::string ticket_id;
-    if (!args.empty()) {
-      auto key_values = chromeos::data_encoding::WebParamsDecode(args);
-      for (const auto& pair : key_values) {
-        if (pair.first == "ticket_id")
-          ticket_id = pair.second;
-      }
-    }
-
-    ErrorPtr error;
-    std::string device_id;
-    if (!manager_proxy->RegisterDevice(ticket_id, &device_id, &error)) {
-      return ReportError(error.get());
-    }
-
-    printf("Device registered: %s\n", device_id.c_str());
-    OnJobComplete();
-  }
-
-  void CallUpdateState(const std::string& prop,
-                       const std::string& value,
-                       ManagerProxy* manager_proxy) {
-    ErrorPtr error;
-    std::string error_message;
-    std::unique_ptr<base::Value> json(
-        base::JSONReader::ReadAndReturnError(value, base::JSON_PARSE_RFC,
-                                             nullptr, &error_message)
-            .release());
-    if (!json) {
-      Error::AddTo(&error, FROM_HERE, chromeos::errors::json::kDomain,
-                   chromeos::errors::json::kParseError, error_message);
-      return ReportError(error.get());
-    }
-
-    chromeos::VariantDictionary property_set{{prop, JsonToAny(*json)}};
-    if (!manager_proxy->UpdateState(property_set, &error)) {
-      return ReportError(error.get());
-    }
-    OnJobComplete();
-  }
-
-  void CallGetState(ManagerProxy* manager_proxy) {
-    std::string json;
-    ErrorPtr error;
-    if (!manager_proxy->GetState(&json, &error)) {
-      return ReportError(error.get());
-    }
-    printf("%s\n", json.c_str());
-    OnJobComplete();
-  }
-
-  void CallAddCommand(const std::string& command, ManagerProxy* manager_proxy) {
-    ErrorPtr error;
-    std::string id;
-    if (!manager_proxy->AddCommand(command, "owner", &id, &error)) {
-      return ReportError(error.get());
-    }
-    OnJobComplete();
-  }
-
-  void CallGetPendingCommands() {
-    printf("Pending commands:\n");
-    for (auto* cmd : object_manager_->GetCommandInstances()) {
-      printf("%10s - '%s' (id:%s)\n", cmd->status().c_str(),
-             cmd->name().c_str(), cmd->id().c_str());
-    }
-    OnJobComplete();
-  }
-
-  std::unique_ptr<org::chromium::Buffet::ObjectManagerProxy> object_manager_;
-  int exit_code_{EX_OK};
-  base::CancelableCallback<void()> timeout_task_;
-
-  base::WeakPtrFactory<Daemon> weak_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(Daemon);
-};
-
-}  // anonymous namespace
-
-int main(int argc, char** argv) {
-  base::CommandLine::Init(argc, argv);
-  base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
-  base::CommandLine::StringVector args = cl->GetArgs();
-  if (args.empty()) {
-    usage();
-    return EX_USAGE;
-  }
-
-  Daemon daemon;
-  return daemon.Run();
-}
diff --git a/buffet/buffet_testrunner.cc b/buffet/buffet_testrunner.cc
deleted file mode 100644
index 072461d..0000000
--- a/buffet/buffet_testrunner.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <base/at_exit.h>
-#include <gtest/gtest.h>
-
-int main(int argc, char** argv) {
-  base::AtExitManager exit_manager;
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/buffet/dbus_bindings/dbus-service-config.json b/buffet/dbus_bindings/dbus-service-config.json
deleted file mode 100644
index e610c3d..0000000
--- a/buffet/dbus_bindings/dbus-service-config.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "service_name": "org.chromium.Buffet",
-  "object_manager": {
-    "name": "org.chromium.Buffet.ObjectManager",
-    "object_path": "/org/chromium/Buffet"
-  }
-}
diff --git a/buffet/dbus_bindings/org.chromium.Buffet.Command.xml b/buffet/dbus_bindings/org.chromium.Buffet.Command.xml
deleted file mode 100644
index c9ed924..0000000
--- a/buffet/dbus_bindings/org.chromium.Buffet.Command.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<node xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
-  <interface name="org.chromium.Buffet.Command">
-    <method name="SetProgress">
-      <arg name="progress" type="a{sv}" direction="in"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="SetResults">
-      <arg name="results" type="a{sv}" direction="in"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="Abort">
-      <tp:docstring>
-        Mark the command as aborted. This tells the cloud that the device did
-        not successfully complete executing the command.
-      </tp:docstring>
-      <annotation name="org.chromium.DBus.Method.Kind" value="simple"/>
-    </method>
-    <method name="Cancel">
-      <tp:docstring>
-        Mark the command as cancelled. Unlike Abort() this should be used when
-        the device detects a user request to cancel a command.
-      </tp:docstring>
-      <annotation name="org.chromium.DBus.Method.Kind" value="simple"/>
-    </method>
-    <method name="Done">
-      <tp:docstring>
-        Mark the command as successfully completed.
-      </tp:docstring>
-      <annotation name="org.chromium.DBus.Method.Kind" value="simple"/>
-    </method>
-    <property name="Name" type="s" access="read"/>
-    <property name="Category" type="s" access="read"/>
-    <property name="Id" type="s" access="read"/>
-    <property name="Status" type="s" access="read"/>
-    <property name="Parameters" type="a{sv}" access="read"/>
-    <property name="Progress" type="a{sv}" access="read"/>
-    <property name="Results" type="a{sv}" access="read"/>
-    <property name="Origin" type="s" access="read">
-      <tp:docstring>
-        Specifies the origin of the command. This is a string containing
-        "cloud" or "local" indicating the method of delivery of the command.
-      </tp:docstring>
-    </property>
-  </interface>
-</node>
diff --git a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml b/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml
deleted file mode 100644
index 56370fa..0000000
--- a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml
+++ /dev/null
@@ -1,219 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<node name="/org/chromium/Buffet/Manager"
-      xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
-  <interface name="org.chromium.Buffet.Manager">
-    <tp:docstring>
-      The Manager is responsible for global state of Buffet.  It exposes
-      interfaces which affect the entire device such as device registration and
-      device state.
-    </tp:docstring>
-    <method name="CheckDeviceRegistered">
-      <arg name="device_id" type="s" direction="out"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
-    </method>
-    <method name="GetDeviceInfo">
-      <arg name="device_info" type="s" direction="out"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
-    </method>
-    <method name="RegisterDevice">
-      <arg name="ticket_id" type="s" direction="in"/>
-      <arg name="device_id" type="s" direction="out"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
-    </method>
-    <method name="UpdateDeviceInfo">
-      <arg name="name" type="s" direction="in"/>
-      <arg name="description" type="s" direction="in"/>
-      <arg name="location" type="s" direction="in"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="UpdateServiceConfig">
-      <arg name="client_id" type="s" direction="in"/>
-      <arg name="client_secret" type="s" direction="in"/>
-      <arg name="api_key" type="s" direction="in"/>
-      <arg name="oauth_url" type="s" direction="in"/>
-      <arg name="service_url" type="s" direction="in"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="UpdateState">
-      <arg name="property_set" type="a{sv}" direction="in"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
-    </method>
-    <method name="GetState">
-      <arg name="device_info" type="s" direction="out"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="AddCommand">
-      <arg name="json_command" type="s" direction="in"/>
-      <arg name="user_role" type="s" direction="in"/>
-      <arg name="id" type="s" direction="out"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
-    </method>
-    <method name="GetCommand">
-      <arg name="id" type="s" direction="in"/>
-      <arg name="json_command" type="s" direction="out"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
-    </method>
-    <method name="TestMethod">
-      <arg name="message" type="s" direction="in"/>
-      <arg name="echoed_message" type="s" direction="out"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="simple"/>
-    </method>
-    <method name="EnableWiFiBootstrapping">
-      <tp:docstring>
-        Enables WiFiBootstrapping if manual bootstrapping is selected via the
-        configuration file.  This will re-purpose a WiFi interface for use in
-        bootstrapping.  This breaks any existing WiFi connection on the
-        interface.
-      </tp:docstring>
-      <arg name="listener_path" type="o" direction="in">
-        <tp:docstring>
-          Path to an object exposed by the caller.  This object must support
-          the org.chromium.Buffet.WiFiBootstrapListener interface.
-        </tp:docstring>
-      </arg>
-      <arg name="options" type="a{sv}" direction="in"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="DisableWiFiBootstrapping">
-      <tp:docstring>
-        If a previous call to EnableWiFiBootstrapping was successful and
-        has not been cancelled or completed since, disables that bootstrapping
-        process.
-      </tp:docstring>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="EnableGCDBootstrapping">
-      <arg name="listener_path" type="o" direction="in"/>
-      <arg name="options" type="a{sv}" direction="in"/>
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-    <method name="DisableGCDBootstrapping">
-      <annotation name="org.chromium.DBus.Method.Kind" value="normal"/>
-    </method>
-
-    <property name="Status" type="s" access="read">
-      <tp:docstring>
-        State of Buffet's cloud registration.
-        Possible values include:
-          "unconfigured": Buffet has no credentials, either from an out of box
-                          state, or because device was unregistered.
-
-          "connecting": Buffet is registered and attempting to connect to the
-                        cloud.
-
-          "connected": Buffet is online and connected to the cloud. Note that
-                       only this state requires internet connectivity.
-
-          "invalid_credentials": Buffet has credentials, but they are no longer
-                                 valid.
-      </tp:docstring>
-    </property>
-    <property name="DeviceId" type="s" access="read">
-      <tp:docstring>
-        GCD ID if the device is registered or empty otherwise.
-      </tp:docstring>
-    </property>
-    <property name="State" type="s" access="read">
-      <tp:docstring>
-        JSON with state of the devices.
-      </tp:docstring>
-    </property>
-    <property name="OemName" type="s" access="read">
-      <tp:docstring>
-        Name of the device maker.
-      </tp:docstring>
-    </property>
-    <property name="ModelName" type="s" access="read">
-      <tp:docstring>
-        Name of the device model.
-      </tp:docstring>
-    </property>
-    <property name="ModelId" type="s" access="read">
-      <tp:docstring>
-        Five character code assigned by the cloud registry of device models.
-      </tp:docstring>
-    </property>
-    <property name="Name" type="s" access="read">
-      <tp:docstring>
-        Human readable name of the device. Must not be empty.
-      </tp:docstring>
-    </property>
-    <property name="Description" type="s" access="read">
-      <tp:docstring>
-        Human readable description of the device.
-      </tp:docstring>
-    </property>
-    <property name="Location" type="s" access="read">
-      <tp:docstring>
-        Location of the device.
-      </tp:docstring>
-    </property>
-    <property name="AnonymousAccessRole" type="s" access="read">
-      <tp:docstring>
-        Max role granted to anonymous user when accessing device over the local
-        network.
-        Possible values include:
-          "none": Device does not allow local access by unauthenticated users.
-
-          "viewer": Device allows everyone authenticated to access device.
-
-          "user": Device allows everyone authenticated as 'user' to access
-                  device.
-
-          "owner": Device allows everyone authenticated as 'owner' to access
-                  device.
-      </tp:docstring>
-    </property>
-    <property name="WiFiBootstrapState" type="s" access="read">
-      <tp:docstring>
-        Contains one of the following values describing the state of WiFi
-        bootstrapping:
-          “disabled” - Bootstrapping has been disabled in the config file.
-          “waiting” - buffet is waiting to receive WiFi credentials from
-                      a paired peer.
-          “connecting” - buffet has received WiFi credentials, and is now
-                         attempting to connect to a WiFi network.
-          “monitoring” - buffet is monitoring our connectivity and will
-                         re-enable bootstrapping if connectivity fails in
-                         automatic mode.
-
-       Note: more values may be added later to this list.
-      </tp:docstring>
-    </property>
-    <property name="GCDBootstrapState" type="s" access="read">
-      <tp:docstring>
-        Contains one of the following values describing the state of GCD
-        bootstrapping:
-          “disabled” - GCD registration has been disabled in the config file.
-          “offline” - GCD registration is unknown because the device is offline.
-          “connecting” - GCD registration is unknown because the device is still
-                         connecting to the cloud.
-          “waiting” - Waiting to be configured with GCD credentials.
-          “registering” - Registering the device with the GCD servers.
-          “online” - Device is online and registered with GCD servers.
-
-        Note: more values may be added later to this list.
-
-        Clients that wish to present a single linear bootstrapping flow to users
-        may treat GCD bootstrapping states as a suffix to WiFi bootstrapping
-        states.  If we have no cloud connectivity, we cannot possibly do GCD
-        registration/credential verification.
-      </tp:docstring>
-    </property>
-    <property name="PairingInfo" type="a{sv}" access="read">
-      <tp:docstring>
-        Describes the state of device pairing. While no pairing attempt is in
-        progress, this dictionary will be empty. When a client initiates a
-        pairing transaction via /privet/v3/pairing/start, dictionary will
-        contain the following keys:
-          “sessionId” - ID of the pairing session; generated by device
-          “pairingMode” - Selected type of pairing from /privet/v3/pairing/start
-                          (e.g. “pinCode” or “embeddedCode”)
-          “code” - The pin code or embedded code as appropriate to the
-                   “pairingMode” value.  See design document.
-                   This value will be a string.
-      </tp:docstring>
-    </property>
-  </interface>
-</node>
diff --git a/buffet/dbus_command_dispatcher.cc b/buffet/dbus_command_dispatcher.cc
deleted file mode 100644
index 1af0983..0000000
--- a/buffet/dbus_command_dispatcher.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/dbus_command_dispatcher.h"
-
-#include <chromeos/dbus/exported_object_manager.h>
-#include <weave/command.h>
-
-#include "buffet/dbus_command_proxy.h"
-#include "buffet/dbus_constants.h"
-
-using chromeos::dbus_utils::AsyncEventSequencer;
-using chromeos::dbus_utils::ExportedObjectManager;
-
-namespace buffet {
-
-DBusCommandDispacher::DBusCommandDispacher(
-    const base::WeakPtr<ExportedObjectManager>& object_manager,
-    weave::Commands* command_manager)
-    : object_manager_{object_manager} {
-  command_manager->AddOnCommandAddedCallback(base::Bind(
-      &DBusCommandDispacher::OnCommandAdded, weak_ptr_factory_.GetWeakPtr()));
-}
-
-void DBusCommandDispacher::OnCommandAdded(weave::Command* command) {
-  if (!object_manager_)
-    return;
-  std::unique_ptr<DBusCommandProxy> proxy{new DBusCommandProxy(
-      object_manager_.get(), object_manager_->GetBus(), command,
-      buffet::kCommandServicePathPrefix + std::to_string(++next_id_))};
-  proxy->RegisterAsync(AsyncEventSequencer::GetDefaultCompletionAction());
-  // DBusCommandProxy::DBusCommandProxy() subscribe itself to weave::Command
-  // notifications. When weave::Command is being destroyed it sends
-  // ::OnCommandDestroyed() and DBusCommandProxy deletes itself.
-  proxy.release();
-}
-
-}  // namespace buffet
diff --git a/buffet/dbus_command_dispatcher.h b/buffet/dbus_command_dispatcher.h
deleted file mode 100644
index fa17ad6..0000000
--- a/buffet/dbus_command_dispatcher.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_DBUS_COMMAND_DISPATCHER_H_
-#define BUFFET_DBUS_COMMAND_DISPATCHER_H_
-
-#include <map>
-#include <string>
-
-#include <base/macros.h>
-#include <base/memory/weak_ptr.h>
-#include <weave/commands.h>
-
-namespace chromeos {
-namespace dbus_utils {
-class ExportedObjectManager;
-}  // namespace dbus_utils
-}  // namespace chromeos
-
-namespace buffet {
-
-// Implements D-Bus dispatch of commands. When OnCommandAdded is called,
-// DBusCommandDispacher creates an instance of DBusCommandProxy object and
-// advertises it through ExportedObjectManager on D-Bus. Command handling
-// processes can watch the new D-Bus object appear and communicate with it to
-// update the command handling progress. Once command is handled,
-// DBusCommandProxy::Done() is called and the command is removed from the
-// command queue and D-Bus ExportedObjectManager.
-class DBusCommandDispacher final {
- public:
-  explicit DBusCommandDispacher(
-      const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>&
-          object_manager,
-      weave::Commands* command_manager);
-
- private:
-  void OnCommandAdded(weave::Command* command);
-
-  base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager> object_manager_;
-  int next_id_{0};
-
-  // Default constructor is used in special circumstances such as for testing.
-  DBusCommandDispacher() = default;
-
-  base::WeakPtrFactory<DBusCommandDispacher> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(DBusCommandDispacher);
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_DBUS_COMMAND_DISPATCHER_H_
diff --git a/buffet/dbus_command_proxy.cc b/buffet/dbus_command_proxy.cc
deleted file mode 100644
index 064c801..0000000
--- a/buffet/dbus_command_proxy.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/dbus_command_proxy.h"
-
-#include <chromeos/dbus/async_event_sequencer.h>
-#include <chromeos/dbus/exported_object_manager.h>
-#include <weave/enum_to_string.h>
-
-#include "buffet/dbus_conversion.h"
-
-using chromeos::dbus_utils::AsyncEventSequencer;
-using chromeos::dbus_utils::ExportedObjectManager;
-
-namespace buffet {
-
-DBusCommandProxy::DBusCommandProxy(ExportedObjectManager* object_manager,
-                                   const scoped_refptr<dbus::Bus>& bus,
-                                   weave::Command* command,
-                                   std::string object_path)
-    : command_{command},
-      dbus_object_{object_manager, bus, dbus::ObjectPath{object_path}} {
-  observer_.Add(command);
-}
-
-void DBusCommandProxy::RegisterAsync(
-    const AsyncEventSequencer::CompletionAction& completion_callback) {
-  dbus_adaptor_.RegisterWithDBusObject(&dbus_object_);
-
-  // Set the initial property values before registering the DBus object.
-  dbus_adaptor_.SetName(command_->GetName());
-  dbus_adaptor_.SetCategory(command_->GetCategory());
-  dbus_adaptor_.SetId(command_->GetID());
-  dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus()));
-  dbus_adaptor_.SetProgress(
-      DictionaryToDBusVariantDictionary(*command_->GetProgress()));
-  dbus_adaptor_.SetOrigin(EnumToString(command_->GetOrigin()));
-  dbus_adaptor_.SetParameters(
-      DictionaryToDBusVariantDictionary(*command_->GetParameters()));
-  dbus_adaptor_.SetResults(
-      DictionaryToDBusVariantDictionary(*command_->GetResults()));
-
-  // Register the command DBus object and expose its methods and properties.
-  dbus_object_.RegisterAsync(completion_callback);
-}
-
-void DBusCommandProxy::OnResultsChanged() {
-  dbus_adaptor_.SetResults(
-      DictionaryToDBusVariantDictionary(*command_->GetResults()));
-}
-
-void DBusCommandProxy::OnStatusChanged() {
-  dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus()));
-}
-
-void DBusCommandProxy::OnProgressChanged() {
-  dbus_adaptor_.SetProgress(
-      DictionaryToDBusVariantDictionary(*command_->GetProgress()));
-}
-
-void DBusCommandProxy::OnCommandDestroyed() {
-  delete this;
-}
-
-bool DBusCommandProxy::SetProgress(
-    chromeos::ErrorPtr* error,
-    const chromeos::VariantDictionary& progress) {
-  LOG(INFO) << "Received call to Command<" << command_->GetName()
-            << ">::SetProgress()";
-  auto dictionary = DictionaryFromDBusVariantDictionary(progress, error);
-  if (!dictionary)
-    return false;
-  return command_->SetProgress(*dictionary, error);
-}
-
-bool DBusCommandProxy::SetResults(chromeos::ErrorPtr* error,
-                                  const chromeos::VariantDictionary& results) {
-  LOG(INFO) << "Received call to Command<" << command_->GetName()
-            << ">::SetResults()";
-  auto dictionary = DictionaryFromDBusVariantDictionary(results, error);
-  if (!dictionary)
-    return false;
-  return command_->SetResults(*dictionary, error);
-}
-
-void DBusCommandProxy::Abort() {
-  LOG(INFO) << "Received call to Command<" << command_->GetName()
-            << ">::Abort()";
-  command_->Abort();
-}
-
-void DBusCommandProxy::Cancel() {
-  LOG(INFO) << "Received call to Command<" << command_->GetName()
-            << ">::Cancel()";
-  command_->Cancel();
-}
-
-void DBusCommandProxy::Done() {
-  LOG(INFO) << "Received call to Command<" << command_->GetName()
-            << ">::Done()";
-  command_->Done();
-}
-
-}  // namespace buffet
diff --git a/buffet/dbus_command_proxy.h b/buffet/dbus_command_proxy.h
deleted file mode 100644
index c13ee0a..0000000
--- a/buffet/dbus_command_proxy.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_DBUS_COMMAND_PROXY_H_
-#define BUFFET_DBUS_COMMAND_PROXY_H_
-
-#include <string>
-
-#include <base/macros.h>
-#include <base/scoped_observer.h>
-#include <chromeos/dbus/data_serialization.h>
-#include <chromeos/dbus/dbus_object.h>
-#include <weave/command.h>
-
-#include "buffet/org.chromium.Buffet.Command.h"
-
-namespace chromeos {
-namespace dbus_utils {
-class ExportedObjectManager;
-}  // namespace dbus_utils
-}  // namespace chromeos
-
-namespace buffet {
-
-class DBusCommandProxy : public weave::Command::Observer,
-                         public org::chromium::Buffet::CommandInterface {
- public:
-  DBusCommandProxy(chromeos::dbus_utils::ExportedObjectManager* object_manager,
-                   const scoped_refptr<dbus::Bus>& bus,
-                   weave::Command* command,
-                   std::string object_path);
-  ~DBusCommandProxy() override = default;
-
-  void RegisterAsync(
-      const chromeos::dbus_utils::AsyncEventSequencer::CompletionAction&
-          completion_callback);
-
-  // CommandProxyInterface implementation/overloads.
-  void OnResultsChanged() override;
-  void OnStatusChanged() override;
-  void OnProgressChanged() override;
-  void OnCommandDestroyed() override;
-
- private:
-  // Handles calls to org.chromium.Buffet.Command.SetProgress(progress).
-  bool SetProgress(chromeos::ErrorPtr* error,
-                   const chromeos::VariantDictionary& progress) override;
-  // Handles calls to org.chromium.Buffet.Command.SetResults(results).
-  bool SetResults(chromeos::ErrorPtr* error,
-                  const chromeos::VariantDictionary& results) override;
-  // Handles calls to org.chromium.Buffet.Command.Abort().
-  void Abort() override;
-  // Handles calls to org.chromium.Buffet.Command.Cancel().
-  void Cancel() override;
-  // Handles calls to org.chromium.Buffet.Command.Done().
-  void Done() override;
-
-  weave::Command* command_;
-  org::chromium::Buffet::CommandAdaptor dbus_adaptor_{this};
-  chromeos::dbus_utils::DBusObject dbus_object_;
-
-  ScopedObserver<weave::Command, weave::Command::Observer> observer_{this};
-
-  friend class DBusCommandProxyTest;
-  friend class DBusCommandDispacherTest;
-  DISALLOW_COPY_AND_ASSIGN(DBusCommandProxy);
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_DBUS_COMMAND_PROXY_H_
diff --git a/buffet/dbus_command_proxy_unittest.cc b/buffet/dbus_command_proxy_unittest.cc
deleted file mode 100644
index 18dd8e0..0000000
--- a/buffet/dbus_command_proxy_unittest.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/dbus_command_proxy.h"
-
-#include <functional>
-#include <memory>
-#include <vector>
-
-#include <dbus/mock_bus.h>
-#include <dbus/mock_exported_object.h>
-#include <dbus/property.h>
-#include <chromeos/dbus/dbus_object.h>
-#include <chromeos/dbus/dbus_object_test_helpers.h>
-#include <gtest/gtest.h>
-#include <weave/command.h>
-#include <weave/enum_to_string.h>
-#include <weave/mock_command.h>
-#include <weave/mock_commands.h>
-#include <weave/unittest_utils.h>
-
-#include "buffet/dbus_constants.h"
-
-namespace buffet {
-
-using ::testing::AnyNumber;
-using ::testing::Return;
-using ::testing::ReturnRefOfCopy;
-using ::testing::_;
-
-using chromeos::VariantDictionary;
-using chromeos::dbus_utils::AsyncEventSequencer;
-using weave::unittests::CreateDictionaryValue;
-using weave::unittests::IsEqualValue;
-
-namespace {
-
-const char kTestCommandCategoty[] = "test_command_category";
-const char kTestCommandId[] = "cmd_1";
-
-MATCHER_P(EqualToJson, json, "") {
-  auto json_value = CreateDictionaryValue(json);
-  return IsEqualValue(*json_value, arg);
-}
-
-}  // namespace
-
-class DBusCommandProxyTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    // Set up a mock DBus bus object.
-    dbus::Bus::Options options;
-    options.bus_type = dbus::Bus::SYSTEM;
-    bus_ = new dbus::MockBus(options);
-    // By default, don't worry about threading assertions.
-    EXPECT_CALL(*bus_, AssertOnOriginThread()).Times(AnyNumber());
-    EXPECT_CALL(*bus_, AssertOnDBusThread()).Times(AnyNumber());
-
-    EXPECT_CALL(command_, GetID())
-        .WillOnce(ReturnRefOfCopy<std::string>(kTestCommandId));
-    // Use WillRepeatedly becase GetName is used for logging.
-    EXPECT_CALL(command_, GetName())
-        .WillRepeatedly(ReturnRefOfCopy<std::string>("robot.jump"));
-    EXPECT_CALL(command_, GetCategory())
-        .WillOnce(ReturnRefOfCopy<std::string>(kTestCommandCategoty));
-    EXPECT_CALL(command_, GetStatus())
-        .WillOnce(Return(weave::CommandStatus::kQueued));
-    EXPECT_CALL(command_, GetOrigin())
-        .WillOnce(Return(weave::CommandOrigin::kLocal));
-    EXPECT_CALL(command_, MockGetParameters())
-        .WillOnce(ReturnRefOfCopy<std::string>(R"({
-          'height': 53,
-          '_jumpType': '_withKick'
-        })"));
-    EXPECT_CALL(command_, MockGetProgress())
-        .WillOnce(ReturnRefOfCopy<std::string>("{}"));
-    EXPECT_CALL(command_, MockGetResults())
-        .WillOnce(ReturnRefOfCopy<std::string>("{}"));
-
-    // Set up a mock ExportedObject to be used with the DBus command proxy.
-    std::string cmd_path = buffet::kCommandServicePathPrefix;
-    cmd_path += kTestCommandId;
-    const dbus::ObjectPath kCmdObjPath(cmd_path);
-    // Use a mock exported object for the exported object manager.
-    mock_exported_object_command_ =
-        new dbus::MockExportedObject(bus_.get(), kCmdObjPath);
-    EXPECT_CALL(*bus_, GetExportedObject(kCmdObjPath))
-        .Times(AnyNumber())
-        .WillRepeatedly(Return(mock_exported_object_command_.get()));
-    EXPECT_CALL(*mock_exported_object_command_, ExportMethod(_, _, _, _))
-        .Times(AnyNumber());
-
-    proxy_.reset(new DBusCommandProxy(nullptr, bus_, &command_, cmd_path));
-    GetCommandProxy()->RegisterAsync(
-        AsyncEventSequencer::GetDefaultCompletionAction());
-  }
-
-  void TearDown() override {
-    EXPECT_CALL(*mock_exported_object_command_, Unregister()).Times(1);
-    bus_ = nullptr;
-  }
-
-  DBusCommandProxy* GetCommandProxy() const { return proxy_.get(); }
-
-  org::chromium::Buffet::CommandAdaptor* GetCommandAdaptor() const {
-    return &GetCommandProxy()->dbus_adaptor_;
-  }
-
-  org::chromium::Buffet::CommandInterface* GetCommandInterface() const {
-    // DBusCommandProxy also implements CommandInterface.
-    return GetCommandProxy();
-  }
-
-  weave::CommandStatus GetCommandStatus() const {
-    weave::CommandStatus status;
-    EXPECT_TRUE(StringToEnum(GetCommandAdaptor()->GetStatus(), &status));
-    return status;
-  }
-
-  scoped_refptr<dbus::MockExportedObject> mock_exported_object_command_;
-  scoped_refptr<dbus::MockBus> bus_;
-
-  weave::unittests::MockCommand command_;
-  std::unique_ptr<DBusCommandProxy> proxy_;
-};
-
-TEST_F(DBusCommandProxyTest, Init) {
-  VariantDictionary params = {
-      {"height", int32_t{53}}, {"_jumpType", std::string{"_withKick"}},
-  };
-  EXPECT_EQ(weave::CommandStatus::kQueued, GetCommandStatus());
-  EXPECT_EQ(params, GetCommandAdaptor()->GetParameters());
-  EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetProgress());
-  EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetResults());
-  EXPECT_EQ("robot.jump", GetCommandAdaptor()->GetName());
-  EXPECT_EQ(kTestCommandCategoty, GetCommandAdaptor()->GetCategory());
-  EXPECT_EQ(kTestCommandId, GetCommandAdaptor()->GetId());
-}
-
-TEST_F(DBusCommandProxyTest, OnProgressChanged) {
-  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
-  EXPECT_CALL(command_, MockGetProgress())
-      .WillOnce(ReturnRefOfCopy<std::string>("{'progress': 10}"));
-  proxy_->OnProgressChanged();
-  EXPECT_EQ((VariantDictionary{{"progress", int32_t{10}}}),
-            GetCommandAdaptor()->GetProgress());
-}
-
-TEST_F(DBusCommandProxyTest, OnResultsChanged) {
-  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
-  EXPECT_CALL(command_, MockGetResults())
-      .WillOnce(ReturnRefOfCopy<std::string>(
-          "{'foo': 42, 'bar': 'foobar', 'resultList': [1, 2, 3]}"));
-  proxy_->OnResultsChanged();
-
-  EXPECT_EQ((VariantDictionary{{"foo", int32_t{42}},
-                               {"bar", std::string{"foobar"}},
-                               {"resultList", std::vector<int>{1, 2, 3}}}),
-            GetCommandAdaptor()->GetResults());
-}
-
-TEST_F(DBusCommandProxyTest, OnStatusChanged) {
-  EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
-  EXPECT_CALL(command_, GetStatus())
-      .WillOnce(Return(weave::CommandStatus::kInProgress));
-  proxy_->OnStatusChanged();
-  EXPECT_EQ(weave::CommandStatus::kInProgress, GetCommandStatus());
-}
-
-TEST_F(DBusCommandProxyTest, SetProgress) {
-  EXPECT_CALL(command_, SetProgress(EqualToJson("{'progress': 10}"), _))
-      .WillOnce(Return(true));
-  EXPECT_TRUE(
-      GetCommandInterface()->SetProgress(nullptr, {{"progress", int32_t{10}}}));
-}
-
-TEST_F(DBusCommandProxyTest, SetResults) {
-  EXPECT_CALL(
-      command_,
-      SetResults(
-          EqualToJson("{'foo': 42, 'bar': 'foobar', 'resultList': [1, 2, 3]}"),
-          _))
-      .WillOnce(Return(true));
-  EXPECT_TRUE(GetCommandInterface()->SetResults(
-      nullptr, VariantDictionary{{"foo", int32_t{42}},
-                                 {"bar", std::string{"foobar"}},
-                                 {"resultList", std::vector<int>{1, 2, 3}}}));
-}
-
-TEST_F(DBusCommandProxyTest, Abort) {
-  EXPECT_CALL(command_, Abort());
-  GetCommandInterface()->Abort();
-}
-
-TEST_F(DBusCommandProxyTest, Cancel) {
-  EXPECT_CALL(command_, Cancel());
-  GetCommandInterface()->Cancel();
-}
-
-TEST_F(DBusCommandProxyTest, Done) {
-  EXPECT_CALL(command_, Done());
-  GetCommandInterface()->Done();
-}
-
-}  // namespace buffet
diff --git a/buffet/dbus_constants.cc b/buffet/dbus_constants.cc
deleted file mode 100644
index 6ab587a..0000000
--- a/buffet/dbus_constants.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/dbus_constants.h"
-
-namespace buffet {
-
-const char kServiceName[] = "org.chromium.Buffet";
-const char kRootServicePath[] = "/org/chromium/Buffet";
-const char kCommandServicePathPrefix[] = "/org/chromium/Buffet/commands/";
-
-}  // namespace buffet
diff --git a/buffet/dbus_constants.h b/buffet/dbus_constants.h
deleted file mode 100644
index 0bb72dc..0000000
--- a/buffet/dbus_constants.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_DBUS_CONSTANTS_H_
-#define BUFFET_DBUS_CONSTANTS_H_
-
-namespace buffet {
-
-// The service name claimed by the Buffet daemon.
-extern const char kServiceName[];
-
-// The object at this path implements the ObjectManager interface.
-extern const char kRootServicePath[];
-
-// D-Bus object path prefix for Command objects.
-extern const char kCommandServicePathPrefix[];
-
-}  // namespace buffet
-
-#endif  // BUFFET_DBUS_CONSTANTS_H_
diff --git a/buffet/dbus_conversion.cc b/buffet/dbus_conversion.cc
deleted file mode 100644
index 51d35f1..0000000
--- a/buffet/dbus_conversion.cc
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2015 The Chromium OS 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 "buffet/dbus_conversion.h"
-
-#include <set>
-#include <string>
-#include <vector>
-
-#include <chromeos/type_name_undecorate.h>
-
-namespace buffet {
-
-namespace {
-
-// Helpers for JsonToAny().
-template <typename T>
-chromeos::Any ValueToAny(const base::Value& json,
-                         bool (base::Value::*fnc)(T*) const) {
-  T val;
-  CHECK((json.*fnc)(&val));
-  return val;
-}
-
-chromeos::Any ValueToAny(const base::Value& json);
-
-template <typename T>
-chromeos::Any ListToAny(const base::ListValue& list,
-                        bool (base::Value::*fnc)(T*) const) {
-  std::vector<T> result;
-  result.reserve(list.GetSize());
-  for (const base::Value* v : list) {
-    T val;
-    CHECK((v->*fnc)(&val));
-    result.push_back(val);
-  }
-  return result;
-}
-
-chromeos::Any DictListToAny(const base::ListValue& list) {
-  std::vector<chromeos::VariantDictionary> result;
-  result.reserve(list.GetSize());
-  for (const base::Value* v : list) {
-    const base::DictionaryValue* dict = nullptr;
-    CHECK(v->GetAsDictionary(&dict));
-    result.push_back(DictionaryToDBusVariantDictionary(*dict));
-  }
-  return result;
-}
-
-chromeos::Any ListListToAny(const base::ListValue& list) {
-  std::vector<chromeos::Any> result;
-  result.reserve(list.GetSize());
-  for (const base::Value* v : list)
-    result.push_back(ValueToAny(*v));
-  return result;
-}
-
-// Converts a JSON value into an Any so it can be sent over D-Bus using
-// UpdateState D-Bus method from Buffet.
-chromeos::Any ValueToAny(const base::Value& json) {
-  chromeos::Any prop_value;
-  switch (json.GetType()) {
-    case base::Value::TYPE_BOOLEAN:
-      prop_value = ValueToAny<bool>(json, &base::Value::GetAsBoolean);
-      break;
-    case base::Value::TYPE_INTEGER:
-      prop_value = ValueToAny<int>(json, &base::Value::GetAsInteger);
-      break;
-    case base::Value::TYPE_DOUBLE:
-      prop_value = ValueToAny<double>(json, &base::Value::GetAsDouble);
-      break;
-    case base::Value::TYPE_STRING:
-      prop_value = ValueToAny<std::string>(json, &base::Value::GetAsString);
-      break;
-    case base::Value::TYPE_DICTIONARY: {
-      const base::DictionaryValue* dict = nullptr;
-      CHECK(json.GetAsDictionary(&dict));
-      prop_value = DictionaryToDBusVariantDictionary(*dict);
-      break;
-    }
-    case base::Value::TYPE_LIST: {
-      const base::ListValue* list = nullptr;
-      CHECK(json.GetAsList(&list));
-      if (list->empty()) {
-        // We don't know type of objects this list intended for, so we just use
-        // vector<chromeos::Any>.
-        prop_value = ListListToAny(*list);
-        break;
-      }
-      auto type = (*list->begin())->GetType();
-      for (const base::Value* v : *list)
-        CHECK_EQ(v->GetType(), type) << "Unsupported different type elements";
-
-      switch (type) {
-        case base::Value::TYPE_BOOLEAN:
-          prop_value = ListToAny<bool>(*list, &base::Value::GetAsBoolean);
-          break;
-        case base::Value::TYPE_INTEGER:
-          prop_value = ListToAny<int>(*list, &base::Value::GetAsInteger);
-          break;
-        case base::Value::TYPE_DOUBLE:
-          prop_value = ListToAny<double>(*list, &base::Value::GetAsDouble);
-          break;
-        case base::Value::TYPE_STRING:
-          prop_value = ListToAny<std::string>(*list, &base::Value::GetAsString);
-          break;
-        case base::Value::TYPE_DICTIONARY:
-          prop_value = DictListToAny(*list);
-          break;
-        case base::Value::TYPE_LIST:
-          // We can't support Any{vector<vector<>>} as the type is only known
-          // in runtime when we need to instantiate templates in compile time.
-          // We can use Any{vector<Any>} instead.
-          prop_value = ListListToAny(*list);
-          break;
-        default:
-          LOG(FATAL) << "Unsupported JSON value type for list element: "
-                     << (*list->begin())->GetType();
-      }
-      break;
-    }
-    default:
-      LOG(FATAL) << "Unexpected JSON value type: " << json.GetType();
-      break;
-  }
-  return prop_value;
-}
-
-template <typename T>
-std::unique_ptr<base::Value> CreateValue(const T& value,
-                                         chromeos::ErrorPtr* error) {
-  return std::unique_ptr<base::Value>{new base::FundamentalValue{value}};
-}
-
-template <>
-std::unique_ptr<base::Value> CreateValue<std::string>(
-    const std::string& value,
-    chromeos::ErrorPtr* error) {
-  return std::unique_ptr<base::Value>{new base::StringValue{value}};
-}
-
-template <>
-std::unique_ptr<base::Value> CreateValue<chromeos::VariantDictionary>(
-    const chromeos::VariantDictionary& value,
-    chromeos::ErrorPtr* error) {
-  return DictionaryFromDBusVariantDictionary(value, error);
-}
-
-template <typename T>
-std::unique_ptr<base::ListValue> CreateListValue(const std::vector<T>& value,
-                                                 chromeos::ErrorPtr* error) {
-  std::unique_ptr<base::ListValue> list{new base::ListValue};
-
-  for (const T& i : value) {
-    auto item = CreateValue(i, error);
-    if (!item)
-      return nullptr;
-    list->Append(item.release());
-  }
-
-  return list;
-}
-
-// Returns false only in case of error. True can be returned if type is not
-// matched.
-template <typename T>
-bool TryCreateValue(const chromeos::Any& any,
-                    std::unique_ptr<base::Value>* value,
-                    chromeos::ErrorPtr* error) {
-  if (any.IsTypeCompatible<T>()) {
-    *value = CreateValue(any.Get<T>(), error);
-    return *value != nullptr;
-  }
-
-  if (any.IsTypeCompatible<std::vector<T>>()) {
-    *value = CreateListValue(any.Get<std::vector<T>>(), error);
-    return *value != nullptr;
-  }
-
-  return true;  // Not an error, we will try different type.
-}
-
-template <>
-std::unique_ptr<base::Value> CreateValue<chromeos::Any>(
-    const chromeos::Any& any,
-    chromeos::ErrorPtr* error) {
-  std::unique_ptr<base::Value> result;
-  if (!TryCreateValue<bool>(any, &result, error) || result)
-    return result;
-
-  if (!TryCreateValue<int>(any, &result, error) || result)
-    return result;
-
-  if (!TryCreateValue<double>(any, &result, error) || result)
-    return result;
-
-  if (!TryCreateValue<std::string>(any, &result, error) || result)
-    return result;
-
-  if (!TryCreateValue<chromeos::VariantDictionary>(any, &result, error) ||
-      result) {
-    return result;
-  }
-
-  // This will collapse Any{Any{T}} and vector{Any{T}}.
-  if (!TryCreateValue<chromeos::Any>(any, &result, error) || result)
-    return result;
-
-  chromeos::Error::AddToPrintf(
-      error, FROM_HERE, "buffet", "unknown_type", "Type '%s' is not supported.",
-      chromeos::UndecorateTypeName(any.GetType().name()).c_str());
-
-  return nullptr;
-}
-
-}  // namespace
-
-// TODO(vitalybuka): Use in buffet_client.
-chromeos::VariantDictionary DictionaryToDBusVariantDictionary(
-    const base::DictionaryValue& object) {
-  chromeos::VariantDictionary result;
-
-  for (base::DictionaryValue::Iterator it(object); !it.IsAtEnd(); it.Advance())
-    result.emplace(it.key(), ValueToAny(it.value()));
-
-  return result;
-}
-
-std::unique_ptr<base::DictionaryValue> DictionaryFromDBusVariantDictionary(
-    const chromeos::VariantDictionary& object,
-    chromeos::ErrorPtr* error) {
-  std::unique_ptr<base::DictionaryValue> result{new base::DictionaryValue};
-
-  for (const auto& pair : object) {
-    auto value = CreateValue(pair.second, error);
-    if (!value)
-      return nullptr;
-    result->SetWithoutPathExpansion(pair.first, value.release());
-  }
-
-  return result;
-}
-
-}  // namespace buffet
diff --git a/buffet/dbus_conversion.h b/buffet/dbus_conversion.h
deleted file mode 100644
index 20c3f58..0000000
--- a/buffet/dbus_conversion.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_DBUS_CONVERSION_H_
-#define BUFFET_DBUS_CONVERSION_H_
-
-#include <base/values.h>
-#include <chromeos/any.h>
-#include <chromeos/errors/error.h>
-#include <chromeos/variant_dictionary.h>
-
-namespace buffet {
-
-// Converts DictionaryValue to D-Bus variant dictionary.
-chromeos::VariantDictionary DictionaryToDBusVariantDictionary(
-    const base::DictionaryValue& object);
-
-// Converts D-Bus variant dictionary to DictionaryValue.
-std::unique_ptr<base::DictionaryValue> DictionaryFromDBusVariantDictionary(
-    const chromeos::VariantDictionary& object,
-    chromeos::ErrorPtr* error);
-
-}  // namespace buffet
-
-#endif  // BUFFET_DBUS_CONVERSION_H_
diff --git a/buffet/dbus_conversion_unittest.cc b/buffet/dbus_conversion_unittest.cc
deleted file mode 100644
index 0d94576..0000000
--- a/buffet/dbus_conversion_unittest.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2015 The Chromium OS 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 "buffet/dbus_conversion.h"
-
-#include <limits>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <base/guid.h>
-#include <base/rand_util.h>
-#include <base/values.h>
-#include <chromeos/variant_dictionary.h>
-#include <gtest/gtest.h>
-#include <weave/unittest_utils.h>
-
-namespace buffet {
-
-namespace {
-
-using chromeos::Any;
-using chromeos::VariantDictionary;
-using weave::unittests::CreateDictionaryValue;
-using weave::unittests::IsEqualValue;
-
-chromeos::VariantDictionary ToDBus(const base::DictionaryValue& object) {
-  return DictionaryToDBusVariantDictionary(object);
-}
-
-std::unique_ptr<base::DictionaryValue> FromDBus(
-    const chromeos::VariantDictionary& object) {
-  chromeos::ErrorPtr error;
-  auto result = DictionaryFromDBusVariantDictionary(object, &error);
-  EXPECT_TRUE(result || error);
-  return result;
-}
-
-std::unique_ptr<base::Value> CreateRandomValue(int children);
-std::unique_ptr<base::Value> CreateRandomValue(int children,
-                                               base::Value::Type type);
-
-const base::Value::Type kRandomTypes[] = {
-    base::Value::TYPE_BOOLEAN,    base::Value::TYPE_INTEGER,
-    base::Value::TYPE_DOUBLE,     base::Value::TYPE_STRING,
-    base::Value::TYPE_DICTIONARY, base::Value::TYPE_LIST,
-};
-
-const base::Value::Type kRandomTypesWithChildren[] = {
-    base::Value::TYPE_DICTIONARY, base::Value::TYPE_LIST,
-};
-
-base::Value::Type CreateRandomValueType(bool with_children) {
-  if (with_children) {
-    return kRandomTypesWithChildren[base::RandInt(
-        0, arraysize(kRandomTypesWithChildren) - 1)];
-  }
-  return kRandomTypes[base::RandInt(0, arraysize(kRandomTypes) - 1)];
-}
-
-std::unique_ptr<base::DictionaryValue> CreateRandomDictionary(int children) {
-  std::unique_ptr<base::DictionaryValue> result{new base::DictionaryValue};
-
-  while (children > 0) {
-    int sub_children = base::RandInt(1, children);
-    children -= sub_children;
-    result->Set(base::GenerateGUID(),
-                CreateRandomValue(sub_children).release());
-  }
-
-  return result;
-}
-
-std::unique_ptr<base::ListValue> CreateRandomList(int children) {
-  std::unique_ptr<base::ListValue> result{new base::ListValue};
-
-  base::Value::Type type = CreateRandomValueType(children > 0);
-  while (children > 0) {
-    size_t max_children =
-        (type != base::Value::TYPE_DICTIONARY && type != base::Value::TYPE_LIST)
-            ? 1
-            : children;
-    size_t sub_children = base::RandInt(1, max_children);
-    children -= sub_children;
-    result->Append(CreateRandomValue(sub_children, type).release());
-  }
-
-  return result;
-}
-
-std::unique_ptr<base::Value> CreateRandomValue(int children,
-                                               base::Value::Type type) {
-  CHECK_GE(children, 1);
-  switch (type) {
-    case base::Value::TYPE_INTEGER:
-      return std::unique_ptr<base::Value>{new base::FundamentalValue{
-          base::RandInt(std::numeric_limits<int>::min(),
-                        std::numeric_limits<int>::max())}};
-    case base::Value::TYPE_DOUBLE:
-      return std::unique_ptr<base::Value>{
-          new base::FundamentalValue{base::RandDouble()}};
-    case base::Value::TYPE_STRING:
-      return std::unique_ptr<base::Value>{
-          new base::StringValue{base::GenerateGUID()}};
-    case base::Value::TYPE_DICTIONARY:
-      CHECK_GE(children, 1);
-      return CreateRandomDictionary(children - 1);
-    case base::Value::TYPE_LIST:
-      CHECK_GE(children, 1);
-      return CreateRandomList(children - 1);
-    default:
-      return std::unique_ptr<base::Value>{
-          new base::FundamentalValue{base::RandInt(0, 1) != 0}};
-  }
-}
-
-std::unique_ptr<base::Value> CreateRandomValue(int children) {
-  return CreateRandomValue(children, CreateRandomValueType(children > 0));
-}
-
-}  // namespace
-
-TEST(DBusConversionTest, DictionaryToDBusVariantDictionary) {
-  EXPECT_EQ((VariantDictionary{{"bool", true}}),
-            ToDBus(*CreateDictionaryValue("{'bool': true}")));
-  EXPECT_EQ((VariantDictionary{{"int", 5}}),
-            ToDBus(*CreateDictionaryValue("{'int': 5}")));
-  EXPECT_EQ((VariantDictionary{{"double", 6.7}}),
-            ToDBus(*CreateDictionaryValue("{'double': 6.7}")));
-  EXPECT_EQ((VariantDictionary{{"string", std::string{"abc"}}}),
-            ToDBus(*CreateDictionaryValue("{'string': 'abc'}")));
-  EXPECT_EQ((VariantDictionary{{"object", VariantDictionary{{"bool", true}}}}),
-            ToDBus(*CreateDictionaryValue("{'object': {'bool': true}}")));
-  EXPECT_EQ((VariantDictionary{{"emptyList", std::vector<Any>{}}}),
-            ToDBus(*CreateDictionaryValue("{'emptyList': []}")));
-  EXPECT_EQ((VariantDictionary{{"intList", std::vector<int>{5}}}),
-            ToDBus(*CreateDictionaryValue("{'intList': [5]}")));
-  EXPECT_EQ((VariantDictionary{
-                {"intListList", std::vector<Any>{std::vector<int>{5},
-                                                 std::vector<int>{6, 7}}}}),
-            ToDBus(*CreateDictionaryValue("{'intListList': [[5], [6, 7]]}")));
-  EXPECT_EQ((VariantDictionary{{"objList",
-                                std::vector<VariantDictionary>{
-                                    {{"string", std::string{"abc"}}}}}}),
-            ToDBus(*CreateDictionaryValue("{'objList': [{'string': 'abc'}]}")));
-}
-
-TEST(DBusConversionTest, DictionaryFromDBusVariantDictionary) {
-  EXPECT_JSON_EQ("{'bool': true}", *FromDBus({{"bool", true}}));
-  EXPECT_JSON_EQ("{'int': 5}", *FromDBus({{"int", 5}}));
-  EXPECT_JSON_EQ("{'double': 6.7}", *FromDBus({{"double", 6.7}}));
-  EXPECT_JSON_EQ("{'string': 'abc'}",
-                 *FromDBus({{"string", std::string{"abc"}}}));
-  EXPECT_JSON_EQ("{'object': {'bool': true}}",
-                 *FromDBus({{"object", VariantDictionary{{"bool", true}}}}));
-  EXPECT_JSON_EQ("{'emptyList': []}",
-                 *FromDBus({{"emptyList", std::vector<bool>{}}}));
-  EXPECT_JSON_EQ("{'intList': [5]}",
-                 *FromDBus({{"intList", std::vector<int>{5}}}));
-  EXPECT_JSON_EQ(
-      "{'intListList': [[5], [6, 7]]}",
-      *FromDBus({{"intListList", std::vector<Any>{std::vector<int>{5},
-                                                  std::vector<int>{6, 7}}}}));
-  EXPECT_JSON_EQ(
-      "{'objList': [{'string': 'abc'}]}",
-      *FromDBus({{"objList", std::vector<VariantDictionary>{
-                                 {{"string", std::string{"abc"}}}}}}));
-  EXPECT_JSON_EQ("{'int': 5}", *FromDBus({{"int", Any{Any{5}}}}));
-}
-
-TEST(DBusConversionTest, DictionaryFromDBusVariantDictionary_Errors) {
-  EXPECT_FALSE(FromDBus({{"cString", "abc"}}));
-  EXPECT_FALSE(FromDBus({{"float", 1.0f}}));
-  EXPECT_FALSE(FromDBus({{"listList", std::vector<std::vector<int>>{}}}));
-  EXPECT_FALSE(FromDBus({{"any", Any{}}}));
-  EXPECT_FALSE(FromDBus({{"null", nullptr}}));
-}
-
-TEST(DBusConversionTest, DBusRandomDictionaryConversion) {
-  auto dict = CreateRandomDictionary(10000);
-  auto varian_dict = ToDBus(*dict);
-  auto dict_restored = FromDBus(varian_dict);
-  EXPECT_PRED2(IsEqualValue, *dict, *dict_restored);
-}
-
-}  // namespace buffet
diff --git a/buffet/etc/buffet/base_state.defaults.json b/buffet/etc/buffet/base_state.defaults.json
deleted file mode 100644
index 166f2f1..0000000
--- a/buffet/etc/buffet/base_state.defaults.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "base": {
-    "firmwareVersion": "",
-    "localDiscoveryEnabled": false,
-    "localAnonymousAccessMaxRole": "none",
-    "localPairingEnabled": false
-  }
-}
diff --git a/buffet/etc/buffet/base_state.schema.json b/buffet/etc/buffet/base_state.schema.json
deleted file mode 100644
index 19cc9b2..0000000
--- a/buffet/etc/buffet/base_state.schema.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "base": {
-    "firmwareVersion": "string",
-    "localDiscoveryEnabled": "boolean",
-    "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ],
-    "localPairingEnabled": "boolean",
-    "network": {
-      "properties": {
-        "name": "string"
-      }
-    }
-  }
-}
diff --git a/buffet/etc/buffet/commands/buffet.json b/buffet/etc/buffet/commands/buffet.json
deleted file mode 100644
index 4196a22..0000000
--- a/buffet/etc/buffet/commands/buffet.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "base": {
-    "updateBaseConfiguration": { },
-    "updateDeviceInfo": { }
-  }
-}
diff --git a/buffet/etc/buffet/commands/test.json b/buffet/etc/buffet/commands/test.json
deleted file mode 100644
index 911d8f0..0000000
--- a/buffet/etc/buffet/commands/test.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "base": {
-    "_jump": {
-      "parameters": {
-        "_height": "integer"
-      },
-      "progress": {
-        "progress": {
-          "type": "integer",
-          "minimum": 0,
-          "maximum": 100,
-          "isRequired": true
-        }
-      }
-    }
-  }
-}
diff --git a/buffet/etc/buffet/gcd.json b/buffet/etc/buffet/gcd.json
deleted file mode 100644
index 368704e..0000000
--- a/buffet/etc/buffet/gcd.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "base": {
-    "updateBaseConfiguration": {
-      "minimalRole": "manager",
-      "parameters": {
-        "localDiscoveryEnabled": "boolean",
-        "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ],
-        "localPairingEnabled": "boolean"
-      },
-      "results": {}
-    },
-
-    "reboot": {
-      "minimalRole": "user",
-      "parameters": {},
-      "results": {}
-    },
-
-    "identify": {
-      "minimalRole": "user",
-      "parameters": {},
-      "results": {}
-    },
-
-    "updateDeviceInfo": {
-      "minimalRole": "manager",
-      "parameters": {
-        "description": "string",
-        "name": "string",
-        "location": "string"
-      },
-      "results": {}
-    }
-  }
-}
diff --git a/buffet/etc/dbus-1/org.chromium.Buffet.conf b/buffet/etc/dbus-1/org.chromium.Buffet.conf
deleted file mode 100644
index 23a4ffc..0000000
--- a/buffet/etc/dbus-1/org.chromium.Buffet.conf
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE busconfig PUBLIC
- "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
-  <policy user="root">
-    <allow send_destination="org.chromium.Buffet" />
-  </policy>
-
-  <policy group="buffet">
-    <allow send_destination="org.chromium.Buffet" />
-  </policy>
-
-  <policy user="buffet">
-    <allow own="org.chromium.Buffet" />
-  </policy>
-
-  <policy user="webservd">
-        <allow send_destination="org.chromium.Buffet"
-               send_interface="org.chromium.WebServer.RequestHandler"/>
-  </policy>
-</busconfig>
diff --git a/buffet/etc/init/buffet.conf b/buffet/etc/init/buffet.conf
deleted file mode 100644
index 6948605..0000000
--- a/buffet/etc/init/buffet.conf
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2014 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-description     "Brillo Buffet Service"
-author          "chromium-os-dev@chromium.org"
-
-start on starting system-services
-stop on stopping system-services
-respawn
-
-env BUFFET_LOG_LEVEL=0
-env BUFFET_ENABLE_XMPP=
-env BUFFET_STATE_PATH=
-env BUFFET_CONFIG_PATH=
-env BUFFET_ENABLE_PING=false
-env BUFFET_DEVICE_WHITELIST=
-env BUFFET_DISABLE_PRIVET=false
-env BUFFET_TEST_DEFINITIONS_PATH=
-env BUFFET_DISABLE_SECURITY=false
-env BUFFET_TEST_PRIVET_SSID=
-
-pre-start script
-  mkdir -m 0755 -p /var/lib/buffet
-  chown -R buffet:buffet /var/lib/buffet
-end script
-
-# Minijail actually forks off our desired process.
-expect fork
-
-exec minijail0 -i -g buffet -u buffet /usr/bin/buffet \
-    --v="${BUFFET_LOG_LEVEL}" \
-    --config_path="${BUFFET_CONFIG_PATH}" \
-    --state_path="${BUFFET_STATE_PATH}" \
-    --disable_security="${BUFFET_DISABLE_SECURITY}" \
-    --enable_ping="${BUFFET_ENABLE_PING}" \
-    --device_whitelist="${BUFFET_DEVICE_WHITELIST}" \
-    --disable_privet="${BUFFET_DISABLE_PRIVET}" \
-    --test_definitions_path="${BUFFET_TEST_DEFINITIONS_PATH}" \
-    --enable_xmpp="${BUFFET_ENABLE_XMPP}" \
-    --test_privet_ssid="${BUFFET_TEST_PRIVET_SSID}"
-
-# Wait for daemon to claim its D-Bus name before transitioning to started.
-post-start exec gdbus wait --system --timeout 30 org.chromium.Buffet
diff --git a/buffet/main.cc b/buffet/main.cc
deleted file mode 100644
index 276e030..0000000
--- a/buffet/main.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2014 The Chromium OS 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 <string>
-
-#include <base/files/file_path.h>
-#include <chromeos/dbus/async_event_sequencer.h>
-#include <chromeos/dbus/exported_object_manager.h>
-#include <chromeos/daemons/dbus_daemon.h>
-#include <chromeos/flag_helper.h>
-#include <chromeos/strings/string_utils.h>
-#include <chromeos/syslog_logging.h>
-
-#include "buffet/dbus_constants.h"
-#include "buffet/manager.h"
-
-using chromeos::dbus_utils::AsyncEventSequencer;
-using chromeos::DBusServiceDaemon;
-using buffet::kServiceName;
-using buffet::kRootServicePath;
-
-namespace buffet {
-
-class Daemon final : public DBusServiceDaemon {
- public:
-  Daemon(const weave::Device::Options& options,
-         const std::set<std::string>& device_whitelist)
-      : DBusServiceDaemon(kServiceName, kRootServicePath),
-        options_{options},
-        device_whitelist_{device_whitelist} {}
-
- protected:
-  void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
-    manager_.reset(new buffet::Manager(object_manager_->AsWeakPtr()));
-    manager_->Start(options_, device_whitelist_, sequencer);
-  }
-
-  void OnShutdown(int* return_code) override { manager_->Stop(); }
-
- private:
-  weave::Device::Options options_;
-  std::set<std::string> device_whitelist_;
-
-  std::unique_ptr<buffet::Manager> manager_;
-  DISALLOW_COPY_AND_ASSIGN(Daemon);
-};
-
-}  // namespace buffet
-
-namespace {
-
-const char kDefaultConfigFilePath[] = "/etc/buffet/buffet.conf";
-const char kDefaultStateFilePath[] = "/var/lib/buffet/device_reg_info";
-
-}  // namespace
-
-int main(int argc, char* argv[]) {
-  DEFINE_bool(log_to_stderr, false, "log trace messages to stderr as well");
-  DEFINE_string(config_path, kDefaultConfigFilePath,
-                "Path to file containing config information.");
-  DEFINE_string(state_path, kDefaultStateFilePath,
-                "Path to file containing state information.");
-  DEFINE_bool(enable_xmpp, true,
-              "Connect to GCD via a persistent XMPP connection.");
-  DEFINE_bool(disable_privet, false, "disable Privet protocol");
-  DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping");
-  DEFINE_string(device_whitelist, "",
-                "Comma separated list of network interfaces to monitor for "
-                "connectivity (an empty list enables all interfaces).");
-
-  DEFINE_bool(disable_security, false,
-              "disable Privet security for tests. For test only.");
-  DEFINE_string(test_privet_ssid, "",
-                "Fixed SSID for WiFi bootstrapping. For test only.");
-  DEFINE_string(test_definitions_path, "",
-                "Path to directory containing additional command "
-                "and state definitions. For test only.");
-
-  chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon");
-  if (FLAGS_config_path.empty())
-    FLAGS_config_path = kDefaultConfigFilePath;
-  if (FLAGS_state_path.empty())
-    FLAGS_state_path = kDefaultStateFilePath;
-  int flags = chromeos::kLogToSyslog | chromeos::kLogHeader;
-  if (FLAGS_log_to_stderr)
-    flags |= chromeos::kLogToStderr;
-  chromeos::InitLog(flags);
-
-  auto device_whitelist =
-      chromeos::string_utils::Split(FLAGS_device_whitelist, ",", true, true);
-
-  weave::Device::Options options;
-  options.config_path = base::FilePath{FLAGS_config_path};
-  options.state_path = base::FilePath{FLAGS_state_path};
-  options.definitions_path = base::FilePath{"/etc/buffet"};
-  options.test_definitions_path = base::FilePath{FLAGS_test_definitions_path};
-  options.xmpp_enabled = FLAGS_enable_xmpp;
-  options.disable_privet = FLAGS_disable_privet;
-  options.disable_security = FLAGS_disable_security;
-  options.enable_ping = FLAGS_enable_ping;
-  options.test_privet_ssid = FLAGS_test_privet_ssid;
-
-  buffet::Daemon daemon{options, std::set<std::string>{device_whitelist.begin(),
-                                                       device_whitelist.end()}};
-  return daemon.Run();
-}
diff --git a/buffet/manager.cc b/buffet/manager.cc
deleted file mode 100644
index cc83686..0000000
--- a/buffet/manager.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/manager.h"
-
-#include <map>
-#include <set>
-#include <string>
-
-#include <base/bind.h>
-#include <base/bind_helpers.h>
-#include <base/json/json_reader.h>
-#include <base/json/json_writer.h>
-#include <base/message_loop/message_loop.h>
-#include <base/time/time.h>
-#include <chromeos/dbus/async_event_sequencer.h>
-#include <chromeos/dbus/exported_object_manager.h>
-#include <chromeos/errors/error.h>
-#include <chromeos/http/http_transport.h>
-#include <chromeos/key_value_store.h>
-#include <dbus/bus.h>
-#include <dbus/object_path.h>
-#include <dbus/values_util.h>
-#include <weave/enum_to_string.h>
-
-#include "buffet/dbus_command_dispatcher.h"
-#include "buffet/dbus_conversion.h"
-#include "buffet/peerd_client.h"
-#include "buffet/shill_client.h"
-#include "buffet/webserv_client.h"
-
-using chromeos::dbus_utils::AsyncEventSequencer;
-using chromeos::dbus_utils::ExportedObjectManager;
-
-namespace buffet {
-
-namespace {
-
-const char kPairingSessionIdKey[] = "sessionId";
-const char kPairingModeKey[] = "mode";
-const char kPairingCodeKey[] = "code";
-
-const char kErrorDomain[] = "buffet";
-const char kNotImplemented[] = "notImplemented";
-
-}  // anonymous namespace
-
-Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager)
-    : dbus_object_(object_manager.get(),
-                   object_manager->GetBus(),
-                   org::chromium::Buffet::ManagerAdaptor::GetObjectPath()) {
-}
-
-Manager::~Manager() {
-}
-
-void Manager::Start(const weave::Device::Options& options,
-                    const std::set<std::string>& device_whitelist,
-                    AsyncEventSequencer* sequencer) {
-  shill_client_.reset(new ShillClient{dbus_object_.GetBus(), device_whitelist});
-  if (!options.disable_privet) {
-    peerd_client_.reset(new PeerdClient{dbus_object_.GetBus()});
-    web_serv_client_.reset(new WebServClient{dbus_object_.GetBus(), sequencer});
-  }
-
-  device_ = weave::Device::Create();
-  device_->Start(options, shill_client_.get(), peerd_client_.get(),
-                 web_serv_client_.get());
-
-  command_dispatcher_.reset(new DBusCommandDispacher{
-      dbus_object_.GetObjectManager(), device_->GetCommands()});
-
-  device_->GetState()->AddOnChangedCallback(
-      base::Bind(&Manager::OnStateChanged, weak_ptr_factory_.GetWeakPtr()));
-
-  device_->GetConfig()->AddOnChangedCallback(
-      base::Bind(&Manager::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
-
-  device_->GetCloud()->AddOnRegistrationChangedCallback(base::Bind(
-      &Manager::OnRegistrationChanged, weak_ptr_factory_.GetWeakPtr()));
-
-  if (device_->GetPrivet()) {
-    device_->GetPrivet()->AddOnWifiSetupChangedCallback(base::Bind(
-        &Manager::UpdateWiFiBootstrapState, weak_ptr_factory_.GetWeakPtr()));
-
-    device_->GetPrivet()->AddOnPairingChangedCallbacks(
-        base::Bind(&Manager::OnPairingStart, weak_ptr_factory_.GetWeakPtr()),
-        base::Bind(&Manager::OnPairingEnd, weak_ptr_factory_.GetWeakPtr()));
-  } else {
-    UpdateWiFiBootstrapState(weave::WifiSetupState::kDisabled);
-  }
-
-  dbus_adaptor_.RegisterWithDBusObject(&dbus_object_);
-  dbus_object_.RegisterAsync(
-      sequencer->GetHandler("Manager.RegisterAsync() failed.", true));
-}
-
-void Manager::Stop() {
-  device_.reset();
-}
-
-// TODO(vitalybuka): Remove, it's just duplicate of property.
-void Manager::CheckDeviceRegistered(
-    DBusMethodResponsePtr<std::string> response) {
-  LOG(INFO) << "Received call to Manager.CheckDeviceRegistered()";
-  response->Return(dbus_adaptor_.GetDeviceId());
-}
-
-// TODO(vitalybuka): Remove or rename to leave for testing.
-void Manager::GetDeviceInfo(DBusMethodResponsePtr<std::string> response) {
-  LOG(INFO) << "Received call to Manager.GetDeviceInfo()";
-  std::shared_ptr<DBusMethodResponse<std::string>> shared_response =
-      std::move(response);
-
-  device_->GetCloud()->GetDeviceInfo(
-      base::Bind(&Manager::OnGetDeviceInfoSuccess,
-                 weak_ptr_factory_.GetWeakPtr(), shared_response),
-      base::Bind(&Manager::OnGetDeviceInfoError, weak_ptr_factory_.GetWeakPtr(),
-                 shared_response));
-}
-
-void Manager::OnGetDeviceInfoSuccess(
-    const std::shared_ptr<DBusMethodResponse<std::string>>& response,
-    const base::DictionaryValue& device_info) {
-  std::string device_info_str;
-  base::JSONWriter::WriteWithOptions(
-      device_info, base::JSONWriter::OPTIONS_PRETTY_PRINT, &device_info_str);
-  response->Return(device_info_str);
-}
-
-void Manager::OnGetDeviceInfoError(
-    const std::shared_ptr<DBusMethodResponse<std::string>>& response,
-    const chromeos::Error* error) {
-  response->ReplyWithError(error);
-}
-
-void Manager::RegisterDevice(DBusMethodResponsePtr<std::string> response,
-                             const std::string& ticket_id) {
-  LOG(INFO) << "Received call to Manager.RegisterDevice()";
-
-  chromeos::ErrorPtr error;
-  std::string device_id =
-      device_->GetCloud()->RegisterDevice(ticket_id, &error);
-  if (!device_id.empty()) {
-    response->Return(device_id);
-    return;
-  }
-  CHECK(error);
-  response->ReplyWithError(error.get());
-}
-
-void Manager::UpdateState(DBusMethodResponsePtr<> response,
-                          const chromeos::VariantDictionary& property_set) {
-  chromeos::ErrorPtr error;
-  auto properties = DictionaryFromDBusVariantDictionary(property_set, &error);
-  if (!properties)
-    response->ReplyWithError(error.get());
-
-  if (!device_->GetState()->SetProperties(*properties, &error))
-    response->ReplyWithError(error.get());
-  else
-    response->Return();
-}
-
-bool Manager::GetState(chromeos::ErrorPtr* error, std::string* state) {
-  auto json = device_->GetState()->GetStateValuesAsJson();
-  CHECK(json);
-  base::JSONWriter::WriteWithOptions(
-      *json, base::JSONWriter::OPTIONS_PRETTY_PRINT, state);
-  return true;
-}
-
-void Manager::AddCommand(DBusMethodResponsePtr<std::string> response,
-                         const std::string& json_command,
-                         const std::string& in_user_role) {
-  std::string error_message;
-  std::unique_ptr<base::Value> value(
-      base::JSONReader::ReadAndReturnError(json_command, base::JSON_PARSE_RFC,
-                                           nullptr, &error_message)
-          .release());
-  const base::DictionaryValue* command{nullptr};
-  if (!value || !value->GetAsDictionary(&command)) {
-    return response->ReplyWithError(FROM_HERE, chromeos::errors::json::kDomain,
-                                    chromeos::errors::json::kParseError,
-                                    error_message);
-  }
-
-  chromeos::ErrorPtr error;
-  weave::UserRole role;
-  if (!StringToEnum(in_user_role, &role)) {
-    chromeos::Error::AddToPrintf(&error, FROM_HERE, kErrorDomain,
-                                 "invalid_user_role", "Invalid role: '%s'",
-                                 in_user_role.c_str());
-    return response->ReplyWithError(error.get());
-  }
-
-  std::string id;
-  if (!device_->GetCommands()->AddCommand(*command, role, &id, &error))
-    return response->ReplyWithError(error.get());
-
-  response->Return(id);
-}
-
-void Manager::GetCommand(DBusMethodResponsePtr<std::string> response,
-                         const std::string& id) {
-  const weave::Command* command = device_->GetCommands()->FindCommand(id);
-  if (!command) {
-    response->ReplyWithError(FROM_HERE, kErrorDomain, "unknown_command",
-                             "Can't find command with id: " + id);
-    return;
-  }
-  std::string command_str;
-  base::JSONWriter::WriteWithOptions(
-      *command->ToJson(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &command_str);
-  response->Return(command_str);
-}
-
-std::string Manager::TestMethod(const std::string& message) {
-  LOG(INFO) << "Received call to test method: " << message;
-  return message;
-}
-
-bool Manager::EnableWiFiBootstrapping(
-    chromeos::ErrorPtr* error,
-    const dbus::ObjectPath& in_listener_path,
-    const chromeos::VariantDictionary& in_options) {
-  chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented,
-                         "Manual WiFi bootstrapping is not implemented");
-  return false;
-}
-
-bool Manager::DisableWiFiBootstrapping(chromeos::ErrorPtr* error) {
-  chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented,
-                         "Manual WiFi bootstrapping is not implemented");
-  return false;
-}
-
-bool Manager::EnableGCDBootstrapping(
-    chromeos::ErrorPtr* error,
-    const dbus::ObjectPath& in_listener_path,
-    const chromeos::VariantDictionary& in_options) {
-  chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented,
-                         "Manual GCD bootstrapping is not implemented");
-  return false;
-}
-
-bool Manager::DisableGCDBootstrapping(chromeos::ErrorPtr* error) {
-  chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented,
-                         "Manual GCD bootstrapping is not implemented");
-  return false;
-}
-
-bool Manager::UpdateDeviceInfo(chromeos::ErrorPtr* error,
-                               const std::string& name,
-                               const std::string& description,
-                               const std::string& location) {
-  return device_->GetCloud()->UpdateDeviceInfo(name, description, location,
-                                               error);
-}
-
-bool Manager::UpdateServiceConfig(chromeos::ErrorPtr* error,
-                                  const std::string& client_id,
-                                  const std::string& client_secret,
-                                  const std::string& api_key,
-                                  const std::string& oauth_url,
-                                  const std::string& service_url) {
-  return device_->GetCloud()->UpdateServiceConfig(
-      client_id, client_secret, api_key, oauth_url, service_url, error);
-}
-
-void Manager::OnStateChanged() {
-  auto state = device_->GetState()->GetStateValuesAsJson();
-  CHECK(state);
-  std::string json;
-  base::JSONWriter::WriteWithOptions(
-      *state, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
-  dbus_adaptor_.SetState(json);
-}
-
-void Manager::OnRegistrationChanged(weave::RegistrationStatus status) {
-  dbus_adaptor_.SetStatus(weave::EnumToString(status));
-}
-
-void Manager::OnConfigChanged(const weave::Settings& settings) {
-  dbus_adaptor_.SetDeviceId(settings.device_id);
-  dbus_adaptor_.SetOemName(settings.oem_name);
-  dbus_adaptor_.SetModelName(settings.model_name);
-  dbus_adaptor_.SetModelId(settings.model_id);
-  dbus_adaptor_.SetName(settings.name);
-  dbus_adaptor_.SetDescription(settings.description);
-  dbus_adaptor_.SetLocation(settings.location);
-  dbus_adaptor_.SetAnonymousAccessRole(settings.local_anonymous_access_role);
-}
-
-void Manager::UpdateWiFiBootstrapState(weave::WifiSetupState state) {
-  dbus_adaptor_.SetWiFiBootstrapState(weave::EnumToString(state));
-}
-
-void Manager::OnPairingStart(const std::string& session_id,
-                             weave::PairingType pairing_type,
-                             const std::vector<uint8_t>& code) {
-  // For now, just overwrite the exposed PairInfo with
-  // the most recent pairing attempt.
-  dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{
-      {kPairingSessionIdKey, session_id},
-      {kPairingModeKey, weave::EnumToString(pairing_type)},
-      {kPairingCodeKey, code},
-  });
-}
-
-void Manager::OnPairingEnd(const std::string& session_id) {
-  auto exposed_pairing_attempt = dbus_adaptor_.GetPairingInfo();
-  auto it = exposed_pairing_attempt.find(kPairingSessionIdKey);
-  if (it == exposed_pairing_attempt.end()) {
-    return;
-  }
-  std::string exposed_session{it->second.TryGet<std::string>()};
-  if (exposed_session == session_id) {
-    dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{});
-  }
-}
-
-}  // namespace buffet
diff --git a/buffet/manager.h b/buffet/manager.h
deleted file mode 100644
index 821acff..0000000
--- a/buffet/manager.h
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_MANAGER_H_
-#define BUFFET_MANAGER_H_
-
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include <base/files/file_path.h>
-#include <base/macros.h>
-#include <base/memory/weak_ptr.h>
-#include <base/values.h>
-#include <chromeos/dbus/data_serialization.h>
-#include <chromeos/dbus/dbus_object.h>
-#include <chromeos/dbus/exported_property_set.h>
-#include <chromeos/errors/error.h>
-#include <weave/device.h>
-
-#include "buffet/org.chromium.Buffet.Manager.h"
-
-namespace chromeos {
-namespace dbus_utils {
-class ExportedObjectManager;
-}  // namespace dbus_utils
-}  // namespace chromeos
-
-namespace buffet {
-
-class DBusCommandDispacher;
-class PeerdClient;
-class ShillClient;
-class WebServClient;
-
-template<typename... Types>
-using DBusMethodResponsePtr =
-    std::unique_ptr<chromeos::dbus_utils::DBusMethodResponse<Types...>>;
-
-template<typename... Types>
-using DBusMethodResponse =
-    chromeos::dbus_utils::DBusMethodResponse<Types...>;
-
-// The Manager is responsible for global state of Buffet.  It exposes
-// interfaces which affect the entire device such as device registration and
-// device state.
-class Manager final : public org::chromium::Buffet::ManagerInterface {
- public:
-  explicit Manager(
-      const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>&
-          object_manager);
-  ~Manager();
-
-  void Start(const weave::Device::Options& options,
-             const std::set<std::string>& device_whitelist,
-             chromeos::dbus_utils::AsyncEventSequencer* sequencer);
-
-  void Stop();
-
- private:
-  // DBus methods:
-  void CheckDeviceRegistered(
-      DBusMethodResponsePtr<std::string> response) override;
-  void GetDeviceInfo(DBusMethodResponsePtr<std::string> response) override;
-  void RegisterDevice(DBusMethodResponsePtr<std::string> response,
-                      const std::string& ticket_id) override;
-  bool UpdateDeviceInfo(chromeos::ErrorPtr* error,
-                        const std::string& name,
-                        const std::string& description,
-                        const std::string& location) override;
-  bool UpdateServiceConfig(chromeos::ErrorPtr* error,
-                           const std::string& client_id,
-                           const std::string& client_secret,
-                           const std::string& api_key,
-                           const std::string& oauth_url,
-                           const std::string& service_url) override;
-  void UpdateState(DBusMethodResponsePtr<> response,
-                   const chromeos::VariantDictionary& property_set) override;
-  bool GetState(chromeos::ErrorPtr* error, std::string* state) override;
-  void AddCommand(DBusMethodResponsePtr<std::string> response,
-                  const std::string& json_command,
-                  const std::string& in_user_role) override;
-  void GetCommand(DBusMethodResponsePtr<std::string> response,
-                  const std::string& id) override;
-  std::string TestMethod(const std::string& message) override;
-  bool EnableWiFiBootstrapping(
-      chromeos::ErrorPtr* error,
-      const dbus::ObjectPath& in_listener_path,
-      const chromeos::VariantDictionary& in_options) override;
-  bool DisableWiFiBootstrapping(chromeos::ErrorPtr* error) override;
-  bool EnableGCDBootstrapping(
-      chromeos::ErrorPtr* error,
-      const dbus::ObjectPath& in_listener_path,
-      const chromeos::VariantDictionary& in_options) override;
-  bool DisableGCDBootstrapping(chromeos::ErrorPtr* error) override;
-
-  void OnGetDeviceInfoSuccess(
-      const std::shared_ptr<DBusMethodResponse<std::string>>& response,
-      const base::DictionaryValue& device_info);
-  void OnGetDeviceInfoError(
-      const std::shared_ptr<DBusMethodResponse<std::string>>& response,
-      const chromeos::Error* error);
-
-  void StartPrivet(const weave::Device::Options& options,
-                   chromeos::dbus_utils::AsyncEventSequencer* sequencer);
-
-  void OnStateChanged();
-  void OnRegistrationChanged(weave::RegistrationStatus status);
-  void OnConfigChanged(const weave::Settings& settings);
-  void UpdateWiFiBootstrapState(weave::WifiSetupState state);
-  void OnPairingStart(const std::string& session_id,
-                      weave::PairingType pairing_type,
-                      const std::vector<uint8_t>& code);
-  void OnPairingEnd(const std::string& session_id);
-
-  org::chromium::Buffet::ManagerAdaptor dbus_adaptor_{this};
-  chromeos::dbus_utils::DBusObject dbus_object_;
-
-  std::unique_ptr<ShillClient> shill_client_;
-  std::unique_ptr<PeerdClient> peerd_client_;
-  std::unique_ptr<WebServClient> web_serv_client_;
-  std::unique_ptr<weave::Device> device_;
-  std::unique_ptr<DBusCommandDispacher> command_dispatcher_;
-
-  base::WeakPtrFactory<Manager> weak_ptr_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(Manager);
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_MANAGER_H_
diff --git a/buffet/peerd_client.cc b/buffet/peerd_client.cc
deleted file mode 100644
index cfbf64a..0000000
--- a/buffet/peerd_client.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/peerd_client.h"
-
-#include <map>
-
-#include <base/message_loop/message_loop.h>
-#include <chromeos/errors/error.h>
-#include <chromeos/strings/string_utils.h>
-
-using org::chromium::peerd::PeerProxy;
-
-namespace buffet {
-
-namespace {
-
-// Commit changes only if no update request happened during the timeout.
-// Usually updates happen in batches, so we don't want to flood network with
-// updates relevant for a short amount of time.
-const int kCommitTimeoutSeconds = 1;
-
-const char kSelfPath[] = "/org/chromium/peerd/Self";
-
-void OnError(const std::string& operation, chromeos::Error* error) {
-  LOG(ERROR) << operation << " failed:" << error->GetMessage();
-}
-
-}  // namespace
-
-PeerdClient::PeerdClient(const scoped_refptr<dbus::Bus>& bus)
-    : peerd_object_manager_proxy_{bus} {
-  peerd_object_manager_proxy_.SetManagerAddedCallback(
-      base::Bind(&PeerdClient::OnPeerdOnline, weak_ptr_factory_.GetWeakPtr()));
-  peerd_object_manager_proxy_.SetManagerRemovedCallback(
-      base::Bind(&PeerdClient::OnPeerdOffline, weak_ptr_factory_.GetWeakPtr()));
-  peerd_object_manager_proxy_.SetPeerAddedCallback(
-      base::Bind(&PeerdClient::OnNewPeer, weak_ptr_factory_.GetWeakPtr()));
-}
-
-PeerdClient::~PeerdClient() {
-  RemoveService();
-}
-
-std::string PeerdClient::GetId() const {
-  return device_id_;
-}
-
-void PeerdClient::PublishService(
-    const std::string& service_name,
-    uint16_t port,
-    const std::map<std::string, std::string>& txt) {
-  // Only one service supported.
-  CHECK(service_name_.empty() || service_name_ == service_name);
-  service_name_ = service_name;
-  port_ = port;
-  txt_ = txt;
-
-  Update();
-}
-
-void PeerdClient::StopPublishing(const std::string& service_name) {
-  // Only one service supported.
-  CHECK(service_name_.empty() || service_name_ == service_name);
-  service_name_ = service_name;
-  port_ = 0;
-
-  Update();
-}
-
-void PeerdClient::Update() {
-  // Abort pending updates, and wait for more changes.
-  restart_weak_ptr_factory_.InvalidateWeakPtrs();
-  base::MessageLoop::current()->PostDelayedTask(
-      FROM_HERE, base::Bind(&PeerdClient::UpdateImpl,
-                            restart_weak_ptr_factory_.GetWeakPtr()),
-      base::TimeDelta::FromSeconds(kCommitTimeoutSeconds));
-}
-
-void PeerdClient::OnNewPeer(PeerProxy* peer) {
-  if (!peer || peer->GetObjectPath().value() != kSelfPath)
-    return;
-  peer->SetPropertyChangedCallback(base::Bind(
-      &PeerdClient::OnPeerPropertyChanged, weak_ptr_factory_.GetWeakPtr()));
-  OnPeerPropertyChanged(peer, PeerProxy::UUIDName());
-}
-
-void PeerdClient::OnPeerPropertyChanged(PeerProxy* peer,
-                                        const std::string& property_name) {
-  if (property_name != PeerProxy::UUIDName() ||
-      peer->GetObjectPath().value() != kSelfPath)
-    return;
-  const std::string new_id{peer->uuid()};
-  if (new_id != device_id_) {
-    device_id_ = new_id;
-    Update();
-  }
-}
-
-void PeerdClient::OnPeerdOnline(
-    org::chromium::peerd::ManagerProxy* manager_proxy) {
-  peerd_manager_proxy_ = manager_proxy;
-  VLOG(1) << "Peerd manager is online at '"
-          << manager_proxy->GetObjectPath().value() << "'.";
-  Update();
-}
-
-void PeerdClient::OnPeerdOffline(const dbus::ObjectPath& object_path) {
-  peerd_manager_proxy_ = nullptr;
-  VLOG(1) << "Peerd manager is now offline.";
-}
-
-void PeerdClient::ExposeService() {
-  // Do nothing if peerd hasn't started yet.
-  if (peerd_manager_proxy_ == nullptr)
-    return;
-  VLOG(1) << "Starting peerd advertising.";
-  CHECK_NE(port_, 0);
-  CHECK(!service_name_.empty());
-  CHECK(!txt_.empty());
-  std::map<std::string, chromeos::Any> mdns_options{
-      {"port", chromeos::Any{port_}},
-  };
-
-  peerd_manager_proxy_->ExposeServiceAsync(
-      service_name_, txt_, {{"mdns", mdns_options}}, base::Closure(),
-      base::Bind(&OnError, "ExposeService"));
-}
-
-void PeerdClient::RemoveService() {
-  if (peerd_manager_proxy_ == nullptr)
-    return;
-
-  VLOG(1) << "Stopping peerd advertising.";
-  if (!service_name_.empty()) {
-    peerd_manager_proxy_->RemoveExposedServiceAsync(
-        service_name_, base::Closure(), base::Bind(&OnError, "RemoveService"));
-  }
-}
-
-void PeerdClient::UpdateImpl() {
-  if (port_ == 0)
-    return RemoveService();
-  ExposeService();
-}
-
-}  // namespace buffet
diff --git a/buffet/peerd_client.h b/buffet/peerd_client.h
deleted file mode 100644
index ac75e19..0000000
--- a/buffet/peerd_client.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_PEERD_CLIENT_H_
-#define BUFFET_PEERD_CLIENT_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include <base/callback.h>
-#include <base/memory/ref_counted.h>
-#include <weave/mdns.h>
-
-#include "peerd/dbus-proxies.h"
-
-namespace dbus {
-class Bus;
-}  // namespace dbus
-
-namespace buffet {
-
-// Publishes privet service on mDns using peerd.
-class PeerdClient : public weave::Mdns {
- public:
-  explicit PeerdClient(const scoped_refptr<dbus::Bus>& bus);
-  ~PeerdClient() override;
-
-  // Mdns implementation.
-  void PublishService(const std::string& service_name,
-                      uint16_t port,
-                      const std::map<std::string, std::string>& txt) override;
-  void StopPublishing(const std::string& service_name) override;
-  std::string GetId() const override;
-
- private:
-  void OnPeerdOnline(org::chromium::peerd::ManagerProxy* manager_proxy);
-  void OnPeerdOffline(const dbus::ObjectPath& object_path);
-  void OnNewPeer(org::chromium::peerd::PeerProxy* peer_proxy);
-  void OnPeerPropertyChanged(org::chromium::peerd::PeerProxy* peer_proxy,
-                             const std::string& property_name);
-
-  // Updates published information.  Removes service if HTTP is not alive.
-  void Update();
-
-  void ExposeService();
-  void RemoveService();
-
-  void UpdateImpl();
-
-  org::chromium::peerd::ObjectManagerProxy peerd_object_manager_proxy_;
-  // |peerd_manager_proxy_| is owned by |peerd_object_manager_proxy_|.
-  org::chromium::peerd::ManagerProxy* peerd_manager_proxy_{nullptr};
-
-  // Cached value of the device ID that we got from peerd.
-  std::string device_id_;
-
-  std::string service_name_;
-  uint16_t port_{0};
-  std::map<std::string, std::string> txt_;
-
-  base::WeakPtrFactory<PeerdClient> restart_weak_ptr_factory_{this};
-  base::WeakPtrFactory<PeerdClient> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(PeerdClient);
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_PEERD_CLIENT_H_
diff --git a/buffet/shill_client.cc b/buffet/shill_client.cc
deleted file mode 100644
index c549fd4..0000000
--- a/buffet/shill_client.cc
+++ /dev/null
@@ -1,499 +0,0 @@
-// Copyright 2014 The Chromium OS 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 "buffet/shill_client.h"
-
-#include <set>
-
-#include <base/message_loop/message_loop.h>
-#include <base/stl_util.h>
-#include <chromeos/any.h>
-#include <chromeos/dbus/service_constants.h>
-#include <chromeos/errors/error.h>
-#include <chromeos/errors/error_codes.h>
-#include <weave/enum_to_string.h>
-
-#include "buffet/ap_manager_client.h"
-
-using chromeos::Any;
-using chromeos::VariantDictionary;
-using dbus::ObjectPath;
-using org::chromium::flimflam::DeviceProxy;
-using org::chromium::flimflam::ServiceProxy;
-using std::map;
-using std::set;
-using std::string;
-using std::vector;
-
-namespace buffet {
-
-namespace {
-
-void IgnoreDetachEvent() {}
-
-bool GetStateForService(ServiceProxy* service, string* state) {
-  CHECK(service) << "|service| was nullptr in GetStateForService()";
-  VariantDictionary properties;
-  if (!service->GetProperties(&properties, nullptr)) {
-    LOG(WARNING) << "Failed to read properties from service.";
-    return false;
-  }
-  auto property_it = properties.find(shill::kStateProperty);
-  if (property_it == properties.end()) {
-    LOG(WARNING) << "No state found in service properties.";
-    return false;
-  }
-  string new_state = property_it->second.TryGet<string>();
-  if (new_state.empty()) {
-    LOG(WARNING) << "Invalid state value.";
-    return false;
-  }
-  *state = new_state;
-  return true;
-}
-
-weave::NetworkState ShillServiceStateToNetworkState(const string& state) {
-  // TODO(wiley) What does "unconfigured" mean in a world with multiple sets
-  //             of WiFi credentials?
-  // TODO(wiley) Detect disabled devices, update state appropriately.
-  if ((state.compare(shill::kStateReady) == 0) ||
-      (state.compare(shill::kStatePortal) == 0) ||
-      (state.compare(shill::kStateOnline) == 0)) {
-    return weave::NetworkState::kConnected;
-  }
-  if ((state.compare(shill::kStateAssociation) == 0) ||
-      (state.compare(shill::kStateConfiguration) == 0)) {
-    return weave::NetworkState::kConnecting;
-  }
-  if ((state.compare(shill::kStateFailure) == 0) ||
-      (state.compare(shill::kStateActivationFailure) == 0)) {
-    // TODO(wiley) Get error information off the service object.
-    return weave::NetworkState::kFailure;
-  }
-  if ((state.compare(shill::kStateIdle) == 0) ||
-      (state.compare(shill::kStateOffline) == 0) ||
-      (state.compare(shill::kStateDisconnect) == 0)) {
-    return weave::NetworkState::kOffline;
-  }
-  LOG(WARNING) << "Unknown state found: '" << state << "'";
-  return weave::NetworkState::kOffline;
-}
-
-}  // namespace
-
-ShillClient::ShillClient(const scoped_refptr<dbus::Bus>& bus,
-                         const set<string>& device_whitelist)
-    : bus_{bus},
-      manager_proxy_{bus_, ObjectPath{"/"}},
-      device_whitelist_{device_whitelist},
-      ap_manager_client_{new ApManagerClient(bus)} {
-  manager_proxy_.RegisterPropertyChangedSignalHandler(
-      base::Bind(&ShillClient::OnManagerPropertyChange,
-                 weak_factory_.GetWeakPtr()),
-      base::Bind(&ShillClient::OnManagerPropertyChangeRegistration,
-                 weak_factory_.GetWeakPtr()));
-  auto owner_changed_cb = base::Bind(&ShillClient::OnShillServiceOwnerChange,
-                                     weak_factory_.GetWeakPtr());
-  bus_->GetObjectProxy(shill::kFlimflamServiceName, ObjectPath{"/"})
-      ->SetNameOwnerChangedCallback(owner_changed_cb);
-}
-
-ShillClient::~ShillClient() {}
-
-void ShillClient::Init() {
-  VLOG(2) << "ShillClient::Init();";
-  CleanupConnectingService(false);
-  devices_.clear();
-  connectivity_state_ = weave::NetworkState::kOffline;
-  VariantDictionary properties;
-  if (!manager_proxy_.GetProperties(&properties, nullptr)) {
-    LOG(ERROR) << "Unable to get properties from Manager, waiting for "
-                  "Manager to come back online.";
-    return;
-  }
-  auto it = properties.find(shill::kDevicesProperty);
-  CHECK(it != properties.end()) << "shill should always publish a device list.";
-  OnManagerPropertyChange(shill::kDevicesProperty, it->second);
-}
-
-bool ShillClient::ConnectToService(const string& ssid,
-                                   const string& passphrase,
-                                   const base::Closure& on_success,
-                                   chromeos::ErrorPtr* error) {
-  CleanupConnectingService(false);
-  VariantDictionary service_properties;
-  service_properties[shill::kTypeProperty] = Any{string{shill::kTypeWifi}};
-  service_properties[shill::kSSIDProperty] = Any{ssid};
-  service_properties[shill::kPassphraseProperty] = Any{passphrase};
-  service_properties[shill::kSecurityProperty] = Any{
-      string{passphrase.empty() ? shill::kSecurityNone : shill::kSecurityPsk}};
-  service_properties[shill::kSaveCredentialsProperty] = Any{true};
-  service_properties[shill::kAutoConnectProperty] = Any{true};
-  ObjectPath service_path;
-  if (!manager_proxy_.ConfigureService(service_properties, &service_path,
-                                       error)) {
-    return false;
-  }
-  if (!manager_proxy_.RequestScan(shill::kTypeWifi, error)) {
-    return false;
-  }
-  connecting_service_.reset(new ServiceProxy{bus_, service_path});
-  on_connect_success_.Reset(on_success);
-  connecting_service_->RegisterPropertyChangedSignalHandler(
-      base::Bind(&ShillClient::OnServicePropertyChange,
-                 weak_factory_.GetWeakPtr(), service_path),
-      base::Bind(&ShillClient::OnServicePropertyChangeRegistration,
-                 weak_factory_.GetWeakPtr(), service_path));
-  return true;
-}
-
-weave::NetworkState ShillClient::GetConnectionState() const {
-  return connectivity_state_;
-}
-
-void ShillClient::EnableAccessPoint(const std::string& ssid) {
-  ap_manager_client_->Start(ssid);
-}
-
-void ShillClient::DisableAccessPoint() {
-  ap_manager_client_->Stop();
-}
-
-void ShillClient::AddOnConnectionChangedCallback(
-    const OnConnectionChangedCallback& listener) {
-  connectivity_listeners_.push_back(listener);
-}
-
-bool ShillClient::IsMonitoredDevice(DeviceProxy* device) {
-  if (device_whitelist_.empty()) {
-    return true;
-  }
-  VariantDictionary device_properties;
-  if (!device->GetProperties(&device_properties, nullptr)) {
-    LOG(ERROR) << "Devices without properties aren't whitelisted.";
-    return false;
-  }
-  auto it = device_properties.find(shill::kInterfaceProperty);
-  if (it == device_properties.end()) {
-    LOG(ERROR) << "Failed to find interface property in device properties.";
-    return false;
-  }
-  return ContainsKey(device_whitelist_, it->second.TryGet<string>());
-}
-
-void ShillClient::OnShillServiceOwnerChange(const string& old_owner,
-                                            const string& new_owner) {
-  VLOG(1) << "Shill service owner name changed to '" << new_owner << "'";
-  if (new_owner.empty()) {
-    CleanupConnectingService(false);
-    devices_.clear();
-    connectivity_state_ = weave::NetworkState::kOffline;
-  } else {
-    Init();  // New service owner means shill reset!
-  }
-}
-
-void ShillClient::OnManagerPropertyChangeRegistration(const string& interface,
-                                                      const string& signal_name,
-                                                      bool success) {
-  VLOG(3) << "Registered ManagerPropertyChange handler.";
-  CHECK(success) << "privetd requires Manager signals.";
-  VariantDictionary properties;
-  if (!manager_proxy_.GetProperties(&properties, nullptr)) {
-    LOG(ERROR) << "Unable to get properties from Manager, waiting for "
-                  "Manager to come back online.";
-    return;
-  }
-  auto it = properties.find(shill::kDevicesProperty);
-  CHECK(it != properties.end()) << "Shill should always publish a device list.";
-  OnManagerPropertyChange(shill::kDevicesProperty, it->second);
-}
-
-void ShillClient::OnManagerPropertyChange(const string& property_name,
-                                          const Any& property_value) {
-  if (property_name != shill::kDevicesProperty) {
-    return;
-  }
-  VLOG(3) << "Manager's device list has changed.";
-  // We're going to remove every device we haven't seen in the update.
-  set<ObjectPath> device_paths_to_remove;
-  for (const auto& kv : devices_) {
-    device_paths_to_remove.insert(kv.first);
-  }
-  for (const auto& device_path : property_value.TryGet<vector<ObjectPath>>()) {
-    if (!device_path.IsValid()) {
-      LOG(ERROR) << "Ignoring invalid device path in Manager's device list.";
-      return;
-    }
-    auto it = devices_.find(device_path);
-    if (it != devices_.end()) {
-      // Found an existing proxy.  Since the whitelist never changes,
-      // this still a valid device.
-      device_paths_to_remove.erase(device_path);
-      continue;
-    }
-    std::unique_ptr<DeviceProxy> device{new DeviceProxy{bus_, device_path}};
-    if (!IsMonitoredDevice(device.get())) {
-      continue;
-    }
-    device->RegisterPropertyChangedSignalHandler(
-        base::Bind(&ShillClient::OnDevicePropertyChange,
-                   weak_factory_.GetWeakPtr(), device_path),
-        base::Bind(&ShillClient::OnDevicePropertyChangeRegistration,
-                   weak_factory_.GetWeakPtr(), device_path));
-    VLOG(3) << "Creating device proxy at " << device_path.value();
-    devices_[device_path].device = std::move(device);
-  }
-  // Clean up devices/services related to removed devices.
-  if (!device_paths_to_remove.empty()) {
-    for (const ObjectPath& device_path : device_paths_to_remove) {
-      devices_.erase(device_path);
-    }
-    UpdateConnectivityState();
-  }
-}
-
-void ShillClient::OnDevicePropertyChangeRegistration(
-    const ObjectPath& device_path,
-    const string& interface,
-    const string& signal_name,
-    bool success) {
-  VLOG(3) << "Registered DevicePropertyChange handler.";
-  auto it = devices_.find(device_path);
-  if (it == devices_.end()) {
-    return;
-  }
-  CHECK(success) << "Failed to subscribe to Device property changes.";
-  DeviceProxy* device = it->second.device.get();
-  VariantDictionary properties;
-  if (!device->GetProperties(&properties, nullptr)) {
-    LOG(WARNING) << "Failed to get device properties?";
-    return;
-  }
-  auto prop_it = properties.find(shill::kSelectedServiceProperty);
-  if (prop_it == properties.end()) {
-    LOG(WARNING) << "Failed to get device's selected service?";
-    return;
-  }
-  OnDevicePropertyChange(device_path, shill::kSelectedServiceProperty,
-                         prop_it->second);
-}
-
-void ShillClient::OnDevicePropertyChange(const ObjectPath& device_path,
-                                         const string& property_name,
-                                         const Any& property_value) {
-  // We only care about selected services anyway.
-  if (property_name != shill::kSelectedServiceProperty) {
-    return;
-  }
-  // If the device isn't our list of whitelisted devices, ignore it.
-  auto it = devices_.find(device_path);
-  if (it == devices_.end()) {
-    return;
-  }
-  DeviceState& device_state = it->second;
-  ObjectPath service_path{property_value.TryGet<ObjectPath>()};
-  if (!service_path.IsValid()) {
-    LOG(ERROR) << "Device at " << device_path.value()
-               << " selected invalid service path.";
-    return;
-  }
-  VLOG(3) << "Device at " << it->first.value() << " has selected service at "
-          << service_path.value();
-  bool removed_old_service{false};
-  if (device_state.selected_service) {
-    if (device_state.selected_service->GetObjectPath() == service_path) {
-      return;  // Spurious update?
-    }
-    device_state.selected_service.reset();
-    device_state.service_state = weave::NetworkState::kOffline;
-    removed_old_service = true;
-  }
-  std::shared_ptr<ServiceProxy> new_service;
-  const bool reuse_connecting_service =
-      service_path.value() != "/" && connecting_service_ &&
-      connecting_service_->GetObjectPath() == service_path;
-  if (reuse_connecting_service) {
-    new_service = connecting_service_;
-    // When we reuse the connecting service, we need to make sure that our
-    // cached state is correct.  Normally, we do this by relying reading the
-    // state when our signal handlers finish registering, but this may have
-    // happened long in the past for the connecting service.
-    string state;
-    if (GetStateForService(new_service.get(), &state)) {
-      device_state.service_state = ShillServiceStateToNetworkState(state);
-    } else {
-      LOG(WARNING) << "Failed to read properties from existing service "
-                      "on selection.";
-    }
-  } else if (service_path.value() != "/") {
-    // The device has selected a new service we haven't see before.
-    new_service.reset(new ServiceProxy{bus_, service_path});
-    new_service->RegisterPropertyChangedSignalHandler(
-        base::Bind(&ShillClient::OnServicePropertyChange,
-                   weak_factory_.GetWeakPtr(), service_path),
-        base::Bind(&ShillClient::OnServicePropertyChangeRegistration,
-                   weak_factory_.GetWeakPtr(), service_path));
-  }
-  device_state.selected_service = new_service;
-  if (reuse_connecting_service || removed_old_service) {
-    UpdateConnectivityState();
-  }
-}
-
-void ShillClient::OnServicePropertyChangeRegistration(const ObjectPath& path,
-                                                      const string& interface,
-                                                      const string& signal_name,
-                                                      bool success) {
-  VLOG(3) << "OnServicePropertyChangeRegistration(" << path.value() << ");";
-  ServiceProxy* service{nullptr};
-  if (connecting_service_ && connecting_service_->GetObjectPath() == path) {
-    // Note that the connecting service might also be a selected service.
-    service = connecting_service_.get();
-    if (!success) {
-      CleanupConnectingService(false);
-    }
-  } else {
-    for (const auto& kv : devices_) {
-      if (kv.second.selected_service &&
-          kv.second.selected_service->GetObjectPath() == path) {
-        service = kv.second.selected_service.get();
-        break;
-      }
-    }
-  }
-  if (service == nullptr || !success) {
-    return;  // A failure or success for a proxy we no longer care about.
-  }
-  VariantDictionary properties;
-  if (!service->GetProperties(&properties, nullptr)) {
-    return;
-  }
-  // Give ourselves property changed signals for the initial property
-  // values.
-  auto it = properties.find(shill::kStateProperty);
-  if (it != properties.end()) {
-    OnServicePropertyChange(path, shill::kStateProperty, it->second);
-  }
-  it = properties.find(shill::kSignalStrengthProperty);
-  if (it != properties.end()) {
-    OnServicePropertyChange(path, shill::kSignalStrengthProperty, it->second);
-  }
-}
-
-void ShillClient::OnServicePropertyChange(const ObjectPath& service_path,
-                                          const string& property_name,
-                                          const Any& property_value) {
-  VLOG(3) << "ServicePropertyChange(" << service_path.value() << ", "
-          << property_name << ", ...);";
-  if (property_name == shill::kStateProperty) {
-    const string state{property_value.TryGet<string>()};
-    if (state.empty()) {
-      VLOG(3) << "Invalid service state update.";
-      return;
-    }
-    VLOG(3) << "New service state=" << state;
-    OnStateChangeForSelectedService(service_path, state);
-    OnStateChangeForConnectingService(service_path, state);
-  } else if (property_name == shill::kSignalStrengthProperty) {
-    OnStrengthChangeForConnectingService(service_path,
-                                         property_value.TryGet<uint8_t>());
-  }
-}
-
-void ShillClient::OnStateChangeForConnectingService(
-    const ObjectPath& service_path,
-    const string& state) {
-  if (!connecting_service_ ||
-      connecting_service_->GetObjectPath() != service_path ||
-      ShillServiceStateToNetworkState(state) !=
-          weave::NetworkState::kConnected) {
-    return;
-  }
-  connecting_service_reset_pending_ = true;
-  on_connect_success_.callback().Run();
-  CleanupConnectingService(true);
-}
-
-void ShillClient::OnStrengthChangeForConnectingService(
-    const ObjectPath& service_path,
-    uint8_t signal_strength) {
-  if (!connecting_service_ ||
-      connecting_service_->GetObjectPath() != service_path ||
-      signal_strength <= 0 || have_called_connect_) {
-    return;
-  }
-  VLOG(1) << "Connecting service has signal. Calling Connect().";
-  have_called_connect_ = true;
-  // Failures here indicate that we've already connected,
-  // or are connecting, or some other very unexciting thing.
-  // Ignore all that, and rely on state changes to detect
-  // connectivity.
-  connecting_service_->Connect(nullptr);
-}
-
-void ShillClient::OnStateChangeForSelectedService(
-    const ObjectPath& service_path,
-    const string& state) {
-  // Find the device/service pair responsible for this update
-  VLOG(3) << "State for potentially selected service " << service_path.value()
-          << " have changed to " << state;
-  for (auto& kv : devices_) {
-    if (kv.second.selected_service &&
-        kv.second.selected_service->GetObjectPath() == service_path) {
-      VLOG(3) << "Updated cached connection state for selected service.";
-      kv.second.service_state = ShillServiceStateToNetworkState(state);
-      UpdateConnectivityState();
-      return;
-    }
-  }
-}
-
-void ShillClient::UpdateConnectivityState() {
-  // Update the connectivity state of the device by picking the
-  // state of the currently most connected selected service.
-  weave::NetworkState new_connectivity_state{weave::NetworkState::kOffline};
-  for (const auto& kv : devices_) {
-    if (kv.second.service_state > new_connectivity_state) {
-      new_connectivity_state = kv.second.service_state;
-    }
-  }
-  VLOG(1) << "Connectivity changed: " << EnumToString(connectivity_state_)
-          << " -> " << EnumToString(new_connectivity_state);
-  // Notify listeners even if state changed to the same value. Listeners may
-  // want to handle this event.
-  connectivity_state_ = new_connectivity_state;
-  // We may call UpdateConnectivityState whenever we mutate a data structure
-  // such that our connectivity status could change.  However, we don't want
-  // to allow people to call into ShillClient while some other operation is
-  // underway.  Therefore, call our callbacks later, when we're in a good
-  // state.
-  base::MessageLoop::current()->PostTask(
-      FROM_HERE,
-      base::Bind(&ShillClient::NotifyConnectivityListeners,
-                 weak_factory_.GetWeakPtr(),
-                 GetConnectionState() == weave::NetworkState::kConnected));
-}
-
-void ShillClient::NotifyConnectivityListeners(bool am_online) {
-  VLOG(3) << "Notifying connectivity listeners that online=" << am_online;
-  for (const auto& listener : connectivity_listeners_) {
-    listener.Run(am_online);
-  }
-}
-
-void ShillClient::CleanupConnectingService(bool check_for_reset_pending) {
-  if (check_for_reset_pending && !connecting_service_reset_pending_) {
-    return;  // Must have called connect before we got here.
-  }
-  if (connecting_service_) {
-    connecting_service_->ReleaseObjectProxy(base::Bind(&IgnoreDetachEvent));
-    connecting_service_.reset();
-  }
-  on_connect_success_.Cancel();
-  have_called_connect_ = false;
-  connecting_service_reset_pending_ = false;
-}
-
-}  // namespace buffet
diff --git a/buffet/shill_client.h b/buffet/shill_client.h
deleted file mode 100644
index 4d54d60..0000000
--- a/buffet/shill_client.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_SHILL_CLIENT_H_
-#define BUFFET_SHILL_CLIENT_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include <base/callback.h>
-#include <base/cancelable_callback.h>
-#include <base/macros.h>
-#include <base/memory/ref_counted.h>
-#include <base/memory/weak_ptr.h>
-#include <dbus/bus.h>
-#include <weave/network.h>
-
-#include "shill/dbus-proxies.h"
-
-namespace buffet {
-
-class ApManagerClient;
-
-class ShillClient final : public weave::Network {
- public:
-  ShillClient(const scoped_refptr<dbus::Bus>& bus,
-              const std::set<std::string>& device_whitelist);
-  ~ShillClient();
-
-  void Init();
-
-  // Network implementation.
-  void AddOnConnectionChangedCallback(
-      const OnConnectionChangedCallback& listener) override;
-  bool ConnectToService(const std::string& ssid,
-                        const std::string& passphrase,
-                        const base::Closure& on_success,
-                        chromeos::ErrorPtr* error) override;
-  weave::NetworkState GetConnectionState() const override;
-  void EnableAccessPoint(const std::string& ssid) override;
-  void DisableAccessPoint() override;
-
- private:
-  struct DeviceState {
-    std::unique_ptr<org::chromium::flimflam::DeviceProxy> device;
-    // ServiceProxy objects are shared because the connecting service will
-    // also be the selected service for a device, but is not always the selected
-    // service (for instance, in the period between configuring a WiFi service
-    // with credentials, and when Connect() is called.)
-    std::shared_ptr<org::chromium::flimflam::ServiceProxy> selected_service;
-    weave::NetworkState service_state{weave::NetworkState::kOffline};
-  };
-
-  bool IsMonitoredDevice(org::chromium::flimflam::DeviceProxy* device);
-  void OnShillServiceOwnerChange(const std::string& old_owner,
-                                 const std::string& new_owner);
-  void OnManagerPropertyChangeRegistration(const std::string& interface,
-                                           const std::string& signal_name,
-                                           bool success);
-  void OnManagerPropertyChange(const std::string& property_name,
-                               const chromeos::Any& property_value);
-  void OnDevicePropertyChangeRegistration(const dbus::ObjectPath& device_path,
-                                          const std::string& interface,
-                                          const std::string& signal_name,
-                                          bool success);
-  void OnDevicePropertyChange(const dbus::ObjectPath& device_path,
-                              const std::string& property_name,
-                              const chromeos::Any& property_value);
-  void OnServicePropertyChangeRegistration(const dbus::ObjectPath& path,
-                                           const std::string& interface,
-                                           const std::string& signal_name,
-                                           bool success);
-  void OnServicePropertyChange(const dbus::ObjectPath& service_path,
-                               const std::string& property_name,
-                               const chromeos::Any& property_value);
-
-  void OnStateChangeForConnectingService(const dbus::ObjectPath& service_path,
-                                         const std::string& state);
-  void OnStrengthChangeForConnectingService(
-      const dbus::ObjectPath& service_path,
-      uint8_t signal_strength);
-  void OnStateChangeForSelectedService(const dbus::ObjectPath& service_path,
-                                       const std::string& state);
-  void UpdateConnectivityState();
-  void NotifyConnectivityListeners(bool am_online);
-  // Clean up state related to a connecting service.  If
-  // |check_for_reset_pending| is set, then we'll check to see if we've called
-  // ConnectToService() in the time since a task to call this function was
-  // posted.
-  void CleanupConnectingService(bool check_for_reset_pending);
-
-  const scoped_refptr<dbus::Bus> bus_;
-  org::chromium::flimflam::ManagerProxy manager_proxy_;
-  // There is logic that assumes we will never change this device list
-  // in OnManagerPropertyChange.  Do not be tempted to remove this const.
-  const std::set<std::string> device_whitelist_;
-  std::vector<OnConnectionChangedCallback> connectivity_listeners_;
-
-  // State for tracking where we are in our attempts to connect to a service.
-  bool connecting_service_reset_pending_{false};
-  bool have_called_connect_{false};
-  std::shared_ptr<org::chromium::flimflam::ServiceProxy> connecting_service_;
-  base::CancelableClosure on_connect_success_;
-
-  // State for tracking our online connectivity.
-  std::map<dbus::ObjectPath, DeviceState> devices_;
-  weave::NetworkState connectivity_state_{weave::NetworkState::kOffline};
-
-  std::unique_ptr<ApManagerClient> ap_manager_client_;
-
-  base::WeakPtrFactory<ShillClient> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(ShillClient);
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_SHILL_CLIENT_H_
diff --git a/buffet/test_daemon/main.cc b/buffet/test_daemon/main.cc
deleted file mode 100644
index eeb0caf..0000000
--- a/buffet/test_daemon/main.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a sample daemon that "handles" Buffet commands.
-// It just prints the information about the command received to stdout and
-// marks the command as processed.
-
-#include <string>
-#include <sysexits.h>
-
-#include <base/bind.h>
-#include <base/command_line.h>
-#include <base/format_macros.h>
-#include <base/json/json_writer.h>
-#include <base/values.h>
-#include <chromeos/daemons/dbus_daemon.h>
-#include <chromeos/map_utils.h>
-#include <chromeos/strings/string_utils.h>
-#include <chromeos/syslog_logging.h>
-
-#include "buffet/dbus-proxies.h"
-
-namespace {
-const char kTestCommandCategory[] = "test";
-
-std::unique_ptr<base::DictionaryValue> DictionaryToJson(
-    const chromeos::VariantDictionary& dictionary);
-
-std::unique_ptr<base::Value> AnyToJson(const chromeos::Any& value) {
-  if (value.IsTypeCompatible<chromeos::VariantDictionary>())
-    return DictionaryToJson(value.Get<chromeos::VariantDictionary>());
-
-  if (value.IsTypeCompatible<std::string>()) {
-    return std::unique_ptr<base::Value>{
-        new base::StringValue(value.Get<std::string>())};
-  }
-
-  if (value.IsTypeCompatible<double>()) {
-    return std::unique_ptr<base::Value>{
-        new base::FundamentalValue(value.Get<double>())};
-  }
-
-  if (value.IsTypeCompatible<bool>()) {
-    return std::unique_ptr<base::Value>{
-        new base::FundamentalValue(value.Get<bool>())};
-  }
-
-  if (value.IsTypeCompatible<int>()) {
-    return std::unique_ptr<base::Value>{
-        new base::FundamentalValue(value.Get<int>())};
-  }
-
-  LOG(FATAL) << "Unsupported type:" << value.GetType().name();
-  return {};
-}
-
-std::unique_ptr<base::DictionaryValue> DictionaryToJson(
-    const chromeos::VariantDictionary& dictionary) {
-  std::unique_ptr<base::DictionaryValue> result{new base::DictionaryValue};
-  for (const auto& it : dictionary)
-    result->Set(it.first, AnyToJson(it.second).release());
-  return result;
-}
-
-std::string DictionaryToString(const chromeos::VariantDictionary& dictionary) {
-  std::unique_ptr<base::DictionaryValue> json{DictionaryToJson(dictionary)};
-  std::string str;
-  base::JSONWriter::Write(*json, &str);
-  return str;
-}
-
-}  // anonymous namespace
-
-class Daemon final : public chromeos::DBusDaemon {
- public:
-  Daemon() = default;
-
- protected:
-  int OnInit() override;
-  void OnShutdown(int* return_code) override;
-
- private:
-  std::unique_ptr<org::chromium::Buffet::ObjectManagerProxy> object_manager_;
-
-  void OnBuffetCommand(org::chromium::Buffet::CommandProxy* command);
-  void OnBuffetCommandRemoved(const dbus::ObjectPath& object_path);
-  void OnPropertyChange(org::chromium::Buffet::CommandProxy* command,
-                        const std::string& property_name);
-  void OnCommandProgress(org::chromium::Buffet::CommandProxy* command,
-                         int progress);
-
-  DISALLOW_COPY_AND_ASSIGN(Daemon);
-};
-
-int Daemon::OnInit() {
-  int return_code = chromeos::DBusDaemon::OnInit();
-  if (return_code != EX_OK)
-    return return_code;
-
-  object_manager_.reset(new org::chromium::Buffet::ObjectManagerProxy{bus_});
-  object_manager_->SetCommandAddedCallback(
-      base::Bind(&Daemon::OnBuffetCommand, base::Unretained(this)));
-  object_manager_->SetCommandRemovedCallback(
-      base::Bind(&Daemon::OnBuffetCommandRemoved, base::Unretained(this)));
-
-  printf("Waiting for commands...\n");
-  return EX_OK;
-}
-
-void Daemon::OnShutdown(int* return_code) {
-  printf("Shutting down...\n");
-}
-
-void Daemon::OnPropertyChange(org::chromium::Buffet::CommandProxy* command,
-                              const std::string& property_name) {
-  printf("Notification: property '%s' on command '%s' changed.\n",
-         property_name.c_str(), command->id().c_str());
-  printf("  Current command status: '%s'\n", command->status().c_str());
-  std::string progress = DictionaryToString(command->progress());
-  printf("  Current command progress: %s\n", progress.c_str());
-  std::string results = DictionaryToString(command->results());
-  printf("  Current command results: %s\n", results.c_str());
-}
-
-void Daemon::OnBuffetCommand(org::chromium::Buffet::CommandProxy* command) {
-  // "Handle" only commands that belong to this daemon's category.
-  if (command->category() != kTestCommandCategory ||
-      command->status() == "done") {
-    return;
-  }
-
-  command->SetPropertyChangedCallback(base::Bind(&Daemon::OnPropertyChange,
-                                                 base::Unretained(this)));
-  printf("++++++++++++++++++++++++++++++++++++++++++++++++\n");
-  printf("Command received: %s\n", command->name().c_str());
-  printf("DBus Object Path: %s\n", command->GetObjectPath().value().c_str());
-  printf("        category: %s\n", command->category().c_str());
-  printf("              ID: %s\n", command->id().c_str());
-  printf("          status: %s\n", command->status().c_str());
-  printf("          origin: %s\n", command->origin().c_str());
-  std::string param_names = DictionaryToString(command->parameters());
-  printf(" parameters: %s\n", param_names.c_str());
-  OnCommandProgress(command, 0);
-}
-
-void Daemon::OnCommandProgress(org::chromium::Buffet::CommandProxy* command,
-                               int progress) {
-  printf("Updating command '%s' progress to %d%%\n", command->id().c_str(),
-         progress);
-  auto new_progress = command->progress();
-  new_progress["progress"] = progress;
-  command->SetProgress(new_progress, nullptr);
-
-  if (progress >= 100) {
-    command->Done(nullptr);
-  } else {
-    base::MessageLoop::current()->PostDelayedTask(
-        FROM_HERE, base::Bind(&Daemon::OnCommandProgress,
-                              base::Unretained(this), command, progress + 10),
-        base::TimeDelta::FromSeconds(1));
-  }
-}
-
-void Daemon::OnBuffetCommandRemoved(const dbus::ObjectPath& object_path) {
-  printf("------------------------------------------------\n");
-  printf("Command removed\n");
-  printf("DBus Object Path: %s\n", object_path.value().c_str());
-}
-
-int main(int argc, char* argv[]) {
-  base::CommandLine::Init(argc, argv);
-  chromeos::InitLog(chromeos::kLogToSyslog |
-                    chromeos::kLogToStderr |
-                    chromeos::kLogHeader);
-  Daemon daemon;
-  return daemon.Run();
-}
diff --git a/buffet/webserv_client.cc b/buffet/webserv_client.cc
deleted file mode 100644
index 2ae5910..0000000
--- a/buffet/webserv_client.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2015 The Chromium OS 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 "buffet/webserv_client.h"
-
-#include <memory>
-#include <string>
-
-#include <libwebserv/protocol_handler.h>
-#include <libwebserv/request.h>
-#include <libwebserv/response.h>
-#include <libwebserv/server.h>
-
-#include "buffet/dbus_constants.h"
-
-namespace buffet {
-
-namespace {
-
-class RequestImpl : public weave::HttpServer::Request {
- public:
-  explicit RequestImpl(std::unique_ptr<libwebserv::Request> request)
-      : request_{std::move(request)} {}
-  ~RequestImpl() override {}
-
-  // HttpServer::Request implementation.
-  const std::string& GetPath() const override { return request_->GetPath(); }
-  std::string GetFirstHeader(const std::string& name) const override {
-    return request_->GetFirstHeader(name);
-  }
-  const std::vector<uint8_t>& GetData() const override {
-    return request_->GetData();
-  }
-
- private:
-  std::unique_ptr<libwebserv::Request> request_;
-
-  DISALLOW_COPY_AND_ASSIGN(RequestImpl);
-};
-
-}  // namespace
-
-WebServClient::~WebServClient() {
-  web_server_->Disconnect();
-}
-
-void WebServClient::AddOnStateChangedCallback(
-    const OnStateChangedCallback& callback) {
-  on_state_changed_callbacks_.push_back(callback);
-  callback.Run(*this);
-}
-
-void WebServClient::AddRequestHandler(const std::string& path_prefix,
-                                      const OnRequestCallback& callback) {
-  web_server_->GetDefaultHttpHandler()->AddHandlerCallback(
-      path_prefix, "", base::Bind(&WebServClient::OnRequest,
-                                  weak_ptr_factory_.GetWeakPtr(), callback));
-  web_server_->GetDefaultHttpsHandler()->AddHandlerCallback(
-      path_prefix, "", base::Bind(&WebServClient::OnRequest,
-                                  weak_ptr_factory_.GetWeakPtr(), callback));
-}
-
-uint16_t WebServClient::GetHttpPort() const {
-  return http_port_;
-}
-
-uint16_t WebServClient::GetHttpsPort() const {
-  return https_port_;
-}
-
-const chromeos::Blob& WebServClient::GetHttpsCertificateFingerprint() const {
-  return certificate_;
-}
-
-WebServClient::WebServClient(
-    const scoped_refptr<dbus::Bus>& bus,
-    chromeos::dbus_utils::AsyncEventSequencer* sequencer) {
-  web_server_.reset(new libwebserv::Server);
-  web_server_->OnProtocolHandlerConnected(
-      base::Bind(&WebServClient::OnProtocolHandlerConnected,
-                 weak_ptr_factory_.GetWeakPtr()));
-  web_server_->OnProtocolHandlerDisconnected(
-      base::Bind(&WebServClient::OnProtocolHandlerDisconnected,
-                 weak_ptr_factory_.GetWeakPtr()));
-
-  web_server_->Connect(bus, buffet::kServiceName,
-                       sequencer->GetHandler("Server::Connect failed.", true),
-                       base::Bind(&base::DoNothing),
-                       base::Bind(&base::DoNothing));
-}
-
-void WebServClient::OnRequest(const OnRequestCallback& callback,
-                              std::unique_ptr<libwebserv::Request> request,
-                              std::unique_ptr<libwebserv::Response> response) {
-  callback.Run(
-      RequestImpl{std::move(request)},
-      base::Bind(&WebServClient::OnResponse, weak_ptr_factory_.GetWeakPtr(),
-                 base::Passed(&response)));
-}
-
-void WebServClient::OnResponse(std::unique_ptr<libwebserv::Response> response,
-                               int status_code,
-                               const std::string& data,
-                               const std::string& mime_type) {
-  response->Reply(status_code, data.data(), data.size(), mime_type);
-}
-
-void WebServClient::OnProtocolHandlerConnected(
-    libwebserv::ProtocolHandler* protocol_handler) {
-  if (protocol_handler->GetName() == libwebserv::ProtocolHandler::kHttp) {
-    http_port_ = *protocol_handler->GetPorts().begin();
-  } else if (protocol_handler->GetName() ==
-             libwebserv::ProtocolHandler::kHttps) {
-    https_port_ = *protocol_handler->GetPorts().begin();
-    certificate_ = protocol_handler->GetCertificateFingerprint();
-  }
-  for (const auto& cb : on_state_changed_callbacks_)
-    cb.Run(*this);
-}
-
-void WebServClient::OnProtocolHandlerDisconnected(
-    libwebserv::ProtocolHandler* protocol_handler) {
-  if (protocol_handler->GetName() == libwebserv::ProtocolHandler::kHttp) {
-    http_port_ = 0;
-  } else if (protocol_handler->GetName() ==
-             libwebserv::ProtocolHandler::kHttps) {
-    https_port_ = 0;
-    certificate_.clear();
-  }
-  for (const auto& cb : on_state_changed_callbacks_)
-    cb.Run(*this);
-}
-
-}  // namespace buffet
diff --git a/buffet/webserv_client.h b/buffet/webserv_client.h
deleted file mode 100644
index d7b5433..0000000
--- a/buffet/webserv_client.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_WEBSERV_CLIENT_H_
-#define BUFFET_WEBSERV_CLIENT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <base/memory/weak_ptr.h>
-#include <weave/http_server.h>
-
-namespace dbus {
-class Bus;
-}
-
-namespace chromeos {
-namespace dbus_utils {
-class AsyncEventSequencer;
-}
-}
-
-namespace libwebserv {
-class ProtocolHandler;
-class Request;
-class Response;
-class Server;
-}
-
-namespace buffet {
-
-// Wrapper around libwebserv that implements HttpServer interface.
-class WebServClient : public weave::HttpServer {
- public:
-  WebServClient(const scoped_refptr<dbus::Bus>& bus,
-                chromeos::dbus_utils::AsyncEventSequencer* sequencer);
-  ~WebServClient() override;
-
-  // HttpServer implementation.
-  void AddOnStateChangedCallback(
-      const OnStateChangedCallback& callback) override;
-  void AddRequestHandler(const std::string& path_prefix,
-                         const OnRequestCallback& callback) override;
-  uint16_t GetHttpPort() const override;
-  uint16_t GetHttpsPort() const override;
-  const chromeos::Blob& GetHttpsCertificateFingerprint() const override;
-
- private:
-  void OnRequest(const OnRequestCallback& callback,
-                 std::unique_ptr<libwebserv::Request> request,
-                 std::unique_ptr<libwebserv::Response> response);
-
-  void OnResponse(std::unique_ptr<libwebserv::Response> response,
-                  int status_code,
-                  const std::string& data,
-                  const std::string& mime_type);
-
-  void OnProtocolHandlerConnected(
-      libwebserv::ProtocolHandler* protocol_handler);
-
-  void OnProtocolHandlerDisconnected(
-      libwebserv::ProtocolHandler* protocol_handler);
-
-  uint16_t http_port_{0};
-  uint16_t https_port_{0};
-  chromeos::Blob certificate_;
-
-  std::vector<OnStateChangedCallback> on_state_changed_callbacks_;
-
-  std::unique_ptr<libwebserv::Server> web_server_;
-
-  base::WeakPtrFactory<WebServClient> weak_ptr_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(WebServClient);
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_WEBSERV_CLIENT_H_
