diff --git a/.waf-tools/compiler-features.py b/.waf-tools/compiler-features.py
index 502596c..1602f16 100644
--- a/.waf-tools/compiler-features.py
+++ b/.waf-tools/compiler-features.py
@@ -23,31 +23,8 @@
 @conf
 def check_std_to_string(self):
     if self.check_cxx(msg='Checking for std::to_string',
-                      fragment=STD_TO_STRING,
-                      features='cxx', mandatory=False):
+                      fragment=STD_TO_STRING, mandatory=False):
         self.define('HAVE_STD_TO_STRING', 1)
 
-VECTOR_INSERT_ERASE_CONST_ITERATOR = '''
-#include <vector>
-int
-main()
-{
-  std::vector<int> v;
-  std::vector<int>::const_iterator it = v.cbegin();
-
-  v.insert(it, 2);
-  it = v.cend() - 1;
-  v.erase(it);
-}
-'''
-
-@conf
-def check_vector_const_iterators(self):
-    if self.check_cxx(msg='Checking for std::vector::insert with const_iterator',
-                      fragment=VECTOR_INSERT_ERASE_CONST_ITERATOR,
-                      features='cxx', mandatory=False):
-        self.define('HAVE_VECTOR_INSERT_ERASE_CONST_ITERATOR', 1)
-
 def configure(conf):
     conf.check_std_to_string()
-    conf.check_vector_const_iterators()
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 efc4e3d..0000000
--- a/.waf-tools/type_traits.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def checkForTypeProperty(conf, prop, tparams):
-    if conf.check_cxx(msg=('Checking for std::%s' % prop),
-                      fragment=('#include <type_traits>\nstatic_assert(std::%s<%s>::value, "");' %
-                                (prop, tparams)),
-                      features='cxx', mandatory=False):
-        define = 'HAVE_' + prop.upper()
-        conf.define(define, 1)
-        conf.env[define] = True
-
-def configure(conf):
-    checkForTypeProperty(conf, 'is_default_constructible', 'int')
-    checkForTypeProperty(conf, 'is_nothrow_move_constructible', 'int')
-    checkForTypeProperty(conf, 'is_nothrow_move_assignable', 'int')
