diff --git a/.waf-tools/boost-kqueue.py b/.waf-tools/boost-kqueue.py
deleted file mode 100644
index d4d5139..0000000
--- a/.waf-tools/boost-kqueue.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-#
-# Copyright (c) 2014, Regents of the University of California
-#
-# GPL 3.0 license, see the COPYING.md file for more information
-
-from waflib import Configure
-
-BOOST_ASIO_HAS_KQUEUE_CHECK = '''
-#include <boost/asio.hpp>
-#if defined(BOOST_ASIO_HAS_KQUEUE) and BOOST_VERSION == 105600
-#error "Ethernet face support cannot be enabled on this platform with boost 1.56"
-#endif
-'''
-
-@Configure.conf
-def check_asio_pcap_support(conf):
-    # https://svn.boost.org/trac/boost/ticket/10367
-    if conf.check_cxx(msg='Checking if Ethernet face support can be enabled',
-                      fragment=BOOST_ASIO_HAS_KQUEUE_CHECK,
-                      features='cxx', use='BOOST', mandatory=False):
-        conf.define('HAVE_ASIO_PCAP_SUPPORT', 1)
-        conf.env['HAVE_ASIO_PCAP_SUPPORT'] = True
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
index 54db7ea..e9fdcc6 100644
--- a/.waf-tools/default-compiler-flags.py
+++ b/.waf-tools/default-compiler-flags.py
@@ -15,14 +15,14 @@
     errmsg = ''
     warnmsg = ''
     if cxx == 'gcc':
-        if ccver < (4, 8, 2):
+        if ccver < (5, 3, 0):
             errmsg = ('The version of gcc you are using is too old.\n'
-                      'The minimum supported gcc version is 4.8.2.')
+                      'The minimum supported gcc version is 5.3.0.')
         conf.flags = GccFlags()
     elif cxx == 'clang':
-        if ccver < (3, 4, 0):
+        if ccver < (3, 5, 0):
             errmsg = ('The version of clang you are using is too old.\n'
-                      'The minimum supported clang version is 3.4.0.')
+                      'The minimum supported clang version is 3.5.0.')
         conf.flags = ClangFlags()
     else:
         warnmsg = 'Note: %s compiler is unsupported' % cxx
@@ -164,16 +164,12 @@
 class GccFlags(GccBasicFlags):
     def getDebugFlags(self, conf):
         flags = super(GccFlags, self).getDebugFlags(conf)
-        if self.getCompilerVersion(conf) < (5, 1, 0):
-            flags['CXXFLAGS'] += ['-Wno-missing-field-initializers']
-        flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9
+        flags['CXXFLAGS'] += ['-fdiagnostics-color']
         return flags
 
     def getOptimizedFlags(self, conf):
         flags = super(GccFlags, self).getOptimizedFlags(conf)
-        if self.getCompilerVersion(conf) < (5, 1, 0):
-            flags['CXXFLAGS'] += ['-Wno-missing-field-initializers']
-        flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9
+        flags['CXXFLAGS'] += ['-fdiagnostics-color']
         return flags
 
 class ClangFlags(GccBasicFlags):
diff --git a/.waf-tools/type_traits.py b/.waf-tools/type_traits.py
deleted file mode 100644
index fc1ffbf..0000000
--- a/.waf-tools/type_traits.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-#
-# Copyright (c) 2014, Regents of the University of California
-#
-# GPL 3.0 license, see the COPYING.md file for more information
-
-from waflib import Configure
-
-IS_MOVE_CONSTRUCTIBLE_CHECK = '''
-#include <type_traits>
-static_assert(std::is_move_constructible<int>::value, "");
-'''
-
-def configure(conf):
-    if conf.check_cxx(msg='Checking for std::is_move_constructible',
-                      fragment=IS_MOVE_CONSTRUCTIBLE_CHECK,
-                      features='cxx', mandatory=False):
-        conf.define('HAVE_IS_MOVE_CONSTRUCTIBLE', 1)
-        conf.env['HAVE_IS_MOVE_CONSTRUCTIBLE'] = True
diff --git a/.waf-tools/websocket.py b/.waf-tools/websocket.py
index c30c48e..6b481cf 100644
--- a/.waf-tools/websocket.py
+++ b/.waf-tools/websocket.py
@@ -62,11 +62,11 @@
         if isMandatory:
             self.end_msg(str(error), color='RED')
             Logs.warn('If you are using git NFD repository, checkout websocketpp submodule: ')
-            Logs.warn('    git submodule init && git submodule update')
+            Logs.warn('    git submodule update --init')
             Logs.warn('Otherwise, manually download and extract websocketpp library:')
             Logs.warn('    mkdir websocketpp')
             Logs.warn('    curl -L https://github.com/zaphoyd/websocketpp/archive/0.7.0.tar.gz > websocket.tar.gz')
-            Logs.warn('    tar zxf websocket.tar.gz -C websocketpp/ --strip 1')
+            Logs.warn('    tar xf websocket.tar.gz -C websocketpp/ --strip 1')
             Logs.warn('Alternatively, WebSocket support can be disabled with --without-websocket')
             self.fatal('The configuration failed')
         else:
