diff --git a/.waf-tools/boost.py b/.waf-tools/boost.py
index 39b5446..8c36b34 100644
--- a/.waf-tools/boost.py
+++ b/.waf-tools/boost.py
@@ -53,8 +53,11 @@
 from waflib import Utils, Logs, Errors
 from waflib.Configure import conf
 
-BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib', '/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu', '/usr/local/ndn/lib']
-BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include', '/usr/local/ndn/include']
+BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib',
+              '/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
+              '/usr/local/ndn/lib', '/opt/ndn/lib']
+BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include',
+                  '/usr/local/ndn/include', '/opt/ndn/include']
 BOOST_VERSION_FILE = 'boost/version.hpp'
 BOOST_VERSION_CODE = '''
 #include <iostream>
diff --git a/.waf-tools/coverage.py b/.waf-tools/coverage.py
index eac7608..8045aa8 100644
--- a/.waf-tools/coverage.py
+++ b/.waf-tools/coverage.py
@@ -3,7 +3,7 @@
 from waflib import TaskGen
 
 def options(opt):
-    opt.add_option('--with-coverage',action='store_true',default=False,dest='with_coverage',
+    opt.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage',
                    help='''Set compiler flags for gcc to enable code coverage information''')
 
 def configure(conf):
diff --git a/.waf-tools/cryptopp.py b/.waf-tools/cryptopp.py
index ab3f7f7..4293aab 100644
--- a/.waf-tools/cryptopp.py
+++ b/.waf-tools/cryptopp.py
@@ -6,10 +6,11 @@
 When using this tool, the wscript will look like:
 
     def options(opt):
-        opt.tool_options('cryptopp', tooldir=["waf-tools"])
+        opt.load('compiler_cxx cryptopp')
 
     def configure(conf):
         conf.load('compiler_cxx cryptopp')
+        conf.check_cryptopp()
 
     def build(bld):
         bld(source='main.cpp', target='app', use='CRYPTOPP')
@@ -22,12 +23,12 @@
 import re
 from waflib import Utils,Logs,Errors
 from waflib.Configure import conf
-CRYPTOPP_DIR = ['/usr', '/usr/local', '/opt/local', '/sw']
+CRYPTOPP_DIR = ['/usr', '/usr/local', '/opt/local', '/sw', '/usr/local/ndn', '/opt/ndn']
 CRYPTOPP_VERSION_FILE = 'config.h'
 
 def options(opt):
-    opt.add_option('--cryptopp', type='string', default='', dest='cryptopp_dir',
-                   help='''Path to where CryptoPP is installed, e.g. /opt/local''')
+    opt.add_option('--with-cryptopp', type='string', default=None, dest='cryptopp_dir',
+                   help='''Path to where CryptoPP is installed, e.g., /usr/local''')
 
 @conf
 def __cryptopp_get_version_file(self, dir):
@@ -39,7 +40,7 @@
 
 @conf
 def __cryptopp_find_root_and_version_file(self, *k, **kw):
-    root = k and k[0]or kw.get('path', None)
+    root = k and k[0] or kw.get('path', self.options.cryptopp_dir)
 
     file = self.__cryptopp_get_version_file(root)
     if root and file:
@@ -52,7 +53,7 @@
     if root:
         self.fatal('CryptoPP not found in %s' % root)
     else:
-        self.fatal('CryptoPP not found, please provide a --cryptopp argument (see help)')
+        self.fatal('CryptoPP not found, please provide a --with=cryptopp=PATH argument (see help)')
 
 @conf
 def check_cryptopp(self, *k, **kw):
@@ -60,6 +61,8 @@
         self.fatal('Load a c++ compiler first, e.g., conf.load("compiler_cxx")')
 
     var = kw.get('uselib_store','CRYPTOPP')
+    mandatory = kw.get('mandatory', True)
+
     self.start_msg('Checking Crypto++ lib')
     (root, file) = self.__cryptopp_find_root_and_version_file(*k, **kw)
 
@@ -81,5 +84,5 @@
                          lib='cryptopp',
                          cxxflags="-I%s/include" % root,
                          linkflags="-L%s/lib" % root,
-                         mandatory=True,
+                         mandatory=mandatory,
                          uselib_store=var)
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
index 9f7843e..21060a2 100644
--- a/.waf-tools/default-compiler-flags.py
+++ b/.waf-tools/default-compiler-flags.py
@@ -1,8 +1,4 @@
 # -*- 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 Logs, Configure
 
diff --git a/.waf-tools/openssl.py b/.waf-tools/openssl.py
index eb85462..e2ba7d0 100644
--- a/.waf-tools/openssl.py
+++ b/.waf-tools/openssl.py
@@ -9,8 +9,7 @@
         opt.tool_options('openssl')
 
     def configure(conf):
-        conf.load('compiler_c openssl')
-
+        conf.load('compiler_cxx openssl')
         conf.check_openssl()
 
     def build(bld):
@@ -23,21 +22,10 @@
 
 @conf
 def check_openssl(self,*k,**kw):
-    root = k and k[0] or kw.get('path',None) or Options.options.with_openssl
+    root = k and k[0] or kw.get('path', None) or Options.options.with_openssl
     mandatory = kw.get('mandatory', True)
-    var = kw.get('var', 'OPENSSL')
+    var = kw.get('uselib_store', 'OPENSSL')
 
-    CODE = """
-#include <openssl/crypto.h>
-#include <stdio.h>
-
-int main(int argc, char **argv) {
-    (void)argc;
-    printf("%s", argv[0]);
-
-    return 0;
-}
-"""
     if root:
         libcrypto = self.check_cxx(lib=['ssl', 'crypto'],
                        msg='Checking for OpenSSL library',
@@ -45,16 +33,14 @@
                        uselib_store=var,
                        mandatory=mandatory,
                        cxxflags="-I%s/include" % root,
-                       linkflags="-L%s/lib" % root,
-                       fragment=CODE)
+                       linkflags="-L%s/lib" % root)
     else:
         libcrypto = self.check_cxx(lib=['ssl', 'crypto'],
                        msg='Checking for OpenSSL library',
                        define_name='HAVE_%s' % var,
                        uselib_store=var,
-                       mandatory=mandatory,
-                       fragment=CODE)
+                       mandatory=mandatory)
 
 def options(opt):
-    opt.add_option('--with-openssl', type='string', default='',
+    opt.add_option('--with-openssl', type='string', default=None,
                    dest='with_openssl', help='''Path to OpenSSL''')
diff --git a/.waf-tools/osx-security.py b/.waf-tools/osx-security.py
new file mode 100644
index 0000000..9bcb3a8
--- /dev/null
+++ b/.waf-tools/osx-security.py
@@ -0,0 +1,36 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+from waflib import Logs, Utils
+from waflib.Configure import conf
+
+OSX_SECURITY_CODE='''
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#include <Security/SecRandom.h>
+#include <CoreServices/CoreServices.h>
+#include <Security/SecDigestTransform.h>
+
+int main(int argc, char **argv) {
+    (void)argc; (void)argv;
+    return 0;
+}
+'''
+
+@conf
+def check_osx_security(conf, *k, **kw):
+    if Utils.unversioned_sys_platform() == "darwin":
+        try:
+            conf.check_cxx(framework_name='CoreFoundation', uselib_store='OSX_COREFOUNDATION',
+                           mandatory=True)
+            conf.check_cxx(framework_name='CoreServices', uselib_store='OSX_CORESERVICES',
+                           mandatory=True)
+            conf.check_cxx(framework_name='Security', uselib_store='OSX_SECURITY',
+                           define_name='HAVE_SECURITY', use="OSX_COREFOUNDATION",
+                           fragment=OSX_SECURITY_CODE, mandatory=True)
+
+            conf.define('HAVE_OSX_SECURITY', 1)
+            conf.env['HAVE_OSX_SECURITY'] = True
+        except:
+            Logs.warn("Compiling on OSX, but CoreFoundation, CoreServices, or Security framework is not functional.")
+            Logs.warn("The frameworks are known to work only with Apple-specific compilers: llvm-gcc-4.2 or clang")
diff --git a/.waf-tools/pch.py b/.waf-tools/pch.py
new file mode 100644
index 0000000..b4f8f7f
--- /dev/null
+++ b/.waf-tools/pch.py
@@ -0,0 +1,38 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+from waflib import Logs, Utils, Task, TaskGen
+from waflib.Tools import c_preproc
+
+def options(opt):
+    opt.add_option('--with-pch', action='store_true', default=False, dest='with_pch',
+                   help='''Try to use precompiled header to speed up compilation '''
+                        '''(only gcc and clang)''')
+
+def configure(conf):
+    conf.env['WITH_PCH'] = conf.options.with_pch
+
+
+@TaskGen.feature('cxx')
+@TaskGen.before('process_source')
+def process_pch(self):
+    if getattr(self, 'pch', ''):
+        # for now support only gcc-compatible things
+        if self.env['COMPILER_CXX'] == 'g++':
+            nodes = self.to_nodes(self.pch, path=self.path)
+            for x in nodes:
+                z = self.create_task('gchx', x, x.change_ext('.hpp.gch'))
+                z.orig_self = self
+
+class gchx(Task.Task):
+    run_str = '${CXX} -x c++-header ${CXXFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ' + \
+                '${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ' + \
+                '${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT}'
+    scan    = c_preproc.scan
+    ext_out = ['.hpp']
+    color   = 'BLUE'
+
+    def post_run(self):
+        super(gchx, self).post_run()
+        self.orig_self.env['CXXFLAGS'] = ['-include', self.inputs[0].relpath()] + \
+                                         self.env['CXXFLAGS']
diff --git a/.waf-tools/sphinx_build.py b/.waf-tools/sphinx_build.py
index 53cc431..32fd78a 100644
--- a/.waf-tools/sphinx_build.py
+++ b/.waf-tools/sphinx_build.py
@@ -1,119 +1,77 @@
 #!/usr/bin/env python
 # encoding: utf-8
-# Hans-Martin von Gaudecker, 2012
 
-"""
-Create Sphinx documentation. Currently only LaTeX and HTML are supported.
-
-The source file **must** be the conf.py file used by Sphinx. Everything
-else has defaults, passing in the parameters is optional.
-
-Usage for getting both html and pdf docs:
-
-    def build(ctx):
-        ctx(features='sphinx', source='docs/conf.py')
-        ctx(features='sphinx', source='docs/conf.py', buildername='latex')
-
-    def sphinx(ctx):
-        ctx(features='sphinx', source='docs/conf.py')
-        ctx(features='sphinx', source='docs/conf.py', buildername='latex')
-
-Optional parameters and their defaults:
-
-    * buildername: html
-    * srcdir: confdir (the directory where conf.py lives)
-    * outdir: confdir/buildername (in the build directory tree)
-    * doctreedir: outdir/.doctrees
-    * type: pdflatex (only applies to 'latex' builder)
-
-"""
-
+# inspired by code by Hans-Martin von Gaudecker, 2012
 
 import os
-from waflib import Task, TaskGen, Errors, Logs, Build
+from waflib import Node, Task, TaskGen, Errors, Logs, Build, Utils
 
-class RunSphinxBuild(Task.Task):
-	def scan(self):
-		"""Use Sphinx' internal environment to find the dependencies."""
-		s = self.sphinx_instance
-		msg, dummy, iterator = s.env.update(s.config, s.srcdir, s.doctreedir, s)
-		s.info(msg)
-		dep_nodes = []
-		for docname in s.builder.status_iterator(iterator, "reading sources... "):
-			filename = docname + s.config.source_suffix
-			dep_nodes.append(self.srcdir.find_node(filename))
-		for dep in s.env.dependencies.values():
-			# Need the 'str' call because Sphinx might return Unicode strings.
-			[dep_nodes.append(self.srcdir.find_node(str(d))) for d in dep]
-		return (dep_nodes, [])
+class sphinx_build(Task.Task):
+    color = 'BLUE'
+    run_str = '${SPHINX_BUILD} -q -b ${BUILDERNAME} -d ${DOCTREEDIR} ${SRCDIR} ${OUTDIR}'
 
-	def run(self):
-		"""Run the Sphinx build."""
-		self.sphinx_instance.build(force_all=False, filenames=None)
-		return None
+    def __str__(self):
+        env = self.env
+        src_str = ' '.join([a.nice_path()for a in self.inputs])
+        tgt_str = ' '.join([a.nice_path()for a in self.outputs])
+        if self.outputs: sep = ' -> '
+        else: sep = ''
+        return'%s [%s]: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),
+                                   self.env['BUILDERNAME'], src_str, sep, tgt_str)
 
-	def post_run(self):
-		"""Add everything found in the output directory tree as an output.
-		Not elegant, but pragmatic."""
-		for n in self.outdir.ant_glob("**", quiet=True, remove=False):
-			if n not in self.outputs: self.set_outputs(n)
-		super(RunSphinxBuild, self).post_run()
-
-
-def _get_main_targets(tg, s):
-	"""Return some easy targets known from the Sphinx build environment **s.env**."""
-	out_dir = tg.bld.root.find_node(s.outdir)
-	tgt_nodes = []
-	if s.builder.name == "latex":
-		for tgt_info in s.env.config.latex_documents:
-			tgt_nodes.append(out_dir.find_or_declare(tgt_info[1]))
-	elif s.builder.name == "html":
-		suffix = getattr(s.env.config, "html_file_suffix", ".html")
-		tgt_name = s.env.config.master_doc + suffix
-		tgt_nodes.append(out_dir.find_or_declare(tgt_name))
-	else:
-		raise Errors.WafError("Sphinx builder not implemented: %s" % s.builder.name)
-	return tgt_nodes
-
+@TaskGen.extension('.py', '.rst')
+def sig_hook(self, node):
+    node.sig=Utils.h_file(node.abspath())
 
 @TaskGen.feature("sphinx")
 @TaskGen.before_method("process_source")
-def apply_sphinx(tg):
-	"""Set up the task generator with a Sphinx instance and create a task."""
+def apply_sphinx(self):
+    """Set up the task generator with a Sphinx instance and create a task."""
 
-        from sphinx.application import Sphinx
+    inputs = []
+    for i in Utils.to_list(self.source):
+        if not isinstance(i, Node.Node):
+            node = self.path.find_node(node)
+        else:
+            node = i
+        if not node:
+            raise ValueError('[%s] file not found' % i)
+        inputs.append(node)
 
-	# Put together the configuration based on defaults and tg attributes.
-	conf = tg.path.find_node(tg.source)
-	confdir = conf.parent.abspath()
-	buildername = getattr(tg, "buildername", "html")
-	srcdir = getattr(tg, "srcdir", confdir)
-	outdir = tg.path.find_or_declare (getattr(tg, "outdir", os.path.join(conf.parent.get_bld().abspath(), buildername))).abspath ()
+    task = self.create_task('sphinx_build', inputs)
 
-	doctreedir = getattr(tg, "doctreedir", os.path.join(outdir, ".doctrees"))
+    conf = self.path.find_node(self.config)
+    task.inputs.append(conf)
 
-	# Set up the Sphinx instance.
-	s = Sphinx (srcdir, confdir, outdir, doctreedir, buildername, status=None)
+    confdir = conf.parent.abspath()
+    buildername = getattr(self, "builder", "html")
+    srcdir = getattr(self, "srcdir", confdir)
+    outdir = self.path.find_or_declare(getattr(self, "outdir", buildername)).get_bld()
+    doctreedir = getattr(self, "doctreedir", os.path.join(outdir.abspath(), ".doctrees"))
 
-	# Get the main targets of the Sphinx build.
-	tgt_nodes = _get_main_targets(tg, s)
+    task.env['BUILDERNAME'] = buildername
+    task.env['SRCDIR'] = srcdir
+    task.env['DOCTREEDIR'] = doctreedir
+    task.env['OUTDIR'] = outdir.abspath()
 
-	# Create the task and set the required attributes.
-	task = tg.create_task("RunSphinxBuild", src=conf, tgt=tgt_nodes)
-	task.srcdir = tg.bld.root.find_node(s.srcdir)
-	task.outdir = tg.bld.root.find_node(s.outdir)
-	task.sphinx_instance = s
+    import imp
+    confData = imp.load_source('sphinx_conf', conf.abspath())
 
-	# Build pdf if we have the LaTeX builder, allow for building with xelatex.
-	if s.builder.name == "latex":
-		compile_type = getattr(tg, "type", "pdflatex")
-		tg.bld(features="tex", type=compile_type, source=tgt_nodes, name="sphinx_pdf", prompt=0)
+    if buildername == "man":
+        for i in confData.man_pages:
+            target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
+            task.outputs.append(target)
 
-	# Bypass the execution of process_source by setting the source to an empty list
-	tg.source = []
+            if self.install_path:
+                self.bld.install_files("%s/man%d/" % (self.install_path, i[4]), target)
+    else:
+        task.outputs.append(outdir)
+
+def configure(conf):
+    conf.find_program('sphinx-build', var='SPHINX_BUILD', mandatory=False)
 
 # sphinx docs
 from waflib.Build import BuildContext
-class sphinx (BuildContext):
+class sphinx(BuildContext):
     cmd = "sphinx"
     fun = "sphinx"
diff --git a/.waf-tools/sqlite3.py b/.waf-tools/sqlite3.py
new file mode 100644
index 0000000..4eabeaa
--- /dev/null
+++ b/.waf-tools/sqlite3.py
@@ -0,0 +1,36 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+from waflib import Options
+from waflib.Configure import conf
+
+def options(opt):
+    opt.add_option('--with-sqlite3', type='string', default=None,
+                   dest='with_sqlite3', help='''Path to SQLite3, e.g., /usr/local''')
+
+@conf
+def check_sqlite3(self, *k, **kw):
+    root = k and k[0] or kw.get('path', None) or Options.options.with_sqlite3
+    mandatory = kw.get('mandatory', True)
+    var = kw.get('uselib_store', 'SQLITE3')
+
+    if root:
+        self.check_cxx(lib='sqlite3',
+                       msg='Checking for SQLite3 library',
+                       define_name='HAVE_%s' % var,
+                       uselib_store=var,
+                       mandatory=mandatory,
+                       cxxflags="-I%s/include" % root,
+                       linkflags="-L%s/lib" % root)
+    else:
+        try:
+            self.check_cfg(package='sqlite3',
+                           args=['--cflags', '--libs'],
+                           uselib_store='SQLITE3',
+                           mandatory=True)
+        except:
+            self.check_cxx(lib='sqlite3',
+                           msg='Checking for SQLite3 library',
+                           define_name='HAVE_%s' % var,
+                           uselib_store=var,
+                           mandatory=mandatory)
