diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index 73d2a9b..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,141 +0,0 @@
-include aminclude.am
-
-## Place generated object files (.o) into the same directory as their source
-## files, in order to avoid collisions when non-recursive make is used.
-AUTOMAKE_OPTIONS = subdir-objects
-
-## Additional flags to pass to aclocal when it is invoked automatically at
-## make time. The ${ACLOCAL_FLAGS} variable is picked up from the environment
-## to provide a way for the user to supply additional arguments.
-ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
-
-lib_LTLIBRARIES = libndn-cpp-dev.la
-
-# "make install" will also install the include headers.
-SUBDIRS = include . tools examples
-
-if COMPILE_TESTS
-  SUBDIRS += tests
-if HAVE_BOOST_UNIT_TEST_FRAMEWORK
-  SUBDIRS += tests_boost
-endif
-endif
-
-# Just the C code.
-## To regenerate:
-## for i in `find src/c -name '*.c' -or -name '*.h'`; do echo "  $i \\"; done
-##
-## Note that public header files do not need to be included here (handled by include/Makefile.am)
-libndn_c_la_SOURCES = \
-  src/c/data.h \
-  src/c/encoding/binary-xml-data.c \
-  src/c/encoding/binary-xml-data.h \
-  src/c/encoding/binary-xml-decoder.c \
-  src/c/encoding/binary-xml-decoder.h \
-  src/c/encoding/binary-xml-element-reader.c \
-  src/c/encoding/binary-xml-element-reader.h \
-  src/c/encoding/binary-xml-encoder.c \
-  src/c/encoding/binary-xml-encoder.h \
-  src/c/encoding/binary-xml-forwarding-entry.c \
-  src/c/encoding/binary-xml-forwarding-entry.h \
-  src/c/encoding/binary-xml-interest.c \
-  src/c/encoding/binary-xml-interest.h \
-  src/c/encoding/binary-xml-key.c \
-  src/c/encoding/binary-xml-key.h \
-  src/c/encoding/binary-xml-name.c \
-  src/c/encoding/binary-xml-name.h \
-  src/c/encoding/binary-xml-publisher-public-key-digest.c \
-  src/c/encoding/binary-xml-publisher-public-key-digest.h \
-  src/c/encoding/binary-xml-structure-decoder.c \
-  src/c/encoding/binary-xml-structure-decoder.h \
-  src/c/encoding/binary-xml.h \
-  src/c/errors.c \
-  src/c/errors.h \
-  src/c/forwarding-entry.h \
-  src/c/forwarding-flags.c \
-  src/c/interest.c \
-  src/c/interest.h \
-  src/c/key-locator.h \
-  src/c/name.c \
-  src/c/name.h \
-  src/c/publisher-public-key-digest.h \
-  src/c/transport/socket-transport.c \
-  src/c/transport/socket-transport.h \
-  src/c/transport/tcp-transport.h \
-  src/c/transport/udp-transport.h \
-  src/c/util/blob.h \
-  src/c/util/crypto.c \
-  src/c/util/dynamic-uint8-array.c \
-  src/c/util/dynamic-uint8-array.h \
-  src/c/util/ndn_memory.c \
-  src/c/util/ndn_memory.h \
-  src/c/util/ndn_realloc.c \
-  src/c/util/ndn_realloc.h \
-  src/c/util/time.c \
-  src/c/util/time.h
-
-libndn_c_la_LIBADD  = @OPENSSL_LIBS@
-libndn_c_la_LDFLAGS = @OPENSSL_LDFLAGS@
-libndn_c_la_CFLAGS  = @OPENSSL_INCLUDES@
-
-# C++ code and also the C code.
-## To regenerate:
-## for i in `find src -name '*.cpp' -or -name '*.hpp' -or -name '*.h' -and -not -path 'src/c/*'`; do echo "  $i \\"; done
-libndn_cpp_dev_la_SOURCES = $(libndn_c_la_SOURCES) \
-  src/common.cpp \
-  src/data.cpp \
-  src/encoding/binary-xml-decoder.hpp \
-  src/encoding/binary-xml-encoder.hpp \
-  src/encoding/binary-xml-structure-decoder.hpp \
-  src/encoding/binary-xml-wire-format.cpp \
-  src/encoding/block.cpp \
-  src/encoding/cryptopp/asn_ext.cpp \
-  src/encoding/cryptopp/asn_ext.hpp \
-  src/encoding/element-listener.cpp \
-  src/encoding/oid.cpp \
-  src/encoding/wire-format.cpp \
-  src/exclude.cpp \
-  src/face.cpp \
-  src/interest.cpp \
-  src/name.cpp \
-  src/node.cpp \
-  src/security/certificate-extension.cpp \
-  src/security/certificate-subject-description.cpp \
-  src/security/certificate.cpp \
-  src/security/identity-certificate.cpp \
-  src/security/public-key.cpp \
-  src/security/sec-public-info-sqlite3.cpp \
-  src/security/sec-tpm-file.cpp \
-  src/security/sec-public-info-memory.cpp \
-  src/security/sec-tpm-memory.cpp \
-  src/security/verifier.cpp \
-  src/security/sec-policy-no-verify.cpp \
-  src/security/sec-policy-self-verify.cpp \
-  src/transport/tcp-transport.cpp \
-  src/transport/unix-transport.cpp \
-  src/util/blob-stream.hpp \
-  src/util/blob.cpp \
-  src/util/changed-event.cpp \
-  src/util/changed-event.hpp \
-  src/util/dynamic-uint8-vector.cpp \
-  src/util/dynamic-uint8-vector.hpp \
-  src/util/logging.cpp \
-  src/util/logging.hpp \
-  src/util/ndnd-id-fetcher.hpp \
-  src/util/string-helper.hpp \
-  src/util/time.hpp
-
-if HAVE_OSX_SECURITY
-  libndn_cpp_dev_la_SOURCES += src/security/sec-tpm-osx.cpp
-else
-  EXTRA_DIST = src/security/sec-tpm-osx.cpp
-endif
-
-libndn_cpp_dev_la_LIBADD  = @OPENSSL_LIBS@     @CRYPTOPP_LIBS@     @OSX_SECURITY_LIBS@  @BOOST_SYSTEM_LIB@ @BOOST_FILESYSTEM_LIB@
-libndn_cpp_dev_la_LDFLAGS = @OPENSSL_LDFLAGS@  @CRYPTOPP_LDFLAGS@  @SQLITE3_LDFLAGS@    @BOOST_LDFLAGS@
-libndn_cpp_dev_la_CFLAGS  = @OPENSSL_INCLUDES@ @CRYPTOPP_INCLUDES@ @SQLITE3_CFLAGS@     @BOOST_CPPFLAGS@
-
-dist_noinst_SCRIPTS = autogen.sh
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libndn-cpp-dev.pc
diff --git a/aminclude.am b/aminclude.am
deleted file mode 100644
index 65f6515..0000000
--- a/aminclude.am
+++ /dev/null
@@ -1,158 +0,0 @@
-# This file is copied from http://www.gnu.org/software/autoconf-archive/ax_prog_doxygen.html
-
-## --------------------------------- ##
-## Format-independent Doxygen rules. ##
-## --------------------------------- ##
-
-if DX_COND_doc
-
-## ------------------------------- ##
-## Rules specific for HTML output. ##
-## ------------------------------- ##
-
-if DX_COND_html
-
-DX_CLEAN_HTML = @DX_DOCDIR@/html
-
-endif DX_COND_html
-
-## ------------------------------ ##
-## Rules specific for CHM output. ##
-## ------------------------------ ##
-
-if DX_COND_chm
-
-DX_CLEAN_CHM = @DX_DOCDIR@/chm
-
-if DX_COND_chi
-
-DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi
-
-endif DX_COND_chi
-
-endif DX_COND_chm
-
-## ------------------------------ ##
-## Rules specific for MAN output. ##
-## ------------------------------ ##
-
-if DX_COND_man
-
-DX_CLEAN_MAN = @DX_DOCDIR@/man
-
-endif DX_COND_man
-
-## ------------------------------ ##
-## Rules specific for RTF output. ##
-## ------------------------------ ##
-
-if DX_COND_rtf
-
-DX_CLEAN_RTF = @DX_DOCDIR@/rtf
-
-endif DX_COND_rtf
-
-## ------------------------------ ##
-## Rules specific for XML output. ##
-## ------------------------------ ##
-
-if DX_COND_xml
-
-DX_CLEAN_XML = @DX_DOCDIR@/xml
-
-endif DX_COND_xml
-
-## ----------------------------- ##
-## Rules specific for PS output. ##
-## ----------------------------- ##
-
-if DX_COND_ps
-
-DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps
-
-DX_PS_GOAL = doxygen-ps
-
-doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps
-
-@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag
-	cd @DX_DOCDIR@/latex; \
-	rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
-	$(DX_LATEX) refman.tex; \
-	$(MAKEINDEX_PATH) refman.idx; \
-	$(DX_LATEX) refman.tex; \
-	countdown=5; \
-	while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
-	                  refman.log > /dev/null 2>&1 \
-	   && test $$countdown -gt 0; do \
-	    $(DX_LATEX) refman.tex; \
-	    countdown=`expr $$countdown - 1`; \
-	done; \
-	$(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi
-
-endif DX_COND_ps
-
-## ------------------------------ ##
-## Rules specific for PDF output. ##
-## ------------------------------ ##
-
-if DX_COND_pdf
-
-DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf
-
-DX_PDF_GOAL = doxygen-pdf
-
-doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf
-
-@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag
-	cd @DX_DOCDIR@/latex; \
-	rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
-	$(DX_PDFLATEX) refman.tex; \
-	$(DX_MAKEINDEX) refman.idx; \
-	$(DX_PDFLATEX) refman.tex; \
-	countdown=5; \
-	while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
-	                  refman.log > /dev/null 2>&1 \
-	   && test $$countdown -gt 0; do \
-	    $(DX_PDFLATEX) refman.tex; \
-	    countdown=`expr $$countdown - 1`; \
-	done; \
-	mv refman.pdf ../@PACKAGE@.pdf
-
-endif DX_COND_pdf
-
-## ------------------------------------------------- ##
-## Rules specific for LaTeX (shared for PS and PDF). ##
-## ------------------------------------------------- ##
-
-if DX_COND_latex
-
-DX_CLEAN_LATEX = @DX_DOCDIR@/latex
-
-endif DX_COND_latex
-
-.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL)
-
-.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
-
-doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag
-
-doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
-
-@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS)
-	rm -rf @DX_DOCDIR@
-	$(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG)
-
-DX_CLEANFILES = \
-    @DX_DOCDIR@/@PACKAGE@.tag \
-    -r \
-    $(DX_CLEAN_HTML) \
-    $(DX_CLEAN_CHM) \
-    $(DX_CLEAN_CHI) \
-    $(DX_CLEAN_MAN) \
-    $(DX_CLEAN_RTF) \
-    $(DX_CLEAN_XML) \
-    $(DX_CLEAN_PS) \
-    $(DX_CLEAN_PDF) \
-    $(DX_CLEAN_LATEX)
-
-endif DX_COND_doc
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755
index 2e9954b..0000000
--- a/autogen.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh -e
-
-test -n "$srcdir" || srcdir=`dirname "$0"`
-test -n "$srcdir" || srcdir=.
-autoreconf --force --install --verbose "$srcdir"
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index e938039..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,176 +0,0 @@
-# To build using autotools, see the Development section of the file INSTALL.
-
-AC_PREREQ([2.59])
-AC_INIT([ndn-cpp-dev], [0.2.1], [ndn-lib@lists.cs.ucla.edu], [ndn-cpp-dev], [https://github.com/named-data/ndn-cpp])
-AM_INIT_AUTOMAKE([1.10 -Wall no-define foreign])
-
-AC_CONFIG_MACRO_DIR([m4])
-AC_CONFIG_SRCDIR([configure.ac])
-# Create config.h without prefixes.  Put it in the include directory so CFLAGS will have -I./include .
-AC_CONFIG_HEADERS(include/config.h)
-# Add prefixes and output to a unique file name which will go into the ndn-cpp include install directory.
-AX_PREFIX_CONFIG_H(include/ndn-cpp-dev/ndn-cpp-config.h, ndn-cpp)
-AM_MAINTAINER_MODE
-AM_PROG_AR
-AC_PROG_LIBTOOL
-LT_PREREQ([2.2])
-LT_INIT()
-AC_PROG_CXX
-AM_PROG_CC_C_O
-AC_PROG_OBJCXX
-AC_LANG([C++])
-
-# Special case.
-case "$host" in
-  *-darwin* | *-macos10*)
-     if test -d /opt/local ; then
-       CFLAGS="$CFLAGS -I/opt/local/include"
-       CXXFLAGS="$CXXFLAGS -I/opt/local/include"
-       CPPFLAGS="$CPPFLAGS -I/opt/local/include"
-       LDFLAGS="$LDFLAGS -L/opt/local/lib"
-     elif test -d /sw ; then
-       CFLAGS="$CFLAGS -I/sw/include"
-       CXXFLAGS="$CXXFLAGS -I/sw/include"
-       CPPFLAGS="$CPPFLAGS -I/sw/include"
-       LDFLAGS="$LDFLAGS -L/sw/lib"
-     fi
-  ;;
-esac
-
-AC_TYPE_SIZE_T
-AC_TYPE_INT8_T
-AC_TYPE_INT16_T
-AC_TYPE_INT32_T
-AC_TYPE_INT64_T
-AC_TYPE_UINT8_T
-AC_TYPE_UINT16_T
-AC_TYPE_UINT32_T
-AC_TYPE_UINT64_T
-AC_CHECK_FUNCS([memcmp] [memcpy] [memset])
-AC_CHECK_FUNCS([strchr], :, AC_MSG_ERROR([*** strchr not found. Check 'config.log' for more details.]))
-AC_CHECK_FUNCS([sscanf], :, AC_MSG_ERROR([*** sscanf not found. Check 'config.log' for more details.]))
-AC_CHECK_HEADERS([time.h], :, AC_MSG_ERROR([*** time.h not found. Check 'config.log' for more details.]))
-AC_CHECK_HEADERS([sys/time.h], :, AC_MSG_ERROR([*** sys/time.h not found. Check 'config.log' for more details.]))
-AC_CHECK_FUNCS([gettimeofday], :, AC_MSG_ERROR([*** gettimeofday not found. processEvents requires it. Check 'config.log' for more details.]))
-AC_C_INLINE
-
-# Unless --with-c++11 specified, do not enable C++11 features
-AX_CXX_COMPILE_STDCXX_11(, optional)
-
-AC_ARG_WITH([system-boost],
-  AS_HELP_STRING(
-      [--without-system-boost],
-      [do not attempt to use system-installed boost libraries and use the bundled version (ndnboost) when necessary.]
-  ),
-  [
-  want_system_boost="yes"
-  if test "$withval" = "no"; then
-      want_system_boost="no"
-  fi
-  ],
-  [want_system_boost="yes"]
-)
-
-AX_BOOST_BASE([1.42.0],
-  [
-    if test "$want_system_boost" == "yes" ; then
-      AC_DEFINE(USE_SYSTEM_BOOST,[1],[use system-installed boost libraries])
-      AM_CONDITIONAL(USE_SYSTEM_BOOST, true)
-    else
-      AM_CONDITIONAL(USE_SYSTEM_BOOST, false)
-    fi
-  ],
-  [AM_CONDITIONAL(USE_SYSTEM_BOOST, false)]
-)
-AX_BOOST_ASIO
-
-AC_ARG_WITH([tests],
-  AS_HELP_STRING(
-      [--with-tests],
-      [Enable compilation of library tests (disabled by default).]
-  ),
-  [
-    want_tests="yes"
-    AM_CONDITIONAL(COMPILE_TESTS, true)
-  ],
-  [
-    want_tests="no"
-    AM_CONDITIONAL(COMPILE_TESTS, false)
-  ]
-)
-
-# @todo: These checks are not really optional
-AX_BOOST_SYSTEM
-AX_BOOST_FILESYSTEM
-AX_BOOST_UNIT_TEST_FRAMEWORK
-AM_CONDITIONAL(HAVE_BOOST_UNIT_TEST_FRAMEWORK, [test "x$ax_cv_boost_unit_test_framework" = "xyes"])
-
-AC_MSG_CHECKING([for gmtime support])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-    [[#include <time.h>]]
-    [[#include <sys/time.h>]]
-    [[struct timeval tv;]]
-    [[int result1 = gettimeofday(&tv, 0);]]
-    [[time_t time1 = time(0);]]
-    [[struct tm* tm1 = gmtime(&time1);]]
-    [[time_t time2 = timegm(tm1);]])
-], [
-    AC_MSG_RESULT([yes])
-    AC_DEFINE_UNQUOTED([HAVE_GMTIME_SUPPORT], 1, [1 if have sys/time gmtime support including timegm.])
-], [
-    AC_MSG_RESULT([no])
-    AC_DEFINE_UNQUOTED([HAVE_GMTIME_SUPPORT], 0, [1 if have sys/time gmtime support including timegm.])
-])
-
-# Require openssl (libcrypto).
-AX_CHECK_OPENSSL([], [AC_MSG_FAILURE([can't find openssl crypto lib])])
-
-AX_LIB_CRYPTOPP([], [AC_MSG_FAILURE([can't find crypto++ library])])
-
-# Conditionally use libsqlite3.  AX_LIB_SQLITE3 defines HAVE_SQLITE3 in confdefs.h .
-AX_LIB_SQLITE3()
-if grep -q "#define HAVE_SQLITE3" confdefs.h ; then
-  AC_CHECK_LIB([sqlite3], [sqlite3_open], [ ], # space necessar to prevent updating LIBS
-               [AC_MSG_FAILURE([have sqlite2 headers but no libsqlite3])])
-else
-  AC_MSG_ERROR(Missing required libsqlite3 library)
-fi
-
-
-# Conditionally use the OSX Security framework .
-AC_MSG_CHECKING([for OSX Security framework])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-    [[#include <CoreFoundation/CoreFoundation.h>]]
-    [[#include <Security/Security.h>]]
-    [[#include <CoreServices/CoreServices.h>]]
-    [[void test() { SecKeychainRef x; }]])
-], [
-    AC_MSG_RESULT([yes])
-    AC_DEFINE_UNQUOTED([HAVE_OSX_SECURITY], 1, [1 if have the OSX framework.])
-    AM_CONDITIONAL(HAVE_OSX_SECURITY, true)
-
-    OSX_SECURITY_LIBS="-framework Security"
-    AC_SUBST([OSX_SECURITY_LIBS])
-], [
-    AC_MSG_RESULT([no])
-    AM_CONDITIONAL(HAVE_OSX_SECURITY, false)
-])
-
-DX_HTML_FEATURE(ON)
-DX_CHM_FEATURE(OFF)
-DX_CHI_FEATURE(OFF)
-DX_MAN_FEATURE(OFF)
-DX_RTF_FEATURE(OFF)
-DX_XML_FEATURE(OFF)
-DX_PDF_FEATURE(OFF)
-DX_PS_FEATURE(OFF)
-DX_INIT_DOXYGEN([$PACKAGE_NAME],[Doxyfile])
-
-AC_CONFIG_FILES([Makefile
-                 include/Makefile
-                 examples/Makefile
-                 tools/Makefile
-                 tests/Makefile
-                 tests_boost/Makefile
-                 libndn-cpp-dev.pc])
-AC_OUTPUT
diff --git a/examples/Makefile.am b/examples/Makefile.am
deleted file mode 100644
index 121a867..0000000
--- a/examples/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-
-LDADD = ../libndn-cpp-dev.la @BOOST_SYSTEM_LIB@
-
-noinst_PROGRAMS=consumer producer
-
-consumer_SOURCES = consumer.cpp
-producer_SOURCES = producer.cpp
diff --git a/include/Makefile.am b/include/Makefile.am
deleted file mode 100644
index cf09eae..0000000
--- a/include/Makefile.am
+++ /dev/null
@@ -1,197 +0,0 @@
-# "make install" will install these in the install include directory, for example
-# /usr/local/ndn-cpp-dev/name.hpp.
-# These files are included by the application with, for example
-# #include <ndn-cpp-dev/namp.hpp>
-# Internal include headers are not put in this public install directory.
-
-# Public C headers.
-ndn_cpp_c_headers = \
-  $(wildcard ndn-cpp-dev/*.h) \
-  $(wildcard ndn-cpp-dev/c/*.*) \
-  $(wildcard ndn-cpp-dev/c/encoding/*.*) \
-  $(wildcard ndn-cpp-dev/c/util/*.*)
-
-# Public C++ headers.
-# Use ndn-cpp-dev/*.hpp instead of *.* to not overwrite *.h from above.
-ndn_cpp_cpp_headers = \
-  $(wildcard ndn-cpp-dev/*.hpp) \
-  $(wildcard ndn-cpp-dev/encoding/*.*) \
-  $(wildcard ndn-cpp-dev/security/*.*) \
-  $(wildcard ndn-cpp-dev/transport/*.*) \
-  $(wildcard ndn-cpp-dev/util/*.*)
-
-ndnboost_headers = \
-  $(wildcard ndnboost/*.*) \
-  $(wildcard ndnboost/utility/*.*) \
-  $(wildcard ndnboost/utility/detail/*.*) \
-  $(wildcard ndnboost/units/*.*) \
-  $(wildcard ndnboost/units/detail/*.*) \
-  $(wildcard ndnboost/unordered/*.*) \
-  $(wildcard ndnboost/unordered/detail/*.*) \
-  $(wildcard ndnboost/range/*.*) \
-  $(wildcard ndnboost/range/algorithm/*.*) \
-  $(wildcard ndnboost/range/detail/*.*) \
-  $(wildcard ndnboost/range/detail/vc6/*.*) \
-  $(wildcard ndnboost/smart_ptr/*.*) \
-  $(wildcard ndnboost/smart_ptr/detail/*.*) \
-  $(wildcard ndnboost/intrusive/*.*) \
-  $(wildcard ndnboost/intrusive/detail/*.*) \
-  $(wildcard ndnboost/typeof/*.*) \
-  $(wildcard ndnboost/typeof/dmc/*.*) \
-  $(wildcard ndnboost/typeof/msvc/*.*) \
-  $(wildcard ndnboost/config/*.*) \
-  $(wildcard ndnboost/config/no_tr1/*.*) \
-  $(wildcard ndnboost/config/abi/*.*) \
-  $(wildcard ndnboost/config/platform/*.*) \
-  $(wildcard ndnboost/config/compiler/*.*) \
-  $(wildcard ndnboost/config/stdlib/*.*) \
-  $(wildcard ndnboost/test/*.*) \
-  $(wildcard ndnboost/test/utils/*.*) \
-  $(wildcard ndnboost/test/utils/basic_cstring/*.*) \
-  $(wildcard ndnboost/test/utils/iterator/*.*) \
-  $(wildcard ndnboost/test/utils/runtime/*.*) \
-  $(wildcard ndnboost/test/utils/runtime/cla/*.*) \
-  $(wildcard ndnboost/test/utils/runtime/cla/detail/*.*) \
-  $(wildcard ndnboost/test/utils/runtime/cla/iface/*.*) \
-  $(wildcard ndnboost/test/utils/runtime/env/*.*) \
-  $(wildcard ndnboost/test/output/*.*) \
-  $(wildcard ndnboost/test/impl/*.*) \
-  $(wildcard ndnboost/test/detail/*.*) \
-  $(wildcard ndnboost/math/*.*) \
-  $(wildcard ndnboost/math/special_functions/*.*) \
-  $(wildcard ndnboost/math/special_functions/detail/*.*) \
-  $(wildcard ndnboost/math/tools/*.*) \
-  $(wildcard ndnboost/math/policies/*.*) \
-  $(wildcard ndnboost/bind/*.*) \
-  $(wildcard ndnboost/iterator/*.*) \
-  $(wildcard ndnboost/iterator/detail/*.*) \
-  $(wildcard ndnboost/mpl/*.*) \
-  $(wildcard ndnboost/mpl/vector/*.*) \
-  $(wildcard ndnboost/mpl/vector/aux_/*.*) \
-  $(wildcard ndnboost/mpl/vector/aux_/preprocessed/*.*) \
-  $(wildcard ndnboost/mpl/vector/aux_/preprocessed/typeof_based/*.*) \
-  $(wildcard ndnboost/mpl/vector/aux_/preprocessed/plain/*.*) \
-  $(wildcard ndnboost/mpl/vector/aux_/preprocessed/no_ctps/*.*) \
-  $(wildcard ndnboost/mpl/aux_/*.*) \
-  $(wildcard ndnboost/mpl/aux_/config/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/msvc60/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/dmc/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/bcc551/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/msvc70/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/gcc/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/plain/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/mwcw/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/bcc_pre590/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/no_ttp/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/bcc/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessed/no_ctps/*.*) \
-  $(wildcard ndnboost/mpl/aux_/preprocessor/*.*) \
-  $(wildcard ndnboost/mpl/limits/*.*) \
-  $(wildcard ndnboost/mpl/list/*.*) \
-  $(wildcard ndnboost/mpl/list/aux_/*.*) \
-  $(wildcard ndnboost/mpl/list/aux_/preprocessed/*.*) \
-  $(wildcard ndnboost/mpl/list/aux_/preprocessed/plain/*.*) \
-  $(wildcard ndnboost/regex/*.*) \
-  $(wildcard ndnboost/regex/config/*.*) \
-  $(wildcard ndnboost/regex/v4/*.*) \
-  $(wildcard ndnboost/regex/pending/*.*) \
-  $(wildcard ndnboost/filesystem/*.*) \
-  $(wildcard ndnboost/filesystem/detail/*.*) \
-  $(wildcard ndnboost/iostreams/*.*) \
-  $(wildcard ndnboost/iostreams/filter/*.*) \
-  $(wildcard ndnboost/iostreams/device/*.*) \
-  $(wildcard ndnboost/iostreams/detail/*.*) \
-  $(wildcard ndnboost/iostreams/detail/adapter/*.*) \
-  $(wildcard ndnboost/iostreams/detail/config/*.*) \
-  $(wildcard ndnboost/iostreams/detail/streambuf/*.*) \
-  $(wildcard ndnboost/iostreams/detail/vc6/*.*) \
-  $(wildcard ndnboost/iostreams/detail/broken_overload_resolution/*.*) \
-  $(wildcard ndnboost/integer/*.*) \
-  $(wildcard ndnboost/optional/*.*) \
-  $(wildcard ndnboost/numeric/*.*) \
-  $(wildcard ndnboost/numeric/conversion/*.*) \
-  $(wildcard ndnboost/numeric/conversion/detail/*.*) \
-  $(wildcard ndnboost/numeric/conversion/detail/preprocessed/*.*) \
-  $(wildcard ndnboost/function/*.*) \
-  $(wildcard ndnboost/function/detail/*.*) \
-  $(wildcard ndnboost/random/*.*) \
-  $(wildcard ndnboost/random/detail/*.*) \
-  $(wildcard ndnboost/system/*.*) \
-  $(wildcard ndnboost/container/*.*) \
-  $(wildcard ndnboost/functional/*.*) \
-  $(wildcard ndnboost/functional/hash/*.*) \
-  $(wildcard ndnboost/functional/hash/detail/*.*) \
-  $(wildcard ndnboost/pending/*.*) \
-  $(wildcard ndnboost/io/*.*) \
-  $(wildcard ndnboost/io/detail/*.*) \
-  $(wildcard ndnboost/exception/*.*) \
-  $(wildcard ndnboost/exception/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/*.*) \
-  $(wildcard ndnboost/preprocessor/repetition/*.*) \
-  $(wildcard ndnboost/preprocessor/repetition/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/repetition/detail/dmc/*.*) \
-  $(wildcard ndnboost/preprocessor/repetition/detail/edg/*.*) \
-  $(wildcard ndnboost/preprocessor/repetition/detail/msvc/*.*) \
-  $(wildcard ndnboost/preprocessor/facilities/*.*) \
-  $(wildcard ndnboost/preprocessor/logical/*.*) \
-  $(wildcard ndnboost/preprocessor/control/*.*) \
-  $(wildcard ndnboost/preprocessor/control/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/control/detail/dmc/*.*) \
-  $(wildcard ndnboost/preprocessor/control/detail/edg/*.*) \
-  $(wildcard ndnboost/preprocessor/control/detail/msvc/*.*) \
-  $(wildcard ndnboost/preprocessor/arithmetic/*.*) \
-  $(wildcard ndnboost/preprocessor/arithmetic/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/array/*.*) \
-  $(wildcard ndnboost/preprocessor/config/*.*) \
-  $(wildcard ndnboost/preprocessor/slot/*.*) \
-  $(wildcard ndnboost/preprocessor/slot/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/seq/*.*) \
-  $(wildcard ndnboost/preprocessor/seq/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/comparison/*.*) \
-  $(wildcard ndnboost/preprocessor/punctuation/*.*) \
-  $(wildcard ndnboost/preprocessor/iteration/*.*) \
-  $(wildcard ndnboost/preprocessor/iteration/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/iteration/detail/iter/*.*) \
-  $(wildcard ndnboost/preprocessor/iteration/detail/bounds/*.*) \
-  $(wildcard ndnboost/preprocessor/debug/*.*) \
-  $(wildcard ndnboost/preprocessor/variadic/*.*) \
-  $(wildcard ndnboost/preprocessor/tuple/*.*) \
-  $(wildcard ndnboost/preprocessor/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/detail/dmc/*.*) \
-  $(wildcard ndnboost/preprocessor/list/*.*) \
-  $(wildcard ndnboost/preprocessor/list/detail/*.*) \
-  $(wildcard ndnboost/preprocessor/list/detail/dmc/*.*) \
-  $(wildcard ndnboost/preprocessor/list/detail/edg/*.*) \
-  $(wildcard ndnboost/move/*.*) \
-  $(wildcard ndnboost/move/detail/*.*) \
-  $(wildcard ndnboost/algorithm/*.*) \
-  $(wildcard ndnboost/algorithm/string/*.*) \
-  $(wildcard ndnboost/algorithm/string/detail/*.*) \
-  $(wildcard ndnboost/type_traits/*.*) \
-  $(wildcard ndnboost/type_traits/msvc/*.*) \
-  $(wildcard ndnboost/type_traits/detail/*.*) \
-  $(wildcard ndnboost/tuple/*.*) \
-  $(wildcard ndnboost/tuple/detail/*.*) \
-  $(wildcard ndnboost/detail/*.*) \
-  $(wildcard ndnboost/function_types/*.*) \
-  $(wildcard ndnboost/function_types/config/*.*) \
-  $(wildcard ndnboost/function_types/detail/*.*) \
-  $(wildcard ndnboost/function_types/detail/pp_retag_default_cc/*.*) \
-  $(wildcard ndnboost/function_types/detail/components_impl/*.*) \
-  $(wildcard ndnboost/function_types/detail/pp_variate_loop/*.*) \
-  $(wildcard ndnboost/function_types/detail/classifier_impl/*.*) \
-  $(wildcard ndnboost/function_types/detail/pp_cc_loop/*.*) \
-  $(wildcard ndnboost/function_types/detail/encoding/*.*) \
-  $(wildcard ndnboost/function_types/detail/synthesize_impl/*.*) \
-  $(wildcard ndnboost/function_types/detail/pp_tags/*.*) \
-  $(wildcard ndnboost/concept/*.*) \
-  $(wildcard ndnboost/concept/detail/*.*) \
-  $(wildcard ndnboost/lambda/*.*) \
-  $(wildcard ndnboost/lambda/detail/*.*)
-
-nobase_include_HEADERS = $(ndn_cpp_c_headers) $(ndn_cpp_cpp_headers)
-
-if ! USE_SYSTEM_BOOST
-  nobase_include_HEADERS += $(ndnboost_headers)
-endif
diff --git a/include/ndn-cpp-dev/encoding/binary-xml-wire-format.hpp b/include/ndn-cpp-dev/encoding/binary-xml-wire-format.hpp
deleted file mode 100644
index cb4f0aa..0000000
--- a/include/ndn-cpp-dev/encoding/binary-xml-wire-format.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_BINARYXMLWIREFORMAT_HPP
-#define NDN_BINARYXMLWIREFORMAT_HPP
-
-#include "wire-format.hpp"
-
-namespace ndn {
-
-/**
- * A BinaryXmlWireFormat extends WireFormat to override its virtual methods to implement encoding and decoding
- * using binary XML.
- */
-class BinaryXmlWireFormat : public WireFormat {
-public:
-  /**
-   * Encode interest in binary XML and return the encoding.
-   * @param interest The Interest object to encode.
-   * @return A Blob containing the encoding.
-   */  
-  virtual Blob 
-  encodeInterest(const Interest& interest);
-    
-  /**
-   * Decode input as an interest in binary XML and set the fields of the interest object.
-   * @param interest The Interest object whose fields are updated.
-   * @param input A pointer to the input buffer to decode.
-   * @param inputLength The number of bytes in input.
-   */
-  virtual void 
-  decodeInterest(Interest& interest, const uint8_t *input, size_t inputLength);
-
-  /**
-   * Encode data with binary XML and return the encoding.
-   * @param data The Data object to encode.
-   * @param signedPortionBeginOffset Return the offset in the encoding of the beginning of the signed portion.
-   * If you are not encoding in order to sign, you can call encodeData(const Data& data) to ignore this returned value.
-   * @param signedPortionEndOffset Return the offset in the encoding of the end of the signed portion.
-   * If you are not encoding in order to sign, you can call encodeData(const Data& data) to ignore this returned value.
-   * @return A Blob containing the encoding.
-   */
-  virtual Blob 
-  encodeData
-    (const Data& data, size_t *signedPortionBeginOffset, size_t *signedPortionEndOffset);
-  
-  /**
-   * Decode input as a data packet in binary XML and set the fields in the data object.
-   * @param data The Data object whose fields are updated.
-   * @param input A pointer to the input buffer to decode.
-   * @param inputLength The number of bytes in input.
-   * @param signedPortionBeginOffset Return the offset in the input buffer of the beginning of the signed portion.
-   * If you are not decoding in order to verify, you can call 
-   * decodeData(Data& data, const uint8_t *input, size_t inputLength) to ignore this returned value.
-   * @param signedPortionEndOffset Return the offset in the input buffer of the end of the signed portion.
-   * If you are not decoding in order to verify, you can call 
-   * decodeData(Data& data, const uint8_t *input, size_t inputLength) to ignore this returned value.
-   */  
-  virtual void 
-  decodeData
-    (Data& data, const uint8_t *input, size_t inputLength, size_t *signedPortionBeginOffset, size_t *signedPortionEndOffset);
-
-  /**
-   * Encode forwardingEntry in binary XML and return the encoding. 
-   * @param forwardingEntry The ForwardingEntry object to encode.
-   * @return A Blob containing the encoding.
-   */
-  virtual Blob 
-  encodeForwardingEntry(const ForwardingEntry& forwardingEntry);
-  
-  /**
-   * Decode input as a forwarding entry in binary XML and set the fields of the forwardingEntry object. 
-   * @param forwardingEntry The ForwardingEntry object whose fields are updated.
-   * @param input A pointer to the input buffer to decode.
-   * @param inputLength The number of bytes in input.
-   */
-  virtual void 
-  decodeForwardingEntry(ForwardingEntry& forwardingEntry, const uint8_t *input, size_t inputLength);
-};
-  
-}
-
-#endif
-
diff --git a/include/ndn-cpp-dev/encoding/element-listener.hpp b/include/ndn-cpp-dev/encoding/element-listener.hpp
deleted file mode 100644
index 7d13312..0000000
--- a/include/ndn-cpp-dev/encoding/element-listener.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_ELEMENT_LISTENER_HPP
-#define NDN_ELEMENT_LISTENER_HPP
-
-#include "../c/encoding/element-listener.h"
-
-namespace ndn {
-
-/**
- * An ElementListener extends an ndn_ElementListener struct to proved an abstract virtual onReceivedElement function which wraps
- * the onReceivedElement used by the ndn_ElementListener struct.  You must extend this class to override onReceivedElement.
- */
-class ElementListener : public ndn_ElementListener {
-public:
-  ElementListener() 
-  {
-    ndn_ElementListener_initialize(this, staticOnReceivedElement);
-  }
-  
-  /**
-   * This is called when an entire binary XML element is received.  You must extend this class to override this method.
-   * @param element pointer to the binary XML element.  This buffer is only valid during this call.  If you need the data
-   * later, you must copy.
-   * @param elementLength length of element
-   */
-  virtual void 
-  onReceivedElement(const uint8_t *element, size_t elementLength) = 0;
-  
-private:
-  /**
-   * Call the virtual method onReceivedElement. This is used to initialize the base ndn_ElementListener struct.
-   * @param self
-   * @param element
-   * @param elementLength
-   */
-  static void 
-  staticOnReceivedElement(struct ndn_ElementListener *self, uint8_t *element, size_t elementLength);
-};
-
-}
-
-#endif
diff --git a/include/ndn-cpp-dev/encoding/endian.h b/include/ndn-cpp-dev/encoding/endian.hpp
similarity index 100%
rename from include/ndn-cpp-dev/encoding/endian.h
rename to include/ndn-cpp-dev/encoding/endian.hpp
diff --git a/include/ndn-cpp-dev/encoding/tlv.hpp b/include/ndn-cpp-dev/encoding/tlv.hpp
index 3d42402..511d0f6 100644
--- a/include/ndn-cpp-dev/encoding/tlv.hpp
+++ b/include/ndn-cpp-dev/encoding/tlv.hpp
@@ -13,7 +13,7 @@
 #include <stdexcept>
 #include <iterator>
 #include "buffer.hpp"
-#include "endian.h"
+#include "endian.hpp"
 
 namespace ndn {
 
diff --git a/include/ndn-cpp-dev/encoding/wire-format.hpp b/include/ndn-cpp-dev/encoding/wire-format.hpp
deleted file mode 100644
index 1a40cd1..0000000
--- a/include/ndn-cpp-dev/encoding/wire-format.hpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_WIREFORMAT_HPP
-#define NDN_WIREFORMAT_HPP
-
-#include "../common.hpp"
-#include "../util/blob.hpp"
-
-namespace ndn {
-  
-class Interest;
-class Data;
-class ForwardingEntry;
-  
-class WireFormat {
-public:
-  /**
-   * Encode interest and return the encoding.  Your derived class should override.
-   * @param interest The Interest object to encode.
-   * @return A Blob containing the encoding.
-   * @throw logic_error for unimplemented if the derived class does not override.
-   */
-  virtual Blob 
-  encodeInterest(const Interest& interest);
-  
-  /**
-   * Decode input as an interest and set the fields of the interest object.  Your derived class should override.
-   * @param interest The Interest object whose fields are updated.
-   * @param input A pointer to the input buffer to decode.
-   * @param inputLength The number of bytes in input.
-   * @throw logic_error for unimplemented if the derived class does not override.
-   */
-  virtual void 
-  decodeInterest(Interest& interest, const uint8_t *input, size_t inputLength);
-
-  /**
-   * Encode data and return the encoding.  Your derived class should override.
-   * @param data The Data object to encode.
-   * @param signedPortionBeginOffset Return the offset in the encoding of the beginning of the signed portion.
-   * If you are not encoding in order to sign, you can call encodeData(const Data& data) to ignore this returned value.
-   * @param signedPortionEndOffset Return the offset in the encoding of the end of the signed portion.
-   * If you are not encoding in order to sign, you can call encodeData(const Data& data) to ignore this returned value.
-   * @return A Blob containing the encoding.
-   * @throw logic_error for unimplemented if the derived class does not override.
-   */
-  virtual Blob 
-  encodeData
-    (const Data& data, size_t *signedPortionBeginOffset, size_t *signedPortionEndOffset);
-
-  /**
-   * Encode data and return the encoding.
-   * @param data The Data object to encode.
-   * @return A Blob containing the encoding.
-   * @throw logic_error for unimplemented if the derived class does not override.
-   */
-  Blob 
-  encodeData(const Data& data)
-  {
-    size_t dummyBeginOffset, dummyEndOffset;
-    return encodeData(data, &dummyBeginOffset, &dummyEndOffset);
-  }
-
-  /**
-   * Decode input as a data packet and set the fields in the data object.  Your derived class should override.
-   * @param data The Data object whose fields are updated.
-   * @param input A pointer to the input buffer to decode.
-   * @param inputLength The number of bytes in input.
-   * @param signedPortionBeginOffset Return the offset in the input buffer of the beginning of the signed portion.
-   * If you are not decoding in order to verify, you can call 
-   * decodeData(Data& data, const uint8_t *input, size_t inputLength) to ignore this returned value.
-   * @param signedPortionEndOffset Return the offset in the input buffer of the end of the signed portion.
-   * If you are not decoding in order to verify, you can call 
-   * decodeData(Data& data, const uint8_t *input, size_t inputLength) to ignore this returned value.
-   * @throw logic_error for unimplemented if the derived class does not override.
-   */  
-  virtual void 
-  decodeData
-    (Data& data, const uint8_t *input, size_t inputLength, size_t *signedPortionBeginOffset, size_t *signedPortionEndOffset);
-
-  void 
-  decodeData(Data& data, const uint8_t *input, size_t inputLength)
-  {
-    size_t dummyBeginOffset, dummyEndOffset;
-    decodeData(data, input, inputLength, &dummyBeginOffset, &dummyEndOffset);
-  }
-  
-  /**
-   * Encode forwardingEntry and return the encoding.  Your derived class should override.
-   * @param forwardingEntry The ForwardingEntry object to encode.
-   * @return A Blob containing the encoding.
-   * @throw logic_error for unimplemented if the derived class does not override.
-   */
-  virtual Blob 
-  encodeForwardingEntry(const ForwardingEntry& forwardingEntry);
-  
-  /**
-   * Decode input as a forwarding entry and set the fields of the forwardingEntry object.  Your derived class should override.
-   * @param forwardingEntry The ForwardingEntry object whose fields are updated.
-   * @param input A pointer to the input buffer to decode.
-   * @param inputLength The number of bytes in input.
-   * @throw logic_error for unimplemented if the derived class does not override.
-   */
-  virtual void 
-  decodeForwardingEntry(ForwardingEntry& forwardingEntry, const uint8_t *input, size_t inputLength);
-
-  /**
-   * Set the static default WireFormat used by default encoding and decoding methods.
-   * @param wireFormat A Pointer to an object of a subclass of WireFormat.  This does not make a copy and
-   * the caller must ensure that the object remains allocated.
-   */
-  static void 
-  setDefaultWireFormat(WireFormat *wireFormat) 
-  {
-    defaultWireFormat_ = wireFormat;
-  }
-  
-  /**
-   * Return the default WireFormat used by default encoding and decoding methods which was set with
-   * setDefaultWireFormat.
-   * @return A pointer to the WireFormat object.
-   */
-  static WireFormat*
-  getDefaultWireFormat();
-  
-private:
-  /**
-   * This is implemented by only one of the subclasses of WireFormat to return a new object used
-   * as the initial value for the default WireFormat.  If the application doesn't include that class, then the application
-   * needs to include another subclass which defines WireFormat::newInitialDefaultWireFormat.
-   * @return a new object, which is held by a shared_ptr and freed when the application exits.
-   */
-  static WireFormat*
-  newInitialDefaultWireFormat();
-  
-  static WireFormat *defaultWireFormat_;
-};
-
-}
-
-#endif
-
diff --git a/include/ndn-cpp-dev/security/security-exception.hpp b/include/ndn-cpp-dev/security/security-exception.hpp
deleted file mode 100644
index daf1d61..0000000
--- a/include/ndn-cpp-dev/security/security-exception.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Yingdi Yu <yingdi@cs.ucla.edu>
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_SECURITY_EXCEPTION_HPP
-#define NDN_SECURITY_EXCEPTION_HPP
-
-#include <exception>
-#include <string>
-
-namespace ndn {
-
-class SecurityException : public std::exception {
-public:
-  SecurityException(const std::string& errorMessage) throw();
-    
-  virtual ~SecurityException() throw();
-    
-  std::string Msg() { return errorMessage_; }
-
-  virtual const char* what() const throw() { return errorMessage_.c_str(); }
-    
-private:
-  const std::string errorMessage_;
-};
-
-class UnrecognizedKeyFormatException : public SecurityException {
-public:
-  UnrecognizedKeyFormatException(const std::string& errorMessage)
-  : SecurityException(errorMessage)
-  {
-  }
-};
-
-class UnrecognizedDigestAlgorithmException : public SecurityException {
-public:
-  UnrecognizedDigestAlgorithmException(const std::string& errorMessage)
-  : SecurityException(errorMessage)
-  {
-  }
-};
-
-}
-
-#endif
diff --git a/include/ndn-cpp-dev/security/sha256-with-rsa-handler.hpp b/include/ndn-cpp-dev/security/sha256-with-rsa-handler.hpp
deleted file mode 100644
index 6627f02..0000000
--- a/include/ndn-cpp-dev/security/sha256-with-rsa-handler.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Yingdi Yu <yingdi@cs.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_SHA256_RSA_HANDLER_HPP
-#define NDN_SHA256_RSA_HANDLER_HPP
-
-#include "../../data.hpp"
-#include "../certificate/public-key.hpp"
-
-namespace ndn{
-
-class Sha256WithRsaHandler {
-public:
-  Sha256WithRsaHandler() {}
-
-  virtual
-  ~Sha256WithRsaHandler() {}
-
- /**
-  * Verify the signature on the data packet using the given public key. If there is no data.getDefaultWireEncoding(),
-  * this calls data.wireEncode() to set it.
-  * @param data The data packet with the signed portion and the signature to verify. The data packet must have a
-  * Sha256WithRsaSignature.
-  * @param publicKey The public key used to verify the signature.
-  * @return true if the signature verifies, false if not.
-  * @throw SecurityException if data does not have a Sha256WithRsaSignature.
-  */
-  static bool
-  verifySignature(const Data& data, const PublicKey& publicKey);
-
-};
-
-}
-#endif
diff --git a/include/ndn-cpp-dev/util/blob.hpp b/include/ndn-cpp-dev/util/blob.hpp
deleted file mode 100644
index 4de7a02..0000000
--- a/include/ndn-cpp-dev/util/blob.hpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_BLOB_HPP
-#define NDN_BLOB_HPP
-
-#include "../common.hpp"
-
-struct ndn_Blob;
-
-namespace ndn {
-
-/**
- * A Blob holds a pointer to an immutable byte array implemented as const std::vector<uint8_t>.  
- * This is like a JavaScript string which is a pointer to an immutable string.  
- * It is OK to pass a pointer to the string because the new owner can't change the bytes
- * of the string.  However, like a JavaScript string, it is possible to change the pointer, and so this does allow
- * the copy constructor and assignment to change the pointer.  Also remember that the pointer can be null.
- * (Note that we could have made Blob derive directly from vector<uint8_t> and then explicitly use
- * a pointer to it like Blob, but this does not enforce immutability because we can't declare
- * Blob as derived from const vector<uint8_t>.)
- */
-class Blob : public ptr_lib::shared_ptr<const std::vector<uint8_t> > {
-public:
-  /**
-   * Create a new Blob with a null pointer.
-   */
-  Blob()
-  {  
-  }
-  
-  /**
-   * Create a new Blob with an immutable copy of the given array.
-   * @param value A pointer to the byte array which is copied.
-   * @param valueLength The length of value.
-   */
-  Blob(const uint8_t* value, size_t valueLength)
-  : ptr_lib::shared_ptr<const std::vector<uint8_t> >(new std::vector<uint8_t>(value, value + valueLength))
-  {
-  }
-  
-  /**
-   * Create a new Blob with an immutable copy of the array in the given vector.
-   * If you want to transfer the array without copying, the the vector has to start as a 
-   * ptr_lib::shared_ptr<std::vector<uint8_t> > and you can use the Blob constructor with this type.
-   * @param value A reference to a vector which is copied.
-   */
-  Blob(const std::vector<uint8_t> &value)
-  : ptr_lib::shared_ptr<const std::vector<uint8_t> >(new std::vector<uint8_t>(value))
-  {
-  }
-  
-  /**
-   * Create a new Blob with an immutable copy of the array in the given Blob struct.
-   * @param blobStruct The C ndn_Blob struct to receive the pointer.
-   */
-  Blob(const struct ndn_Blob& blobStruct);
-  
-  /**
-   * Create a new Blob to point to an existing byte array.  IMPORTANT: After calling this constructor,
-   * if you keep a pointer to the array then you must treat the array as immutable and promise not to change it.
-   * @param value A pointer to a vector with the byte array.  This takes another reference and does not copy the bytes.
-   */
-  Blob(const ptr_lib::shared_ptr<std::vector<uint8_t> > &value)
-  : ptr_lib::shared_ptr<const std::vector<uint8_t> >((const ptr_lib::shared_ptr<const std::vector<uint8_t> > &)value)
-  {
-  }
-  Blob(const ptr_lib::shared_ptr<const std::vector<uint8_t> > &value)
-  : ptr_lib::shared_ptr<const std::vector<uint8_t> >(value)
-  {
-  }
-  
-  /**
-   * Return the length of the immutable byte array.
-   */
-  size_t 
-  size() const
-  {
-    if (*this)
-      return (*this)->size();
-    else
-      return 0;
-  }
-
-  /**
-   * Return a const pointer to the first byte of the immutable byte array, or 0 if the pointer is null.
-   */
-  const uint8_t* 
-  buf() const
-  {
-    if (*this)
-      return &(*this)->front();
-    else
-      return 0;
-  }
-  
-  /**
-   * Set the blobStruct to point to this Blob's byte array, without copying any memory.
-   * WARNING: The resulting pointer in blobStruct is invalid after a further use of this object which could reallocate memory.
-   * @param blobStruct The C ndn_Blob struct to receive the pointer.
-   */
-  void 
-  get(struct ndn_Blob& blobStruct) const;
-};
-
-}
-
-#endif
diff --git a/include/ndn-cpp-dev/util/signed-blob.hpp b/include/ndn-cpp-dev/util/signed-blob.hpp
deleted file mode 100644
index 1ad2d25..0000000
--- a/include/ndn-cpp-dev/util/signed-blob.hpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/**
- * Copyright (C) 2013 Regents of the University of California.
- * @author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- * @author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- * @author: Jeff Thompson <jefft0@remap.ucla.edu>
- * See COPYING for copyright and distribution information.
- */
-
-#ifndef NDN_SIGNED_BLOB_HPP
-#define NDN_SIGNED_BLOB_HPP
-
-#include "blob.hpp"
-
-namespace ndn {
-
-/**
- * A SignedBlob extends Blob to keep the offsets of a signed portion (e.g., the bytes of Data packet).
- */
-class SignedBlob : public Blob {
-public:
-  /**
-   * Create a new SignedBlob with a null pointer.
-   */
-  SignedBlob()
-  : signedPortionBeginOffset_(0), signedPortionEndOffset_(0)
-  {  
-  }
-  
-  /**
-   * Create a new SignedBlob with an immutable copy of the given array.
-   * @param value A pointer to the byte array which is copied.
-   * @param valueLength The length of value.
-   * @param signedPortionBeginOffset The offset in the encoding of the beginning of the signed portion.
-   * @param signedPortionEndOffset The offset in the encoding of the end of the signed portion.
-   */
-  SignedBlob
-    (const uint8_t* value, size_t valueLength, size_t signedPortionBeginOffset, size_t signedPortionEndOffset)
-  : Blob(value, valueLength), signedPortionBeginOffset_(signedPortionBeginOffset), signedPortionEndOffset_(signedPortionEndOffset)
-  {
-  }
-  
-  /**
-   * Create a new SignedBlob with an immutable copy of the array in the given vector.
-   * If you want to transfer the array without copying, the the vector has to start as a 
-   * ptr_lib::shared_ptr<std::vector<uint8_t> > and you can use the SignedBlob constructor with this type.
-   * @param value A reference to a vector which is copied.
-   * @param signedPortionBeginOffset The offset in the encoding of the beginning of the signed portion.
-   * @param signedPortionEndOffset The offset in the encoding of the end of the signed portion.
-   */
-  SignedBlob
-    (const std::vector<uint8_t> &value, size_t signedPortionBeginOffset, size_t signedPortionEndOffset)
-  : Blob(value), signedPortionBeginOffset_(signedPortionBeginOffset), signedPortionEndOffset_(signedPortionEndOffset)
-  {
-  }
-  
-  /**
-   * Create a new SignedBlob to point to an existing byte array.  IMPORTANT: After calling this constructor,
-   * if you keep a pointer to the array then you must treat the array as immutable and promise not to change it.
-   * @param value A pointer to a vector with the byte array.  This takes another reference and does not copy the bytes.
-   * @param signedPortionBeginOffset The offset in the array of the beginning of the signed portion.
-   * @param signedPortionEndOffset The offset in the array of the end of the signed portion.
-   */
-  SignedBlob
-    (const ptr_lib::shared_ptr<std::vector<uint8_t> > &value, 
-     size_t signedPortionBeginOffset, size_t signedPortionEndOffset)
-  : Blob(value), signedPortionBeginOffset_(signedPortionBeginOffset), signedPortionEndOffset_(signedPortionEndOffset)
-  {
-  }
-  SignedBlob
-    (const ptr_lib::shared_ptr<const std::vector<uint8_t> > &value, 
-     size_t signedPortionBeginOffset, size_t signedPortionEndOffset)
-  : Blob(value), signedPortionBeginOffset_(signedPortionBeginOffset), signedPortionEndOffset_(signedPortionEndOffset)
-  {
-  }
-    
-  /**
-   * Return the length of the signed portion of the immutable byte array, or 0 of the pointer to the array is null.
-   */
-  size_t 
-  signedSize() const
-  {
-    if (*this)
-      return signedPortionEndOffset_ - signedPortionBeginOffset_;
-    else
-      return 0;
-  }
-
-  /**
-   * Return a const pointer to the first byte of the signed portion of the immutable byte array, or 0 if the 
-   * pointer to the array is null.
-   */
-  const uint8_t*
-  signedBuf() const
-  {
-    if (*this)
-      return &(*this)->front() + signedPortionBeginOffset_;
-    else
-      return 0;
-  }
-
-  /**
-   * Return the offset in the array of the beginning of the signed portion.
-   */  
-  size_t 
-  getSignedPortionBeginOffset() const { return signedPortionBeginOffset_; }
-
-  /**
-   * Return the offset in the array of the end of the signed portion.
-   */  
-  size_t 
-  getSignedPortionEndOffset() const { return signedPortionEndOffset_; }
-  
-private:
-  size_t signedPortionBeginOffset_;
-  size_t signedPortionEndOffset_;
-};
-
-}
-
-#endif
diff --git a/libndn-cpp-dev.pc.in b/libndn-cpp-dev.pc.in
index 6219d0b..0e31949 100644
--- a/libndn-cpp-dev.pc.in
+++ b/libndn-cpp-dev.pc.in
@@ -6,5 +6,5 @@
 Name: libndn-cpp-dev
 Description: Development version of C++ API for NDN (NDN-TLV packet format)
 Version: @VERSION@
-Libs: -L${libdir} @OPENSSL_LDFLAGS@ @CRYPTOPP_LDFLAGS@ @SQLITE3_LDFLAGS@ @BOOST_LDFLAGS@ -lndn-cpp-dev @OPENSSL_LIBS@ @CRYPTOPP_LIBS@ @OSX_SECURITY_LIBS@ @BOOST_SYSTEM_LIB@ @BOOST_FILESYSTEM_LIB@
-Cflags: -I${includedir} @OPENSSL_INCLUDES@ @CRYPTOPP_INCLUDES@ @SQLITE3_CFLAGS@ @BOOST_CPPFLAGS@
+Libs: -L${libdir} @EXTRA_LDFLAGS@ -lndn-cpp-dev @EXTRA_LIBS@
+Cflags: -I${includedir} @EXTRA_INCLUDES@
diff --git a/m4/ax_boost_asio.m4 b/m4/ax_boost_asio.m4
deleted file mode 100644
index b57d487..0000000
--- a/m4/ax_boost_asio.m4
+++ /dev/null
@@ -1,110 +0,0 @@
-# ===========================================================================
-#       http://www.gnu.org/software/autoconf-archive/ax_boost_asio.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_BOOST_ASIO
-#
-# DESCRIPTION
-#
-#   Test for Asio library from the Boost C++ libraries. The macro requires a
-#   preceding call to AX_BOOST_BASE. Further documentation is available at
-#   <http://randspringer.de/boost/index.html>.
-#
-#   This macro calls:
-#
-#     AC_SUBST(BOOST_ASIO_LIB)
-#
-#   And sets:
-#
-#     HAVE_BOOST_ASIO
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
-#   Copyright (c) 2008 Pete Greenwell <pete@mu.org>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 16
-
-AC_DEFUN([AX_BOOST_ASIO],
-[
-	AC_ARG_WITH([boost-asio],
-	AS_HELP_STRING([--with-boost-asio@<:@=special-lib@:>@],
-                   [use the ASIO library from boost - it is possible to specify a certain library for the linker
-                        e.g. --with-boost-asio=boost_system-gcc41-mt-1_34 ]),
-        [
-        if test "$withval" = "no"; then
-			want_boost="no"
-        elif test "$withval" = "yes"; then
-            want_boost="yes"
-            ax_boost_user_asio_lib=""
-        else
-		    want_boost="yes"
-		ax_boost_user_asio_lib="$withval"
-		fi
-        ],
-        [want_boost="yes"]
-	)
-
-	if test "x$want_boost" = "xyes"; then
-        AC_REQUIRE([AC_PROG_CC])
-		CPPFLAGS_SAVED="$CPPFLAGS"
-		CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-		export CPPFLAGS
-
-		LDFLAGS_SAVED="$LDFLAGS"
-		LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-		export LDFLAGS
-
-        AC_CACHE_CHECK(whether the Boost::ASIO library is available,
-					   ax_cv_boost_asio,
-        [AC_LANG_PUSH([C++])
-		 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include <boost/asio.hpp>
-											]],
-                                  [[
-
-                                    boost::asio::io_service io;
-                                    boost::system::error_code timer_result;
-                                    boost::asio::deadline_timer t(io);
-                                    t.cancel();
-                                    io.run_one();
-									return 0;
-                                   ]])],
-                             ax_cv_boost_asio=yes, ax_cv_boost_asio=no)
-         AC_LANG_POP([C++])
-		])
-		if test "x$ax_cv_boost_asio" = "xyes"; then
-			AC_DEFINE(HAVE_BOOST_ASIO,,[define if the Boost::ASIO library is available])
-			BN=boost_system
-			BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
-            if test "x$ax_boost_user_asio_lib" = "x"; then
-				for ax_lib in `ls $BOOSTLIBDIR/libboost_system*.so* $BOOSTLIBDIR/libboost_system*.dylib* $BOOSTLIBDIR/libboost_system*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_system.*\)\.so.*$;\1;' -e 's;^lib\(boost_system.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_system.*\)\.a.*$;\1;' ` ; do
-				    AC_CHECK_LIB($ax_lib, main, [BOOST_ASIO_LIB="-l$ax_lib" AC_SUBST(BOOST_ASIO_LIB) link_thread="yes" break],
-                                 [link_thread="no"])
-				done
-            else
-               for ax_lib in $ax_boost_user_asio_lib $BN-$ax_boost_user_asio_lib; do
-				      AC_CHECK_LIB($ax_lib, main,
-                                   [BOOST_ASIO_LIB="-l$ax_lib" AC_SUBST(BOOST_ASIO_LIB) link_asio="yes" break],
-                                   [link_asio="no"])
-                  done
-
-            fi
-            if test "x$ax_lib" = "x"; then
-                AC_MSG_ERROR(Could not find a version of the library!)
-            fi
-			if test "x$link_asio" = "xno"; then
-				AC_MSG_ERROR(Could not link against $ax_lib !)
-			fi
-		fi
-
-		CPPFLAGS="$CPPFLAGS_SAVED"
-	LDFLAGS="$LDFLAGS_SAVED"
-	fi
-])
diff --git a/m4/ax_boost_base.m4 b/m4/ax_boost_base.m4
deleted file mode 100644
index 6b7ce35..0000000
--- a/m4/ax_boost_base.m4
+++ /dev/null
@@ -1,272 +0,0 @@
-# ===========================================================================
-#       http://www.gnu.org/software/autoconf-archive/ax_boost_base.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-#
-# DESCRIPTION
-#
-#   Test for the Boost C++ libraries of a particular version (or newer)
-#
-#   If no path to the installed boost library is given the macro searchs
-#   under /usr, /usr/local, /opt and /opt/local and evaluates the
-#   $BOOST_ROOT environment variable. Further documentation is available at
-#   <http://randspringer.de/boost/index.html>.
-#
-#   This macro calls:
-#
-#     AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
-#
-#   And sets:
-#
-#     HAVE_BOOST
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
-#   Copyright (c) 2009 Peter Adolphs
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 22
-
-AC_DEFUN([AX_BOOST_BASE],
-[
-AC_ARG_WITH([boost],
-  [AS_HELP_STRING([--with-boost@<:@=ARG@:>@],
-    [use Boost library from a standard location (ARG=yes),
-     from the specified location (ARG=<path>),
-     or disable it (ARG=no)
-     @<:@ARG=yes@:>@ ])],
-    [
-    if test "$withval" = "no"; then
-        want_boost="no"
-    elif test "$withval" = "yes"; then
-        want_boost="yes"
-        ac_boost_path=""
-    else
-        want_boost="yes"
-        ac_boost_path="$withval"
-    fi
-    ],
-    [want_boost="yes"])
-
-
-AC_ARG_WITH([boost-libdir],
-        AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
-        [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
-        [
-        if test -d "$withval"
-        then
-                ac_boost_lib_path="$withval"
-        else
-                AC_MSG_ERROR(--with-boost-libdir expected directory name)
-        fi
-        ],
-        [ac_boost_lib_path=""]
-)
-
-if test "x$want_boost" = "xyes"; then
-    boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
-    boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
-    boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
-    boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
-    boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
-    if test "x$boost_lib_version_req_sub_minor" = "x" ; then
-        boost_lib_version_req_sub_minor="0"
-        fi
-    WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+  $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
-    AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
-    succeeded=no
-
-    dnl On 64-bit systems check for system libraries in both lib64 and lib.
-    dnl The former is specified by FHS, but e.g. Debian does not adhere to
-    dnl this (as it rises problems for generic multi-arch support).
-    dnl The last entry in the list is chosen by default when no libraries
-    dnl are found, e.g. when only header-only libraries are installed!
-    libsubdirs="lib"
-    ax_arch=`uname -m`
-    case $ax_arch in
-      x86_64|ppc64|s390x|sparc64|aarch64)
-        libsubdirs="lib64 lib lib64"
-        ;;
-    esac
-
-    dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
-    dnl them priority over the other paths since, if libs are found there, they
-    dnl are almost assuredly the ones desired.
-    AC_REQUIRE([AC_CANONICAL_HOST])
-    libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
-
-    case ${host_cpu} in
-      i?86)
-        libsubdirs="lib/i386-${host_os} $libsubdirs"
-        ;;
-    esac
-
-    dnl first we check the system location for boost libraries
-    dnl this location ist chosen if boost libraries are installed with the --layout=system option
-    dnl or if you install boost with RPM
-    if test "$ac_boost_path" != ""; then
-        BOOST_CPPFLAGS="-I$ac_boost_path/include"
-        for ac_boost_path_tmp in $libsubdirs; do
-                if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
-                        BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
-                        break
-                fi
-        done
-    elif test "$cross_compiling" != yes; then
-        for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
-            if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
-                for libsubdir in $libsubdirs ; do
-                    if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
-                done
-                BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
-                BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
-                break;
-            fi
-        done
-    fi
-
-    dnl overwrite ld flags if we have required special directory with
-    dnl --with-boost-libdir parameter
-    if test "$ac_boost_lib_path" != ""; then
-       BOOST_LDFLAGS="-L$ac_boost_lib_path"
-    fi
-
-    CPPFLAGS_SAVED="$CPPFLAGS"
-    CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-    export CPPFLAGS
-
-    LDFLAGS_SAVED="$LDFLAGS"
-    LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-    export LDFLAGS
-
-    AC_REQUIRE([AC_PROG_CXX])
-    AC_LANG_PUSH(C++)
-        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-    @%:@include <boost/version.hpp>
-    ]], [[
-    #if BOOST_VERSION >= $WANT_BOOST_VERSION
-    // Everything is okay
-    #else
-    #  error Boost version is too old
-    #endif
-    ]])],[
-        AC_MSG_RESULT(yes)
-    succeeded=yes
-    found_system=yes
-        ],[
-        ])
-    AC_LANG_POP([C++])
-
-
-
-    dnl if we found no boost with system layout we search for boost libraries
-    dnl built and installed without the --layout=system option or for a staged(not installed) version
-    if test "x$succeeded" != "xyes"; then
-        _version=0
-        if test "$ac_boost_path" != ""; then
-            if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
-                for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
-                    _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
-                    V_CHECK=`expr $_version_tmp \> $_version`
-                    if test "$V_CHECK" = "1" ; then
-                        _version=$_version_tmp
-                    fi
-                    VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
-                    BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
-                done
-            fi
-        else
-            if test "$cross_compiling" != yes; then
-                for ac_boost_path in /usr /usr/local /opt /opt/local ; do
-                    if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
-                        for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
-                            _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
-                            V_CHECK=`expr $_version_tmp \> $_version`
-                            if test "$V_CHECK" = "1" ; then
-                                _version=$_version_tmp
-                                best_path=$ac_boost_path
-                            fi
-                        done
-                    fi
-                done
-
-                VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
-                BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
-                if test "$ac_boost_lib_path" = ""; then
-                    for libsubdir in $libsubdirs ; do
-                        if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
-                    done
-                    BOOST_LDFLAGS="-L$best_path/$libsubdir"
-                fi
-            fi
-
-            if test "x$BOOST_ROOT" != "x"; then
-                for libsubdir in $libsubdirs ; do
-                    if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
-                done
-                if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
-                    version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
-                    stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
-                        stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
-                    V_CHECK=`expr $stage_version_shorten \>\= $_version`
-                    if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
-                        AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
-                        BOOST_CPPFLAGS="-I$BOOST_ROOT"
-                        BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
-                    fi
-                fi
-            fi
-        fi
-
-        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-        export CPPFLAGS
-        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-        export LDFLAGS
-
-        AC_LANG_PUSH(C++)
-            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-        @%:@include <boost/version.hpp>
-        ]], [[
-        #if BOOST_VERSION >= $WANT_BOOST_VERSION
-        // Everything is okay
-        #else
-        #  error Boost version is too old
-        #endif
-        ]])],[
-            AC_MSG_RESULT(yes)
-        succeeded=yes
-        found_system=yes
-            ],[
-            ])
-        AC_LANG_POP([C++])
-    fi
-
-    if test "$succeeded" != "yes" ; then
-        if test "$_version" = "0" ; then
-            AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option.  If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
-        else
-            AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
-        fi
-        # execute ACTION-IF-NOT-FOUND (if present):
-        ifelse([$3], , :, [$3])
-    else
-        AC_SUBST(BOOST_CPPFLAGS)
-        AC_SUBST(BOOST_LDFLAGS)
-        AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
-        # execute ACTION-IF-FOUND (if present):
-        ifelse([$2], , :, [$2])
-    fi
-
-    CPPFLAGS="$CPPFLAGS_SAVED"
-    LDFLAGS="$LDFLAGS_SAVED"
-fi
-
-])
diff --git a/m4/ax_boost_filesystem.m4 b/m4/ax_boost_filesystem.m4
deleted file mode 100644
index f162163..0000000
--- a/m4/ax_boost_filesystem.m4
+++ /dev/null
@@ -1,118 +0,0 @@
-# ===========================================================================
-#    http://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_BOOST_FILESYSTEM
-#
-# DESCRIPTION
-#
-#   Test for Filesystem library from the Boost C++ libraries. The macro
-#   requires a preceding call to AX_BOOST_BASE. Further documentation is
-#   available at <http://randspringer.de/boost/index.html>.
-#
-#   This macro calls:
-#
-#     AC_SUBST(BOOST_FILESYSTEM_LIB)
-#
-#   And sets:
-#
-#     HAVE_BOOST_FILESYSTEM
-#
-# LICENSE
-#
-#   Copyright (c) 2009 Thomas Porschberg <thomas@randspringer.de>
-#   Copyright (c) 2009 Michael Tindal
-#   Copyright (c) 2009 Roman Rybalko <libtorrent@romanr.info>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 26
-
-AC_DEFUN([AX_BOOST_FILESYSTEM],
-[
-	AC_ARG_WITH([boost-filesystem],
-	AS_HELP_STRING([--with-boost-filesystem@<:@=special-lib@:>@],
-                   [use the Filesystem library from boost - it is possible to specify a certain library for the linker
-                        e.g. --with-boost-filesystem=boost_filesystem-gcc-mt ]),
-        [
-        if test "$withval" = "no"; then
-			want_boost="no"
-        elif test "$withval" = "yes"; then
-            want_boost="yes"
-            ax_boost_user_filesystem_lib=""
-        else
-		    want_boost="yes"
-		ax_boost_user_filesystem_lib="$withval"
-		fi
-        ],
-        [want_boost="yes"]
-	)
-
-	if test "x$want_boost" = "xyes"; then
-        AC_REQUIRE([AC_PROG_CC])
-		CPPFLAGS_SAVED="$CPPFLAGS"
-		CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-		export CPPFLAGS
-
-		LDFLAGS_SAVED="$LDFLAGS"
-		LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-		export LDFLAGS
-
-		LIBS_SAVED=$LIBS
-		LIBS="$LIBS $BOOST_SYSTEM_LIB"
-		export LIBS
-
-        AC_CACHE_CHECK(whether the Boost::Filesystem library is available,
-					   ax_cv_boost_filesystem,
-        [AC_LANG_PUSH([C++])
-         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/filesystem/path.hpp>]],
-                                   [[using namespace boost::filesystem;
-                                   path my_path( "foo/bar/data.txt" );
-                                   return 0;]])],
-					       ax_cv_boost_filesystem=yes, ax_cv_boost_filesystem=no)
-         AC_LANG_POP([C++])
-		])
-		if test "x$ax_cv_boost_filesystem" = "xyes"; then
-			AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available])
-            BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
-            if test "x$ax_boost_user_filesystem_lib" = "x"; then
-                for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do
-                     ax_lib=${libextension}
-				    AC_CHECK_LIB($ax_lib, exit,
-                                 [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break],
-                                 [link_filesystem="no"])
-				done
-                if test "x$link_filesystem" != "xyes"; then
-                for libextension in `ls -r $BOOSTLIBDIR/boost_filesystem* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do
-                     ax_lib=${libextension}
-				    AC_CHECK_LIB($ax_lib, exit,
-                                 [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break],
-                                 [link_filesystem="no"])
-				done
-		    fi
-            else
-               for ax_lib in $ax_boost_user_filesystem_lib boost_filesystem-$ax_boost_user_filesystem_lib; do
-				      AC_CHECK_LIB($ax_lib, exit,
-                                   [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break],
-                                   [link_filesystem="no"])
-                  done
-
-            fi
-            if test "x$ax_lib" = "x"; then
-                AC_MSG_ERROR(Could not find a version of the library!)
-            fi
-			if test "x$link_filesystem" != "xyes"; then
-				AC_MSG_ERROR(Could not link against $ax_lib !)
-			fi
-		fi
-
-		CPPFLAGS="$CPPFLAGS_SAVED"
-		LDFLAGS="$LDFLAGS_SAVED"
-		LIBS="$LIBS_SAVED"
-	fi
-])
diff --git a/m4/ax_boost_system.m4 b/m4/ax_boost_system.m4
deleted file mode 100644
index c4c4555..0000000
--- a/m4/ax_boost_system.m4
+++ /dev/null
@@ -1,120 +0,0 @@
-# ===========================================================================
-#      http://www.gnu.org/software/autoconf-archive/ax_boost_system.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_BOOST_SYSTEM
-#
-# DESCRIPTION
-#
-#   Test for System library from the Boost C++ libraries. The macro requires
-#   a preceding call to AX_BOOST_BASE. Further documentation is available at
-#   <http://randspringer.de/boost/index.html>.
-#
-#   This macro calls:
-#
-#     AC_SUBST(BOOST_SYSTEM_LIB)
-#
-#   And sets:
-#
-#     HAVE_BOOST_SYSTEM
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
-#   Copyright (c) 2008 Michael Tindal
-#   Copyright (c) 2008 Daniel Casimiro <dan.casimiro@gmail.com>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 17
-
-AC_DEFUN([AX_BOOST_SYSTEM],
-[
-	AC_ARG_WITH([boost-system],
-	AS_HELP_STRING([--with-boost-system@<:@=special-lib@:>@],
-                   [use the System library from boost - it is possible to specify a certain library for the linker
-                        e.g. --with-boost-system=boost_system-gcc-mt ]),
-        [
-        if test "$withval" = "no"; then
-			want_boost="no"
-        elif test "$withval" = "yes"; then
-            want_boost="yes"
-            ax_boost_user_system_lib=""
-        else
-		    want_boost="yes"
-		ax_boost_user_system_lib="$withval"
-		fi
-        ],
-        [want_boost="yes"]
-	)
-
-	if test "x$want_boost" = "xyes"; then
-        AC_REQUIRE([AC_PROG_CC])
-        AC_REQUIRE([AC_CANONICAL_BUILD])
-		CPPFLAGS_SAVED="$CPPFLAGS"
-		CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-		export CPPFLAGS
-
-		LDFLAGS_SAVED="$LDFLAGS"
-		LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-		export LDFLAGS
-
-        AC_CACHE_CHECK(whether the Boost::System library is available,
-					   ax_cv_boost_system,
-        [AC_LANG_PUSH([C++])
-			 CXXFLAGS_SAVE=$CXXFLAGS
-
-			 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/system/error_code.hpp>]],
-                                   [[boost::system::system_category]])],
-                   ax_cv_boost_system=yes, ax_cv_boost_system=no)
-			 CXXFLAGS=$CXXFLAGS_SAVE
-             AC_LANG_POP([C++])
-		])
-		if test "x$ax_cv_boost_system" = "xyes"; then
-			AC_SUBST(BOOST_CPPFLAGS)
-
-			AC_DEFINE(HAVE_BOOST_SYSTEM,,[define if the Boost::System library is available])
-            BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
-
-			LDFLAGS_SAVE=$LDFLAGS
-            if test "x$ax_boost_user_system_lib" = "x"; then
-                for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do
-                     ax_lib=${libextension}
-				    AC_CHECK_LIB($ax_lib, exit,
-                                 [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break],
-                                 [link_system="no"])
-				done
-                if test "x$link_system" != "xyes"; then
-                for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do
-                     ax_lib=${libextension}
-				    AC_CHECK_LIB($ax_lib, exit,
-                                 [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break],
-                                 [link_system="no"])
-				done
-                fi
-
-            else
-               for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do
-				      AC_CHECK_LIB($ax_lib, exit,
-                                   [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break],
-                                   [link_system="no"])
-                  done
-
-            fi
-            if test "x$ax_lib" = "x"; then
-                AC_MSG_ERROR(Could not find a version of the library!)
-            fi
-			if test "x$link_system" = "xno"; then
-				AC_MSG_ERROR(Could not link against $ax_lib !)
-			fi
-		fi
-
-		CPPFLAGS="$CPPFLAGS_SAVED"
-	LDFLAGS="$LDFLAGS_SAVED"
-	fi
-])
diff --git a/m4/ax_boost_unit_test_framework.m4 b/m4/ax_boost_unit_test_framework.m4
deleted file mode 100644
index 1115f55..0000000
--- a/m4/ax_boost_unit_test_framework.m4
+++ /dev/null
@@ -1,137 +0,0 @@
-# ================================================================================
-#  http://www.gnu.org/software/autoconf-archive/ax_boost_unit_test_framework.html
-# ================================================================================
-#
-# SYNOPSIS
-#
-#   AX_BOOST_UNIT_TEST_FRAMEWORK
-#
-# DESCRIPTION
-#
-#   Test for Unit_Test_Framework library from the Boost C++ libraries. The
-#   macro requires a preceding call to AX_BOOST_BASE. Further documentation
-#   is available at <http://randspringer.de/boost/index.html>.
-#
-#   This macro calls:
-#
-#     AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB)
-#
-#   And sets:
-#
-#     HAVE_BOOST_UNIT_TEST_FRAMEWORK
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 19
-
-AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK],
-[
-	AC_ARG_WITH([boost-unit-test-framework],
-	AS_HELP_STRING([--with-boost-unit-test-framework@<:@=special-lib@:>@],
-                   [use the Unit_Test_Framework library from boost - it is possible to specify a certain library for the linker
-                        e.g. --with-boost-unit-test-framework=boost_unit_test_framework-gcc ]),
-        [
-        if test "$withval" = "no"; then
-			want_boost="no"
-        elif test "$withval" = "yes"; then
-            want_boost="yes"
-            ax_boost_user_unit_test_framework_lib=""
-        else
-		    want_boost="yes"
-		ax_boost_user_unit_test_framework_lib="$withval"
-		fi
-        ],
-        [want_boost="yes"]
-	)
-
-	if test "x$want_boost" = "xyes"; then
-        AC_REQUIRE([AC_PROG_CC])
-		CPPFLAGS_SAVED="$CPPFLAGS"
-		CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-		export CPPFLAGS
-
-		LDFLAGS_SAVED="$LDFLAGS"
-		LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-		export LDFLAGS
-
-        AC_CACHE_CHECK(whether the Boost::Unit_Test_Framework library is available,
-					   ax_cv_boost_unit_test_framework,
-        [AC_LANG_PUSH([C++])
-			 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/test/unit_test.hpp>]],
-                                    [[using boost::unit_test::test_suite;
-							 test_suite* test= BOOST_TEST_SUITE( "Unit test example 1" ); return 0;]])],
-                   ax_cv_boost_unit_test_framework=yes, ax_cv_boost_unit_test_framework=no)
-         AC_LANG_POP([C++])
-		])
-		if test "x$ax_cv_boost_unit_test_framework" = "xyes"; then
-			AC_DEFINE(HAVE_BOOST_UNIT_TEST_FRAMEWORK,,[define if the Boost::Unit_Test_Framework library is available])
-            BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
-
-            if test "x$ax_boost_user_unit_test_framework_lib" = "x"; then
-			saved_ldflags="${LDFLAGS}"
-                for monitor_library in `ls $BOOSTLIBDIR/libboost_unit_test_framework*.so* $BOOSTLIBDIR/libboost_unit_test_framework*.dylib* $BOOSTLIBDIR/libboost_unit_test_framework*.a* 2>/dev/null` ; do
-                    if test -r $monitor_library ; then
-                       libextension=`echo $monitor_library | sed 's,.*/,,' | sed -e 's;^lib\(boost_unit_test_framework.*\)\.so.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.a.*$;\1;'`
-                       ax_lib=${libextension}
-                       link_unit_test_framework="yes"
-                    else
-                       link_unit_test_framework="no"
-                    fi
-
-			    if test "x$link_unit_test_framework" = "xyes"; then
-                      BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib"
-                      AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB)
-					  break
-				    fi
-                done
-                if test "x$link_unit_test_framework" != "xyes"; then
-                for libextension in `ls $BOOSTLIBDIR/boost_unit_test_framework*.dll* $BOOSTLIBDIR/boost_unit_test_framework*.a* 2>/dev/null  | sed 's,.*/,,' | sed -e 's;^\(boost_unit_test_framework.*\)\.dll.*$;\1;' -e 's;^\(boost_unit_test_framework.*\)\.a.*$;\1;'` ; do
-                     ax_lib=${libextension}
-				    AC_CHECK_LIB($ax_lib, exit,
-                                 [BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib"; AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) link_unit_test_framework="yes"; break],
-                                 [link_unit_test_framework="no"])
-				done
-                fi
-            else
-                link_unit_test_framework="no"
-			saved_ldflags="${LDFLAGS}"
-                for ax_lib in boost_unit_test_framework-$ax_boost_user_unit_test_framework_lib $ax_boost_user_unit_test_framework_lib ; do
-                   if test "x$link_unit_test_framework" = "xyes"; then
-                      break;
-                   fi
-                   for unittest_library in `ls $BOOSTLIBDIR/lib${ax_lib}.so* $BOOSTLIBDIR/lib${ax_lib}.a* 2>/dev/null` ; do
-                   if test -r $unittest_library ; then
-                       libextension=`echo $unittest_library | sed 's,.*/,,' | sed -e 's;^lib\(boost_unit_test_framework.*\)\.so.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.a*$;\1;'`
-                       ax_lib=${libextension}
-                       link_unit_test_framework="yes"
-                    else
-                       link_unit_test_framework="no"
-                    fi
-
-				if test "x$link_unit_test_framework" = "xyes"; then
-                        BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib"
-                        AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB)
-					    break
-				    fi
-                  done
-               done
-            fi
-            if test "x$ax_lib" = "x"; then
-                AC_MSG_ERROR(Could not find a version of the library!)
-            fi
-			if test "x$link_unit_test_framework" != "xyes"; then
-				AC_MSG_ERROR(Could not link against $ax_lib !)
-			fi
-		fi
-
-		CPPFLAGS="$CPPFLAGS_SAVED"
-	LDFLAGS="$LDFLAGS_SAVED"
-	fi
-])
diff --git a/m4/ax_check_openssl.m4 b/m4/ax_check_openssl.m4
deleted file mode 100644
index a87c5a6..0000000
--- a/m4/ax_check_openssl.m4
+++ /dev/null
@@ -1,124 +0,0 @@
-# ===========================================================================
-#     http://www.gnu.org/software/autoconf-archive/ax_check_openssl.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CHECK_OPENSSL([action-if-found[, action-if-not-found]])
-#
-# DESCRIPTION
-#
-#   Look for OpenSSL in a number of default spots, or in a user-selected
-#   spot (via --with-openssl).  Sets
-#
-#     OPENSSL_INCLUDES to the include directives required
-#     OPENSSL_LIBS to the -l directives required
-#     OPENSSL_LDFLAGS to the -L or -R flags required
-#
-#   and calls ACTION-IF-FOUND or ACTION-IF-NOT-FOUND appropriately
-#
-#   This macro sets OPENSSL_INCLUDES such that source files should use the
-#   openssl/ directory in include directives:
-#
-#     #include <openssl/hmac.h>
-#
-# LICENSE
-#
-#   Copyright (c) 2009,2010 Zmanda Inc. <http://www.zmanda.com/>
-#   Copyright (c) 2009,2010 Dustin J. Mitchell <dustin@zmanda.com>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 8
-
-AU_ALIAS([CHECK_SSL], [AX_CHECK_OPENSSL])
-AC_DEFUN([AX_CHECK_OPENSSL], [
-    found=false
-    AC_ARG_WITH([openssl],
-        [AS_HELP_STRING([--with-openssl=DIR],
-            [root of the OpenSSL directory])],
-        [
-            case "$withval" in
-            "" | y | ye | yes | n | no)
-            AC_MSG_ERROR([Invalid --with-openssl value])
-              ;;
-            *) ssldirs="$withval"
-              ;;
-            esac
-        ], [
-            # if pkg-config is installed and openssl has installed a .pc file,
-            # then use that information and don't search ssldirs
-            AC_PATH_PROG([PKG_CONFIG], [pkg-config])
-            if test x"$PKG_CONFIG" != x""; then
-                OPENSSL_LDFLAGS=`$PKG_CONFIG openssl --libs-only-L 2>/dev/null`
-                if test $? = 0; then
-                    OPENSSL_LIBS=`$PKG_CONFIG openssl --libs-only-l 2>/dev/null`
-                    OPENSSL_INCLUDES=`$PKG_CONFIG openssl --cflags-only-I 2>/dev/null`
-                    found=true
-                fi
-            fi
-
-            # no such luck; use some default ssldirs
-            if ! $found; then
-                ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr"
-            fi
-        ]
-        )
-
-
-    # note that we #include <openssl/foo.h>, so the OpenSSL headers have to be in
-    # an 'openssl' subdirectory
-
-    if ! $found; then
-        OPENSSL_INCLUDES=
-        for ssldir in $ssldirs; do
-            AC_MSG_CHECKING([for openssl/ssl.h in $ssldir])
-            if test -f "$ssldir/include/openssl/ssl.h"; then
-                OPENSSL_INCLUDES="-I$ssldir/include"
-                OPENSSL_LDFLAGS="-L$ssldir/lib"
-                OPENSSL_LIBS="-lssl -lcrypto"
-                found=true
-                AC_MSG_RESULT([yes])
-                break
-            else
-                AC_MSG_RESULT([no])
-            fi
-        done
-
-        # if the file wasn't found, well, go ahead and try the link anyway -- maybe
-        # it will just work!
-    fi
-
-    # try the preprocessor and linker with our new flags,
-    # being careful not to pollute the global LIBS, LDFLAGS, and CPPFLAGS
-
-    AC_MSG_CHECKING([whether compiling and linking against OpenSSL works])
-    echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \
-        "OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&AS_MESSAGE_LOG_FD
-
-    save_LIBS="$LIBS"
-    save_LDFLAGS="$LDFLAGS"
-    save_CPPFLAGS="$CPPFLAGS"
-    LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
-    LIBS="$OPENSSL_LIBS $LIBS"
-    CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS"
-    AC_LINK_IFELSE(
-        [AC_LANG_PROGRAM([#include <openssl/ssl.h>], [SSL_new(NULL)])],
-        [
-            AC_MSG_RESULT([yes])
-            $1
-        ], [
-            AC_MSG_RESULT([no])
-            $2
-        ])
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-
-    AC_SUBST([OPENSSL_INCLUDES])
-    AC_SUBST([OPENSSL_LIBS])
-    AC_SUBST([OPENSSL_LDFLAGS])
-])
diff --git a/m4/ax_cxx_compile_stdcxx_11.m4 b/m4/ax_cxx_compile_stdcxx_11.m4
deleted file mode 100644
index 2d40ac1..0000000
--- a/m4/ax_cxx_compile_stdcxx_11.m4
+++ /dev/null
@@ -1,148 +0,0 @@
-# ============================================================================
-#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
-# ============================================================================
-#
-# SYNOPSIS
-#
-#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
-#
-# DESCRIPTION
-#
-#   Check for baseline language coverage in the compiler for the C++11
-#   standard; if necessary, add switches to CXXFLAGS to enable support.
-#
-#   The first argument, if specified, indicates whether you insist on an
-#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
-#   -std=c++11).  If neither is specified, you get whatever works, with
-#   preference for an extended mode.
-#
-#   The second argument, if specified 'mandatory' or if left unspecified,
-#   indicates that baseline C++11 support is required and that the macro
-#   should error out if no mode with that support is found.  If specified
-#   'optional', then configuration proceeds regardless, after defining
-#   HAVE_CXX11 if and only if a supporting mode is found.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
-#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
-#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 3
-
-m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
-  template <typename T>
-    struct check
-    {
-      static_assert(sizeof(int) <= sizeof(T), "not big enough");
-    };
-
-    typedef check<check<bool>> right_angle_brackets;
-
-    int a;
-    decltype(a) b;
-
-    typedef check<int> check_type;
-    check_type c;
-    check_type&& cr = static_cast<check_type&&>(c);
-
-    auto d = a;
-])
-
-AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
-  AC_ARG_WITH([c++11],
-    AS_HELP_STRING(
-        [--with-c++11=@<:@ARG@:>@],
-        [use C++11 when available @<:@default=no@:>@]
-    ),
-    [
-    if test "$withval" = "yes"; then
-        WANT_CXX11="yes"
-    fi
-    ],
-    [WANT_CXX11="no"]
-  )
-
-  if test "x$WANT_CXX11" = "xyes"; then
-    m4_if([$1], [], [],
-          [$1], [ext], [],
-          [$1], [noext], [],
-          [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
-    m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
-          [$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
-          [$2], [optional], [ax_cxx_compile_cxx11_required=false],
-          [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl
-    AC_LANG_PUSH([C++])dnl
-    ac_success=no
-    AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
-    ax_cv_cxx_compile_cxx11,
-    [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
-      [ax_cv_cxx_compile_cxx11=yes],
-      [ax_cv_cxx_compile_cxx11=no])])
-    if test x$ax_cv_cxx_compile_cxx11 = xyes; then
-      ac_success=yes
-    fi
-    
-    m4_if([$1], [noext], [], [dnl
-    if test x$ac_success = xno; then
-      for switch in -std=gnu++11 -std=gnu++0x; do
-        cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
-        AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
-                       $cachevar,
-          [ac_save_CXXFLAGS="$CXXFLAGS"
-           CXXFLAGS="$CXXFLAGS $switch"
-           AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
-            [eval $cachevar=yes],
-            [eval $cachevar=no])
-           CXXFLAGS="$ac_save_CXXFLAGS"])
-        if eval test x\$$cachevar = xyes; then
-          CXXFLAGS="$CXXFLAGS $switch"
-          ac_success=yes
-          break
-        fi
-      done
-    fi])
-    
-    m4_if([$1], [ext], [], [dnl
-    if test x$ac_success = xno; then
-      for switch in -std=c++11 -std=c++0x; do
-        cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
-        AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
-                       $cachevar,
-          [ac_save_CXXFLAGS="$CXXFLAGS"
-           CXXFLAGS="$CXXFLAGS $switch"
-           AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
-            [eval $cachevar=yes],
-            [eval $cachevar=no])
-           CXXFLAGS="$ac_save_CXXFLAGS"])
-        if eval test x\$$cachevar = xyes; then
-          CXXFLAGS="$CXXFLAGS $switch"
-          ac_success=yes
-          break
-        fi
-      done
-    fi])
-    AC_LANG_POP([C++])
-    if test x$ax_cxx_compile_cxx11_required = xtrue; then
-      if test x$ac_success = xno; then
-        AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
-      fi
-    else
-      if test x$ac_success = xno; then
-        HAVE_CXX11=0
-        AC_MSG_NOTICE([No compiler with C++11 support was found])
-      else
-        HAVE_CXX11=1
-        AC_DEFINE(HAVE_CXX11,1,
-                  [define if the compiler supports basic C++11 syntax])
-      fi
-    
-      AC_SUBST(HAVE_CXX11)
-    fi
-  fi
-])
diff --git a/m4/ax_lib_cryptopp.m4 b/m4/ax_lib_cryptopp.m4
deleted file mode 100644
index f4f51fd..0000000
--- a/m4/ax_lib_cryptopp.m4
+++ /dev/null
@@ -1,101 +0,0 @@
-# SYNOPSIS
-#
-#   AX_LIB_CRYPTOPP([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
-#
-# DESCRIPTION
-#
-#   Test for the Crypto++ library
-#
-#   If no intallation prefix to the installed Crypto++ library is given the
-#   macro searches under /usr, /usr/local, and /opt.
-#
-#   This macro calls:
-#
-#     AC_SUBST(CRYPTOPP_INCLUDES)
-#     AC_SUBST(CRYPTOPP_LDFLAGS)
-#     AC_SUBST(CRYPTOPP_LIBS)
-#
-#   And sets:
-#
-#     HAVE_CRYPTOPP
-
-AC_DEFUN([AX_LIB_CRYPTOPP],
-[
-    AC_ARG_WITH([cryptopp],
-        AS_HELP_STRING(
-            [--with-cryptopp=@<:@ARG@:>@],
-            [use Crypto++ library @<:@default=yes@:>@, optionally specify the prefix for the library]
-        ),
-        [
-        if test "$withval" = "no"; then
-            WANT_CRYPTOPP="no"
-        elif test "$withval" = "yes"; then
-            WANT_CRYPTOPP="yes"
-            ac_cryptopp_path=""
-        else
-            WANT_CRYPTOPP="yes"
-            ac_cryptopp_path="$withval"
-        fi
-        ],
-        [WANT_CRYPTOPP="yes"]
-    )
-
-    CRYPTOPP_CFLAGS=""
-    CRYPTOPP_LDFLAGS=""
-    CRYPTOPP_LIBS=""
-
-    if test "x$WANT_CRYPTOPP" = "xyes"; then
-
-        AC_MSG_CHECKING([for Crypto++ library])
-
-        ac_cryptopp_header="cryptopp/cryptlib.h"
-        ac_cryptopp_libs="-lcryptopp"
-
-        if test "$ac_cryptopp_path" != ""; then
-            ac_cryptopp_ldflags="-L$ac_cryptopp_path/lib"
-            ac_cryptopp_cppflags="-I$ac_cryptopp_path/include"
-        else
-            for ac_cryptopp_path_tmp in /usr /usr/local /opt ; do
-                if test -f "$ac_cryptopp_path_tmp/include/$ac_cryptopp_header" \
-                    && test -r "$ac_cryptopp_path_tmp/include/$ac_cryptopp_header"; then
-                    ac_cryptopp_path=$ac_cryptopp_path_tmp
-                    ac_cryptopp_cppflags="-I$ac_cryptopp_path_tmp/include"
-                    ac_cryptopp_ldflags="-L$ac_cryptopp_path_tmp/lib"
-                    break;
-                fi
-            done
-        fi
-
-        CRYPTOPP_INCLUDES="$ac_cryptopp_cppflags"
-        CRYPTOPP_LDFLAGS="$ac_cryptopp_ldflags"
-        CRYPTOPP_LIBS="$ac_cryptopp_libs"
-
-        save_LIBS="$LIBS"
-        save_LDFLAGS="$LDFLAGS"
-        save_CPPFLAGS="$CPPFLAGS"
-
-        LDFLAGS="$LDFLAGS $CRYPTOPP_LDFLAGS"
-        LIBS="$CRYPTOPP_LIBS $LIBS"
-        CPPFLAGS="$CRYPTOPP_INCLUDES $CPPFLAGS"
-        AC_LANG_PUSH(C++)
-        AC_LINK_IFELSE(
-            [AC_LANG_PROGRAM([#include <cryptopp/cryptlib.h>], [])],
-            [
-                AC_MSG_RESULT([yes])
-                $1
-            ], [
-                AC_MSG_RESULT([no])
-                $2
-            ])
-        AC_LANG_POP([C++])
-        CPPFLAGS="$save_CPPFLAGS"
-        LDFLAGS="$save_LDFLAGS"
-        LIBS="$save_LIBS"
-
-        AC_SUBST(CRYPTOPP_INCLUDES)
-        AC_SUBST(CRYPTOPP_LDFLAGS)
-        AC_SUBST(CRYPTOPP_LIBS)
-
-        AC_DEFINE([HAVE_CRYPTOPP], [], [Have the Crypto++ library])
-    fi
-])
diff --git a/m4/ax_lib_sqlite3.m4 b/m4/ax_lib_sqlite3.m4
deleted file mode 100644
index 7771716..0000000
--- a/m4/ax_lib_sqlite3.m4
+++ /dev/null
@@ -1,156 +0,0 @@
-# ===========================================================================
-#      http://www.gnu.org/software/autoconf-archive/ax_lib_sqlite3.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_LIB_SQLITE3([MINIMUM-VERSION])
-#
-# DESCRIPTION
-#
-#   Test for the SQLite 3 library of a particular version (or newer)
-#
-#   This macro takes only one optional argument, required version of SQLite
-#   3 library. If required version is not passed, 3.0.0 is used in the test
-#   of existance of SQLite 3.
-#
-#   If no intallation prefix to the installed SQLite library is given the
-#   macro searches under /usr, /usr/local, and /opt.
-#
-#   This macro calls:
-#
-#     AC_SUBST(SQLITE3_CFLAGS)
-#     AC_SUBST(SQLITE3_LDFLAGS)
-#     AC_SUBST(SQLITE3_VERSION)
-#
-#   And sets:
-#
-#     HAVE_SQLITE3
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Mateusz Loskot <mateusz@loskot.net>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 14
-
-AC_DEFUN([AX_LIB_SQLITE3],
-[
-    AC_ARG_WITH([sqlite3],
-        AS_HELP_STRING(
-            [--with-sqlite3=@<:@ARG@:>@],
-            [use SQLite 3 library @<:@default=yes@:>@, optionally specify the prefix for sqlite3 library]
-        ),
-        [
-        if test "$withval" = "no"; then
-            WANT_SQLITE3="no"
-        elif test "$withval" = "yes"; then
-            WANT_SQLITE3="yes"
-            ac_sqlite3_path=""
-        else
-            WANT_SQLITE3="yes"
-            ac_sqlite3_path="$withval"
-        fi
-        ],
-        [WANT_SQLITE3="yes"]
-    )
-
-    SQLITE3_CFLAGS=""
-    SQLITE3_LDFLAGS=""
-    SQLITE3_VERSION=""
-
-    if test "x$WANT_SQLITE3" = "xyes"; then
-
-        ac_sqlite3_header="sqlite3.h"
-
-        sqlite3_version_req=ifelse([$1], [], [3.0.0], [$1])
-        sqlite3_version_req_shorten=`expr $sqlite3_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
-        sqlite3_version_req_major=`expr $sqlite3_version_req : '\([[0-9]]*\)'`
-        sqlite3_version_req_minor=`expr $sqlite3_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
-        sqlite3_version_req_micro=`expr $sqlite3_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
-        if test "x$sqlite3_version_req_micro" = "x" ; then
-            sqlite3_version_req_micro="0"
-        fi
-
-        sqlite3_version_req_number=`expr $sqlite3_version_req_major \* 1000000 \
-                                   \+ $sqlite3_version_req_minor \* 1000 \
-                                   \+ $sqlite3_version_req_micro`
-
-        AC_MSG_CHECKING([for SQLite3 library >= $sqlite3_version_req])
-
-        if test "$ac_sqlite3_path" != ""; then
-            ac_sqlite3_ldflags="-L$ac_sqlite3_path/lib"
-            ac_sqlite3_cppflags="-I$ac_sqlite3_path/include"
-        else
-            for ac_sqlite3_path_tmp in /usr /usr/local /opt ; do
-                if test -f "$ac_sqlite3_path_tmp/include/$ac_sqlite3_header" \
-                    && test -r "$ac_sqlite3_path_tmp/include/$ac_sqlite3_header"; then
-                    ac_sqlite3_path=$ac_sqlite3_path_tmp
-                    ac_sqlite3_cppflags="-I$ac_sqlite3_path_tmp/include"
-                    ac_sqlite3_ldflags="-L$ac_sqlite3_path_tmp/lib"
-                    break;
-                fi
-            done
-        fi
-
-        ac_sqlite3_ldflags="$ac_sqlite3_ldflags -lsqlite3"
-
-        saved_CPPFLAGS="$CPPFLAGS"
-        CPPFLAGS="$CPPFLAGS $ac_sqlite3_cppflags"
-
-        AC_LANG_PUSH(C)
-        AC_COMPILE_IFELSE(
-            [
-            AC_LANG_PROGRAM([[@%:@include <sqlite3.h>]],
-                [[
-#if (SQLITE_VERSION_NUMBER >= $sqlite3_version_req_number)
-/* Everything is okay */
-#else
-#  error SQLite version is too old
-#endif
-                ]]
-            )
-            ],
-            [
-            AC_MSG_RESULT([yes])
-            success="yes"
-            ],
-            [
-            AC_MSG_RESULT([not found])
-            success="no"
-            ]
-        )
-        AC_LANG_POP(C)
-
-        CPPFLAGS="$saved_CPPFLAGS"
-
-        if test "$success" = "yes"; then
-
-            SQLITE3_CFLAGS="$ac_sqlite3_cppflags"
-            SQLITE3_LDFLAGS="$ac_sqlite3_ldflags"
-
-            ac_sqlite3_header_path="$ac_sqlite3_path/include/$ac_sqlite3_header"
-
-            dnl Retrieve SQLite release version
-            if test "x$ac_sqlite3_header_path" != "x"; then
-                ac_sqlite3_version=`cat $ac_sqlite3_header_path \
-                    | grep '#define.*SQLITE_VERSION.*\"' | sed -e 's/.* "//' \
-                        | sed -e 's/"//'`
-                if test $ac_sqlite3_version != ""; then
-                    SQLITE3_VERSION=$ac_sqlite3_version
-                else
-                    AC_MSG_WARN([Cannot find SQLITE_VERSION macro in sqlite3.h header to retrieve SQLite version!])
-                fi
-            fi
-
-            AC_SUBST(SQLITE3_CFLAGS)
-            AC_SUBST(SQLITE3_LDFLAGS)
-            AC_SUBST(SQLITE3_VERSION)
-            AC_DEFINE([HAVE_SQLITE3], [], [Have the SQLITE3 library])
-        fi
-    fi
-])
diff --git a/m4/ax_prefix_config_h.m4 b/m4/ax_prefix_config_h.m4
deleted file mode 100644
index 43a3906..0000000
--- a/m4/ax_prefix_config_h.m4
+++ /dev/null
@@ -1,209 +0,0 @@
-# ===========================================================================
-#    http://www.gnu.org/software/autoconf-archive/ax_prefix_config_h.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])]
-#
-# DESCRIPTION
-#
-#   This is a new variant from ac_prefix_config_ this one will use a
-#   lowercase-prefix if the config-define was starting with a
-#   lowercase-char, e.g. "#define const", "#define restrict", or "#define
-#   off_t", (and this one can live in another directory, e.g.
-#   testpkg/config.h therefore I decided to move the output-header to be the
-#   first arg)
-#
-#   takes the usual config.h generated header file; looks for each of the
-#   generated "#define SOMEDEF" lines, and prefixes the defined name (ie.
-#   makes it "#define PREFIX_SOMEDEF". The result is written to the output
-#   config.header file. The PREFIX is converted to uppercase for the
-#   conversions.
-#
-#   Defaults:
-#
-#     OUTPUT-HEADER = $PACKAGE-config.h
-#     PREFIX = $PACKAGE
-#     ORIG-HEADER, from AM_CONFIG_HEADER(config.h)
-#
-#   Your configure.ac script should contain both macros in this order, and
-#   unlike the earlier variations of this prefix-macro it is okay to place
-#   the AX_PREFIX_CONFIG_H call before the AC_OUTPUT invokation.
-#
-#   Example:
-#
-#     AC_INIT(config.h.in)        # config.h.in as created by "autoheader"
-#     AM_INIT_AUTOMAKE(testpkg, 0.1.1)    # makes #undef VERSION and PACKAGE
-#     AM_CONFIG_HEADER(config.h)          # prep config.h from config.h.in
-#     AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it..
-#     AC_MEMORY_H                         # makes "#undef NEED_MEMORY_H"
-#     AC_C_CONST_H                        # makes "#undef const"
-#     AC_OUTPUT(Makefile)                 # creates the "config.h" now
-#                                         # and also mylib/_config.h
-#
-#   if the argument to AX_PREFIX_CONFIG_H would have been omitted then the
-#   default outputfile would have been called simply "testpkg-config.h", but
-#   even under the name "mylib/_config.h" it contains prefix-defines like
-#
-#     #ifndef TESTPKG_VERSION
-#     #define TESTPKG_VERSION "0.1.1"
-#     #endif
-#     #ifndef TESTPKG_NEED_MEMORY_H
-#     #define TESTPKG_NEED_MEMORY_H 1
-#     #endif
-#     #ifndef _testpkg_const
-#     #define _testpkg_const _const
-#     #endif
-#
-#   and this "mylib/_config.h" can be installed along with other
-#   header-files, which is most convenient when creating a shared library
-#   (that has some headers) where some functionality is dependent on the
-#   OS-features detected at compile-time. No need to invent some
-#   "mylib-confdefs.h.in" manually. :-)
-#
-#   Note that some AC_DEFINEs that end up in the config.h file are actually
-#   self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the AC_TYPE_OFF_T
-#   say that they "will define inline|const|off_t if the system does not do
-#   it by itself". You might want to clean up about these - consider an
-#   extra mylib/conf.h that reads something like:
-#
-#     #include <mylib/_config.h>
-#     #ifndef _testpkg_const
-#     #define _testpkg_const const
-#     #endif
-#
-#   and then start using _testpkg_const in the header files. That is also a
-#   good thing to differentiate whether some library-user has starting to
-#   take up with a different compiler, so perhaps it could read something
-#   like this:
-#
-#     #ifdef _MSC_VER
-#     #include <mylib/_msvc.h>
-#     #else
-#     #include <mylib/_config.h>
-#     #endif
-#     #ifndef _testpkg_const
-#     #define _testpkg_const const
-#     #endif
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#   Copyright (c) 2008 Marten Svantesson
-#   Copyright (c) 2008 Gerald Point <Gerald.Point@labri.fr>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-#serial 11
-
-AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl
-AC_PREREQ([2.62])
-AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl
-AC_CONFIG_COMMANDS([ifelse($1,,$PACKAGE-config.h,$1)],[dnl
-AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl
-AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl
-AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl
-AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl
-AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl
-AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl
-m4_pushdef([_script],[conftest.prefix])dnl
-m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl
-_OUT=`echo ifelse($1, , $PACKAGE-config.h, $1)`
-_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"`
-_PKG=`echo ifelse($2, , $PACKAGE, $2)`
-_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"`
-_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:"  -e "/^@<:@m4_cr_digits@:>@/s/^/_/"`
-_INP=`echo "ifelse($3,,,$3)" | sed -e 's/ *//'`
-if test ".$_INP" = "."; then
-   for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
-     case "$ac_file" in
-        *.h) _INP=$ac_file ;;
-        *)
-     esac
-     test ".$_INP" != "." && break
-   done
-fi
-if test ".$_INP" = "."; then
-   case "$_OUT" in
-      */*) _INP=`basename "$_OUT"`
-      ;;
-      *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"`
-      ;;
-      *) _INP=config.h
-      ;;
-   esac
-fi
-if test -z "$_PKG" ; then
-   AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H])
-else
-  if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then
-     _INP="$srcdir/$_INP"
-  fi fi
-  AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines)
-  if test -f $_INP ; then
-    AS_ECHO(["s/^@%:@undef  *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/"]) > _script
-    AS_ECHO(["s/^@%:@undef  *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/"]) >> _script
-    AS_ECHO(["s/^@%:@def[]ine  *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1\\"]) >> _script
-    AS_ECHO(["@%:@def[]ine $_UPP""_\\1\\2\\"]) >> _script
-    AS_ECHO(["@%:@endif/"]) >> _script
-    AS_ECHO(["s/^@%:@def[]ine  *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1\\"]) >> _script
-    AS_ECHO(["@%:@define $_LOW""_\\1\\2\\"]) >> _script
-    AS_ECHO(["@%:@endif/"]) >> _script
-    # now executing _script on _DEF input to create _OUT output file
-    echo "@%:@ifndef $_DEF"      >$tmp/pconfig.h
-    echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h
-    echo ' ' >>$tmp/pconfig.h
-    echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
-
-    sed -f _script $_INP >>$tmp/pconfig.h
-    echo ' ' >>$tmp/pconfig.h
-    echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h
-    echo "@%:@endif" >>$tmp/pconfig.h
-    if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then
-      AC_MSG_NOTICE([$_OUT is unchanged])
-    else
-      ac_dir=`AS_DIRNAME(["$_OUT"])`
-      AS_MKDIR_P(["$ac_dir"])
-      rm -f "$_OUT"
-      mv $tmp/pconfig.h "$_OUT"
-    fi
-    cp _script _configs.sed
-  else
-    AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT])
-  fi
-  rm -f conftest.*
-fi
-m4_popdef([_symbol])dnl
-m4_popdef([_script])dnl
-AS_VAR_POPDEF([_INP])dnl
-AS_VAR_POPDEF([_UPP])dnl
-AS_VAR_POPDEF([_LOW])dnl
-AS_VAR_POPDEF([_PKG])dnl
-AS_VAR_POPDEF([_DEF])dnl
-AS_VAR_POPDEF([_OUT])dnl
-],[PACKAGE="$PACKAGE"])])
diff --git a/m4/ax_prog_doxygen.m4 b/m4/ax_prog_doxygen.m4
deleted file mode 100644
index 44b22b0..0000000
--- a/m4/ax_prog_doxygen.m4
+++ /dev/null
@@ -1,532 +0,0 @@
-# ===========================================================================
-#      http://www.gnu.org/software/autoconf-archive/ax_prog_doxygen.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   DX_INIT_DOXYGEN(PROJECT-NAME, DOXYFILE-PATH, [OUTPUT-DIR])
-#   DX_DOXYGEN_FEATURE(ON|OFF)
-#   DX_DOT_FEATURE(ON|OFF)
-#   DX_HTML_FEATURE(ON|OFF)
-#   DX_CHM_FEATURE(ON|OFF)
-#   DX_CHI_FEATURE(ON|OFF)
-#   DX_MAN_FEATURE(ON|OFF)
-#   DX_RTF_FEATURE(ON|OFF)
-#   DX_XML_FEATURE(ON|OFF)
-#   DX_PDF_FEATURE(ON|OFF)
-#   DX_PS_FEATURE(ON|OFF)
-#
-# DESCRIPTION
-#
-#   The DX_*_FEATURE macros control the default setting for the given
-#   Doxygen feature. Supported features are 'DOXYGEN' itself, 'DOT' for
-#   generating graphics, 'HTML' for plain HTML, 'CHM' for compressed HTML
-#   help (for MS users), 'CHI' for generating a seperate .chi file by the
-#   .chm file, and 'MAN', 'RTF', 'XML', 'PDF' and 'PS' for the appropriate
-#   output formats. The environment variable DOXYGEN_PAPER_SIZE may be
-#   specified to override the default 'a4wide' paper size.
-#
-#   By default, HTML, PDF and PS documentation is generated as this seems to
-#   be the most popular and portable combination. MAN pages created by
-#   Doxygen are usually problematic, though by picking an appropriate subset
-#   and doing some massaging they might be better than nothing. CHM and RTF
-#   are specific for MS (note that you can't generate both HTML and CHM at
-#   the same time). The XML is rather useless unless you apply specialized
-#   post-processing to it.
-#
-#   The macros mainly control the default state of the feature. The use can
-#   override the default by specifying --enable or --disable. The macros
-#   ensure that contradictory flags are not given (e.g.,
-#   --enable-doxygen-html and --enable-doxygen-chm,
-#   --enable-doxygen-anything with --disable-doxygen, etc.) Finally, each
-#   feature will be automatically disabled (with a warning) if the required
-#   programs are missing.
-#
-#   Once all the feature defaults have been specified, call DX_INIT_DOXYGEN
-#   with the following parameters: a one-word name for the project for use
-#   as a filename base etc., an optional configuration file name (the
-#   default is 'Doxyfile', the same as Doxygen's default), and an optional
-#   output directory name (the default is 'doxygen-doc').
-#
-#   Automake Support
-#
-#   The following is a template aminclude.am file for use with Automake.
-#   Make targets and variables values are controlled by the various
-#   DX_COND_* conditionals set by autoconf.
-#
-#   The provided targets are:
-#
-#     doxygen-doc: Generate all doxygen documentation.
-#
-#     doxygen-run: Run doxygen, which will generate some of the
-#                  documentation (HTML, CHM, CHI, MAN, RTF, XML)
-#                  but will not do the post processing required
-#                  for the rest of it (PS, PDF, and some MAN).
-#
-#     doxygen-man: Rename some doxygen generated man pages.
-#
-#     doxygen-ps:  Generate doxygen PostScript documentation.
-#
-#     doxygen-pdf: Generate doxygen PDF documentation.
-#
-#   Note that by default these are not integrated into the automake targets.
-#   If doxygen is used to generate man pages, you can achieve this
-#   integration by setting man3_MANS to the list of man pages generated and
-#   then adding the dependency:
-#
-#     $(man3_MANS): doxygen-doc
-#
-#   This will cause make to run doxygen and generate all the documentation.
-#
-#   The following variable is intended for use in Makefile.am:
-#
-#     DX_CLEANFILES = everything to clean.
-#
-#   Then add this variable to MOSTLYCLEANFILES.
-#
-#     ----- begin aminclude.am -------------------------------------
-#
-#     ## --------------------------------- ##
-#     ## Format-independent Doxygen rules. ##
-#     ## --------------------------------- ##
-#
-#     if DX_COND_doc
-#
-#     ## ------------------------------- ##
-#     ## Rules specific for HTML output. ##
-#     ## ------------------------------- ##
-#
-#     if DX_COND_html
-#
-#     DX_CLEAN_HTML = @DX_DOCDIR@/html
-#
-#     endif DX_COND_html
-#
-#     ## ------------------------------ ##
-#     ## Rules specific for CHM output. ##
-#     ## ------------------------------ ##
-#
-#     if DX_COND_chm
-#
-#     DX_CLEAN_CHM = @DX_DOCDIR@/chm
-#
-#     if DX_COND_chi
-#
-#     DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi
-#
-#     endif DX_COND_chi
-#
-#     endif DX_COND_chm
-#
-#     ## ------------------------------ ##
-#     ## Rules specific for MAN output. ##
-#     ## ------------------------------ ##
-#
-#     if DX_COND_man
-#
-#     DX_CLEAN_MAN = @DX_DOCDIR@/man
-#
-#     endif DX_COND_man
-#
-#     ## ------------------------------ ##
-#     ## Rules specific for RTF output. ##
-#     ## ------------------------------ ##
-#
-#     if DX_COND_rtf
-#
-#     DX_CLEAN_RTF = @DX_DOCDIR@/rtf
-#
-#     endif DX_COND_rtf
-#
-#     ## ------------------------------ ##
-#     ## Rules specific for XML output. ##
-#     ## ------------------------------ ##
-#
-#     if DX_COND_xml
-#
-#     DX_CLEAN_XML = @DX_DOCDIR@/xml
-#
-#     endif DX_COND_xml
-#
-#     ## ----------------------------- ##
-#     ## Rules specific for PS output. ##
-#     ## ----------------------------- ##
-#
-#     if DX_COND_ps
-#
-#     DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps
-#
-#     DX_PS_GOAL = doxygen-ps
-#
-#     doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps
-#
-#     @DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag
-#         cd @DX_DOCDIR@/latex; \
-#         rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
-#         $(DX_LATEX) refman.tex; \
-#         $(MAKEINDEX_PATH) refman.idx; \
-#         $(DX_LATEX) refman.tex; \
-#         countdown=5; \
-#         while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
-#                           refman.log > /dev/null 2>&1 \
-#            && test $$countdown -gt 0; do \
-#             $(DX_LATEX) refman.tex; \
-#             countdown=`expr $$countdown - 1`; \
-#         done; \
-#         $(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi
-#
-#     endif DX_COND_ps
-#
-#     ## ------------------------------ ##
-#     ## Rules specific for PDF output. ##
-#     ## ------------------------------ ##
-#
-#     if DX_COND_pdf
-#
-#     DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf
-#
-#     DX_PDF_GOAL = doxygen-pdf
-#
-#     doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf
-#
-#     @DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag
-#         cd @DX_DOCDIR@/latex; \
-#         rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
-#         $(DX_PDFLATEX) refman.tex; \
-#         $(DX_MAKEINDEX) refman.idx; \
-#         $(DX_PDFLATEX) refman.tex; \
-#         countdown=5; \
-#         while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
-#                           refman.log > /dev/null 2>&1 \
-#            && test $$countdown -gt 0; do \
-#             $(DX_PDFLATEX) refman.tex; \
-#             countdown=`expr $$countdown - 1`; \
-#         done; \
-#         mv refman.pdf ../@PACKAGE@.pdf
-#
-#     endif DX_COND_pdf
-#
-#     ## ------------------------------------------------- ##
-#     ## Rules specific for LaTeX (shared for PS and PDF). ##
-#     ## ------------------------------------------------- ##
-#
-#     if DX_COND_latex
-#
-#     DX_CLEAN_LATEX = @DX_DOCDIR@/latex
-#
-#     endif DX_COND_latex
-#
-#     .PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL)
-#
-#     .INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
-#
-#     doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag
-#
-#     doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
-#
-#     @DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS)
-#         rm -rf @DX_DOCDIR@
-#         $(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG)
-#
-#     DX_CLEANFILES = \
-#         @DX_DOCDIR@/@PACKAGE@.tag \
-#         -r \
-#         $(DX_CLEAN_HTML) \
-#         $(DX_CLEAN_CHM) \
-#         $(DX_CLEAN_CHI) \
-#         $(DX_CLEAN_MAN) \
-#         $(DX_CLEAN_RTF) \
-#         $(DX_CLEAN_XML) \
-#         $(DX_CLEAN_PS) \
-#         $(DX_CLEAN_PDF) \
-#         $(DX_CLEAN_LATEX)
-#
-#     endif DX_COND_doc
-#
-#     ----- end aminclude.am ---------------------------------------
-#
-# LICENSE
-#
-#   Copyright (c) 2009 Oren Ben-Kiki <oren@ben-kiki.org>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 12
-
-## ----------##
-## Defaults. ##
-## ----------##
-
-DX_ENV=""
-AC_DEFUN([DX_FEATURE_doc],  ON)
-AC_DEFUN([DX_FEATURE_dot],  OFF)
-AC_DEFUN([DX_FEATURE_man],  OFF)
-AC_DEFUN([DX_FEATURE_html], ON)
-AC_DEFUN([DX_FEATURE_chm],  OFF)
-AC_DEFUN([DX_FEATURE_chi],  OFF)
-AC_DEFUN([DX_FEATURE_rtf],  OFF)
-AC_DEFUN([DX_FEATURE_xml],  OFF)
-AC_DEFUN([DX_FEATURE_pdf],  ON)
-AC_DEFUN([DX_FEATURE_ps],   ON)
-
-## --------------- ##
-## Private macros. ##
-## --------------- ##
-
-# DX_ENV_APPEND(VARIABLE, VALUE)
-# ------------------------------
-# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen.
-AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])])
-
-# DX_DIRNAME_EXPR
-# ---------------
-# Expand into a shell expression prints the directory part of a path.
-AC_DEFUN([DX_DIRNAME_EXPR],
-         [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']])
-
-# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF)
-# -------------------------------------
-# Expands according to the M4 (static) status of the feature.
-AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])])
-
-# DX_REQUIRE_PROG(VARIABLE, PROGRAM)
-# ----------------------------------
-# Require the specified program to be found for the DX_CURRENT_FEATURE to work.
-AC_DEFUN([DX_REQUIRE_PROG], [
-AC_PATH_TOOL([$1], [$2])
-if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then
-    AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION])
-    AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
-fi
-])
-
-# DX_TEST_FEATURE(FEATURE)
-# ------------------------
-# Expand to a shell expression testing whether the feature is active.
-AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1])
-
-# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE)
-# -------------------------------------------------
-# Verify that a required features has the right state before trying to turn on
-# the DX_CURRENT_FEATURE.
-AC_DEFUN([DX_CHECK_DEPEND], [
-test "$DX_FLAG_$1" = "$2" \
-|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1,
-                            requires, contradicts) doxygen-DX_CURRENT_FEATURE])
-])
-
-# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE)
-# ----------------------------------------------------------
-# Turn off the DX_CURRENT_FEATURE if the required feature is off.
-AC_DEFUN([DX_CLEAR_DEPEND], [
-test "$DX_FLAG_$1" = "$2" || AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
-])
-
-# DX_FEATURE_ARG(FEATURE, DESCRIPTION,
-#                CHECK_DEPEND, CLEAR_DEPEND,
-#                REQUIRE, DO-IF-ON, DO-IF-OFF)
-# --------------------------------------------
-# Parse the command-line option controlling a feature. CHECK_DEPEND is called
-# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND),
-# otherwise CLEAR_DEPEND is called to turn off the default state if a required
-# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional
-# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and
-# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature.
-AC_DEFUN([DX_ARG_ABLE], [
-    AC_DEFUN([DX_CURRENT_FEATURE], [$1])
-    AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2])
-    AC_ARG_ENABLE(doxygen-$1,
-                  [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1],
-                                                      [--enable-doxygen-$1]),
-                                  DX_IF_FEATURE([$1], [don't $2], [$2]))],
-                  [
-case "$enableval" in
-#(
-y|Y|yes|Yes|YES)
-    AC_SUBST([DX_FLAG_$1], 1)
-    $3
-;; #(
-n|N|no|No|NO)
-    AC_SUBST([DX_FLAG_$1], 0)
-;; #(
-*)
-    AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1])
-;;
-esac
-], [
-AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)])
-$4
-])
-if DX_TEST_FEATURE([$1]); then
-    $5
-    :
-fi
-AM_CONDITIONAL(DX_COND_$1, DX_TEST_FEATURE([$1]))
-if DX_TEST_FEATURE([$1]); then
-    $6
-    :
-else
-    $7
-    :
-fi
-])
-
-## -------------- ##
-## Public macros. ##
-## -------------- ##
-
-# DX_XXX_FEATURE(DEFAULT_STATE)
-# -----------------------------
-AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc],  [$1])])
-AC_DEFUN([DX_DOT_FEATURE],     [AC_DEFUN([DX_FEATURE_dot], [$1])])
-AC_DEFUN([DX_MAN_FEATURE],     [AC_DEFUN([DX_FEATURE_man],  [$1])])
-AC_DEFUN([DX_HTML_FEATURE],    [AC_DEFUN([DX_FEATURE_html], [$1])])
-AC_DEFUN([DX_CHM_FEATURE],     [AC_DEFUN([DX_FEATURE_chm],  [$1])])
-AC_DEFUN([DX_CHI_FEATURE],     [AC_DEFUN([DX_FEATURE_chi],  [$1])])
-AC_DEFUN([DX_RTF_FEATURE],     [AC_DEFUN([DX_FEATURE_rtf],  [$1])])
-AC_DEFUN([DX_XML_FEATURE],     [AC_DEFUN([DX_FEATURE_xml],  [$1])])
-AC_DEFUN([DX_XML_FEATURE],     [AC_DEFUN([DX_FEATURE_xml],  [$1])])
-AC_DEFUN([DX_PDF_FEATURE],     [AC_DEFUN([DX_FEATURE_pdf],  [$1])])
-AC_DEFUN([DX_PS_FEATURE],      [AC_DEFUN([DX_FEATURE_ps],   [$1])])
-
-# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR])
-# ---------------------------------------------------------
-# PROJECT also serves as the base name for the documentation files.
-# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc".
-AC_DEFUN([DX_INIT_DOXYGEN], [
-
-# Files:
-AC_SUBST([DX_PROJECT], [$1])
-AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])])
-AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])])
-
-# Environment variables used inside doxygen.cfg:
-DX_ENV_APPEND(SRCDIR, $srcdir)
-DX_ENV_APPEND(PROJECT, $DX_PROJECT)
-DX_ENV_APPEND(DOCDIR, $DX_DOCDIR)
-DX_ENV_APPEND(VERSION, $PACKAGE_VERSION)
-
-# Doxygen itself:
-DX_ARG_ABLE(doc, [generate any doxygen documentation],
-            [],
-            [],
-            [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen)
-             DX_REQUIRE_PROG([DX_PERL], perl)],
-            [DX_ENV_APPEND(PERL_PATH, $DX_PERL)])
-
-# Dot for graphics:
-DX_ARG_ABLE(dot, [generate graphics for doxygen documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_DOT], dot)],
-            [DX_ENV_APPEND(HAVE_DOT, YES)
-             DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])],
-            [DX_ENV_APPEND(HAVE_DOT, NO)])
-
-# Man pages generation:
-DX_ARG_ABLE(man, [generate doxygen manual pages],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_MAN, YES)],
-            [DX_ENV_APPEND(GENERATE_MAN, NO)])
-
-# RTF file generation:
-DX_ARG_ABLE(rtf, [generate doxygen RTF documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_RTF, YES)],
-            [DX_ENV_APPEND(GENERATE_RTF, NO)])
-
-# XML file generation:
-DX_ARG_ABLE(xml, [generate doxygen XML documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_XML, YES)],
-            [DX_ENV_APPEND(GENERATE_XML, NO)])
-
-# (Compressed) HTML help generation:
-DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_HHC], hhc)],
-            [DX_ENV_APPEND(HHC_PATH, $DX_HHC)
-             DX_ENV_APPEND(GENERATE_HTML, YES)
-             DX_ENV_APPEND(GENERATE_HTMLHELP, YES)],
-            [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)])
-
-# Seperate CHI file generation.
-DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file],
-            [DX_CHECK_DEPEND(chm, 1)],
-            [DX_CLEAR_DEPEND(chm, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_CHI, YES)],
-            [DX_ENV_APPEND(GENERATE_CHI, NO)])
-
-# Plain HTML pages generation:
-DX_ARG_ABLE(html, [generate doxygen plain HTML documentation],
-            [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)],
-            [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)],
-            [],
-            [DX_ENV_APPEND(GENERATE_HTML, YES)],
-            [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)])
-
-# PostScript file generation:
-DX_ARG_ABLE(ps, [generate doxygen PostScript documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_LATEX], latex)
-             DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
-             DX_REQUIRE_PROG([DX_DVIPS], dvips)
-             DX_REQUIRE_PROG([DX_EGREP], egrep)])
-
-# PDF file generation:
-DX_ARG_ABLE(pdf, [generate doxygen PDF documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex)
-             DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
-             DX_REQUIRE_PROG([DX_EGREP], egrep)])
-
-# LaTeX generation for PS and/or PDF:
-AM_CONDITIONAL(DX_COND_latex, DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf))
-if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then
-    DX_ENV_APPEND(GENERATE_LATEX, YES)
-else
-    DX_ENV_APPEND(GENERATE_LATEX, NO)
-fi
-
-# Paper size for PS and/or PDF:
-AC_ARG_VAR(DOXYGEN_PAPER_SIZE,
-           [a4wide (default), a4, letter, legal or executive])
-case "$DOXYGEN_PAPER_SIZE" in
-#(
-"")
-    AC_SUBST(DOXYGEN_PAPER_SIZE, "")
-;; #(
-a4wide|a4|letter|legal|executive)
-    DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE)
-;; #(
-*)
-    AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'])
-;;
-esac
-
-#For debugging:
-#echo DX_FLAG_doc=$DX_FLAG_doc
-#echo DX_FLAG_dot=$DX_FLAG_dot
-#echo DX_FLAG_man=$DX_FLAG_man
-#echo DX_FLAG_html=$DX_FLAG_html
-#echo DX_FLAG_chm=$DX_FLAG_chm
-#echo DX_FLAG_chi=$DX_FLAG_chi
-#echo DX_FLAG_rtf=$DX_FLAG_rtf
-#echo DX_FLAG_xml=$DX_FLAG_xml
-#echo DX_FLAG_pdf=$DX_FLAG_pdf
-#echo DX_FLAG_ps=$DX_FLAG_ps
-#echo DX_ENV=$DX_ENV
-])
diff --git a/tests/Makefile.am b/tests/Makefile.am
deleted file mode 100644
index 2e80613..0000000
--- a/tests/Makefile.am
+++ /dev/null
@@ -1,15 +0,0 @@
-
-noinst_PROGRAMS=unit-tests
-
-# for i in `find . -name '*.cpp'`; do echo "  $i \\"; done
-unit_tests_SOURCES = \
-  main.cpp \
-  test-encode-decode-certificate.cpp \
-  test-encode-decode-data.cpp \
-  test-encode-decode-interest.cpp \
-  test-encode-decode-forwarding-entry.cpp \
-  test-encode-decode-block.cpp \
-  test-sec-tpm-file.cpp \
-  test-faces.cpp
-
-unit_tests_LDADD = ../libndn-cpp-dev.la @BOOST_SYSTEM_LIB@ @BOOST_UNIT_TEST_FRAMEWORK_LIB@ @OPENSSL_LIBS@ @CRYPTOPP_LIBS@ @OSX_SECURITY_LIBS@
diff --git a/tools/Makefile.am b/tools/Makefile.am
deleted file mode 100644
index f344e7d..0000000
--- a/tools/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-LDADD = ../libndn-cpp-dev.la @BOOST_SYSTEM_LIB@
-
-bin_PROGRAMS = tlvdump ndncatchunks3 ndnputchunks3
-
-tlvdump_SOURCES      = tlvdump.cpp
-
-ndncatchunks3_SOURCES = ndncatchunks3.cpp
-
-ndnputchunks3_SOURCES = ndnputchunks3.cpp
-
diff --git a/wscript b/wscript
index 1cf54d7..979324d 100644
--- a/wscript
+++ b/wscript
@@ -142,12 +142,34 @@
                 name = "ndn-cpp-dev-stlib",
                 )
         
+    pkgconfig_libs = []
+    pkgconfig_ldflags = []
+    pkgconfig_includes = []
+    for lib in Utils.to_list(libndn_cpp.use):
+        if bld.env['LIB_%s' % lib]:
+            pkgconfig_libs += Utils.to_list(bld.env['LIB_%s' % lib])
+        if bld.env['LIBPATH_%s' % lib]:
+            pkgconfig_ldflags += Utils.to_list(bld.env['LIBPATH_%s' % lib])
+        if bld.env['INCLUDES_%s' % lib]:
+            pkgconfig_includes += Utils.to_list(bld.env['INCLUDES_%s' % lib])
+
+    def uniq(alist):
+        set = {}
+        return [set.setdefault(e,e) for e in alist if e not in set]
+                        
     bld (features = "subst",
          source = "libndn-cpp-dev.pc.in",
          target = "libndn-cpp-dev.pc",
          install_path = "${LIBDIR}/pkgconfig",
+         VERSION = VERSION,
+
+         # This probably not the right thing to do, but to simplify life of apps
+         # that use the library
+         EXTRA_LIBS = " ".join([('-l%s' % i) for i in uniq(pkgconfig_libs)]),
+         EXTRA_LDFLAGS = " ".join([('-L%s' % i) for i in uniq(pkgconfig_ldflags)]),
+         EXTRA_INCLUDES = " ".join([('-I%s' % i) for i in uniq(pkgconfig_includes)]),
         )
-        
+            
     # Unit tests
     if bld.env['WITH_TESTS']:
         bld.recurse('tests')
