diff --git a/wscript b/wscript
index 8137f3b..e153c41 100644
--- a/wscript
+++ b/wscript
@@ -5,17 +5,21 @@
 import Utils
 import Options
 
-def set_options(opt):
-    opt.tool_options('boost')
+def options(opt):
+    opt.tool_options('boost', tooldir=["waf-tools"])
 
 def configure(conf):
-    conf.check_tool('boost')
-    conf.env['BOOST'] = conf.check_boost(lib = 'iostreams',
-                                         min_version='1.40.0' )
-    if not conf.env['BOOST']:
+    try:
+        conf.check_tool('boost')
+        conf.check_boost(lib = 'iostreams')
+    except WafError:
+        conf.env['LIB_BOOST'] = []
+
+    if not conf.env['LIB_BOOST']:
         conf.report_optional_feature("ndn-abstract", "NDN abstraction", False,
                                      "Required boost libraries not found")
         conf.env['ENABLE_NDN_ABSTRACT']=False;
+        conf.env['MODULES_NOT_BUILT'].append('NDNabstraction')
         return
     
     conf.env['ENABLE_NDN_ABSTRACT']=True;
@@ -27,41 +31,46 @@
     module.uselib = 'BOOST BOOST_IOSTREAMS'
 
     tests = bld.create_ns3_module_test_library('NDNabstraction')
-    headers = bld.new_task_gen('ns3header')
+    headers = bld.new_task_gen(features=['ns3header'])
     headers.module = 'NDNabstraction'
 
     if not bld.env['ENABLE_NDN_ABSTRACT']:
-        conf.env['MODULES_NOT_BUILT'].append('NDNabstraction')
+        bld.env['MODULES_NOT_BUILT'].append('NDNabstraction')
         return
    
-    module.find_sources_in_dirs (['model', 'apps', 'helper',
-                                   'helper/ccnb-parser',
-                                   'helper/ccnb-parser/visitors',
-                                   'helper/ccnb-parser/syntax-tree'],[],['.cc']);
-    tests.find_sources_in_dirs( ['test'], [], ['.cc'] );
-    headers.find_sources_in_dirs( ['model', 'apps', 'helper',
-                                   'helper/ccnb-parser',
-                                   'helper/ccnb-parser/visitors',
-                                   'helper/ccnb-parser/syntax-tree'], [], ['.h'] );
+    module.source = bld.path.ant_glob(['model/*.cc', 'apps/*.cc', 
+                          'helper/*.cc',
+                          'helper/ccnb-parser/*.cc',
+                          'helper/ccnb-parser/visitors/*.cc',
+                          'helper/ccnb-parser/syntax-tree/*.cc'])
 
-    if True or bld.env['ENABLE_EXAMPLES']:
-        for path in ["examples"]:
-            anode = bld.path.find_dir (path)
-            if not anode or not anode.is_child_of(bld.srcnode):
-                raise Utils.WscriptError("Unable to use '%s' - either because \
-                it's not a relative path"", or it's not child of \
-               '%s'."%(name,bld.srcnode))
-            bld.rescan(anode)
-            for filename in bld.cache_dir_contents[anode.id]:
-                if filename.startswith('.') or not filename.endswith(".cc"):
-                    continue
-                name = filename[:-len(".cc")]
-                obj = bld.create_ns3_program(name, ['NDNabstraction'])
-                obj.path = obj.path.find_dir (path)
-                obj.source = filename
-                obj.target = name
-                obj.name = obj.target
-                obj.uselib = 'BOOST BOOST_IOSTREAMS'
+    headers.source = bld.path.ant_glob(['model/*.h', 'apps/*.h', 
+                          'helper/*.h',
+                          'helper/ccnb-parser/*.h',
+                          'helper/ccnb-parser/visitors/*.h',
+                          'helper/ccnb-parser/syntax-tree/*.h'])
 
-    bld.ns3_python_bindings()
-    
+    headers.source = [x.path_from(bld.path) for x in headers.source]
+
+    tests.source = bld.path.ant_glob('test/*.cc');
+
+    # if True or bld.env['ENABLE_EXAMPLES']:
+    #     for path in ["examples"]:
+    #         anode = bld.path.find_dir (path)
+    #         if not anode or not anode.is_child_of(bld.srcnode):
+    #             raise Utils.WscriptError("Unable to use '%s' - either because \
+    #             it's not a relative path"", or it's not child of \
+    #            '%s'."%(name,bld.srcnode))
+    #         bld.rescan(anode)
+    #         for filename in bld.cache_dir_contents[anode.id]:
+    #             if filename.startswith('.') or not filename.endswith(".cc"):
+    #                 continue
+    #             name = filename[:-len(".cc")]
+    #             obj = bld.create_ns3_program(name, ['NDNabstraction'])
+    #             obj.path = obj.path.find_dir (path)
+    #             obj.source = filename
+    #             obj.target = name
+    #             obj.name = obj.target
+    #             obj.uselib = 'BOOST BOOST_IOSTREAMS'
+
+    # bld.ns3_python_bindings()
