diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..2cadb03
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,25 @@
+## Helloworld C++: an example project using Automake
+
+## 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}
+
+## Define an executable target "hello", which will be installed into the
+## directory named by the predefined variable $(bindir).
+bin_PROGRAMS = test1
+
+## Define the list of source files for the "hello" target. The file extension
+## .cpp is recognized by Automake, and causes it to produce rules which invoke
+## the C++ compiler to produce an object file (.o) from each source file. The
+## header files (.h) do not result in object files by themselves, but will be
+## included in distribution archives of the project.
+test1_SOURCES = test/test1.cpp
+
+## Define an independent executable script for inclusion in the distribution
+## archive. It will not be installed on an end user's system, however.
+dist_noinst_SCRIPTS = autogen.sh
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..8d8af2b
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,6 @@
+#!/bin/sh -e
+
+test -n "$srcdir" || srcdir=`dirname "$0"`
+test -n "$srcdir" || srcdir=.
+autoreconf --force --install --verbose "$srcdir"
+test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..af7095e
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,33 @@
+AC_INIT([ndn-cpp], [0.5], [],
+        [ndn-cpp], [https://github.com/named-data/ndn-cpp])
+AC_PREREQ([2.59])
+AM_INIT_AUTOMAKE([1.10 -Wall no-define foreign])
+
+AC_CONFIG_HEADERS([config.h])
+AC_PROG_CXX
+AC_LANG([C++])
+
+AC_MSG_CHECKING([for std::shared_ptr])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+    [[#include <memory>]]
+    [[std::shared_ptr<int> have_shared_ptr;]])
+], [
+    AC_MSG_RESULT([yes])
+    AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 1, [1 if have the `std::shared_ptr' class.])
+], [
+    AC_MSG_RESULT([no])
+    AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 0, [1 if have the `std::shared_ptr' class.])
+])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+    [[#include <boost/shared_ptr.hpp>]]
+    [[boost::shared_ptr<int> have_shared_ptr;]])
+], [
+    AC_MSG_RESULT([yes])
+    AC_DEFINE_UNQUOTED([HAVE_BOOST_SHARED_PTR], 1, [1 if have the `boost::shared_ptr' class.])
+], [
+    AC_MSG_RESULT([no])
+    AC_DEFINE_UNQUOTED([HAVE_BOOST_SHARED_PTR], 0, [1 if have the `boost::shared_ptr' class.])
+])
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff --git a/libndn.cxx.pc.in b/libndn.cxx.pc.in
deleted file mode 100644
index e880ea7..0000000
--- a/libndn.cxx.pc.in
+++ /dev/null
@@ -1,9 +0,0 @@
-prefix=@PREFIX@
-libdir=@LIBDIR@
-includedir=@INCLUDEDIR@
-
-Name: libccnx-cpp
-Description: C++ NDN API (currently a wrapper on top of CCNx C library)
-Version: @VERSION@
-Libs: -L${libdir} -lndn.cxx
-Cflags: -I${includedir}
diff --git a/waf b/waf
deleted file mode 100755
index 240e86f..0000000
--- a/waf
+++ /dev/null
Binary files differ
diff --git a/waf-tools/sphinx_build.py b/waf-tools/sphinx_build.py
deleted file mode 100644
index e1155d1..0000000
--- a/waf-tools/sphinx_build.py
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/env python
-# encoding: utf-8
-# Hans-Martin von Gaudecker, 2012
-
-"""
-Create Sphinx documentation. Currently only LaTeX and HTML are supported.
-
-The source file **must** be the conf.py file used by Sphinx. Everything
-else has defaults, passing in the parameters is optional.
-
-Usage for getting both html and pdf docs:
-
-    ctx(features='sphinx', source='docs/conf.py')
-    ctx(features='sphinx', source='docs/conf.py', buildername='latex')
-
-Optional parameters and their defaults:
-
-    * buildername: html
-    * srcdir: confdir (the directory where conf.py lives)
-    * outdir: confdir/buildername (in the build directory tree)
-    * doctreedir: outdir/.doctrees
-    * type: pdflatex (only applies to 'latex' builder)
-
-"""
-
-
-import os
-from waflib import Task, TaskGen, Errors, Logs
-
-class RunSphinxBuild(Task.Task):
-	def scan(self):
-		"""Use Sphinx' internal environment to find the dependencies."""
-		s = self.sphinx_instance
-		msg, dummy, iterator = s.env.update(s.config, s.srcdir, s.doctreedir, s)
-		s.info(msg)
-		dep_nodes = []
-		for docname in s.builder.status_iterator(iterator, "reading sources... "):
-			filename = docname + s.config.source_suffix
-			dep_nodes.append(self.srcdir.find_node(filename))
-		for dep in s.env.dependencies.values():
-			# Need the 'str' call because Sphinx might return Unicode strings.
-			[dep_nodes.append(self.srcdir.find_node(str(d))) for d in dep]
-		return (dep_nodes, [])
-
-	def run(self):
-		"""Run the Sphinx build."""
-		self.sphinx_instance.build(force_all=False, filenames=None)
-		return None
-
-	def post_run(self):
-		"""Add everything found in the output directory tree as an output.
-		Not elegant, but pragmatic."""
-		for n in self.outdir.ant_glob("**", quiet=True, remove=False):
-			if n not in self.outputs: self.set_outputs(n)
-		super(RunSphinxBuild, self).post_run()
-
-
-def _get_main_targets(tg, s):
-	"""Return some easy targets known from the Sphinx build environment **s.env**."""
-	out_dir = tg.bld.root.find_node(s.outdir)
-	tgt_nodes = []
-	if s.builder.name == "latex":
-		for tgt_info in s.env.config.latex_documents:
-			tgt_nodes.append(out_dir.find_or_declare(tgt_info[1]))
-	elif s.builder.name == "html":
-		suffix = getattr(s.env.config, "html_file_suffix", ".html")
-		tgt_name = s.env.config.master_doc + suffix
-		tgt_nodes.append(out_dir.find_or_declare(tgt_name))
-	else:
-		raise Errors.WafError("Sphinx builder not implemented: %s" % s.builder.name)
-	return tgt_nodes
-
-
-@TaskGen.feature("sphinx")
-@TaskGen.before_method("process_source")
-def apply_sphinx(tg):
-	"""Set up the task generator with a Sphinx instance and create a task."""
-
-        from sphinx.application import Sphinx
-
-	# Put together the configuration based on defaults and tg attributes.
-	conf = tg.path.find_node(tg.source)
-	confdir = conf.parent.abspath()
-	buildername = getattr(tg, "buildername", "html")
-	srcdir = getattr(tg, "srcdir", confdir)
-	outdir = tg.path.find_or_declare (getattr(tg, "outdir", os.path.join(conf.parent.get_bld().abspath(), buildername))).abspath ()
-        
-	doctreedir = getattr(tg, "doctreedir", os.path.join(outdir, ".doctrees"))
-
-	# Set up the Sphinx instance.
-	s = Sphinx (srcdir, confdir, outdir, doctreedir, buildername, status=None)
-
-	# Get the main targets of the Sphinx build.
-	tgt_nodes = _get_main_targets(tg, s)
-
-	# Create the task and set the required attributes.  
-	task = tg.create_task("RunSphinxBuild", src=conf, tgt=tgt_nodes)
-	task.srcdir = tg.bld.root.find_node(s.srcdir)
-	task.outdir = tg.bld.root.find_node(s.outdir)
-	task.sphinx_instance = s
-
-	# Build pdf if we have the LaTeX builder, allow for building with xelatex.
-	if s.builder.name == "latex":
-		compile_type = getattr(tg, "type", "pdflatex")
-		tg.bld(features="tex", type=compile_type, source=tgt_nodes, name="sphinx_pdf", prompt=0)
-
-	# Bypass the execution of process_source by setting the source to an empty list
-	tg.source = []
diff --git a/waf-tools/tinyxml.py b/waf-tools/tinyxml.py
deleted file mode 100644
index 3908b38..0000000
--- a/waf-tools/tinyxml.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#! /usr/bin/env python
-# encoding: utf-8
-
-'''
-
-When using this tool, the wscript will look like:
-
-	def options(opt):
-	        opt.tool_options('tinyxml', tooldir=["waf-tools"])
-
-	def configure(conf):
-		conf.load('compiler_cxx tiny')
-
-	def build(bld):
-		bld(source='main.cpp', target='app', use='TINYXML')
-
-Options are generated, in order to specify the location of tinyxml includes/libraries.
-
-
-'''
-import sys
-import re
-from waflib import Utils,Logs,Errors
-from waflib.Configure import conf
-TINYXML_DIR=['/usr','/usr/local','/opt/local','/sw']
-TINYXML_VERSION_FILE='tinyxml.h'
-TINYXML_VERSION_CODE='''
-#include <iostream>
-#include <tinyxml.h>
-int main() { std::cout << TIXML_MAJOR_VERSION << "." << TIXML_MINOR_VERSION << "." << TIXML_PATCH_VERSION; }
-'''
-
-def options(opt):
-	opt.add_option('--tinyxml',type='string',default='',dest='tinyxml_dir',help='''path to where TinyXML is installed, e.g. /usr/local''')
-@conf
-def __tinyxml_get_version_file(self,dir):
-	try:
-		return self.root.find_dir(dir).find_node('%s/%s' % ('include', TINYXML_VERSION_FILE))
-	except:
-		return None
-@conf
-def tinyxml_get_version(self,dir):
-	val=self.check_cxx(fragment=TINYXML_VERSION_CODE,includes=['%s/%s' % (dir, 'include')], execute=True, define_ret = True, mandatory=True)
-	return val
-@conf
-def tinyxml_get_root(self,*k,**kw):
-	root=k and k[0]or kw.get('path',None)
-	# Logs.pprint ('RED', '   %s' %root)
-	if root and self.__tinyxml_get_version_file(root):
-		return root
-	for dir in TINYXML_DIR:
-		if self.__tinyxml_get_version_file(dir):
-			return dir
-	if root:
-		self.fatal('TinyXML not found in %s'%root)
-	else:
-		self.fatal('TinyXML not found, please provide a --tinyxml argument (see help)')
-@conf
-def check_tinyxml(self,*k,**kw):
-	if not self.env['CXX']:
-		self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
-
-	var=kw.get('uselib_store','TINYXML')
-	self.start_msg('Checking TinyXML')
-	root = self.tinyxml_get_root(*k,**kw);
-	self.env.TINYXML_VERSION=self.tinyxml_get_version(root)
-
-	self.env['INCLUDES_%s'%var]= '%s/%s' % (root, "include");
-	self.env['LIB_%s'%var] = "tinyxml"
-	self.env['LIBPATH_%s'%var] = '%s/%s' % (root, "lib")
-
-	self.end_msg(self.env.TINYXML_VERSION)
-	if Logs.verbose:
-		Logs.pprint('CYAN','	TinyXML include : %s'%self.env['INCLUDES_%s'%var])
-		Logs.pprint('CYAN','	TinyXML lib     : %s'%self.env['LIB_%s'%var])
-		Logs.pprint('CYAN','	TinyXML libpath : %s'%self.env['LIBPATH_%s'%var])
diff --git a/wscript b/wscript
deleted file mode 100644
index ef26082..0000000
--- a/wscript
+++ /dev/null
@@ -1,169 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-VERSION='0.6.0'
-
-from waflib import Build, Logs, Utils, Task, TaskGen, Configure
-
-def options(opt):
-    opt.add_option('--debug',action='store_true',default=False,dest='debug',help='''debugging mode''')
-    opt.add_option('--test', action='store_true',default=False,dest='_test',help='''build unit tests''')
-    opt.add_option('--log4cxx', action='store_true',default=False,dest='log4cxx',help='''Compile with log4cxx logging support''')
-
-    opt.load('compiler_c compiler_cxx boost ccnx doxygen gnu_dirs c_osx')
-    opt.load('tinyxml', tooldir=['waf-tools'])
-
-def configure(conf):
-    conf.load("compiler_c compiler_cxx boost ccnx gnu_dirs tinyxml doxygen c_osx")
-
-    if conf.options.debug:
-        conf.define ('_DEBUG', 1)
-        conf.add_supported_cxxflags (cxxflags = ['-O0',
-                                                 '-Wall',
-                                                 '-Wno-unused-variable',
-                                                 '-g3',
-                                                 '-Wno-unused-private-field', # only clang supports
-                                                 '-fcolor-diagnostics',       # only clang supports
-                                                 '-Qunused-arguments'         # only clang supports
-                                                 ])
-    else:
-        conf.add_supported_cxxflags (cxxflags = ['-O3', '-g'])
-
-    # if Utils.unversioned_sys_platform () == "darwin":
-    #     conf.check_cxx(framework_name='Foundation', uselib_store='OSX_FOUNDATION', mandatory=True, compile_filename='test.mm')
-    #     # conf.check_cxx(framework_name='AppKit',     uselib_store='OSX_APPKIT',     mandatory=True, compile_filename='test.mm')
-    #     conf.check_cxx(framework_name='Security',   uselib_store='OSX_SECURITY',   define_name='HAVE_SECURITY',
-    #                    use="OSX_FOUNDATION", mandatory=True, compile_filename='test.mm')
-
-    conf.define ("NDN_CXX_VERSION", VERSION)
-
-    conf.check_cfg(package='libevent', args=['--cflags', '--libs'], uselib_store='LIBEVENT', mandatory=True)
-    conf.check_cfg(package='libevent_pthreads', args=['--cflags', '--libs'], uselib_store='LIBEVENT_PTHREADS', mandatory=True)
-
-    if not conf.check_cfg(package='openssl', args=['--cflags', '--libs'], uselib_store='SSL', mandatory=False):
-        libcrypto = conf.check_cc(lib='crypto',
-                                  header_name='openssl/crypto.h',
-                                  define_name='HAVE_SSL',
-                                  uselib_store='SSL')
-    else:
-        conf.define ("HAVE_SSL", 1)
-    if not conf.get_define ("HAVE_SSL"):
-        conf.fatal ("Cannot find SSL libraries")
-
-    conf.check_cfg(package="libcrypto",  args=['--cflags', '--libs'], uselib_store='CRYPTO', mandatory=True)
-
-    if conf.options.log4cxx:
-        conf.check_cfg(package='liblog4cxx', args=['--cflags', '--libs'], uselib_store='LOG4CXX', mandatory=True)
-        conf.define ("HAVE_LOG4CXX", 1)
-
-    conf.check_tinyxml(path=conf.options.tinyxml_dir)
-    conf.check_doxygen(mandatory=False)
-
-    conf.check_boost(lib='system test iostreams filesystem thread date_time')
-
-    boost_version = conf.env.BOOST_VERSION.split('_')
-    if int(boost_version[0]) < 1 or int(boost_version[1]) < 46:
-        Logs.error ("Minumum required boost version is 1.46")
-        return
-
-    conf.check_ccnx (path=conf.options.ccnx_dir)
-
-    if conf.options._test:
-        conf.define ('_TESTS', 1)
-        conf.env.TEST = 1
-
-    conf.write_config_header('config.h')
-
-def build (bld):
-    executor = bld.objects (
-        target = "executor",
-        features = ["cxx"],
-        cxxflags = "-fPIC",
-        source = bld.path.ant_glob(['executor/**/*.cc']),
-        use = 'BOOST BOOST_THREAD LIBEVENT LIBEVENT_PTHREADS LOG4CXX',
-        includes = ".",
-        )
-
-    scheduler = bld.objects (
-        target = "scheduler",
-        features = ["cxx"],
-        cxxflags = "-fPIC",
-        source = bld.path.ant_glob(['scheduler/**/*.cc']),
-        use = 'BOOST BOOST_THREAD LIBEVENT LIBEVENT_PTHREADS LOG4CXX executor',
-        includes = ".",
-        )
-
-    libndn_cxx = bld (
-        target="ndn.cxx",
-        features=['cxx', 'cxxshlib'],
-        source = bld.path.ant_glob(['ndn.cxx/**/*.cpp', 'ndn.cxx/**/*.cc',
-                                    'logging.cc',
-                                    'libndn.cxx.pc.in']),
-        use = 'CRYPTO TINYXML BOOST BOOST_THREAD SSL CCNX LOG4CXX scheduler executor',
-        includes = ".",
-        )
-
-    # if Utils.unversioned_sys_platform () == "darwin":
-    #     libndn_cxx.mac_app = True
-    #     libndn_cxx.source += bld.path.ant_glob (['platforms/osx/**/*.mm'])
-    #     libndn_cxx.use += " OSX_FOUNDATION OSX_SECURITY"
-
-    # Unit tests
-    if bld.env['TEST']:
-      unittests = bld.program (
-          target="unit-tests",
-          features = "cxx cxxprogram",
-          defines = "WAF",
-          source = bld.path.ant_glob(['test/*.cc']),
-          use = 'BOOST_TEST BOOST_FILESYSTEM BOOST_DATE_TIME LOG4CXX ndn.cxx',
-          includes = ".",
-          install_prefix = None,
-          )
-
-    headers = bld.path.ant_glob(['ndn.cxx.h', 'ndn.cxx/**/*.h'])
-    bld.install_files("%s" % bld.env['INCLUDEDIR'], headers, relative_trick=True)
-
-@Configure.conf
-def add_supported_cxxflags(self, cxxflags):
-    """
-    Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
-    """
-    self.start_msg('Checking allowed flags for c++ compiler')
-
-    supportedFlags = []
-    for flag in cxxflags:
-        if self.check_cxx (cxxflags=[flag], mandatory=False):
-            supportedFlags += [flag]
-
-    self.end_msg (' '.join (supportedFlags))
-    self.env.CXXFLAGS += supportedFlags
-
-
-# doxygen docs
-from waflib.Build import BuildContext
-class doxy (BuildContext):
-    cmd = "doxygen"
-    fun = "doxygen"
-
-def doxygen (bld):
-    if not bld.env.DOXYGEN:
-        bld.fatal ("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
-    bld (features="doxygen",
-         doxyfile='doc/doxygen.conf')
-
-# doxygen docs
-from waflib.Build import BuildContext
-class sphinx (BuildContext):
-    cmd = "sphinx"
-    fun = "sphinx"
-
-def sphinx (bld):
-    bld.load('sphinx_build', tooldir=['waf-tools'])
-
-    bld (features="sphinx",
-         outdir = "doc/html",
-         source = "doc/source/conf.py")
-
-
-@TaskGen.extension('.mm')
-def mm_hook(self, node):
-    """Alias .mm files to be compiled the same as .cc files, gcc will do the right thing."""
-    return self.create_compiled_task('cxx', node)
