Initial port of the Name::Component, Name, Interest, Data, Signature, and Face classes
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e35d885
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+_build
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..ade5cef
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,153 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/NDNspecification.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/NDNspecification.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/NDNspecification"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/NDNspecification"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1a4a69f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,36 @@
+Prerequisites
+=============
+
+To "compile" documentation into html form you would need to install Sphinx documentation package, which should be relatively trivial.
+
+If you're on OSX platform:
+
+- If you have macports, then
+
+    sudo port install py27-sphinx
+    sudo port selectsphinx py27-sphinx
+
+- Install from source: http://sphinx-doc.org/install.html
+
+- Install from .pkg binary package: http://named-data.net/binaries/sphinx-doc-0.2.pkg
+
+If you're on Ubuntu Linux:
+
+    sudo apt-get install python-sphinx
+
+Compilation
+===========
+
+Just type
+
+    make html
+
+And a set of HTML pages will be build under ``_build/html``
+
+
+You can also type
+
+    make latexpdf
+
+This way Sphinx will prepare .tex file and will try to build .pdf document.
+
diff --git a/conf.py b/conf.py
new file mode 100644
index 0000000..7a84fc0
--- /dev/null
+++ b/conf.py
@@ -0,0 +1,242 @@
+# -*- coding: utf-8 -*-
+#
+# NDN specification documentation build configuration file, created by
+# sphinx-quickstart on Wed Nov 20 16:17:43 2013.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'NDN Common Client Libraries API'
+copyright = u'2013, NDN Project Team'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.1'
+# The full version, including alpha/beta/rc tags.
+release = '0.1a2'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'pyramid'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'ndn_ccl_api'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'ndn-ccl-api.tex', u'NDN Common Client Libraries API',
+   u'NDN Project Team', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+# latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'ndn-ccl-api', u'NDN Common Client Libraries API',
+     [u'NDN Project Team'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+  ('index', 'ndn-ccl-api', u'NDN Common Client Libraries API',
+   u'NDN Project Team', 'NDN_CCL_API', 'NDN Common Client Libraries API.',
+   'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
diff --git a/data.rst b/data.rst
new file mode 100644
index 0000000..6ce1cab
--- /dev/null
+++ b/data.rst
@@ -0,0 +1,162 @@
+.. _Data:
+
+Data Class
+==========
+
+:[C++]:
+    Namespace: ``ndn``
+
+:[Python]:
+    Module: ``pyndn``
+
+Data Constructor
+----------------
+
+Create a new Data with the optional values.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Data(
+    
+        [const Name& name]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    var Data = function Data(
+    
+        [name         // Name]
+    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    def __init__(self
+    
+        [, name       // Name]
+    
+    )
+
+:Parameters:
+
+    - ``name``
+	(optional) The name for the data packet.
+
+Data.getContent Method
+----------------------
+
+Get content of the Data packet.
+
+:[C++]:
+
+.. code-block:: c++
+
+    const Blob& getContent() const;
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns Blob
+    Data.prototype.getContent = function()
+    
+:Returns:
+
+    A pointer to the content byte array.
+
+Data.setContent Method
+----------------------
+
+Set content to point to an existing byte array.
+
+:[C++]:
+
+.. code-block:: c++
+
+    void setContent(
+    
+        const Blob& content
+    
+    );
+
+:Parameters:
+
+    - ``content``
+	The pointer to the byte array.
+
+Data.wireDecode Method
+----------------------
+
+Decode the input using a particular wire format and update this Data. If wireFormat is the default wire format, also set the defaultWireEncoding field to the input.
+
+:[C++]:
+
+.. code-block:: c++
+
+    void wireDecode(
+    
+        const std::vector<uint8_t>& input
+	[, WireFormat& wireFormat]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    ContentObject.prototype.decode = function(
+    
+        input // Uint8Array
+        [, wireFormat // WireFormat]
+    
+    )
+
+:Parameters:
+
+    - ``input``
+	The input byte array to be decoded.
+
+    - ``wireFormat``
+	(optional) A WireFormat object used to decode the input. If omitted, use WireFormat getDefaultWireFormat().
+
+Data.wireEncode Method
+----------------------
+
+Encode this Data for a particular wire format. If wireFormat is the default wire format, also set the defaultWireEncoding field to the encoded result.
+
+:[C++]:
+
+.. code-block:: c++
+
+    SignedBlob wireEncode(
+    
+        [WireFormat& wireFormat]
+    
+    ) const;
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns Uint8Array
+    ContentObject.prototype.encode = function(
+    
+        [wireFormat // WireFormat]
+    
+    )
+
+:Parameters:
+
+    - wireFormat
+	(optional) A WireFormat object used to encode the input. If omitted, use WireFormat getDefaultWireFormat ().
+
+:Returns:
+
+    The encoded byte array as a SignedBlob.
diff --git a/face.rst b/face.rst
new file mode 100644
index 0000000..5ad2303
--- /dev/null
+++ b/face.rst
@@ -0,0 +1,367 @@
+.. _Face:
+
+Face Class
+==========
+
+:[C++]:
+    Namespace: ``ndn``
+
+:[Python]:
+    Module: ``pyndn``
+
+Face Constructor (explicit Transport)
+-------------------------------------
+
+Create a new Face object with the given Transport to manage NDN communication.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Face(
+    
+        const ptr_lib::shared_ptr<Transport>& transport
+        const ptr_lib::shared_ptr<const Transport::ConnectionInfo>& connectionInfo
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    var Face = function Face(
+    
+        [settings // associative array]
+    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    def __init__(self)
+
+:Parameters:
+
+    - ``transport``
+	An object of a subclass of Transport to use for communication.
+
+    - ``connectionInfo``
+	This must be a ConnectionInfo from the same subclass of Transport as transport.
+
+    - ``settings``
+	(JavaScript only) An associative array with the following defaults:
+
+	.. code-block:: javascript
+
+            getTransport: function() { return new WebSocketTransport(); },
+            getHostAndPort: transport.defaultGetHostAndPort,
+                 // a function, on each call it returns a new { host: host, port: port } or null if there are no more hosts.
+            host: null, // If null, use getHostAndPort when connecting.
+            port: 9696
+
+Face Constructor (default Transport)
+------------------------------------
+
+Create a new Face object with optional settings to manage NDN communication.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Face(
+    
+        [const char* host]
+        [, unsigned short port]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    var Face = function Face(
+    
+        [settings // associative array]
+    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    def __init__(self)
+
+:Parameters:
+
+    - ``host``
+	(optional) The host to connect to. If omitted, use “localhost” with the default TcpTransport.
+
+    - ``port``
+	(optional) The port to connect to. If omitted, use 6363 with the default TcpTransport.
+
+    - ``settings``
+	(JavaScript only) (optional) An associative array with the following defaults:
+
+	.. code-block:: javascript
+
+            getTransport: function() { return new WebSocketTransport(); },
+            getHostAndPort: transport.defaultGetHostAndPort,
+                // a function, on each call it returns a new { host: host, port: port } or null if there are no more hosts.
+            host: null, // If null, use getHostAndPort when connecting.
+            port: 9696
+
+Face.expressInterest Method (from Interest)
+-------------------------------------------
+
+Send the interest through the transport, read the entire response and call onData. If the interest times out according to interest lifetime, call onTimeout (if not omitted).
+
+C++ only: Your application must call processEvents.
+
+:[C++]:
+
+.. code-block:: c++
+
+    unsigned int expressInterest(
+    
+        const Interest& interest,
+        const OnData& onData,
+        [, const OnTimeout& onTimeout]
+        [, WireFormat& wireFormat]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    Face.prototype.expressInterest = function(
+    
+        interest     // Interest
+        onData,      // function
+        [, onTimeout // function]
+    
+    )
+
+:Parameters:
+
+    - ``interest``
+	The Interest to send which includes the interest lifetime for the timeout.
+
+    - ``onData``
+	When a matching data packet is received, this calls ``onData(interest, data)`` where:
+
+	    - ``interest`` is the interest given to expressInterest.
+	    - ``data`` is the received Data object.
+
+    - ``onTimeout``
+	(optional) If the interest times out according to the interest lifetime, this calls ``onTimeout(interest)`` where:
+
+	    - ``interest`` is the interest given to expressInterest.
+
+    - ``wireFormat``
+	(optional) A WireFormat object used to encode the message. If omitted, use WireFormat getDefaultWireFormat ().
+
+:Returns:
+
+    The pending interest ID which can be used with removePendingInterest.
+
+Face.expressInterest Method (from Name)
+---------------------------------------
+
+Encode name as an Interest, using the interestTemplate if supplied, send the interest through the transport, read the entire response and call onData. If the interest times out according to interest lifetime, call onTimeout (if not omitted).
+C++ only: Your application must call processEvents.
+
+:[C++]:
+
+.. code-block:: c++
+
+    unsigned int expressInterest(
+    
+        const Name& name,
+        [, const Interest* interestTemplate]
+        const OnData& onData,
+        [, const OnTimeout& onTimeout]
+        [, WireFormat& wireFormat]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    Face.prototype.expressInterest = function(
+    
+        name,               // Name
+        [, interestTemplate // Interest]
+        onData,             // function
+        [, onTimeout        // function]
+    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    def expressInterest(self,
+    
+        name                # Name
+        closure             # Closure
+        [, interestTemplate # Interest]
+    
+    )
+
+:Parameters:
+
+    - ``name``
+	The Name for the interest.
+
+    - ``interestTemplate``
+	(optional) If not omitted, copy the interest selectors from this Interest. If omitted, use a default interest lifetime.
+
+    - ``onData``
+	When a matching data packet is received, this calls ``onData(interest, data)`` where:
+
+	    - ``interest`` is the interest given to expressInterest.
+	    - ``data`` is the received Data object.
+
+    - ``onTimeout``
+	(optional) If the interest times out according to the interest lifetime, this calls ``onTimeout(interest)`` where:
+
+	    - ``interest`` is the interest given to expressInterest.
+
+    - ``wireFormat``
+	(optional) A WireFormat object used to encode the message. If omitted, use WireFormat getDefaultWireFormat ().
+
+:Returns:
+
+    The pending interest ID which can be used with removePendingInterest.
+
+Face.removePendingInterest Method
+---------------------------------
+
+Remove the pending interest entry with the pendingInterestId from the pending interest table. This does not affect another pending interest with a different pendingInterestId, even it if has the same interest name. If there is no entry with the pendingInterestId, do nothing.
+
+:[C++]:
+
+.. code-block:: c++
+
+    void removePendingInterest(
+    
+        unsigned int pendingInterestId
+    
+    );
+
+:Parameters:
+
+    - ``pendingInterestId``
+	The ID returned from expressInterest.
+
+Face.registerPrefix Method
+--------------------------
+
+Register prefix with the connected NDN hub and call onInterest when a matching interest is received.
+
+C++ only: Your application must call processEvents.
+
+:[C++]:
+
+.. code-block:: c++
+
+    unsigned int registerPrefix(
+    
+        const Name& prefix,
+        const OnInterest& onInterest,
+        const OnRegisterFailed& onRegisterFailed,
+        [, ForwardingFlags flags]
+        [, WireFormat& wireFormat]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    Face.prototype.registerPrefix = function(
+    
+        name,             // Name
+        onInterest        // function
+        onRegisterFailed  // function
+        [, flags          // ForwardingFlags]
+    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    def setInterestFilter(self,
+    
+        name     # Name
+        closure  # Closure
+        [, flags # int]
+    
+    )
+
+:Parameters:
+
+    - ``prefix``
+	The Name prefix.
+
+    - ``onInterest``
+	When an interest is received which matches the name prefix, this calls ``onInterest(prefix, interest, transport, registeredPrefixId)`` where:
+
+	    - ``prefix`` is the prefix given to registerPrefix.
+	    - ``interest`` is the received interest.
+	    - ``transport`` is the Transport with the connection which received the interest. You must encode a signed Data packet and send it using transport.send().
+	    - ``registeredPrefixId`` is the registered prefix ID which can be used with removeRegisteredPrefix.
+
+    - ``onRegisterFailed``
+	If failed to retrieve the connected hub's ID or failed to register the prefix, this calls onRegisterFailed(prefix) where:
+	    - ``prefix`` is the prefix given to registerPrefix.
+
+    - ``flags``
+	(optional) The flags for finer control of which interests are forward to the application.  If omitted, use the default flags defined by the default ForwardingFlags constructor.
+
+    - ``wireFormat``
+	(optional) A WireFormat object used to encode the message. If omitted, use WireFormat getDefaultWireFormat ().
+
+:Returns:
+
+    The registered prefix ID which can be used with removeRegisteredPrefix.
+
+Face.removeRegisteredPrefix Method
+----------------------------------
+
+Remove the registered prefix entry with the registeredPrefixId from the pending interest table.  This does not affect another registered prefix with a different registeredPrefixId, even it if has the same prefix name. If there is no entry with the registeredPrefixId, do nothing.
+
+:[C++]:
+
+.. code-block:: c++
+
+    void removeRegisteredPrefix(
+    
+        unsigned int registeredPrefixId
+    
+    );
+
+:Parameters:
+
+    - ``registeredPrefixId``
+	The ID returned from registerPrefix.
+
+Face.processEvents Method
+-------------------------
+
+C++ only: Process any data to receive and call data or timeout callbacks.  This is non-blocking and will return immediately if there is no data to receive.  You should repeatedly call this from an event loop, with calls to sleep as needed so that the loop doesn't use 100% of the CPU.  Since processEvents modifies the pending interest table, your application should make sure that it calls processEvents in the same thread as expressInterest (which also modifies the pending interest table).
+
+:[C++]:
+
+.. code-block:: c++
+
+    void processEvents();
+
+:Throw:
+
+    This may throw an exception for reading data or in the callback for processing the data.  If you call this from an main event loop, you may want to catch and log/disregard all exceptions.
+
diff --git a/index.rst b/index.rst
new file mode 100644
index 0000000..eb3c1a6
--- /dev/null
+++ b/index.rst
@@ -0,0 +1,24 @@
+
+NDN Common Client Libraries API
+===============================
+
+This documents the API for the NDN client libraries, showing the classes and method declarations for C++, JavaScript and Python.
+
+Table of Contents:
+
+.. toctree::
+   name
+   interest
+   data
+   signature
+   face
+   :maxdepth: 2
+
+
+.. Indices and tables
+.. ==================
+
+.. * :ref:`genindex`
+.. * :ref:`modindex`
+.. * :ref:`search`
+
diff --git a/interest.rst b/interest.rst
new file mode 100644
index 0000000..614b354
--- /dev/null
+++ b/interest.rst
@@ -0,0 +1,197 @@
+.. _Interest:
+
+Interest Class
+==============
+
+:[C++]:
+    Namespace: ``ndn``
+
+:[Python]:
+    Module: ``pyndn``
+
+Interest Constructor
+--------------------
+
+Create a new Interest with the optional values.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Interest(
+    
+        [const Name& name]
+        [, int minSuffixComponents]
+        [, int maxSuffixComponents]
+        [, const PublisherPublicKeyDigest& publisherPublicKeyDigest]
+        [, const Exclude& exclude]
+        [, int childSelector]
+        [, int answerOriginKind]
+        [, int scope]
+        [, Milliseconds interestLifetimeMilliseconds]
+        [, const std::vector<uint8_t>& nonce]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    var Interest = function Interest (
+    
+        [name                           // Name]
+        [, minSuffixComponents          // number]
+        [, maxSuffixComponents          // number]
+        [, publisherPublicKeyDigest     // PublisherPublicKeyDigest]
+        [, exclude                      // Exclude]
+        [, childSelector                // number]
+        [, answerOriginKind             // number]
+        [, scope                        // number]
+        [, interestLifetimeMilliseconds // number]
+        [, nonce                        // Uint8Array]
+    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    def __init__(self
+    
+        [, name                     // Name]
+        [, minSuffixComponents      // int]
+        [, maxSuffixComponents      // int]
+        [, publisherPublicKeyDigest // string]
+        [, exclude                  // Exclude]
+        [, childSelector            // int]
+        [, answerOriginKind         // int]
+        [, scope                    // int]
+        [, interestLifetime         // float]
+        [, nonce                    // string]
+    
+    )
+
+:Parameters:
+
+    - ``name``
+	(optional) The name of the content.
+
+.. TODO: define other parameters
+
+Interest.wireDecode Method
+--------------------------
+
+Decode the input using a particular wire format and update this Interest.
+
+:[C++]:
+
+.. code-block:: c++
+
+    void decode(
+    
+        const std::vector<uint8_t>& input
+        [,WireFormat& wireFormat]
+    
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    Interest.prototype.decode = function(
+    
+        input         // Uint8Array
+        [, wireFormat // WireFormat]
+        
+    )
+
+:Parameters:
+
+    - ``input``
+	The input byte array to be decoded.
+
+    - ``wireFormat``
+	(optional) A WireFormat object used to decode the input. If omitted, use WireFormat getDefaultWireFormat ().
+
+
+Interest.wireEncode Method
+--------------------------
+
+Encode this Interest for a particular wire format.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Blob encode(
+    
+        [WireFormat& wireFormat]
+    
+    ) const;
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns Uint8Array
+    Interest.prototype.encode = function(
+    
+        [wireFormat // WireFormat]
+    
+    )
+
+:Parameters:
+
+    - ``wireFormat``
+	(optional) A WireFormat object used to encode the input. If omitted, use use WireFormat getDefaultWireFormat ().
+
+:Returns:
+
+    The encoded byte array.
+
+Interest.matchesName Method
+---------------------------
+
+Return true if the components of this Interest’s name are the same as the leading components of the given name, and the name conforms to the interest selectors.
+
+:[C++]:
+
+.. code-block:: c++
+
+    bool matchesName(
+    
+        const Name& name
+    
+    ) const;
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns boolean
+    Interest.prototype.matchesName = function(
+    
+	name // Name
+    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    # Returns True or False
+    def matches_name(self,
+    
+        name # Name
+    
+    )
+
+:Parameters:
+
+    - ``name``
+	The Name to check against this Interest.
+
+:Returns:
+
+    True if this interest’s name and interest selectors match the name.
+
diff --git a/name.rst b/name.rst
new file mode 100644
index 0000000..20e1543
--- /dev/null
+++ b/name.rst
@@ -0,0 +1,444 @@
+.. _Name.Component:
+
+Name.Component Class
+====================
+
+A Name.Component is holds a read-only name component value
+
+:[C++]:
+
+    Namespace: ``ndn``
+
+Name.Component Constructor
+--------------------------
+
+Create a new Name.Component, copying the optional value.
+
+
+:[C++]:
+
+.. code-block:: c++
+
+    ndn::Name::Component(
+        [const std::vector<uint8_t>& value]
+    );
+
+:Parameters:
+
+    - ``value``
+	(optional) The content byte array to copy.
+
+Name.Component.toEscapedString Method
+-------------------------------------
+
+Convert this component value by escaping characters according to the NDN URI Scheme.
+
+:[C++]:
+
+.. code-block:: c++
+
+    std::string toEscapedString() const ();
+
+:Returns:
+
+    The escaped string.
+
+.. _Name:
+
+Name Class
+==========
+
+A Name holds an array of Name.Component and represents an NDN name.
+
+:[C++]:
+    Namespace: ``ndn``
+
+:[Python]:
+    Module: ``pyndn``
+
+Name Constructor (array of components)
+--------------------------------------
+
+Create a new Name with the optional components.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name(
+	[const std::vector<Name::Component>& components]
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    var Name = function Name (
+        [components   // Array<Uint8Array>]    
+    )
+
+:[Python]:
+
+.. code-block:: python
+
+    def __init__(self
+	[, components // Array<string>]
+    )
+    
+:Parameters:
+
+    - ``components``
+	(optional) The array of name components.
+
+Name Constructor (from URI)
+---------------------------
+
+Parse the uri according to the NDN URI Scheme and create the Name with the components.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name(
+	const char* uri
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    var Name = function Name (
+	uri // string
+    )
+
+:Parameters:
+
+    - ``uri``
+	The URI in NDN URI Scheme.
+
+Name.toUri Method
+-----------------
+
+Return the escaped name string according to the NDN URI Scheme.
+
+:[C++]:
+
+.. code-block:: c++
+
+    std::string toUri() const ();
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns string
+    Name.prototype.toUri = function();
+
+:Returns:
+
+The escaped name string according to the NDN URI Scheme.
+
+Name.size Method
+----------------
+
+Get the number of components.
+
+:[C++]:
+
+.. code-block:: c++
+
+    size_t getComponentCount() const;
+
+:Returns:
+
+    The number of components.
+
+Name.get Method
+---------------
+
+Get a Name Component by index number.
+
+:[C++]:
+
+.. code-block:: c++
+
+    const Component& getComponent(
+        size_t i
+    ) const;
+
+:Parameters:
+
+    - ``i``
+	The index of the component to get, starting from 0.
+
+:Returns:
+
+    The Name.Component.
+
+Name.getPrefix Method
+---------------------
+
+Get a new Name with the first nComponents components of this Name.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name getPrefix(
+        size_t nComponents
+    ) const;
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns Name
+    Name.prototype.getPrefix = function(
+        nComponents  // Number
+    );
+
+:Parameters:
+
+    - nComponents
+	The number of prefix components. If larger than the number of components in this name, return a copy of this Name.
+
+:Returns:
+
+    A new Name.
+
+Name.getSubName Method
+----------------------
+
+Get a new name, constructed as a subset of components.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name getSubName(
+        size_t iStartComponent
+	[, size_t nComponents]
+    ) const;
+
+:Parameters:
+
+    - ``iStartComponent``
+	The index if the first component to get.
+
+    - ``nComponents``
+	(optional) The number of components starting at iStartComponent. If omitted, return components until the end of the name.
+
+:Returns:
+
+    A new Name.
+
+Name.match Method
+-----------------
+
+Check if the N components of this name are the same as the first N components of the given name.
+
+:[C++]:
+
+.. code-block:: c++
+
+    bool match(
+	const Name& name
+    ) const;
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns boolean
+    Name.prototype.match = function(
+        name  // Name
+    );
+
+:Parameters:
+
+    - ``name``
+	The Name to check.
+
+    - ``nComponents``
+	The number of components starting at iStartComponent. If omitted, return components until the end of the name.
+
+:Returns:
+
+    true if this matches the given name, otherwise false.  This always returns true if this name is empty.
+
+Name.append Method (copy byte array)
+------------------------------------
+
+Append a new component, copying from byte array.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name& append(
+	const std::vector<uint8_t>& value
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns this Name
+    Name.prototype.append = function(
+        value  // Array<number>|ArrayBuffer|Uint8Array
+    )
+
+:Parameters:
+
+    - ``value``
+	The component byte array to copy.
+
+:Returns:
+
+    This name so that you can chain calls to append.
+
+Name.append Method (from Blob)
+------------------------------
+
+Append a new component, taking another pointer to the byte array in the Blob.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name& append(
+	const Blob& value
+    );
+
+:Parameters:
+
+    - ``value``
+	The Blob with the pointer to the byte array.
+
+:Returns:
+
+    This name so that you can chain calls to append.
+
+Name.append Method (from Component)
+-----------------------------------
+
+Append the component to this name.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name& append(
+	const Name::Component& value
+    );
+
+:Parameters:
+
+    - ``value``
+	The Name.Component to append.
+
+:Returns:
+
+    This name so that you can chain calls to append.
+
+Name.append Method (from Name)
+------------------------------
+
+Append the components of the given name to this name.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name& append(
+	const Name& name
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns this Name
+    Name.prototype.append = function(
+        value  // Name
+    )
+
+:Parameters:
+
+    - ``name``
+	The Name with components to append.
+
+:Returns:
+
+    This name so that you can chain calls to append.
+
+Name.appendSegment Method
+-------------------------
+
+Append a component with the encoded segment number.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name& appendSegment(
+        uint64_t segment
+    );
+
+:[JavaScript]:
+
+.. code-block:: javascript
+
+    // Returns this Name
+    Name.prototype.appendSegment = function(
+	segment  // Number
+    )
+
+:Parameters:
+
+    - ``segment``
+	The integer segment number to be encoded.
+
+:Returns:
+
+    This name so that you can chain calls to append.
+
+Name.appendVersion Method
+-------------------------
+
+Append a component with the encoded version number. Note that this encodes the exact value of version without converting from a time representation.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Name& appendVersion(
+	uint64_t version
+    );
+
+:Parameters:
+
+    - ``version``
+	The version number to be encoded.
+
+:Returns:
+
+    This name so that you can chain calls to append.
+
+Other Name getter and setter methods
+------------------------------------
+
+.. code-block:: javascript
+
+    // Returns a new Name
+    Name.prototype.cut = function(
+	minusComponents  // number
+    )
+    
+    // Returns number
+    Name.prototype.indexOfFileName = function()
+    
+    // Returns Boolean
+    Name.prototype.equalsName = function(
+	name            // Name
+    )
diff --git a/signature.rst b/signature.rst
new file mode 100644
index 0000000..7daa06c
--- /dev/null
+++ b/signature.rst
@@ -0,0 +1,64 @@
+.. _Signature:
+
+Signature Class
+===============
+
+A Signature is an abstract base class providing methods to work with the signature information in a Data packet. You must create an object of a subclass, for example Sha256WithRsaSignature.
+
+:[C++]:
+    Namespace: ``ndn``
+
+:[Python]:
+    Module: ``pyndn``
+
+Signature.clone Method
+----------------------
+
+Return a pointer to a new Signature which is a copy of this signature. This is abstract, the subclass must implement it.
+
+:[C++]:
+
+.. code-block:: c++
+
+    virtual ptr_lib::shared_ptr<Signature> clone() const = 0;
+
+:Returns:
+
+An now object of a subclass of Signature which is a clone of this object.
+
+Sha256WithRsaSignature Class
+============================
+
+A Sha256WithRsaSignature extends Signature and holds the signature bits and other info representing a SHA256-with-RSA signature in a data packet.
+
+:[C++]:
+    Namespace: ``ndn``
+
+:[Python]:
+    Module: ``pyndn``
+
+Sha256WithRsaSignature Constructor
+----------------------------------
+
+Create a new Sha256WithRsaSignature object.
+
+:[C++]:
+
+.. code-block:: c++
+
+    Sha256WithRsaSignature();
+
+Sha256WithRsaSignature.clone Method
+-----------------------------------
+
+Return a pointer to a new Sha256WithRsaSignature which is a copy of this signature.
+
+:[C++]:
+
+.. code-block:: c++
+
+    virtual ptr_lib::shared_ptr<Signature> clone() const;
+
+:Returns:
+
+    A new Sha256WithRsaSignature object.