diff --git a/wscript b/wscript
new file mode 100644
index 0000000..faa9112
--- /dev/null
+++ b/wscript
@@ -0,0 +1,246 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+VERSION='0.3~dev0'
+NAME="ndn-cpp-dev"
+
+from waflib import Build, Logs, Utils, Task, TaskGen, Configure
+
+def options(opt):
+    opt.load('compiler_c compiler_cxx gnu_dirs c_osx')
+    opt.load('boost doxygen openssl cryptopp', tooldir=['waf-tools'])
+
+    opt = opt.add_option_group('NDN-CPP Options')
+
+    opt.add_option('--debug',action='store_true',default=False,dest='debug',help='''debugging mode''')
+    opt.add_option('--test', action='store_true',default=False,dest='_test',help='''build unit tests''')
+    opt.add_option('--log4cxx', action='store_true',default=False,dest='log4cxx',help='''Compile with log4cxx logging support''')
+    opt.add_option('--private_storage', dest='private_storage', default='opt', help='''simple for SimplePrivatekeyStorage; osx for OSXPrivatekeyStorage; opt for optimal one based on system (default)''')
+    opt.add_option('--public_storage', dest='public_storage', default='opt', help='''basic for BasicIdentityStorage; opt for optimal one based on system (default)''')
+    opt.add_option('--policy_manager', dest='policy_manager', default='opt', help='''none for NoVerifyPolicyManager; opt for optimal one based on system (default)''')
+    opt.add_option('--encrypt_manager', dest='encrypt_manager', default='opt', help='''basic for BasicEncryptionManager; opt for optimal one based on system (default)''')
+
+    opt.add_option('--no-c++11', action='store_false', default=True, dest='use_cxx11',
+                   help='''Do not use C++11 features, even if available in the compiler''')
+    opt.add_option('--use-system-boost', action='store_true', default=False, dest='use_system_boost',
+                   help='''Use system's boost libraries''')
+
+
+def configure(conf):
+    conf.load("compiler_c compiler_cxx boost gnu_dirs c_osx openssl cryptopp")
+    try:
+        conf.load("doxygen")
+    except:
+        pass
+
+    if conf.options._test:
+        conf.define ('_TESTS', 1)
+        conf.env['TEST'] = True
+
+    # Optional functions
+    for func in ['memcmp', 'memcpy', 'memset']:
+        conf.check(function_name=func, header_name='string.h', mandatory=False)
+
+    # Mandatory functions
+    for func in ['strchr', 'sscanf']:
+        conf.check(function_name=func, header_name=['string.h', 'stdio.h'])
+
+    # Mandatory headers
+    for header in ['time.h', 'sys/time.h']:
+        conf.check(header_name=header)
+
+    conf.check(function_name='gettimeofday', header_name=['time.h', 'sys/time.h'])
+
+    conf.check_openssl()
+
+    if conf.options.debug:
+        conf.define ('_DEBUG', 1)
+        flags = ['-O0',
+                 '-Wall',
+                 '-Werror',
+                 '-Wno-unused-variable',
+                 '-g3',
+                 '-Wno-unused-private-field', # only clang supports
+                 '-fcolor-diagnostics',       # only clang supports
+                 '-Qunused-arguments',        # only clang supports
+                 '-Wno-tautological-compare', # suppress warnings from CryptoPP
+                 '-Wno-unused-function',      # another annoying warning from CryptoPP
+
+                 '-Wno-deprecated-declarations',
+                 ]
+
+        conf.add_supported_cxxflags (cxxflags = flags)
+        conf.add_supported_cflags (cflags = flags)
+    else:
+        flags = ['-O3', '-g', '-Wno-tautological-compare', '-Wno-unused-function', '-Wno-deprecated-declarations']
+        conf.add_supported_cxxflags (cxxflags = flags)
+        conf.add_supported_cflags (cxxflags = flags)
+
+    if Utils.unversioned_sys_platform () == "darwin":
+        # if 'clang++' not in conf.env['CXX']:
+        #     conf.fatal('Use clang++ compiler (CXX=clang++ ./waf configure) on OSX platform')
+        #     return
+
+        conf.check_cxx(framework_name='CoreFoundation', uselib_store='OSX_COREFOUNDATION', mandatory=True)
+        # conf.check_cxx(framework_name='CoreServices', uselib_store='OSX_CORESERVICES', mandatory=True, compile_filename='test.mm')
+        # conf.check_cxx(framework_name='Security',   uselib_store='OSX_SECURITY',   define_name='HAVE_SECURITY',
+        #                use="OSX_COREFOUNDATION", mandatory=True, compile_filename='test.mm')
+
+    conf.check_security_parameter()
+
+    conf.define ("PACKAGE_BUGREPORT", "ndn-lib@lists.cs.ucla.edu")
+    conf.define ("PACKAGE_NAME", NAME)
+    conf.define ("PACKAGE_VERSION", VERSION)
+    conf.define ("PACKAGE_URL", "https://github.com/named-data/ndn-cpp")
+
+    conf.check_cfg(package='sqlite3', args=['--cflags', '--libs'], uselib_store='SQLITE3', mandatory=True)
+    # conf.check_cfg(package='libevent', args=['--cflags', '--libs'], uselib_store='LIBEVENT', mandatory=True)
+    # conf.check_cfg(package='libevent_pthreads', args=['--cflags', '--libs'], uselib_store='LIBEVENT_PTHREADS', mandatory=True)
+
+    if conf.options.log4cxx:
+        conf.check_cfg(package='liblog4cxx', args=['--cflags', '--libs'], uselib_store='LOG4CXX', mandatory=True)
+        conf.define ("HAVE_LOG4CXX", 1)
+
+    # conf.check_cryptopp(path=conf.options.cryptopp_dir)
+
+    if conf.options.use_cxx11:
+        conf.add_supported_cxxflags(cxxflags = ['-std=c++11', '-std=c++0x'])
+
+        conf.check(msg='Checking for type std::shared_ptr',
+                   type_name="std::shared_ptr<int>", header_name="memory", define_name='HAVE_STD_SHARED_PTR')
+        conf.check(msg='Checking for type std::function',
+                   type_name="std::function<void()>", header_name="functional", define_name='HAVE_STD_FUNCTION')
+        conf.define('HAVE_CXX11', 1)
+    else:
+        if conf.options.use_system_boost:
+            USED_BOOST_LIBS = 'system iostreams'
+            if conf.env['TEST']:
+                USED_BOOST_LIBS += " test"
+
+            conf.check_boost(lib=USED_BOOST_LIBS)
+
+            boost_version = conf.env.BOOST_VERSION.split('_')
+            if int(boost_version[0]) > 1 or (int(boost_version[0]) == 1 and int(boost_version[1]) >= 46):
+                conf.env['USE_SYSTEM_BOOST'] = True
+                conf.define('USE_SYSTEM_BOOST', 1)
+
+    conf.write_config_header('include/ndn-cpp/ndn-cpp-config.h', define_prefix='NDN_CPP_')
+
+def build (bld):
+    libndn_cpp = bld (
+        target="ndn-cpp-dev",
+        vnum = "0.3.0",
+        features=['c', 'cxx', 'cxxshlib'],
+        source = bld.path.ant_glob(['src/**/*.cpp',
+                                    'src/**/*.c']),
+        use = 'BOOST OPENSSL LOG4CXX CRYPTOPP SQLITE3',
+        includes = ". include",
+        )
+
+    if Utils.unversioned_sys_platform () == "darwin":
+        libndn_cpp.mac_app = True
+        libndn_cpp.use += " OSX_COREFOUNDATION OSX_SECURITY"
+
+    # Unit tests
+    if bld.env['TEST']:
+      unittests = bld.program (
+          target="unit-tests",
+          features = "cxx cxxprogram",
+          defines = "WAF",
+          source = bld.path.ant_glob(['test/*.cc']),
+          use = 'BOOST BOOST_TEST OPENSSL LOG4CXX ndn.cxx CRYPTOPP',
+          includes = ".",
+          install_prefix = None,
+          )
+
+    headers = bld.path.ant_glob(['src/**/*.h'])
+    bld.install_files("%s/ndn-cpp" % bld.env['INCLUDEDIR'], headers, relative_trick=True, cwd=bld.path.find_node('src'))
+
+@Configure.conf
+def add_supported_cxxflags(self, cxxflags):
+    """
+    Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
+    """
+    self.start_msg('Checking allowed flags for c++ compiler')
+
+    supportedFlags = []
+    for flag in cxxflags:
+        if self.check_cxx (cxxflags=[flag], mandatory=False):
+            supportedFlags += [flag]
+
+    self.end_msg (' '.join (supportedFlags))
+    self.env.CXXFLAGS += supportedFlags
+
+@Configure.conf
+def add_supported_cflags(self, cflags):
+    """
+    Check which cflags are supported by compiler and add them to env.CFLAGS variable
+    """
+    self.start_msg('Checking allowed flags for c compiler')
+
+    supportedFlags = []
+    for flag in cflags:
+        if self.check_cc (cflags=[flag], mandatory=False):
+            supportedFlags += [flag]
+
+    self.end_msg (' '.join (supportedFlags))
+    self.env.CFLAGS += supportedFlags
+
+@Configure.conf
+def check_security_parameter(self):
+    """
+    Check the security parameters
+    """
+    if self.options.private_storage == 'simple':
+        self.define ('USE_SIMPLE_PRIVATEKEY_STORAGE', 1)
+    elif self.options.private_storage == 'osx':
+        self.define ('USE_OSX_PRIVATEKEY_STORAGE', 1)
+    else:
+        if Utils.unversioned_sys_platform () == "darwin":
+            self.define ('USE_OSX_PRIVATEKEY_STORAGE', 1)
+        else:
+            self.define ('USE_SIMPLE_PRIVATEKEY_STORAGE', 1)
+
+    if self.options.public_storage == 'basic':
+        self.define ('USE_BASIC_IDENTITY_STORAGE', 1)
+    else:
+        self.define ('USE_BASIC_IDENTITY_STORAGE', 1)
+
+    if self.options.policy_manager == 'none':
+        self.define ('USE_NO_VERIFY_POLICY_MANAGER', 1)
+    else:
+        self.define ('USE_SIMPLE_POLICY_MANAGER', 1)
+
+    if self.options.encrypt_manager == 'basic':
+        self.define ('USE_BASIC_ENCRYPTION_MANAGER', 1)
+    else:
+        self.define ('USE_BASIC_ENCRYPTION_MANAGER', 1)
+
+
+# doxygen docs
+from waflib.Build import BuildContext
+class doxy (BuildContext):
+    cmd = "doxygen"
+    fun = "doxygen"
+
+def doxygen (bld):
+    if not bld.env.DOXYGEN:
+        bld.fatal ("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
+    bld (features="doxygen",
+         doxyfile='doc/doxygen.conf')
+
+# doxygen docs
+from waflib.Build import BuildContext
+class sphinx (BuildContext):
+    cmd = "sphinx"
+    fun = "sphinx"
+
+def sphinx (bld):
+    bld.load('sphinx_build', tooldir=['waf-tools'])
+
+    bld (features="sphinx",
+         outdir = "doc/html",
+         source = "doc/source/conf.py")
+
+@TaskGen.extension('.mm')
+def mm_hook(self, node):
+    """Alias .mm files to be compiled the same as .cc files, gcc will do the right thing."""
+    return self.create_compiled_task('cxx', node)
