diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index eb3f75f..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,12 +0,0 @@
-[submodule "googletest"]
-	path = googletest
-	url = https://github.com/google/googletest.git
-[submodule "static/noVNC"]
-	path = static/noVNC
-	url = https://github.com/novnc/noVNC.git
-[submodule "boost-dbus"]
-	path = boost-dbus
-	url = https://github.com/bkietz/boost-dbus.git
-[submodule "tinyxml2"]
-	path = tinyxml2
-	url = https://github.com/leethomason/tinyxml2.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 02de756..869fc48 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,21 +1,13 @@
-cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
 
 cmake_policy(SET CMP0054 NEW)
 
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
-message(CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH})
 
 option(BUILD_STATIC_LIBS "Built static libraries" ON)
 option(YOCTO_DEPENDENCIES "Use YOCTO depedencies system" OFF)
-option(HUNTER_ENABLED "Enable hunter package pulling" OFF)
 
-include("cmake/HunterGate.cmake")
-HunterGate(URL
-           "https://github.com/ruslo/hunter/archive/v0.18.64.tar.gz"
-           SHA1
-           "baf9c8cc4f65306f0e442b5419967b4c4c04589a")
-
-project(bmc-webserver CXX C)
+project(bmc-webserver CXX)
 
 include(CTest)
 
@@ -70,6 +62,16 @@
   endif(NOT CMAKE_BUILD_TYPE MATCHES Debug)
 endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
 
+if(NOT ${YOCTO_DEPENDENCIES}) # Download and unpack googletest at configure time
+  configure_file(CMakeLists.txt.in 3rdparty/CMakeLists.txt)
+  execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
+                  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3rdparty)
+  execute_process(COMMAND ${CMAKE_COMMAND} --build .
+                  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3rdparty)
+
+  set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/prefix ${CMAKE_PREFIX_PATH})
+endif()
+
 # add_definitions(-DBOOST_ASIO_ENABLE_HANDLER_TRACKING)
 add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
 add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)
@@ -77,12 +79,11 @@
 add_definitions(-DBOOST_NO_RTTI)
 add_definitions(-DBOOST_NO_TYPEID)
 # set(Boost_USE_STATIC_LIBS ON)
-hunter_add_package(Boost)
-find_package(Boost)
+
+find_package(Boost 1.64 REQUIRED)
 include_directories(${Boost_INCLUDE_DIRS})
 
 # Openssl
-hunter_add_package(OpenSSL)
 find_package(OpenSSL REQUIRED)
 include_directories(${OPENSSL_INCLUDE_DIR})
 message("OPENSSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}")
@@ -99,16 +100,9 @@
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/crow/include)
 
 # Zlib
-hunter_add_package(ZLIB)
 find_package(ZLIB REQUIRED)
 include_directories(${ZLIB_INCLUDE_DIRS})
 
-# tinyxml2
-if(NOT ${YOCTO_DEPENDENCIES})
-  add_subdirectory(tinyxml2)
-else()
-  find_package(tinyxml2 REQUIRED)
-endif()
 # PAM
 option(WEBSERVER_ENABLE_PAM "enable pam authentication" ON)
 if("${WEBSERVER_ENABLE_PAM}")
@@ -117,26 +111,15 @@
   add_definitions("-DWEBSERVER_DISABLE_PAM")
 endif()
 
-# Boost-dbus
-set(BOOST_DBUS_BUILD_UT ${BMCWEB_BUILD_UT})
-if(NOT ${YOCTO_DEPENDENCIES})
-  add_subdirectory(boost-dbus)
-else()
-  find_package(boost-dbus REQUIRED)
-endif()
-set(WEBSERVER_MAIN src/webserver_main.cpp)
+add_definitions("-Wno-attributes")
 
-# the webassets file has a non-ideal beahvior, where it loads binary data into a
-# std::string due to the way crow is constructed.  This causes GCC warnings.
-# Filter them out.
-if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
-  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9)
-    set_source_files_properties(${CMAKE_BINARY_DIR}/generated/webassets.cpp
-                                PROPERTIES
-                                COMPILE_FLAGS
-                                -Wno-narrowing)
-  endif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9)
-endif()
+# Boost-dbus
+find_package(boost-dbus REQUIRED)
+
+# tinyxml2
+find_package(tinyxml2 REQUIRED)
+
+set(WEBSERVER_MAIN src/webserver_main.cpp)
 
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/redfish-core/include)
@@ -153,7 +136,6 @@
 # Unit Tests
 if(${BMCWEB_BUILD_UT})
   set(UT_FILES
-      redfish-core/ut/privileges_test.cpp
       src/crow_test.cpp
       src/gtest_main.cpp
       src/token_authorization_middleware_test.cpp
@@ -178,11 +160,13 @@
                               TRUE) # googletest
   enable_testing()
 
-  hunter_add_package(GTest)
-  find_package(GTest REQUIRED) # find_package(GMock CONFIG REQUIRED)
-
   add_executable(webtest ${SRC_FILES} ${UT_FILES})
-  target_link_libraries(webtest gmock gtest)
+
+  find_package(GTest REQUIRED)
+  find_package(GMock REQUIRED)
+  target_link_libraries(webtest ${GTEST_LIBRARIES})
+  target_link_libraries(webtest ${GMOCK_LIBRARIES})
+
   target_link_libraries(webtest pthread)
   target_link_libraries(webtest boost-dbus)
   target_link_libraries(webtest ${OPENSSL_LIBRARIES})
diff --git a/CMakeLists.txt.in b/CMakeLists.txt.in
new file mode 100644
index 0000000..ccce7d8
--- /dev/null
+++ b/CMakeLists.txt.in
@@ -0,0 +1,49 @@
+cmake_minimum_required(VERSION 3.5)
+
+include(ExternalProject)
+
+ExternalProject_Add(
+    tinyxml2
+    GIT_REPOSITORY
+    "https://github.com/leethomason/tinyxml2.git"
+    GIT_TAG
+    8c8293ba8969a46947606a93ff0cb5a083aab47a
+    CMAKE_ARGS
+    SOURCE_DIR        "${CMAKE_BINARY_DIR}/tinyxml2-src"
+    BINARY_DIR        "${CMAKE_BINARY_DIR}/tinyxml2-build"
+    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/prefix
+)
+
+ExternalProject_Add(
+    Boost
+    URL https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz
+    URL_MD5 d275cd85b00022313c171f602db59fc5
+    SOURCE_DIR        "${CMAKE_BINARY_DIR}/boost-src"
+    BINARY_DIR        "${CMAKE_BINARY_DIR}/boost-build"
+    CONFIGURE_COMMAND ""
+    BUILD_COMMAND ""
+    INSTALL_COMMAND mkdir -p "${CMAKE_BINARY_DIR}/prefix/include/" && cp -R ${CMAKE_BINARY_DIR}/boost-src/boost ${CMAKE_BINARY_DIR}/prefix/include
+)
+
+ExternalProject_Add(
+    boost-dbus
+    GIT_REPOSITORY
+    "ssh://git-amr-2.devtools.intel.com:29418/openbmc-boost-dbus"
+    GIT_TAG
+    895ef1b67f3aaac3808296e4729b991fcf276832
+    SOURCE_DIR        "${CMAKE_BINARY_DIR}/boost-dbus-src"
+    BINARY_DIR        "${CMAKE_BINARY_DIR}/boost-dbus-build"
+    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/prefix -DBOOST_DBUS_BUILD_UT=OFF
+)
+
+ExternalProject_Add(
+    gtest
+    GIT_REPOSITORY
+    "https://github.com/google/googletest.git"
+    GIT_TAG
+    dfa853b63d17c787914b663b50c2095a0c5b706e
+    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/googletest-build
+    SOURCE_DIR        "${CMAKE_BINARY_DIR}/googletest-src"
+    BINARY_DIR        "${CMAKE_BINARY_DIR}/googletest-build"
+    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/prefix
+)
\ No newline at end of file
diff --git a/boost-dbus b/boost-dbus
deleted file mode 160000
index 165e3f0..0000000
--- a/boost-dbus
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 165e3f02c7d5d418c1b5f8c180ae970d6a8afb3a
diff --git a/build_x86.sh b/build_x86.sh
index 461b18c..dd1f5e2 100755
--- a/build_x86.sh
+++ b/build_x86.sh
@@ -1,19 +1,6 @@
 #!/bin/sh
-
-#Currently there are some build errors with the pre-instaleld libgtest-dev, as a workaround, we can build it with these steps(first time only):
-#cd googletest/googletest/
-#cmake ./
-#make
-#sudo make install
-
-cd `dirname $0`
-#update source code
-#git pull
-git submodule init
-git submodule sync
-git submodule update
-
+sudo apt-get install -y libpam0g-dev libssl-dev zlib1g-dev
 mkdir -p build
 cd build
-cmake ..  -DHUNTER_ENABLED=ON
-make  -j$(nproc)
+cmake ..
+cmake --build .
diff --git a/cmake/FindSystemd.cmake b/cmake/FindSystemd.cmake
new file mode 100644
index 0000000..533feb5
--- /dev/null
+++ b/cmake/FindSystemd.cmake
@@ -0,0 +1,15 @@
+include(FeatureSummary)
+set_package_properties(Systemd PROPERTIES
+   URL "http://freedesktop.org/wiki/Software/systemd/"
+   DESCRIPTION "System and Service Manager")
+
+find_package(PkgConfig)
+pkg_check_modules(PC_SYSTEMD libsystemd)
+find_library(SYSTEMD_LIBRARIES NAMES systemd ${PC_SYSTEMD_LIBRARY_DIRS})
+find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS})
+
+set(SYSTEMD_DEFINITIONS ${PC_SYSTEMD_CFLAGS_OTHER})
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(SYSTEMD DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
+mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES SYSTEMD_DEFINITIONS)
diff --git a/cmake/Hunter/config.cmake b/cmake/Hunter/config.cmake
deleted file mode 100644
index 473cecb..0000000
--- a/cmake/Hunter/config.cmake
+++ /dev/null
@@ -1 +0,0 @@
-hunter_config(OpenSSL VERSION 1.0.2k)
diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake
deleted file mode 100644
index 97f69cc..0000000
--- a/cmake/HunterGate.cmake
+++ /dev/null
@@ -1,514 +0,0 @@
-# Copyright (c) 2013-2015, Ruslan Baratov
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice, this
-#   list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This is a gate file to Hunter package manager.
-# Include this file using `include` command and add package you need, example:
-#
-#     cmake_minimum_required(VERSION 3.0)
-#
-#     include("cmake/HunterGate.cmake")
-#     HunterGate(
-#         URL "https://github.com/path/to/hunter/archive.tar.gz"
-#         SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
-#     )
-#
-#     project(MyProject)
-#
-#     hunter_add_package(Foo)
-#     hunter_add_package(Boo COMPONENTS Bar Baz)
-#
-# Projects:
-#     * https://github.com/hunter-packages/gate/
-#     * https://github.com/ruslo/hunter
-
-option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
-if(HUNTER_ENABLED)
-  if(CMAKE_VERSION VERSION_LESS "3.0")
-    message(FATAL_ERROR "At least CMake version 3.0 required for hunter dependency management."
-      " Update CMake or set HUNTER_ENABLED to OFF.")
-  endif()
-endif()
-
-include(CMakeParseArguments) # cmake_parse_arguments
-
-option(HUNTER_STATUS_PRINT "Print working status" ON)
-option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
-
-set(HUNTER_WIKI "https://github.com/ruslo/hunter/wiki")
-
-function(hunter_gate_status_print)
-  foreach(print_message ${ARGV})
-    if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
-      message(STATUS "[hunter] ${print_message}")
-    endif()
-  endforeach()
-endfunction()
-
-function(hunter_gate_status_debug)
-  foreach(print_message ${ARGV})
-    if(HUNTER_STATUS_DEBUG)
-      string(TIMESTAMP timestamp)
-      message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
-    endif()
-  endforeach()
-endfunction()
-
-function(hunter_gate_wiki wiki_page)
-  message("------------------------------ WIKI -------------------------------")
-  message("    ${HUNTER_WIKI}/${wiki_page}")
-  message("-------------------------------------------------------------------")
-  message("")
-  message(FATAL_ERROR "")
-endfunction()
-
-function(hunter_gate_internal_error)
-  message("")
-  foreach(print_message ${ARGV})
-    message("[hunter ** INTERNAL **] ${print_message}")
-  endforeach()
-  message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
-  message("")
-  hunter_gate_wiki("error.internal")
-endfunction()
-
-function(hunter_gate_fatal_error)
-  cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}")
-  string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki)
-  if(have_no_wiki)
-    hunter_gate_internal_error("Expected wiki")
-  endif()
-  message("")
-  foreach(x ${hunter_UNPARSED_ARGUMENTS})
-    message("[hunter ** FATAL ERROR **] ${x}")
-  endforeach()
-  message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
-  message("")
-  hunter_gate_wiki("${hunter_WIKI}")
-endfunction()
-
-function(hunter_gate_user_error)
-  hunter_gate_fatal_error(${ARGV} WIKI "error.incorrect.input.data")
-endfunction()
-
-function(hunter_gate_self root version sha1 result)
-  string(COMPARE EQUAL "${root}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("root is empty")
-  endif()
-
-  string(COMPARE EQUAL "${version}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("version is empty")
-  endif()
-
-  string(COMPARE EQUAL "${sha1}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("sha1 is empty")
-  endif()
-
-  string(SUBSTRING "${sha1}" 0 7 archive_id)
-
-  if(EXISTS "${root}/cmake/Hunter")
-    set(hunter_self "${root}")
-  else()
-    set(
-        hunter_self
-        "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
-    )
-  endif()
-
-  set("${result}" "${hunter_self}" PARENT_SCOPE)
-endfunction()
-
-# Set HUNTER_GATE_ROOT cmake variable to suitable value.
-function(hunter_gate_detect_root)
-  # Check CMake variable
-  string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty)
-  if(not_empty)
-    set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
-    return()
-  endif()
-
-  # Check environment variable
-  string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty)
-  if(not_empty)
-    set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
-    return()
-  endif()
-
-  # Check HOME environment variable
-  string(COMPARE NOTEQUAL "$ENV{HOME}" "" result)
-  if(result)
-    set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
-    return()
-  endif()
-
-  # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
-  if(WIN32)
-    string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
-    if(result)
-      set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
-      hunter_gate_status_debug(
-          "HUNTER_ROOT set using SYSTEMDRIVE environment variable"
-      )
-      return()
-    endif()
-
-    string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
-    if(result)
-      set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
-      hunter_gate_status_debug(
-          "HUNTER_ROOT set using USERPROFILE environment variable"
-      )
-      return()
-    endif()
-  endif()
-
-  hunter_gate_fatal_error(
-      "Can't detect HUNTER_ROOT"
-      WIKI "error.detect.hunter.root"
-  )
-endfunction()
-
-macro(hunter_gate_lock dir)
-  if(NOT HUNTER_SKIP_LOCK)
-    if("${CMAKE_VERSION}" VERSION_LESS "3.2")
-      hunter_gate_fatal_error(
-          "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK"
-          WIKI "error.can.not.lock"
-      )
-    endif()
-    hunter_gate_status_debug("Locking directory: ${dir}")
-    file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
-    hunter_gate_status_debug("Lock done")
-  endif()
-endmacro()
-
-function(hunter_gate_download dir)
-  string(
-      COMPARE
-      NOTEQUAL
-      "$ENV{HUNTER_DISABLE_AUTOINSTALL}"
-      ""
-      disable_autoinstall
-  )
-  if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
-    hunter_gate_fatal_error(
-        "Hunter not found in '${dir}'"
-        "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
-        "Settings:"
-        "  HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
-        "  HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
-        WIKI "error.run.install"
-    )
-  endif()
-  string(COMPARE EQUAL "${dir}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("Empty 'dir' argument")
-  endif()
-
-  string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
-  endif()
-
-  string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("HUNTER_GATE_URL empty")
-  endif()
-
-  set(done_location "${dir}/DONE")
-  set(sha1_location "${dir}/SHA1")
-
-  set(build_dir "${dir}/Build")
-  set(cmakelists "${dir}/CMakeLists.txt")
-
-  hunter_gate_lock("${dir}")
-  if(EXISTS "${done_location}")
-    # while waiting for lock other instance can do all the job
-    hunter_gate_status_debug("File '${done_location}' found, skip install")
-    return()
-  endif()
-
-  file(REMOVE_RECURSE "${build_dir}")
-  file(REMOVE_RECURSE "${cmakelists}")
-
-  file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
-
-  # Disabling languages speeds up a little bit, reduces noise in the output
-  # and avoids path too long windows error
-  file(
-      WRITE
-      "${cmakelists}"
-      "cmake_minimum_required(VERSION 3.0)\n"
-      "project(HunterDownload LANGUAGES NONE)\n"
-      "include(ExternalProject)\n"
-      "ExternalProject_Add(\n"
-      "    Hunter\n"
-      "    URL\n"
-      "    \"${HUNTER_GATE_URL}\"\n"
-      "    URL_HASH\n"
-      "    SHA1=${HUNTER_GATE_SHA1}\n"
-      "    DOWNLOAD_DIR\n"
-      "    \"${dir}\"\n"
-      "    SOURCE_DIR\n"
-      "    \"${dir}/Unpacked\"\n"
-      "    CONFIGURE_COMMAND\n"
-      "    \"\"\n"
-      "    BUILD_COMMAND\n"
-      "    \"\"\n"
-      "    INSTALL_COMMAND\n"
-      "    \"\"\n"
-      ")\n"
-  )
-
-  if(HUNTER_STATUS_DEBUG)
-    set(logging_params "")
-  else()
-    set(logging_params OUTPUT_QUIET)
-  endif()
-
-  hunter_gate_status_debug("Run generate")
-
-  # Need to add toolchain file too.
-  # Otherwise on Visual Studio + MDD this will fail with error:
-  # "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
-  if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
-    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
-  else()
-    # 'toolchain_arg' can't be empty
-    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
-  endif()
-
-  execute_process(
-      COMMAND "${CMAKE_COMMAND}" "-H${dir}" "-B${build_dir}" "-G${CMAKE_GENERATOR}" "${toolchain_arg}"
-      WORKING_DIRECTORY "${dir}"
-      RESULT_VARIABLE download_result
-      ${logging_params}
-  )
-
-  if(NOT download_result EQUAL 0)
-    hunter_gate_internal_error("Configure project failed")
-  endif()
-
-  hunter_gate_status_print(
-      "Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
-      "  ${HUNTER_GATE_URL}"
-      "  -> ${dir}"
-  )
-  execute_process(
-      COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
-      WORKING_DIRECTORY "${dir}"
-      RESULT_VARIABLE download_result
-      ${logging_params}
-  )
-
-  if(NOT download_result EQUAL 0)
-    hunter_gate_internal_error("Build project failed")
-  endif()
-
-  file(REMOVE_RECURSE "${build_dir}")
-  file(REMOVE_RECURSE "${cmakelists}")
-
-  file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
-  file(WRITE "${done_location}" "DONE")
-
-  hunter_gate_status_debug("Finished")
-endfunction()
-
-# Must be a macro so master file 'cmake/Hunter' can
-# apply all variables easily just by 'include' command
-# (otherwise PARENT_SCOPE magic needed)
-macro(HunterGate)
-  if(HUNTER_GATE_DONE)
-    # variable HUNTER_GATE_DONE set explicitly for external project
-    # (see `hunter_download`)
-    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
-  endif()
-
-  # First HunterGate command will init Hunter, others will be ignored
-  get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
-
-  if(NOT HUNTER_ENABLED)
-    # Empty function to avoid error "unknown function"
-    function(hunter_add_package)
-    endfunction()
-  elseif(_hunter_gate_done)
-    hunter_gate_status_debug("Secondary HunterGate (use old settings)")
-    hunter_gate_self(
-        "${HUNTER_CACHED_ROOT}"
-        "${HUNTER_VERSION}"
-        "${HUNTER_SHA1}"
-        _hunter_self
-    )
-    include("${_hunter_self}/cmake/Hunter")
-  else()
-    set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_LIST_DIR}")
-
-    string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
-    if(_have_project_name)
-      hunter_gate_fatal_error(
-          "Please set HunterGate *before* 'project' command. "
-          "Detected project: ${PROJECT_NAME}"
-          WIKI "error.huntergate.before.project"
-      )
-    endif()
-
-    cmake_parse_arguments(
-        HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
-    )
-
-    string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
-    string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
-    string(
-        COMPARE
-        NOTEQUAL
-        "${HUNTER_GATE_UNPARSED_ARGUMENTS}"
-        ""
-        _have_unparsed
-    )
-    string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
-    string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
-
-    if(_have_unparsed)
-      hunter_gate_user_error(
-          "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
-      )
-    endif()
-    if(_empty_sha1)
-      hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
-    endif()
-    if(_empty_url)
-      hunter_gate_user_error("URL suboption of HunterGate is mandatory")
-    endif()
-    if(_have_global)
-      if(HUNTER_GATE_LOCAL)
-        hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
-      endif()
-      if(_have_filepath)
-        hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
-      endif()
-    endif()
-    if(HUNTER_GATE_LOCAL)
-      if(_have_global)
-        hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
-      endif()
-      if(_have_filepath)
-        hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
-      endif()
-    endif()
-    if(_have_filepath)
-      if(_have_global)
-        hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
-      endif()
-      if(HUNTER_GATE_LOCAL)
-        hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
-      endif()
-    endif()
-
-    hunter_gate_detect_root() # set HUNTER_GATE_ROOT
-
-    # Beautify path, fix probable problems with windows path slashes
-    get_filename_component(
-        HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
-    )
-    hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
-    if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
-      string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
-      if(NOT _contain_spaces EQUAL -1)
-        hunter_gate_fatal_error(
-            "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
-            "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
-            "(Use at your own risk!)"
-            WIKI "error.spaces.in.hunter.root"
-        )
-      endif()
-    endif()
-
-    string(
-        REGEX
-        MATCH
-        "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
-        HUNTER_GATE_VERSION
-        "${HUNTER_GATE_URL}"
-    )
-    string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
-    if(_is_empty)
-      set(HUNTER_GATE_VERSION "unknown")
-    endif()
-
-    hunter_gate_self(
-        "${HUNTER_GATE_ROOT}"
-        "${HUNTER_GATE_VERSION}"
-        "${HUNTER_GATE_SHA1}"
-        _hunter_self
-    )
-
-    set(_master_location "${_hunter_self}/cmake/Hunter")
-    if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter")
-      # Hunter downloaded manually (e.g. by 'git clone')
-      set(_unused "xxxxxxxxxx")
-      set(HUNTER_GATE_SHA1 "${_unused}")
-      set(HUNTER_GATE_VERSION "${_unused}")
-    else()
-      get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
-      set(_done_location "${_archive_id_location}/DONE")
-      set(_sha1_location "${_archive_id_location}/SHA1")
-
-      # Check Hunter already downloaded by HunterGate
-      if(NOT EXISTS "${_done_location}")
-        hunter_gate_download("${_archive_id_location}")
-      endif()
-
-      if(NOT EXISTS "${_done_location}")
-        hunter_gate_internal_error("hunter_gate_download failed")
-      endif()
-
-      if(NOT EXISTS "${_sha1_location}")
-        hunter_gate_internal_error("${_sha1_location} not found")
-      endif()
-      file(READ "${_sha1_location}" _sha1_value)
-      string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal)
-      if(NOT _is_equal)
-        hunter_gate_internal_error(
-            "Short SHA1 collision:"
-            "  ${_sha1_value} (from ${_sha1_location})"
-            "  ${HUNTER_GATE_SHA1} (HunterGate)"
-        )
-      endif()
-      if(NOT EXISTS "${_master_location}")
-        hunter_gate_user_error(
-            "Master file not found:"
-            "  ${_master_location}"
-            "try to update Hunter/HunterGate"
-        )
-      endif()
-    endif()
-    include("${_master_location}")
-    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
-  endif()
-endmacro()
\ No newline at end of file
diff --git a/crow/include/crow.h b/crow/include/crow.h
index 5945354..94e7995 100644
--- a/crow/include/crow.h
+++ b/crow/include/crow.h
@@ -19,4 +19,4 @@
 #include "crow/middleware_context.h"
 #include "crow/http_connection.h"
 #include "crow/http_server.h"
-#include "crow/app.h"
+#include "crow/app.h"
\ No newline at end of file
diff --git a/googletest b/googletest
deleted file mode 160000
index 7888184..0000000
--- a/googletest
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7888184f28509dba839e3683409443e0b5bb8948
diff --git a/scripts/build_web_assets.py b/scripts/build_web_assets.py
deleted file mode 100755
index f9b3f74..0000000
--- a/scripts/build_web_assets.py
+++ /dev/null
@@ -1,205 +0,0 @@
-#! /usr/bin/python3
-
-import argparse
-import os
-import gzip
-import hashlib
-from subprocess import Popen, PIPE
-from collections import defaultdict
-import re
-
-THIS_DIR = os.path.dirname(os.path.realpath(__file__))
-
-ENABLE_CACHING = False
-
-# TODO(ed) THis should really pull type and file information from webpack
-CONTENT_TYPES = {
-    'css': "text/css;charset=UTF-8",
-    'html': "text/html;charset=UTF-8",
-    'js': "text/html;charset=UTF-8",
-    'png': "image/png;charset=UTF-8",
-    'woff': "application/x-font-woff",
-    'woff2': "application/x-font-woff2",
-    'ttf': "application/x-font-ttf",
-    "svg": "image/svg+xml",
-    "eot": "application/vnd.ms-fontobject",
-    # dev tools don't care, causes browser to show as text
-    # https://stackoverflow.com/questions/19911929/what-mime-type-should-i-use-for-javascript-source-map-files
-    "map": "application/json"
-}
-
-CPP_MIDDLE_BUFFER = """  CROW_ROUTE(app, "{pretty_name}")
-  ([](const crow::request& req, crow::response& res) {{
-    {CACHE_FOREVER_HEADER}
-    std::string sha1("{sha1}");
-    res.add_header(etag_string, sha1);
-
-    if (req.get_header_value(if_none_match_string) == sha1) {{
-      res.code = 304;
-    }} else {{
-        res.code = 200;
-        // TODO, if you have a browser from the dark ages that doesn't support gzip,
-        // unzip it before sending based on Accept-Encoding header
-        res.add_header(content_encoding_string, {content_encoding});
-        res.add_header(content_type_string, "{content_type}");
-
-        res.write(staticassets::{relative_path_escaped});
-    }}
-    res.end();
-  }});
-
-"""
-
-HPP_START_BUFFER = ("#pragma once\n"
-                    "\n"
-                    "#include <string>\n"
-                    "\n"
-                    "#include <crow/app.h>\n"
-                    "#include <crow/http_request.h>\n"
-                    "#include <crow/http_response.h>\n"
-                    "\n"
-                    "#include <crow/routing.h>\n"
-                    "\n"
-                    "namespace crow {\n"
-                    "namespace webassets {\n"
-                    "static const char* gzip_string = \"gzip\";\n"
-                    "static const char* none_string = \"none\";\n"
-                    "static const char* if_none_match_string = \"If-None-Match\";\n"
-                    "static const char* content_encoding_string = \"Content-Encoding\";\n"
-                    "static const char* content_type_string = \"Content-Type\";\n"
-                    "static const char* etag_string = \"ETag\";\n"
-                    )
-
-
-def twos_comp(val, bits):
-    """compute the 2's compliment of int value val"""
-    if (val & (1 << (bits - 1))) != 0:  # if sign bit is set e.g., 8bit: 128-255
-        val = val - (1 << bits)        # compute negative value
-    return val                         # return positive value as is
-
-
-def main():
-    """ Main Function """
-
-    parser = argparse.ArgumentParser()
-    parser.add_argument('-i', '--input', type=str)
-    parser.add_argument('-o', '--output', type=str)
-    parser.add_argument('-d', '--debug', action='store_true')
-    args = parser.parse_args()
-
-    dist_dir = args.input
-
-    with open(args.output.replace("cpp", "hpp"), 'w') as hpp_output:
-        hpp_output.write(HPP_START_BUFFER)
-        hpp_output.write("struct staticassets {\n")
-
-        asset_filenames = []
-
-        for root, dirnames, filenames in os.walk(dist_dir):
-            for filename in filenames:
-                root_file = os.path.join(root, filename)
-                pretty_name = "/" + os.path.relpath(root_file, dist_dir)
-                cpp_name = "file" + pretty_name
-                for character in ['/', '.', '-']:
-                    cpp_name = cpp_name.replace(character, "_")
-
-                if pretty_name.endswith(".gz"):
-                    pretty_name = pretty_name[:-3]
-                    gzip = True
-                else:
-                    gzip = False
-
-                if pretty_name.endswith("/index.html"):
-                    pretty_name = pretty_name[:-10]
-
-                asset_filenames.append(
-                    (root_file, pretty_name, cpp_name, gzip))
-
-        for root_file, pretty_name, cpp_name, gzip in asset_filenames:
-
-            with open(root_file, 'rb') as file_handle:
-                file_content = file_handle.read()
-
-            hpp_output.write(
-                "  static const std::array<char, {}> {};\n".format(len(file_content), cpp_name))
-        hpp_output.write(
-            "  static const std::array<const char*, {}> routes;\n".format(len(asset_filenames)))
-        hpp_output.write("};\n\n")
-        hpp_output.write("template <typename... Middlewares>\n")
-        hpp_output.write(
-            "void request_routes(Crow<Middlewares...>& app) {\n")
-
-        for root_file, pretty_name, cpp_name, gzip in asset_filenames:
-            os.path.basename(root_file)
-            with open(root_file, 'rb') as file_handle:
-                file_content = file_handle.read()
-                sha = hashlib.sha1()
-                sha.update(file_content)
-                sha1 = sha.hexdigest()
-
-            ext = os.path.split(root_file)[-1].split(".")[-1]
-            if ext == "gz":
-                ext = os.path.split(root_file)[-1].split(".")[-2]
-
-            content_type = CONTENT_TYPES.get(ext, "")
-            if content_type == "":
-                print("unknown content type for {}".format(pretty_name))
-
-            content_encoding = 'gzip_string' if gzip else 'none_string'
-
-            environment = {
-                'relative_path': pretty_name,
-                'relative_path_escaped': cpp_name,
-                'pretty_name': pretty_name,
-                'sha1': sha1,
-                'sha1_short': sha1[:20],
-                'content_type': content_type,
-                'content_encoding': content_encoding,
-                "CACHE_FOREVER_HEADER": ""
-            }
-
-            if ENABLE_CACHING:
-                # if we have a valid sha1, and we have a unique path to the resource
-                # it can be safely cached forever
-                if sha1 != "" and relative_path != relative_path_sha1:
-                    environment["CACHE_FOREVER_HEADER"] = "res.add_header(\"Cache-Control\", \"public, max-age=31556926\");\n"
-
-            content = CPP_MIDDLE_BUFFER.format(**environment)
-            hpp_output.write(content)
-
-        hpp_output.write(
-            "}  // namespace staticassets\n}  // namespace webassets\n}  // namespace crow")
-
-        with open(args.output, 'w') as cpp_output:
-            cpp_output.write("#include <webassets.hpp>\n"
-                             "namespace crow{\n"
-                             "namespace webassets{\n")
-
-            for root_file, pretty_name, cpp_name, gzip in asset_filenames:
-                with open(root_file, 'rb') as file_handle:
-                    file_content = file_handle.read()
-                # compute the 2s complement for negative numbers.
-                # If you don't, you get narrowing warnings from gcc/clang
-                array_binary_text = ', '.join(str(twos_comp(x, 8))
-                                              for x in file_content)
-                cpp_end_buffer = "  const std::array<char, {byte_length}> staticassets::{relative_path_escaped} = {{{file_bytes}}};\n"
-                cpp_output.write(
-                    cpp_end_buffer.format(
-                        relative_path_escaped=cpp_name,
-                        byte_length=len(file_content),
-                        relative_path=pretty_name,
-                        file_bytes=array_binary_text
-                    )
-                )
-                print("{:<40} took {:>6} KB".format(
-                    pretty_name, int(len(array_binary_text) / 1024)))
-            static_routes = ",\n".join(
-                ['    "' + x[1] + '"' for x in asset_filenames])
-            cpp_output.write(
-                "\n  const std::array<const char*, {}> staticassets::routes{{\n{}}};\n".format(len(asset_filenames), static_routes))
-            cpp_output.write(
-                "}  // namespace webassets\n}  // namespace crow\n")
-
-
-if __name__ == "__main__":
-    main()
diff --git a/scripts/run_clang_tidy.py.bak b/scripts/run_clang_tidy.py.bak
deleted file mode 100644
index b45d714..0000000
--- a/scripts/run_clang_tidy.py.bak
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/usr/bin/env python
-#
-#===- run-clang-tidy.py - Parallel clang-tidy runner ---------*- python -*--===#
-#
-#                     The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-#===------------------------------------------------------------------------===#
-# FIXME: Integrate with clang-tidy-diff.py
-
-"""
-Parallel clang-tidy runner
-==========================
-
-Runs clang-tidy over all files in a compilation database. Requires clang-tidy
-and clang-apply-replacements in $PATH.
-
-Example invocations.
-- Run clang-tidy on all files in the current working directory with a default
-  set of checks and show warnings in the cpp files and all project headers.
-    run-clang-tidy.py $PWD
-
-- Fix all header guards.
-    run-clang-tidy.py -fix -checks=-*,llvm-header-guard
-
-- Fix all header guards included from clang-tidy and header guards
-  for clang-tidy headers.
-    run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \
-                      -header-filter=extra/clang-tidy
-
-Compilation database setup:
-http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
-"""
-
-import argparse
-import json
-import multiprocessing
-import os
-import Queue
-import re
-import shutil
-import subprocess
-import sys
-import tempfile
-import threading
-
-
-def find_compilation_database(path):
-  """Adjusts the directory until a compilation database is found."""
-  result = './'
-  while not os.path.isfile(os.path.join(result, path)):
-    if os.path.realpath(result) == '/':
-      print 'Error: could not find compilation database.'
-      sys.exit(1)
-    result += '../'
-  return os.path.realpath(result)
-
-
-def get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,
-                        header_filter, extra_arg, extra_arg_before, quiet):
-  """Gets a command line for clang-tidy."""
-  start = [clang_tidy_binary]
-  if header_filter is not None:
-    start.append('-header-filter=' + header_filter)
-  else:
-    # Show warnings in all in-project headers by default.
-    start.append('-header-filter=^' + build_path + '/.*')
-  if checks:
-    start.append('-checks=' + checks)
-  if tmpdir is not None:
-    start.append('-export-fixes')
-    # Get a temporary file. We immediately close the handle so clang-tidy can
-    # overwrite it.
-    (handle, name) = tempfile.mkstemp(suffix='.yaml', dir=tmpdir)
-    os.close(handle)
-    start.append(name)
-  for arg in extra_arg:
-      start.append('-extra-arg=%s' % arg)
-  for arg in extra_arg_before:
-      start.append('-extra-arg-before=%s' % arg)
-  start.append('-p=' + build_path)
-  if quiet:
-      start.append('-quiet')
-  start.append(f)
-  return start
-
-
-def apply_fixes(args, tmpdir):
-  """Calls clang-apply-fixes on a given directory. Deletes the dir when done."""
-  invocation = [args.clang_apply_replacements_binary]
-  if args.format:
-    invocation.append('-format')
-  invocation.append(tmpdir)
-  subprocess.call(invocation)
-  shutil.rmtree(tmpdir)
-
-
-def run_tidy(args, tmpdir, build_path, queue):
-  """Takes filenames out of queue and runs clang-tidy on them."""
-  while True:
-    name = queue.get()
-    invocation = get_tidy_invocation(name, args.clang_tidy_binary, args.checks,
-                                     tmpdir, build_path, args.header_filter,
-                                     args.extra_arg, args.extra_arg_before,
-                                     args.quiet)
-    sys.stdout.write(' '.join(invocation) + '\n')
-    subprocess.call(invocation)
-    queue.task_done()
-
-
-def main():
-  parser = argparse.ArgumentParser(description='Runs clang-tidy over all files '
-                                   'in a compilation database. Requires '
-                                   'clang-tidy and clang-apply-replacements in '
-                                   '$PATH.')
-  parser.add_argument('-clang-tidy-binary', metavar='PATH',
-                      default='clang-tidy',
-                      help='path to clang-tidy binary')
-  parser.add_argument('-clang-apply-replacements-binary', metavar='PATH',
-                      default='clang-apply-replacements',
-                      help='path to clang-apply-replacements binary')
-  parser.add_argument('-checks', default=None,
-                      help='checks filter, when not specified, use clang-tidy '
-                      'default')
-  parser.add_argument('-header-filter', default=None,
-                      help='regular expression matching the names of the '
-                      'headers to output diagnostics from. Diagnostics from '
-                      'the main file of each translation unit are always '
-                      'displayed.')
-  parser.add_argument('-j', type=int, default=0,
-                      help='number of tidy instances to be run in parallel.')
-  parser.add_argument('files', nargs='*', default=['.*'],
-                      help='files to be processed (regex on path)')
-  parser.add_argument('-fix', action='store_true', help='apply fix-its')
-  parser.add_argument('-format', action='store_true', help='Reformat code '
-                      'after applying fixes')
-  parser.add_argument('-p', dest='build_path',
-                      help='Path used to read a compile command database.')
-  parser.add_argument('-extra-arg', dest='extra_arg',
-                      action='append', default=[],
-                      help='Additional argument to append to the compiler '
-                      'command line.')
-  parser.add_argument('-extra-arg-before', dest='extra_arg_before',
-                      action='append', default=[],
-                      help='Additional argument to prepend to the compiler '
-                      'command line.')
-  parser.add_argument('-quiet', action='store_true',
-                      help='Run clang-tidy in quiet mode')
-  args = parser.parse_args()
-
-  db_path = 'compile_commands.json'
-
-  if args.build_path is not None:
-    build_path = args.build_path
-  else:
-    # Find our database
-    build_path = find_compilation_database(db_path)
-
-  try:
-    invocation = [args.clang_tidy_binary, '-list-checks']
-    invocation.append('-p=' + build_path)
-    if args.checks:
-      invocation.append('-checks=' + args.checks)
-    invocation.append('-')
-    print subprocess.check_output(invocation)
-  except:
-    print >>sys.stderr, "Unable to run clang-tidy."
-    sys.exit(1)
-
-  # Load the database and extract all files.
-  database = json.load(open(os.path.join(build_path, db_path)))
-  files = [entry['file'] for entry in database]
-
-  max_task = args.j
-  if max_task == 0:
-    max_task = multiprocessing.cpu_count()
-
-  tmpdir = None
-  if args.fix:
-    tmpdir = tempfile.mkdtemp()
-
-  # Build up a big regexy filter from all command line arguments.
-  file_name_re = re.compile('|'.join(args.files))
-
-  try:
-    # Spin up a bunch of tidy-launching threads.
-    queue = Queue.Queue(max_task)
-    for _ in range(max_task):
-      t = threading.Thread(target=run_tidy,
-                           args=(args, tmpdir, build_path, queue))
-      t.daemon = True
-      t.start()
-
-    # Fill the queue with files.
-    for name in files:
-      if file_name_re.search(name):
-        queue.put(name)
-
-    # Wait for all threads to be done.
-    queue.join()
-
-  except KeyboardInterrupt:
-    # This is a sad hack. Unfortunately subprocess goes
-    # bonkers with ctrl-c and we start forking merrily.
-    print '\nCtrl-C detected, goodbye.'
-    if args.fix:
-      shutil.rmtree(tmpdir)
-    os.kill(0, 9)
-
-  if args.fix:
-    print 'Applying fixes ...'
-    apply_fixes(args, tmpdir)
-
-if __name__ == '__main__':
-  main()
\ No newline at end of file
diff --git a/src/gtest_main.cpp b/src/gtest_main.cpp
index 1659be8..d701498 100644
--- a/src/gtest_main.cpp
+++ b/src/gtest_main.cpp
@@ -1,4 +1,5 @@
 #include "gtest/gtest.h"
+#include "gmock/gmock.h"
 
 int main(int argc, char **argv) {
   ::testing::InitGoogleTest(&argc, argv);
diff --git a/tinyxml2 b/tinyxml2
deleted file mode 160000
index 65b5366..0000000
--- a/tinyxml2
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 65b5366a02dd0982f93821d43846fa6a9f8ae9b1
