Merge remote-tracking branch 'weave/master' into dev_dev2

* weave/master:
  Generate header file dependencies
  Remove unused function
  libweave: Remove gyp build files.
  libweave: Add clang support to Makefile.
  Fix path in documentation.
  Update README.md with markdown formatting
  Rename README to README.md
  libweave: Build with Makefile instead of GYP.
  Don't allow registration of registered device
  Update command definition of sample daemon
  Update examples README file
diff --git a/.gitignore b/.gitignore
index 3ee16a1..a256906 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,5 @@
-*.target.mk
 *~
 /out/
 /third_party/include
 /third_party/lib
 gomacc.lock
-Makefile
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index b45bd87..0bb7f26 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -19,6 +19,7 @@
 David Zeuthen <zeuthen@google.com>
 Gene Gutnik <gene@google.com>
 Gerry Fan <gfan@google.com>
+Jacob Marble <jacobmarble@google.com>
 Johan Euphrosine <proppy@google.com>
 Mike Frysinger <vapier@google.com>
 Nathan Bullock <nathanbullock@google.com>
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d08be68
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,103 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Run make with BUILD_MODE=Release for release.
+BUILD_MODE ?= Debug
+
+DEFS_Debug := \
+	-D_DEBUG
+
+DEFS_Release := \
+	-DNDEBUG
+
+INCLUDES := \
+	-I. \
+	-Iinclude \
+	-Ithird_party/chromium \
+	-Ithird_party/include \
+	-Ithird_party/libuweave \
+	-Ithird_party/modp_b64/modp_b64
+
+CFLAGS := \
+	-fno-exceptions \
+	-fPIC \
+	-fvisibility=hidden \
+	-Wall \
+	-Werror \
+	-Wextra \
+	-Wl,--exclude-libs,ALL \
+	-Wno-char-subscripts \
+	-Wno-format-nonliteral \
+	-Wno-missing-field-initializers \
+	-Wno-unused-local-typedefs \
+	-Wno-unused-parameter \
+	-Wpacked \
+	-Wpointer-arith \
+	-Wwrite-strings
+
+CFLAGS_Debug := \
+	-O0   \
+	-g3
+
+CFLAGS_Release := \
+	-Os
+
+CFLAGS_C := \
+	-std=c99
+
+CFLAGS_CC := \
+	-std=c++11
+
+comma := ,
+ifeq (1, $(CLANG))
+  CC = $(shell which clang-3.6)
+  CXX = $(shell which clang++-3.6)
+  CFLAGS := $(filter-out -Wl$(comma)--exclude-libs$(comma)ALL,$(CFLAGS))
+  CFLAGS += \
+    -fno-omit-frame-pointer \
+    -Wno-deprecated-register \
+    -Wno-inconsistent-missing-override
+  ifeq (Debug, $(BUILD_MODE))
+    CFLAGS += \
+      -fsanitize=address
+    LDFLAGS += \
+      -fsanitize=address
+  endif
+endif
+
+# Headers dependencies.
+CFLAGS += -MMD
+OBJFILES = $(shell find out/$(BUILD_MODE)/ -type f -name '*.o')
+-include $(OBJFILES:.o=.d)
+
+###
+# libweave.so
+
+out/$(BUILD_MODE)/libweave.so : out/$(BUILD_MODE)/libweave_common.a
+	$(CXX) -shared -Wl,-soname=libweave.so -o $@ -Wl,--whole-archive $^ -Wl,--no-whole-archive -lcrypto -lexpat -lpthread -lrt
+
+include file_lists.mk third_party/third_party.mk examples/examples.mk tests.mk
+
+###
+# src/
+
+weave_obj_files := $(WEAVE_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(weave_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave_common.a : $(weave_obj_files) $(third_party_chromium_base_obj_files) $(third_party_chromium_crypto_obj_files) $(third_party_modp_b64_obj_files) $(third_party_libuweave_obj_files)
+	rm -f $@
+	$(AR) crsT $@ $^
+
+all : out/$(BUILD_MODE)/libweave.so out/$(BUILD_MODE)/libweave_exports_testrunner out/$(BUILD_MODE)/libweave_testrunner all-examples
+
+clean :
+	rm -rf out
+
+cleanall : clean clean-gtest clean-libevent
+
+.PHONY : clean cleanall all
+
diff --git a/README b/README
deleted file mode 100644
index c78283b..0000000
--- a/README
+++ /dev/null
@@ -1,131 +0,0 @@
-Overview
---------
-libWeave is the library with device side implementation of Weave
-protocol.
-
-Sources
--------
-Sources are located in git repository at
-https://weave.googlesource.com/weave/libweave/
-
-
-Install Repo
--------
-1. Make sure you have a bin/ directory in your home directory
-and that it is included in your path:
-
-    mkdir ~/bin
-    PATH=~/bin:$PATH
-
-2. Download the Repo tool and ensure that it is executable:
-
-    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
-    chmod a+x ~/bin/repo
-
-Checkout code
--------
-    repo init -u https://weave.googlesource.com/weave/manifest
-    repo sync
-
-Directory structure
--------------------
-Includes to be used by device code:
-  include/
-
-Implementation sources:
-  src/
-
-Example of device code:
-  examples/
-
-Dependencies:
-  third_party/
-
-Build files:
-  libweave_standalone.gyp
-  libweave_common.gypi
-
-Quick start on Debian/Ubuntu
-----------------------------
-
-Install prerequisites:
-
-  examples/prerequisites.sh
-
-Build library, tests, run tests, build example:
-
-  examples/build.sh
-
-Execute example (check examples/daemon/README for details):
-
-  sudo out/Debug/weave_daemon
-
-
-Prerequisites
--------------
-Common:
-
-  autoconf
-  automake
-  binutils
-  libtool
-  gyp
-  libexpat1-dev
-
-For tests:
-
-  gtest
-  gmock
-
-For examples:
-
-  hostapd
-  libavahi-client-dev
-  libcurl4-openssl-dev
-  libevent 2.1.x-alpha
-
-
-Compiling
----------
-Everywhere below Debug can be replaced with Release.
-
-Generate build files:
-
-  gyp -I libweave_common.gypi --toplevel-dir=. --depth=. \
-      -f make libweave_standalone.gyp
-
-Build library with tests:
-
-  make
-
-Build library only:
-
-  make libweave
-
-Testing
--------
-Run unittests tests:
-
-  out/Debug/libweave_testrunner
-  out/Debug/libweave_exports_testrunner
-
-Making changes
---------------
-Make sure to have correct user in local or global config e.g.:
-
-  git config --local user.name "John Doe"
-  git config --local user.email johndoe@example.com
-
-Start local branch
-
-  repo start <branch name> .
-
-Edit code and commit locally e.g.:
-
-  git commit -a -v
-
-Upload CL:
-
-  repo upload .
-
-Go to the url from the output of "repo upload" and add reviewers.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5f69b01
--- /dev/null
+++ b/README.md
@@ -0,0 +1,152 @@
+# Overview
+
+libWeave is the library with device side implementation of Weave protocol.
+
+# Sources
+
+Sources are located in git repository at
+https://weave.googlesource.com/weave/libweave/
+
+
+# Install Repo
+
+Make sure you have a bin/ directory in your home directory
+and that it is included in your path:
+
+```
+mkdir ~/bin
+PATH=~/bin:$PATH
+```
+
+Download the Repo tool and ensure that it is executable:
+
+```
+curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
+chmod a+x ~/bin/repo
+```
+
+# Checkout code
+
+```
+repo init -u https://weave.googlesource.com/weave/manifest
+repo sync
+```
+
+# Directory structure
+
+| Path                     | Description                        |
+|--------------------------|------------------------------------|
+| include/                 | Includes to be used by device code |
+| src/                     | Implementation sources             |
+| examples/                | Example of device code             |
+| third_party/             | Dependencies                       |
+| Makefile, \*.mk files    | Build files                        |
+
+
+# Quick start on Debian/Ubuntu
+
+### Install prerequisites
+
+```
+sudo apt-get update
+sudo apt-get install autoconf automake binutils g++ hostapd libavahi-client-dev libcurl4-openssl-dev libexpat1-dev libnl-3-dev libnl-route-3-dev libssl-dev libtool
+```
+
+# Prerequisites
+
+### Common
+
+  - autoconf
+  - automake
+  - binutils
+  - libtool
+  - libexpat1-dev
+
+### For tests
+
+  - gtest (included; see third_party/get_gtest.sh)
+  - gmock (included; see third_party/get_gtest.sh)
+
+### For examples
+
+  - hostapd
+  - libavahi-client-dev
+  - libcurl4-openssl-dev
+  - libevent 2.1.x-alpha (included; see third_party/get_libevent.sh)
+
+
+# Compiling
+
+The `make --jobs/-j` flag is encouraged, to speed up build time. For example
+
+```
+make all -j
+```
+
+### Build library
+
+```
+make
+
+```
+
+or
+
+```
+make out/Debug/libweave.so
+```
+
+### Build examples
+
+```
+make examples-all
+```
+
+See [the examples README](/examples/daemon/README.md) for details.
+
+# Testing
+
+### Run tests
+
+```
+make test
+make export-test
+```
+
+or
+
+```
+make testall
+```
+
+# Making changes
+
+### Configure git
+Make sure to have correct user in local or global config e.g.:
+
+```
+git config --local user.name "User Name"
+git config --local user.email user.name@example.com
+```
+
+### Start local branch
+
+```
+repo start <branch name> .
+```
+
+### Edit code and commit locally e.g.
+
+```
+git commit -a -v
+```
+
+### Upload CL
+
+```
+repo upload .
+```
+
+### Request code review
+
+Go to the url from the output of "repo upload" and add reviewers.
diff --git a/examples/build.sh b/examples/build.sh
index 262c56b..6a2450d 100755
--- a/examples/build.sh
+++ b/examples/build.sh
@@ -3,26 +3,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+# Instead of this script, try running "make all -j" and "make testall".
+# TODO: Delete this file after 15-feb-2016.
+
 DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
 ROOT_DIR=$(cd -P -- "$(dirname -- "$0")/.." && pwd -P)
 
 cd $ROOT_DIR
 
-gyp -Ilibweave_common.gypi --toplevel-dir=. --depth=. -f make $DIR/daemon/examples.gyp
-
-if [ -z "$BUILD_CONFIG" ]; then
-   export BUILD_CONFIG=Debug
-fi
-
-export BUILD_TARGET=$*
-if [ -z "$BUILD_TARGET" ]; then
-   export BUILD_TARGET="weave_daemon_examples libweave_testrunner libweave_exports_testrunner"
-fi
-
-export CORES=`cat /proc/cpuinfo | grep processor | wc -l`
-BUILDTYPE=$BUILD_CONFIG make -j $CORES $BUILD_TARGET || exit 1
-
-if [[ $BUILD_TARGET == *"libweave_testrunner"* ]]; then
-  out/${BUILD_CONFIG}/libweave_testrunner --gtest_break_on_failure || exit 1
-  out/${BUILD_CONFIG}/libweave_exports_testrunner --gtest_break_on_failure || exit 1
-fi
+make all -j
diff --git a/examples/daemon/README b/examples/daemon/README
deleted file mode 100644
index ef52a47..0000000
--- a/examples/daemon/README
+++ /dev/null
@@ -1,112 +0,0 @@
-Overview
---------
-The wrapper implements OS dependent services for libweave
-
-Building
---------
-  - prepare environment
-        examples/prerequisites.sh
-  - build daemon
-        examples/build.sh
-  - binaries for daemon are in the directory
-        out/Debug/
-
-Prepare Host OS
----------------
-enable user-service-publishing in avahi daemon
-    file:    /etc/avahi/avahi-daemon.conf
-    check:   disable-user-service-publishing=no
-    restart: sudo service avahi-daemon restart
-
-Acquire Registration Ticket
----------------------------
-Goto https://developers.google.com/oauthplayground/
-  - "Step 1", paste to "Authorize APIs" with
-          https://www.googleapis.com/auth/clouddevices
-        click "Authorize APIs", then "Allow" to get an
-        "authorization code"
-  - "Step 2", "Exchange authorization code for tokens"
-  - "Step 3", obtain a registration ticket for your new weave device
-         HTTP Method:  POST
-         Request URI:  https://www.googleapis.com/weave/v1/registrationTickets
-         Enter request body:
-            {
-              "userEmail": "me"
-            }
-         then "Send the request", a ticket id will be returned in
-            {
-              "userEmail": "user@google.com",
-              "kind": "weave#registrationTicket",
-              "expirationTimeMs": "1443204934855",
-              "deviceId": "0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d",
-              "creationTimeMs": "1443204694855",
-              "id": "93019287-6b26-04a0-22ee-d55ad23a4226"
-            }
-    Note: the ticket "id" is not used within 240 sec, it will be expired.
-
-Register device to cloud
-------------------------
-  - copy the ticket "id" generated above
-        93019287-6b26-04a0-22ee-d55ad23a4226
-  - go to terminal, register and start the daemon with
-
-        sudo out/Debug/weave_daemon_sample --registration_ticket=93019287-6b26-04a0-22ee-d55ad23a4226
-
-        you should see something like:
-          Publishing service
-          Saving settings to /var/lib/weave/weave_settings.json
-
-       note: in second and future runs, --registration_ticket
-             options is not necessary anymore
-
-  - get your device id with
-          sudo cat /var/lib/weave/weave_settings.json
-       you should see
-            ...
-            "device_id": 0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d
-            ...
-
-       this device_id shall be used for future communication
-       with your device. it does not expire and no need to
-       register.
-
-  - verify device is up with Weave Device Manager at
-        android: https://play.google.com/apps/testing/com.google.android.apps.weave.management
-        chrome: https://chrome.google.com/webstore/detail/weave-device-manager/pcdgflbjckpjmlofgopidgdfonmnodfm
-        [need your whitelisted EAP account]
-
-Send Command to the Daemon
---------------------------
-  - go to the oauthplayground used for registration ticket command
-     in "Step 3", send base.identify with
-        HTTP Method: POST
-        Request URI: https://www.googleapis.com/weave/v1/commands
-        Enter request body:
-        {
-          "deviceId": "0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d",
-          "name": "_sample._hello",
-          "parameters": { "_name": "cloud user" }
-        }
-   "Send the request", you command will be "queued" as its "state"
-
-  - verify the command execution with weave daemon
-       in terminal running the daemon, observe something similar to
-         New command '_sample._hello' arrived, ...
-         received command: _sample._hello
-         _sample._hello command: finished
-  - verify the command history with oauthplayground
-       Similar to "Acquire Registration Ticket" section in this document,
-       except in "step 3", do:
-
-       HTTP Method:  GET    [not POST anymore]
-       Request URI:  https://www.googleapis.com/weave/v1/commands?deviceId=0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d
-
-       "Send the request", you get all of the commands executed on your
-       device, find something like
-          "kind": "weave#command",
-          "name": "_sample._hello",
-          "results": {
-            "_reply": "Hello cloud user"
-          },
-          ...
-
diff --git a/examples/daemon/README.md b/examples/daemon/README.md
new file mode 100644
index 0000000..4585b5b
--- /dev/null
+++ b/examples/daemon/README.md
@@ -0,0 +1,122 @@
+# Overview
+
+The wrapper implements OS dependent services for libweave
+
+# Building
+
+### Build daemon examples
+
+The example binaries land in the out/Debug/ directory build all of them at once:
+
+```
+make all-examples
+```
+
+...or one at a time.
+
+```
+make out/Debug/weave_daemon_light
+```
+
+# Prepare Host OS
+
+### Enable user-service-publishing in avahi daemon
+Set disable-user-service-publishing=no in /etc/avahi/avahi-daemon.conf
+
+#### restart avahi
+```
+sudo service avahi-daemon restart
+```
+
+# Control device with the cloud
+
+### Generate registration ticket
+- Go to [OAuth 2.0 Playground](https://developers.google.com/oauthplayground/)
+- "Step 1": Paste https://www.googleapis.com/auth/clouddevices and click to "Authorize APIs"
+- "Step 2": Click "Exchange authorization code for tokens"
+- "Step 3": Fill the form:
+    * HTTP Method: POST
+    * Request URI: https://www.googleapis.com/weave/v1/registrationTickets
+    * Enter request body: ```{"userEmail": "me"}```
+    * Click "Send the request", a ticket id will be returned in
+
+```
+            {
+              "userEmail": "user@google.com",
+              "kind": "weave#registrationTicket",
+              "expirationTimeMs": "1443204934855",
+              "deviceId": "0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d",
+              "creationTimeMs": "1443204694855",
+              "id": "93019287-6b26-04a0-22ee-d55ad23a4226"
+            }
+```
+- Note: the ticket "id" is not used within 240 sec, it will be expired.
+
+
+### Register device to cloud
+
+- Copy the ticket "id" generated above: ```93019287-6b26-04a0-22ee-d55ad23a4226```
+- Go to terminal, register and start the daemon with
+
+```
+        sudo out/Debug/weave_daemon_sample --registration_ticket=93019287-6b26-04a0-22ee-d55ad23a4226
+```
+
+- See something like:
+
+```
+        Publishing service
+        Saving settings to /var/lib/weave/weave_settings.json
+```
+
+- Note: in second and future runs, --registration_ticket options is not necessary anymore
+- Get your device id with
+
+```
+        sudo cat /var/lib/weave/weave_settings.json
+```
+
+- See something like:
+
+```
+        ...
+        "device_id": 0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d
+        ...
+```
+
+- Use this device_id for future communication with your device. It does not expire.
+- Verify device is up with Weave Device Managers on
+[Android](https://play.google.com/apps/testing/com.google.android.apps.weave.management),
+[Chrome](https://chrome.google.com/webstore/detail/weave-device-manager/pcdgflbjckpjmlofgopidgdfonmnodfm)
+or [Weave Developpers Console](https://weave.google.com/console/)
+
+### Send Command to the Daemon
+
+- Go to [OAuth 2.0 Playground](https://developers.google.com/oauthplayground/)
+- "Step 1": Paste https://www.googleapis.com/auth/clouddevices and click to "Authorize APIs"
+- "Step 2": Click "Exchange authorization code for tokens"
+- "Step 3": Fill the form:
+    * HTTP Method: POST
+    * Request URI: https://www.googleapis.com/weave/v1/commands
+    * Enter request body:
+
+```
+        {
+          "deviceId": "0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d",
+          "name": "_sample.hello",
+          "component": "sample",
+          "parameters": { "name": "cloud user" }
+        }
+
+```
+
+- "Send the request", you command will be "queued" as its "state"
+- Verify the command execution observing daemon console logs
+- Verify the command usign [Weave Developpers Console](https://weave.google.com/console/)
+- Verify the command history with [OAuth 2.0 Playground](https://developers.google.com/oauthplayground/)
+- "Step 1": Paste https://www.googleapis.com/auth/clouddevices and click to "Authorize APIs"
+- "Step 2": Click "Exchange authorization code for tokens"
+- "Step 3": Fill the form:
+    * HTTP Method: GET
+    * Request URI: https://www.googleapis.com/weave/v1/commands?deviceId=0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d
+    * Click "Send the request", you get all of the commands executed on your device.
diff --git a/examples/daemon/examples.gyp b/examples/daemon/examples.gyp
deleted file mode 100644
index d63c5e4..0000000
--- a/examples/daemon/examples.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_examples',
-      'type': 'none',
-      'dependencies': [
-        'sample/daemon.gyp:weave_daemon_sample',
-        'light/daemon.gyp:weave_daemon_light',
-        'lock/daemon.gyp:weave_daemon_lock',
-        'ledflasher/daemon.gyp:weave_daemon_ledflasher',
-        'speaker/daemon.gyp:weave_daemon_speaker',
-        'oven/daemon.gyp:weave_daemon_oven',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/ledflasher/daemon.gyp b/examples/daemon/ledflasher/daemon.gyp
deleted file mode 100644
index 5abfcd6..0000000
--- a/examples/daemon/ledflasher/daemon.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_ledflasher',
-      'type': 'executable',
-      'sources': [
-        'ledflasher.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/light/daemon.gyp b/examples/daemon/light/daemon.gyp
deleted file mode 100644
index e8bb646..0000000
--- a/examples/daemon/light/daemon.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_light',
-      'type': 'executable',
-      'sources': [
-        'light.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/lock/daemon.gyp b/examples/daemon/lock/daemon.gyp
deleted file mode 100644
index 0402a29..0000000
--- a/examples/daemon/lock/daemon.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_lock',
-      'type': 'executable',
-      'sources': [
-        'lock.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/oven/daemon.gyp b/examples/daemon/oven/daemon.gyp
deleted file mode 100644
index 44b4798..0000000
--- a/examples/daemon/oven/daemon.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_oven',
-      'type': 'executable',
-      'sources': [
-        'oven.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/sample/daemon.gyp b/examples/daemon/sample/daemon.gyp
deleted file mode 100644
index 29d8235..0000000
--- a/examples/daemon/sample/daemon.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_sample',
-      'type': 'executable',
-      'sources': [
-        'sample.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/daemon/sample/sample.cc b/examples/daemon/sample/sample.cc
index 1d036d5..f4ad3d9 100644
--- a/examples/daemon/sample/sample.cc
+++ b/examples/daemon/sample/sample.cc
@@ -19,6 +19,9 @@
         "minimalRole": "user",
         "parameters": {
           "name": { "type": "string" }
+        },
+        "results": {
+          "reply": { "type": "string" }
         }
       },
       "ping": {
@@ -107,10 +110,9 @@
                               base::FundamentalValue{++ping_count_}, nullptr);
     LOG(INFO) << "New component state: " << device_->GetComponents();
 
-    base::DictionaryValue result;
-    cmd->Complete(result, nullptr);
+    cmd->Complete({}, nullptr);
 
-    LOG(INFO) << cmd->GetName() << " command finished: " << result;
+    LOG(INFO) << cmd->GetName() << " command finished";
   }
 
   void OnCountdownCommand(const std::weak_ptr<weave::Command>& command) {
@@ -146,10 +148,9 @@
       return;
     }
 
-    base::DictionaryValue result;
-    cmd->Complete(result, nullptr);
+    cmd->Complete({}, nullptr);
     LOG(INFO) << "countdown finished";
-    LOG(INFO) << cmd->GetName() << " command finished: " << result;
+    LOG(INFO) << cmd->GetName() << " command finished";
   }
 
   weave::Device* device_{nullptr};
diff --git a/examples/daemon/speaker/daemon.gyp b/examples/daemon/speaker/daemon.gyp
deleted file mode 100644
index 3bf7a91..0000000
--- a/examples/daemon/speaker/daemon.gyp
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'targets': [
-    {
-      'target_name': 'weave_daemon_speaker',
-      'type': 'executable',
-      'sources': [
-        'speaker.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-        '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider',
-      ]
-    }
-  ]
-}
diff --git a/examples/examples.mk b/examples/examples.mk
new file mode 100644
index 0000000..a25194c
--- /dev/null
+++ b/examples/examples.mk
@@ -0,0 +1,58 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+###
+# examples
+
+examples_provider_obj_files := $(EXAMPLES_PROVIDER_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libevent.a, but the headers files in third_party/include.
+$(examples_provider_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libevent.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/examples_provider.a : $(examples_provider_obj_files)
+	rm -f $@
+	$(AR) crsT $@ $^
+
+# We don't need libevent.a, but the headers files in third_party/include.
+out/$(BUILD_MODE)/examples/daemon/%.o : examples/daemon/%.cc third_party/lib/libevent.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+daemon_common_flags := \
+	-Wl,-rpath=out/$(BUILD_MODE)/ \
+	-Lthird_party/lib \
+	-levent \
+	-levent_openssl \
+	-lpthread \
+	-lavahi-common \
+	-lavahi-client \
+	-lexpat \
+	-lcurl \
+	-lssl \
+	-lcrypto
+
+out/$(BUILD_MODE)/weave_daemon_ledflasher : out/$(BUILD_MODE)/examples/daemon/ledflasher/ledflasher.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(CFLAGS) $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_light : out/$(BUILD_MODE)/examples/daemon/light/light.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(CFLAGS) $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_lock : out/$(BUILD_MODE)/examples/daemon/lock/lock.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(CFLAGS) $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_oven : out/$(BUILD_MODE)/examples/daemon/oven/oven.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(CFLAGS) $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_sample : out/$(BUILD_MODE)/examples/daemon/sample/sample.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(CFLAGS) $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_speaker : out/$(BUILD_MODE)/examples/daemon/speaker/speaker.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(CFLAGS) $(daemon_common_flags)
+
+all-examples : out/$(BUILD_MODE)/weave_daemon_ledflasher out/$(BUILD_MODE)/weave_daemon_light out/$(BUILD_MODE)/weave_daemon_lock out/$(BUILD_MODE)/weave_daemon_oven out/$(BUILD_MODE)/weave_daemon_sample out/$(BUILD_MODE)/weave_daemon_speaker
+
+.PHONY : all-examples
+
diff --git a/examples/prerequisites.sh b/examples/prerequisites.sh
index 1b27806..489bb58 100755
--- a/examples/prerequisites.sh
+++ b/examples/prerequisites.sh
@@ -3,6 +3,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+# Instead of this script, try running "make all -j".
+# TODO: Delete this file after 15-feb-2016.
+
 DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
 ROOT_DIR=$(cd -P -- "$(dirname -- "$0")/.." && pwd -P)
 
@@ -11,7 +14,6 @@
   automake \
   binutils \
   g++ \
-  gyp \
   hostapd \
   libavahi-client-dev \
   libcurl4-openssl-dev \
@@ -21,47 +23,3 @@
   libssl-dev \
   libtool \
   || exit 1
-
-mkdir -p $ROOT_DIR/third_party/lib $ROOT_DIR/third_party/include 2> /dev/null
-
-# Make gtest and gmock
-cd $ROOT_DIR/third_party
-rm -rf googletest
-
-git clone https://github.com/google/googletest.git || exit 1
-cd $ROOT_DIR/third_party/googletest
-
-# gtest is in process of changing of dir structure and it has broken build
-# files. So this is temporarily workaround to fix that.
-git reset --hard d945d8c000a0ade73585d143532266968339bbb3
-mv googletest googlemock/gtest
-
-for SUB_DIR in googlemock/gtest googlemock; do
-  cd $ROOT_DIR/third_party/googletest/$SUB_DIR || exit 1
-  autoreconf -fvi || exit 1
-  ./configure --disable-shared || exit 1
-  make || exit 1
-  cp -rf include/* $ROOT_DIR/third_party/include/ || exit 1
-  cp -rf lib/.libs/* $ROOT_DIR/third_party/lib/ || exit 1
-done
-rm -rf $ROOT_DIR/third_party/googletest
-
-# Make libevent.
-# Example uses libevent to implement HTTPS server. This capability is
-# available only in version 2.1.x-alpha. Step could be replaced with apt-get
-# in future.
-cd $ROOT_DIR/third_party
-rm -rf libevent
-
-git clone https://github.com/libevent/libevent.git || exit 1
-cd libevent || exit 1
-./autogen.sh || exit 1
-./configure --disable-shared || exit 1
-make || exit 1
-if [ -z "$DISABLE_LIBEVENT_TEST" ]; then
-  echo -e "\n\nTesting libevent...\nCan take several minutes.\n"
-  make verify || exit 1
-fi
-cp -rf include/* $ROOT_DIR/third_party/include/ || exit 1
-cp -rf .libs/lib* $ROOT_DIR/third_party/lib/ || exit 1
-rm -rf $ROOT_DIR/third_party/libevent
diff --git a/examples/provider/provider.gyp b/examples/provider/provider.gyp
deleted file mode 100644
index 3d13d8f..0000000
--- a/examples/provider/provider.gyp
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'targets': [
-    {
-      'target_name': 'libweave_provider',
-      'type': 'static_library',
-      'variables': {
-        'deps': [
-          'avahi-client',
-          'expat',
-          'libcurl',
-          'libcrypto',
-          'openssl',
-        ]
-      },
-      'cflags': [
-        '>!@(pkg-config >(deps) --cflags)',
-        '-pthread',
-      ],
-      'sources': [
-        'avahi_client.cc',
-        'bluez_client.cc',
-        'curl_http_client.cc',
-        'event_http_client.cc',
-        'event_http_server.cc',
-        'event_network.cc',
-        'event_task_runner.cc',
-        'file_config_store.cc',
-        'wifi_manager.cc',
-        'ssl_stream.cc',
-      ],
-      'dependencies': [
-        '<@(DEPTH)/libweave_standalone.gyp:libweave',
-      ],
-      'direct_dependent_settings' : {
-        'variables': {
-          'parent_deps': [
-            '<@(deps)'
-          ]
-        },
-        'link_settings': {
-          'ldflags+': [
-            '>!@(pkg-config >(parent_deps) --libs-only-L --libs-only-other)',
-          ],
-          'libraries+': [
-            '>!(pkg-config >(parent_deps) --libs-only-l)',
-          ],
-        },
-        'libraries': [
-          '-levent',
-          '-levent_openssl',
-          '-lpthread',
-        ]
-      }
-    }
-  ]
-}
diff --git a/file_lists.mk b/file_lists.mk
new file mode 100644
index 0000000..1e78935
--- /dev/null
+++ b/file_lists.mk
@@ -0,0 +1,166 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+WEAVE_SRC_FILES := \
+	src/backoff_entry.cc \
+	src/base_api_handler.cc \
+	src/commands/cloud_command_proxy.cc \
+	src/commands/command_instance.cc \
+	src/commands/command_queue.cc \
+	src/commands/schema_constants.cc \
+	src/component_manager_impl.cc \
+	src/config.cc \
+	src/data_encoding.cc \
+	src/device_manager.cc \
+	src/device_registration_info.cc \
+	src/error.cc \
+	src/http_constants.cc \
+	src/json_error_codes.cc \
+	src/notification/notification_parser.cc \
+	src/notification/pull_channel.cc \
+	src/notification/xml_node.cc \
+	src/notification/xmpp_channel.cc \
+	src/notification/xmpp_iq_stanza_handler.cc \
+	src/notification/xmpp_stream_parser.cc \
+	src/privet/auth_manager.cc \
+	src/privet/cloud_delegate.cc \
+	src/privet/constants.cc \
+	src/privet/device_delegate.cc \
+	src/privet/device_ui_kind.cc \
+	src/privet/openssl_utils.cc \
+	src/privet/privet_handler.cc \
+	src/privet/privet_manager.cc \
+	src/privet/privet_types.cc \
+	src/privet/publisher.cc \
+	src/privet/security_manager.cc \
+	src/privet/wifi_bootstrap_manager.cc \
+	src/privet/wifi_ssid_generator.cc \
+	src/registration_status.cc \
+	src/states/state_change_queue.cc \
+	src/streams.cc \
+	src/string_utils.cc \
+	src/utils.cc
+
+WEAVE_TEST_SRC_FILES := \
+	src/test/fake_stream.cc \
+	src/test/fake_task_runner.cc \
+	src/test/unittest_utils.cc
+
+WEAVE_UNITTEST_SRC_FILES := \
+	src/backoff_entry_unittest.cc \
+	src/base_api_handler_unittest.cc \
+	src/commands/cloud_command_proxy_unittest.cc \
+	src/commands/command_instance_unittest.cc \
+	src/commands/command_queue_unittest.cc \
+	src/component_manager_unittest.cc \
+	src/config_unittest.cc \
+	src/data_encoding_unittest.cc \
+	src/device_registration_info_unittest.cc \
+	src/error_unittest.cc \
+	src/notification/notification_parser_unittest.cc \
+	src/notification/xml_node_unittest.cc \
+	src/notification/xmpp_channel_unittest.cc \
+	src/notification/xmpp_iq_stanza_handler_unittest.cc \
+	src/notification/xmpp_stream_parser_unittest.cc \
+	src/privet/auth_manager_unittest.cc \
+	src/privet/privet_handler_unittest.cc \
+	src/privet/security_manager_unittest.cc \
+	src/privet/wifi_ssid_generator_unittest.cc \
+	src/states/state_change_queue_unittest.cc \
+	src/streams_unittest.cc \
+	src/string_utils_unittest.cc \
+	src/test/weave_testrunner.cc
+
+WEAVE_EXPORTS_UNITTEST_SRC_FILES := \
+	src/weave_unittest.cc
+
+EXAMPLES_PROVIDER_SRC_FILES := \
+	examples/provider/avahi_client.cc \
+	examples/provider/bluez_client.cc \
+	examples/provider/curl_http_client.cc \
+	examples/provider/event_http_client.cc \
+	examples/provider/event_http_server.cc \
+	examples/provider/event_network.cc \
+	examples/provider/event_task_runner.cc \
+	examples/provider/file_config_store.cc \
+	examples/provider/ssl_stream.cc \
+	examples/provider/wifi_manager.cc
+
+THIRD_PARTY_CHROMIUM_BASE_SRC_FILES := \
+	third_party/chromium/base/bind_helpers.cc \
+	third_party/chromium/base/callback_internal.cc \
+	third_party/chromium/base/guid_posix.cc \
+	third_party/chromium/base/json/json_parser.cc \
+	third_party/chromium/base/json/json_reader.cc \
+	third_party/chromium/base/json/json_writer.cc \
+	third_party/chromium/base/json/string_escape.cc \
+	third_party/chromium/base/location.cc \
+	third_party/chromium/base/logging.cc \
+	third_party/chromium/base/memory/ref_counted.cc \
+	third_party/chromium/base/memory/weak_ptr.cc \
+	third_party/chromium/base/rand_util.cc \
+	third_party/chromium/base/rand_util_posix.cc \
+	third_party/chromium/base/strings/string_number_conversions.cc \
+	third_party/chromium/base/strings/string_piece.cc \
+	third_party/chromium/base/strings/stringprintf.cc \
+	third_party/chromium/base/strings/string_util.cc \
+	third_party/chromium/base/strings/string_util_constants.cc \
+	third_party/chromium/base/strings/utf_string_conversion_utils.cc \
+	third_party/chromium/base/third_party/dmg_fp/dtoa.cc \
+	third_party/chromium/base/third_party/dmg_fp/g_fmt.cc \
+	third_party/chromium/base/third_party/icu/icu_utf.cc \
+	third_party/chromium/base/time/clock.cc \
+	third_party/chromium/base/time/default_clock.cc \
+	third_party/chromium/base/time/time.cc \
+	third_party/chromium/base/time/time_posix.cc \
+	third_party/chromium/base/values.cc
+
+THIRD_PARTY_CHROMIUM_BASE_UNITTEST_SRC_FILES := \
+	third_party/chromium/base/bind_unittest.cc \
+	third_party/chromium/base/callback_list_unittest.cc \
+	third_party/chromium/base/callback_unittest.cc \
+	third_party/chromium/base/guid_unittest.cc \
+	third_party/chromium/base/json/json_parser_unittest.cc \
+	third_party/chromium/base/json/json_reader_unittest.cc \
+	third_party/chromium/base/json/json_writer_unittest.cc \
+	third_party/chromium/base/json/string_escape_unittest.cc \
+	third_party/chromium/base/logging_unittest.cc \
+	third_party/chromium/base/memory/ref_counted_unittest.cc \
+	third_party/chromium/base/memory/scoped_ptr_unittest.cc \
+	third_party/chromium/base/memory/weak_ptr_unittest.cc \
+	third_party/chromium/base/move_unittest.cc \
+	third_party/chromium/base/numerics/safe_numerics_unittest.cc \
+	third_party/chromium/base/observer_list_unittest.cc \
+	third_party/chromium/base/rand_util_unittest.cc \
+	third_party/chromium/base/scoped_clear_errno_unittest.cc \
+	third_party/chromium/base/strings/string_number_conversions_unittest.cc \
+	third_party/chromium/base/strings/string_piece_unittest.cc \
+	third_party/chromium/base/strings/string_util_unittest.cc \
+	third_party/chromium/base/strings/stringprintf_unittest.cc \
+	third_party/chromium/base/template_util_unittest.cc \
+	third_party/chromium/base/time/time_unittest.cc \
+	third_party/chromium/base/tuple_unittest.cc \
+	third_party/chromium/base/values_unittest.cc
+
+THIRD_PARTY_CHROMIUM_CRYPTO_SRC_FILES := \
+	third_party/chromium/crypto/p224.cc \
+	third_party/chromium/crypto/p224_spake.cc \
+	third_party/chromium/crypto/sha2.cc
+
+THIRD_PARTY_CHROMIUM_CRYPTO_UNITTEST_SRC_FILES := \
+	third_party/chromium/crypto/p224_spake_unittest.cc \
+	third_party/chromium/crypto/p224_unittest.cc \
+	third_party/chromium/crypto/sha2_unittest.cc
+
+THIRD_PARTY_MODP_B64_SRC_FILES := \
+	third_party/modp_b64/modp_b64.cc
+
+THIRD_PARTY_LIBUWEAVE_SRC_FILES := \
+	third_party/libuweave/src/crypto_hmac.c \
+	third_party/libuweave/src/crypto_utils.c \
+	third_party/libuweave/src/macaroon.c \
+	third_party/libuweave/src/macaroon_caveat.c \
+	third_party/libuweave/src/macaroon_context.c \
+	third_party/libuweave/src/macaroon_encoding.c
+
diff --git a/libweave.gypi b/libweave.gypi
deleted file mode 100644
index 6f64c89..0000000
--- a/libweave.gypi
+++ /dev/null
@@ -1,151 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'variables': {
-    'weave_sources': [
-      'src/backoff_entry.cc',
-      'src/base_api_handler.cc',
-      'src/commands/cloud_command_proxy.cc',
-      'src/commands/command_instance.cc',
-      'src/commands/command_queue.cc',
-      'src/commands/schema_constants.cc',
-      'src/component_manager_impl.cc',
-      'src/config.cc',
-      'src/data_encoding.cc',
-      'src/device_manager.cc',
-      'src/device_registration_info.cc',
-      'src/error.cc',
-      'src/http_constants.cc',
-      'src/json_error_codes.cc',
-      'src/notification/notification_parser.cc',
-      'src/notification/pull_channel.cc',
-      'src/notification/xml_node.cc',
-      'src/notification/xmpp_channel.cc',
-      'src/notification/xmpp_iq_stanza_handler.cc',
-      'src/notification/xmpp_stream_parser.cc',
-      'src/privet/auth_manager.cc',
-      'src/privet/cloud_delegate.cc',
-      'src/privet/constants.cc',
-      'src/privet/device_delegate.cc',
-      'src/privet/device_ui_kind.cc',
-      'src/privet/openssl_utils.cc',
-      'src/privet/privet_handler.cc',
-      'src/privet/privet_manager.cc',
-      'src/privet/privet_types.cc',
-      'src/privet/publisher.cc',
-      'src/privet/security_manager.cc',
-      'src/privet/wifi_bootstrap_manager.cc',
-      'src/privet/wifi_ssid_generator.cc',
-      'src/registration_status.cc',
-      'src/states/state_change_queue.cc',
-      'src/streams.cc',
-      'src/string_utils.cc',
-      'src/utils.cc',
-      'third_party/chromium/crypto/p224.cc',
-      'third_party/chromium/crypto/p224_spake.cc',
-      'third_party/chromium/crypto/sha2.cc',
-      'third_party/libuweave/src/crypto_hmac.c',
-      'third_party/libuweave/src/crypto_utils.c',
-      'third_party/libuweave/src/macaroon.c',
-      'third_party/libuweave/src/macaroon_caveat.c',
-      'third_party/libuweave/src/macaroon_context.c',
-      'third_party/libuweave/src/macaroon_encoding.c',
-      'third_party/modp_b64/modp_b64.cc',
-    ],
-    'weave_test_sources': [
-      'src/test/fake_stream.cc',
-      'src/test/fake_task_runner.cc',
-      'src/test/unittest_utils.cc',
-    ],
-    'weave_unittest_sources': [
-      'src/backoff_entry_unittest.cc',
-      'src/base_api_handler_unittest.cc',
-      'src/commands/cloud_command_proxy_unittest.cc',
-      'src/commands/command_instance_unittest.cc',
-      'src/commands/command_queue_unittest.cc',
-      'src/component_manager_unittest.cc',
-      'src/config_unittest.cc',
-      'src/data_encoding_unittest.cc',
-      'src/device_registration_info_unittest.cc',
-      'src/error_unittest.cc',
-      'src/notification/notification_parser_unittest.cc',
-      'src/notification/xml_node_unittest.cc',
-      'src/notification/xmpp_channel_unittest.cc',
-      'src/notification/xmpp_iq_stanza_handler_unittest.cc',
-      'src/notification/xmpp_stream_parser_unittest.cc',
-      'src/privet/auth_manager_unittest.cc',
-      'src/privet/privet_handler_unittest.cc',
-      'src/privet/security_manager_unittest.cc',
-      'src/privet/wifi_ssid_generator_unittest.cc',
-      'src/states/state_change_queue_unittest.cc',
-      'src/streams_unittest.cc',
-      'src/string_utils_unittest.cc',
-      'src/test/weave_testrunner.cc',
-      'third_party/chromium/crypto/p224_spake_unittest.cc',
-      'third_party/chromium/crypto/p224_unittest.cc',
-      'third_party/chromium/crypto/sha2_unittest.cc',
-    ],
-    'weave_exports_unittest_sources': [
-      'src/test/weave_testrunner.cc',
-      'src/weave_unittest.cc',
-    ],
-    'base_sources': [
-      'third_party/chromium/base/bind_helpers.cc',
-      'third_party/chromium/base/callback_internal.cc',
-      'third_party/chromium/base/guid_posix.cc',
-      'third_party/chromium/base/json/json_parser.cc',
-      'third_party/chromium/base/json/json_reader.cc',
-      'third_party/chromium/base/json/json_writer.cc',
-      'third_party/chromium/base/json/string_escape.cc',
-      'third_party/chromium/base/memory/ref_counted.cc',
-      'third_party/chromium/base/logging.cc',
-      'third_party/chromium/base/location.cc',
-      'third_party/chromium/base/memory/weak_ptr.cc',
-      'third_party/chromium/base/memory/weak_ptr.cc',
-      'third_party/chromium/base/rand_util.cc',
-      'third_party/chromium/base/rand_util_posix.cc',
-      'third_party/chromium/base/strings/string_number_conversions.cc',
-      'third_party/chromium/base/strings/string_piece.cc',
-      'third_party/chromium/base/strings/stringprintf.cc',
-      'third_party/chromium/base/strings/string_util.cc',
-      'third_party/chromium/base/strings/string_util_constants.cc',
-      'third_party/chromium/base/strings/utf_string_conversion_utils.cc',
-      'third_party/chromium/base/third_party/dmg_fp/g_fmt.cc',
-      'third_party/chromium/base/third_party/dmg_fp/dtoa.cc',
-      'third_party/chromium/base/third_party/icu/icu_utf.cc',
-      'third_party/chromium/base/time/clock.cc',
-      'third_party/chromium/base/time/default_clock.cc',
-      'third_party/chromium/base/time/time.cc',
-      'third_party/chromium/base/time/time_posix.cc',
-      'third_party/chromium/base/values.cc',
-    ],
-    'base_unittests': [
-      'third_party/chromium/base/bind_unittest.cc',
-      'third_party/chromium/base/callback_list_unittest.cc',
-      'third_party/chromium/base/callback_unittest.cc',
-      'third_party/chromium/base/guid_unittest.cc',
-      'third_party/chromium/base/json/json_parser_unittest.cc',
-      'third_party/chromium/base/json/json_reader_unittest.cc',
-      'third_party/chromium/base/json/json_writer_unittest.cc',
-      'third_party/chromium/base/json/string_escape_unittest.cc',
-      'third_party/chromium/base/logging_unittest.cc',
-      'third_party/chromium/base/memory/ref_counted_unittest.cc',
-      'third_party/chromium/base/memory/scoped_ptr_unittest.cc',
-      'third_party/chromium/base/memory/weak_ptr_unittest.cc',
-      'third_party/chromium/base/move_unittest.cc',
-      'third_party/chromium/base/numerics/safe_numerics_unittest.cc',
-      'third_party/chromium/base/observer_list_unittest.cc',
-      'third_party/chromium/base/rand_util_unittest.cc',
-      'third_party/chromium/base/scoped_clear_errno_unittest.cc',
-      'third_party/chromium/base/strings/string_number_conversions_unittest.cc',
-      'third_party/chromium/base/strings/string_piece_unittest.cc',
-      'third_party/chromium/base/strings/string_util_unittest.cc',
-      'third_party/chromium/base/strings/stringprintf_unittest.cc',
-      'third_party/chromium/base/template_util_unittest.cc',
-      'third_party/chromium/base/time/time_unittest.cc',
-      'third_party/chromium/base/tuple_unittest.cc',
-      'third_party/chromium/base/values_unittest.cc',
-    ],
-  },
-}
diff --git a/libweave_common.gypi b/libweave_common.gypi
deleted file mode 100644
index e7b45ce..0000000
--- a/libweave_common.gypi
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'variables': {
-    'clang%': 0,
-  },
-  'target_defaults': {
-    'configurations': {
-      'Release': {
-        'defines': [
-          'NDEBUG',
-        ],
-        'cflags': [
-          '-Os',
-        ],
-      },
-      'Debug': {
-        'defines': [
-          '_DEBUG',
-        ],
-        'cflags': [
-          '-O0  ',
-          '-g3',
-        ],
-      },
-    },
-    'include_dirs': [
-      '.',
-      'include',
-      'third_party/chromium',
-      'third_party/include',
-      'third_party/libuweave',
-      'third_party/modp_b64/modp_b64',
-    ],
-    'cflags!': ['-fPIE'],
-    'cflags': [
-      '-fno-exceptions',
-      '-fPIC',
-      '-fvisibility=hidden',
-      '-Wall',
-      '-Werror',
-      '-Wextra',
-      '-Wl,--exclude-libs,ALL',
-      '-Wno-char-subscripts',
-      '-Wno-format-nonliteral',
-      '-Wno-missing-field-initializers',
-      '-Wno-unused-local-typedefs',
-      '-Wno-unused-parameter',
-      '-Wpacked',
-      '-Wpointer-arith',
-      '-Wwrite-strings',
-    ],
-    'cflags_cc': [
-      '-std=c++11',
-    ],
-    'cflags_c': [
-      '-std=c99',
-    ],
-    'libraries': [
-      # 'library_dirs' does not work as expected with make files
-      '-Lthird_party/lib',
-    ],
-    'library_dirs': ['third_party/lib'],
-  },
-  'conditions': [
-     ['clang==1', {
-       'target_defaults': {
-          'cflags!': ['-Wl,--exclude-libs,ALL'],
-          'cflags': [
-            '-fsanitize=address',
-            '-fno-omit-frame-pointer',
-            '-Wno-deprecated-register',
-            '-Wno-inconsistent-missing-override',
-          ],
-          'ldflags': [
-            '-fsanitize=address',
-          ],
-        },
-        'make_global_settings': [
-          ['CC','/usr/bin/clang-3.6'],
-          ['CXX','/usr/bin/clang++-3.6'],
-          ['LINK','/usr/bin/clang++-3.6'],
-        ],
-     }],
-  ]
-}
diff --git a/libweave_standalone.gyp b/libweave_standalone.gyp
deleted file mode 100644
index d36d208..0000000
--- a/libweave_standalone.gyp
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright 2015 The Weave Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-{
-  'includes': [
-    'libweave.gypi',
-  ],
-  'target_defaults': {
-    'libraries': [
-      '-lcrypto',
-      '-lexpat',
-      '-lgmock',
-      '-lgtest',
-      '-lpthread',
-      '-lrt',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'libweave_common',
-      'type': 'static_library',
-      'include_dirs': [
-        '<@(DEPTH)/external',
-      ],
-      'sources': [
-        '<@(weave_sources)',
-        '<@(base_sources)',
-      ],
-    },
-    {
-      'target_name': 'libweave',
-      'type': 'shared_library',
-      'include_dirs': [
-        '../libweave/external',
-      ],
-      'dependencies': [
-        'libweave_common',
-      ],
-      'sources': [
-        'src/empty.cc'
-      ],
-    },
-    {
-      'target_name': 'libweave-test',
-      'type': 'static_library',
-      'standalone_static_library': 1,
-      'include_dirs': [
-        '<@(DEPTH)/external',
-      ],
-      'sources': [
-        '<@(weave_test_sources)',
-      ],
-    },
-    {
-      'target_name': 'libweave_testrunner',
-      'type': 'executable',
-      'include_dirs': [
-        '<@(DEPTH)/external',
-      ],
-      'dependencies': [
-        'libweave_common',
-        'libweave-test',
-      ],
-      'sources': [
-        '<@(weave_unittest_sources)',
-        '<@(base_unittests)',
-      ],
-    },
-    {
-      'target_name': 'libweave_exports_testrunner',
-      'type': 'executable',
-      'include_dirs': [
-        '<@(DEPTH)/external',
-      ],
-      'dependencies': [
-        'libweave',
-        'libweave-test',
-      ],
-      'sources': [
-        '<@(weave_exports_unittest_sources)',
-      ],
-    },
-  ],
-}
diff --git a/src/base_api_handler.h b/src/base_api_handler.h
index 8497692..1dbbac8 100644
--- a/src/base_api_handler.h
+++ b/src/base_api_handler.h
@@ -30,9 +30,6 @@
  private:
   void UpdateBaseConfiguration(const std::weak_ptr<Command>& command);
   void UpdateDeviceInfo(const std::weak_ptr<Command>& command);
-  bool UpdateState(const std::string& anonymous_access_role,
-                   bool discovery_enabled,
-                   bool pairing_enabled);
   void OnConfigChanged(const Settings& settings);
 
   DeviceRegistrationInfo* device_info_;
diff --git a/src/device_registration_info.cc b/src/device_registration_info.cc
index a91ae6f..c374527 100644
--- a/src/device_registration_info.cc
+++ b/src/device_registration_info.cc
@@ -36,6 +36,7 @@
 const char kErrorDomainOAuth2[] = "oauth2";
 const char kErrorDomainGCD[] = "gcd";
 const char kErrorDomainGCDServer[] = "gcd_server";
+const char kErrorAlreayRegistered[] = "already_registered";
 
 namespace {
 
@@ -523,6 +524,14 @@
 
 void DeviceRegistrationInfo::RegisterDevice(const std::string& ticket_id,
                                             const DoneCallback& callback) {
+  if (HaveRegistrationCredentials()) {
+    ErrorPtr error;
+    Error::AddTo(&error, FROM_HERE, errors::kErrorDomain,
+                 kErrorAlreayRegistered,
+                 "Unable to register already registered device");
+    return RegisterDeviceError(callback, std::move(error));
+  }
+
   std::unique_ptr<base::DictionaryValue> device_draft = BuildDeviceResource();
   CHECK(device_draft);
 
@@ -835,7 +844,7 @@
     const std::string& service_url,
     ErrorPtr* error) {
   if (HaveRegistrationCredentials()) {
-    Error::AddTo(error, FROM_HERE, errors::kErrorDomain, "already_registered",
+    Error::AddTo(error, FROM_HERE, errors::kErrorDomain, kErrorAlreayRegistered,
                  "Unable to change config for registered device");
     return false;
   }
diff --git a/src/device_registration_info_unittest.cc b/src/device_registration_info_unittest.cc
index ea81057..595d749 100644
--- a/src/device_registration_info_unittest.cc
+++ b/src/device_registration_info_unittest.cc
@@ -153,11 +153,14 @@
     dev_reg_->Start();
   }
 
-  void ReloadSettings() {
+  void ReloadSettings(bool registered = true) {
     base::DictionaryValue dict;
-    dict.SetString("refresh_token", test_data::kRefreshToken);
-    dict.SetString("cloud_id", test_data::kCloudId);
-    dict.SetString("robot_account", test_data::kRobotAccountEmail);
+    dict.SetInteger("version", 1);
+    if (registered) {
+      dict.SetString("refresh_token", test_data::kRefreshToken);
+      dict.SetString("cloud_id", test_data::kCloudId);
+      dict.SetString("robot_account", test_data::kRobotAccountEmail);
+    }
     dict.SetString("device_id", test_data::kDeviceId);
     std::string json_string;
     base::JSONWriter::WriteWithOptions(
@@ -373,7 +376,7 @@
 }
 
 TEST_F(DeviceRegistrationInfoTest, RegisterDevice) {
-  ReloadSettings();
+  ReloadSettings(false);
 
   auto json_traits = CreateDictionaryValue(R"({
     'base': {
@@ -558,6 +561,28 @@
   EXPECT_TRUE(done);
 }
 
+TEST_F(DeviceRegistrationInfoTest, ReRegisterDevice) {
+  ReloadSettings();
+
+  bool done = false;
+  dev_reg_->RegisterDevice(
+      test_data::kClaimTicketId, base::Bind([this, &done](ErrorPtr error) {
+        EXPECT_TRUE(error->HasError("weave", "already_registered"));
+        done = true;
+        task_runner_.Break();
+        EXPECT_EQ(GcdState::kConnecting, GetGcdState());
+
+        // Validate the device info saved to storage...
+        EXPECT_EQ(test_data::kCloudId, dev_reg_->GetSettings().cloud_id);
+        EXPECT_EQ(test_data::kRefreshToken,
+                  dev_reg_->GetSettings().refresh_token);
+        EXPECT_EQ(test_data::kRobotAccountEmail,
+                  dev_reg_->GetSettings().robot_account);
+      }));
+  task_runner_.Run();
+  EXPECT_TRUE(done);
+}
+
 TEST_F(DeviceRegistrationInfoTest, OOBRegistrationStatus) {
   // After we've been initialized, we should be either offline or
   // unregistered, depending on whether or not we've found credentials.
diff --git a/src/weave_unittest.cc b/src/weave_unittest.cc
index 987b0c4..b106aab 100644
--- a/src/weave_unittest.cc
+++ b/src/weave_unittest.cc
@@ -433,6 +433,17 @@
                     }));
   task_runner_.Run();
   EXPECT_TRUE(done);
+
+  done = false;
+  device_->Register(
+      "TICKET_ID2", base::Bind([this, &done](ErrorPtr error) {
+        EXPECT_TRUE(error->HasError("weave", "already_registered"));
+        done = true;
+        task_runner_.Break();
+        EXPECT_EQ("CLOUD_ID", device_->GetSettings().cloud_id);
+      }));
+  task_runner_.Run();
+  EXPECT_TRUE(done);
 }
 
 class WeaveWiFiSetupTest : public WeaveTest {
diff --git a/tests.mk b/tests.mk
new file mode 100644
index 0000000..7c05017
--- /dev/null
+++ b/tests.mk
@@ -0,0 +1,58 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+###
+# tests
+
+TEST_FLAGS ?= \
+	--gtest_break_on_failure
+
+TEST_ENV ?=
+ifeq (1, $(CLANG))
+  TEST_ENV += ASAN_SYMBOLIZER_PATH=$(shell which llvm-symbolizer-3.6)
+endif
+
+weave_test_obj_files := $(WEAVE_TEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(weave_test_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave-test.a : $(weave_test_obj_files)
+	$(AR) crs $@ $^
+
+weave_unittest_obj_files := $(WEAVE_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(weave_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave_testrunner : $(weave_unittest_obj_files) $(third_party_chromium_crypto_unittest_obj_files) $(third_party_chromium_base_unittest_obj_files) out/$(BUILD_MODE)/libweave_common.a out/$(BUILD_MODE)/libweave-test.a
+	$(CXX) -o $@ $^ $(CFLAGS) -lcrypto -lexpat -lgmock -lgtest -lpthread -lrt -Lthird_party/lib
+
+test : out/$(BUILD_MODE)/libweave_testrunner
+	$(TEST_ENV) $< $(TEST_FLAGS)
+
+###
+# export tests
+
+weave_exports_unittest_obj_files := $(WEAVE_EXPORTS_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(weave_exports_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave_exports_testrunner : $(weave_exports_unittest_obj_files) out/$(BUILD_MODE)/libweave.so out/$(BUILD_MODE)/libweave-test.a out/$(BUILD_MODE)/src/test/weave_testrunner.o
+	$(CXX) -o $@ $^ $(CFLAGS) -lcrypto -lexpat -lgmock -lgtest -lpthread -lrt -Lthird_party/lib -Wl,-rpath=out/$(BUILD_MODE)/
+
+export-test : out/$(BUILD_MODE)/libweave_exports_testrunner
+	$(TEST_ENV) $< $(TEST_FLAGS)
+
+testall : test export-test
+
+.PHONY : test export-test testall
+
diff --git a/third_party/get_gtest.sh b/third_party/get_gtest.sh
new file mode 100755
index 0000000..0a2e952
--- /dev/null
+++ b/third_party/get_gtest.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Make gtest and gmock.
+cd $(dirname "$0")
+THIRD_PARTY=$(pwd)
+
+mkdir -p include lib
+
+rm -rf $THIRD_PARTY/googletest
+git clone https://github.com/google/googletest.git || exit 1
+cd googletest
+
+# gtest is in process of changing of dir structure and it has broken build
+# files. So this is temporarily workaround to fix that.
+git reset --hard d945d8c000a0ade73585d143532266968339bbb3
+mv googletest googlemock/gtest
+
+for SUB_DIR in googlemock/gtest googlemock; do
+  cd $THIRD_PARTY/googletest/$SUB_DIR || exit 1
+  autoreconf -fvi || exit 1
+  ./configure --disable-shared || exit 1
+  make || exit 1
+  cp -rf include/* $THIRD_PARTY/include/ || exit 1
+  cp -rf lib/.libs/* $THIRD_PARTY/lib/ || exit 1
+done
+
+rm -rf $THIRD_PARTY/googletest
diff --git a/third_party/get_libevent.sh b/third_party/get_libevent.sh
new file mode 100755
index 0000000..9985bc0
--- /dev/null
+++ b/third_party/get_libevent.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Make libevent.
+# Example uses libevent to implement HTTPS server. This capability is
+# available only in version 2.1.x-alpha. Step could be replaced with apt-get
+# in future.
+cd $(dirname "$0")
+THIRD_PARTY=$(pwd)
+
+mkdir -p include lib
+
+rm -rf $THIRD_PARTY/libevent
+git clone https://github.com/libevent/libevent.git || exit 1
+cd libevent || exit 1
+
+./autogen.sh || exit 1
+./configure --disable-shared || exit 1
+make || exit 1
+if [ -z "$DISABLE_LIBEVENT_TEST" ]; then
+  echo -e "\n\nTesting libevent...\nCan take several minutes.\n"
+  make verify || exit 1
+fi
+cp -rf include/*.h include/event2 $THIRD_PARTY/include/ || exit 1
+cp -f .libs/lib* $THIRD_PARTY/lib/ || exit 1
+
+rm -rf $THIRD_PARTY/libevent
diff --git a/third_party/third_party.mk b/third_party/third_party.mk
new file mode 100644
index 0000000..638d8a7
--- /dev/null
+++ b/third_party/third_party.mk
@@ -0,0 +1,77 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+###
+# third_party/chromium/
+
+third_party_chromium_base_obj_files := $(THIRD_PARTY_CHROMIUM_BASE_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(third_party_chromium_base_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+third_party_chromium_base_unittest_obj_files := $(THIRD_PARTY_CHROMIUM_BASE_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(third_party_chromium_base_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+third_party_chromium_crypto_obj_files := $(THIRD_PARTY_CHROMIUM_CRYPTO_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(third_party_chromium_crypto_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+third_party_chromium_crypto_unittest_obj_files := $(THIRD_PARTY_CHROMIUM_CRYPTO_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(third_party_chromium_crypto_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+###
+# third_party/modp_b64/
+
+third_party_modp_b64_obj_files := $(THIRD_PARTY_MODP_B64_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(third_party_modp_b64_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+###
+# third_party/libuweave/
+
+third_party_libuweave_obj_files := $(THIRD_PARTY_LIBUWEAVE_SRC_FILES:%.c=out/$(BUILD_MODE)/%.o)
+
+$(third_party_libuweave_obj_files) : out/$(BUILD_MODE)/%.o : %.c
+	mkdir -p $(dir $@)
+	$(CC) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_C) -c -o $@ $<
+
+###
+# libgtest and libgmock (third_party, downloaded on build)
+
+third_party/lib/libgtest.a :
+	@echo Downloading and building libgtest and libgmock...
+	third_party/get_gtest.sh
+	@echo Finished downloading and building libgtest and libgmock.
+
+clean-gtest :
+	rm -rf third_party/include/gtest third_party/include/gmock
+	rm -rf third_party/lib/libgmock* third_party/lib/libgtest*
+	rm -rf third_party/googletest
+
+###
+# libevent (third_party, downloaded on build)
+
+third_party/lib/libevent.a :
+	@echo Downloading and building libevent...
+	DISABLE_LIBEVENT_TEST=1 third_party/get_libevent.sh
+	@echo Finished downloading and building libevent.
+
+clean-libevent :
+	rm -rf third_party/include/ev* third_party/include/event2
+	rm -rf third_party/lib/libevent*
+	rm -rf third_party/libevent
+