diff --git a/blob.rst b/blob.rst
new file mode 100644
index 0000000..52c730a
--- /dev/null
+++ b/blob.rst
@@ -0,0 +1,251 @@
+.. _Blob:
+
+Blob Class
+==========
+
+:[C++]:
+    Namespace: ndn
+
+.. code-block:: c++
+
+    class Blob : public ptr_lib::shared_ptr<const std::vector<uint8_t> >
+
+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.
+
+Blob Constructor
+----------------
+
+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.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        Blob(
+        
+            [const ptr_lib::shared_ptr<std::vector<uint8_t> > &value]
+        
+        );
+
+        Blob(
+        
+            [const ptr_lib::shared_ptr<const std::vector<uint8_t> > &value]
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: c++
+
+        var Blob = function Blob(
+        
+            [value // Blob]
+        
+        )
+
+:Parameters:
+
+    - `value`
+        (optional) A pointer to a vector with the byte array.  This takes another reference and does not copy the bytes.  If omitted, this set this blob to a null pointer.
+
+Blob Constructor (``uint8_t *``)
+--------------------------------
+
+(C++ only) Create a new Blob with an immutable copy of the given array.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        Blob(
+        
+            const uint8_t* value,
+            size_t valueLength
+        
+        );
+
+:Parameters:
+
+    - `value`
+        A pointer to the byte array which is copied.
+
+    - `valueLength`
+        The length of value.
+
+Blob Constructor (copy byte array)
+----------------------------------
+
+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 type for the main Blob constructor.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        Blob(
+        
+            const std::vector<uint8_t> &value
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        var Blob = function Blob(
+        
+            [value // Buffer|Array<number>]
+        
+        )
+
+:Parameters:
+
+    - `value`
+        A reference to a vector which is copied.
+
+Blob.size Method
+----------------
+
+Return the length of the immutable byte array.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        size_t size() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns number
+        Blob.prototype.size = function()
+
+:Returns:
+
+    The length of the array.  If the pointer to the array is null, return 0.
+
+Blob.buf Method
+---------------
+
+Return a pointer to the immutable byte array. DO NOT change the contents of the array.  If you need to change it, make a copy.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        const uint8_t* buf() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns Buffer
+        Blob.prototype.buf = function()
+
+:Returns:
+
+    A pointer to the immutable byte array.  If the pointer to the array is null, return null.
+
+.. _SignedBlob:
+
+SignedBlob Class
+================
+
+:[C++]:
+    Namespace: ndn
+
+.. code-block:: c++
+
+    class SignedBlob : public Blob
+
+A SignedBlob extends Blob to keep the offsets of a signed portion (e.g., the bytes of Data packet). This inherits from Blob, including Blob.size and Blob.buf.
+
+SignedBlob.signedSize Method
+----------------------------
+
+Return the length of the signed portion of the immutable byte array.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        size_t signedSize() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns number
+        SignedBlob.prototype.signedSize = function()
+
+:Returns:
+
+    The length of the signed portion.  If the pointer to the array is null, return 0.
+
+SignedBlob.signedBuf Method
+---------------------------
+
+Return a pointer to the first byte of the signed portion of the immutable byte array.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        const uint8_t* signedBuf() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns Buffer
+        SignedBlob.prototype.signedBuf = function()
+
+:Returns:
+
+    A pointer to the first byte of the signed portion.  If the pointer to the array is null, return null.
+
+SignedBlob.getSignedPortionBeginOffset Method
+---------------------------------------------
+
+Return the offset in the array of the beginning of the signed portion.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        size_t getSignedPortionBeginOffset() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns number
+        SignedBlob.prototype.getSignedPortionBeginOffset = function()
+
+:Returns:
+
+    The offset that was given to the constructor.
+
+SignedBlob.getSignedPortionEndOffset Method
+-------------------------------------------
+
+Return the offset in the array of the end of the signed portion.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        size_t getSignedPortionEndOffset() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns number
+        SignedBlob.prototype.getSignedPortionEndOffset = function()
+
+:Returns:
+
+    The offset that was given to the constructor.
diff --git a/details/binary-xml-wire-format.rst b/details/binary-xml-wire-format.rst
new file mode 100644
index 0000000..683eeff
--- /dev/null
+++ b/details/binary-xml-wire-format.rst
@@ -0,0 +1,185 @@
+BinaryXmlWireFormat Class
+=========================
+
+:[C++]:
+    Namespace: `ndn`
+
+BinaryXmlWireFormat Constructor
+-------------------------------
+
+Create a BinaryXmlWireFormat which extends the WireFormat interface to implement encoding and decoding in binary XML.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        BinaryXmlWireFormat();
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        var BinaryXmlWireFormat = function BinaryXmlWireFormat()
+
+BinaryXmlWireFormat.decodeData Method
+-------------------------------------
+
+Decode the input and Binary XML and put the result in data.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void decodeData(
+        
+            Data& data,
+            const uint8_t* input,
+            size_t inputLength
+            [, size_t* signedPortionBeginOffset,
+            size_t* signedPortionEndOffset]
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        BinaryXmlWireFormat.prototype.decodeContentObject = function(
+
+            contentObject, // ContentObject
+            input          // Uint8Array
+
+        )
+
+:Parameters:
+
+    - `data`
+        The Data which is set to the values decoded from the input.
+
+    - `input`
+        The input byte array to be decoded.
+
+    - `inputLength`
+        (C++ only) The length of the input byte array.
+
+    - `signedPortionBeginOffset`
+        (optional) Return the offset in the input of the beginning of the signed portion. If you are not decoding in order to verify, you can ignore this returned value.
+
+    - `signedPortionEndOffset`
+        (optional) Return the offset in the input of the end of the signed portion. If you are not decoding in order to verify, you can ignore this returned value.
+
+BinaryXmlWireFormat.encodeData Method
+-------------------------------------
+
+Encode the data object as Binary XML and return the encoding.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        Blob encodeData(
+        
+            const Data& data
+            [, size_t* signedPortionBeginOffset,
+            size_t* signedPortionEndOffset]
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns Uint8Array
+        BinaryXmlWireFormat.prototype.encodeContentObject = function(
+        
+            contentObject, // ContentObject
+        
+        )
+
+:Parameters:
+
+    - `data`
+        The Data object to be encoded.
+
+    - `signedPortionBeginOffset`
+        (optional) Return the offset in the encoding of the beginning of the signed portion. If you are not encoding in order to sign, you can ignore this returned value.
+
+    - `signedPortionEndOffset`
+        (optional) Return the offset in the encoding of the end of the signed portion. If you are not encoding in order to sign, you can ignore this returned value.
+
+:Returns:
+
+    The encoded byte array.
+
+BinaryXmlWireFormat.decodeInterest Method
+-----------------------------------------
+
+Decode the input and Binary XML and put the result in interest.
+
+:[C++]:
+    .. code-block:: c++
+
+        void decodeInterest(
+        
+            Interest& interest,
+            const uint8_t* input,
+            size_t inputLength
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        BinaryXmlWireFormat.prototype.decodeInterest = function(
+        
+            interest, // Interest
+            input // Uint8Array
+        
+        )
+
+:Parameters:
+
+    - `interest`
+        The Interest which is set to the values decoded from the input.
+
+    - `input`
+        The input byte array to be decoded.
+
+    - `inputLength`
+        (C++ only) The length of the input byte array.
+
+BinaryXmlWireFormat.encodeInterest Method
+-----------------------------------------
+
+Encode the interest as Binary XML and return the encoding.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        Blob encodeInterest(
+
+            const Interest& interest,
+
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        // Returns Uint8Array
+        BinaryXmlWireFormat.prototype.encodeContentObject = function(
+        
+            interest, // Interest
+        
+        )
+
+:Parameters:
+
+    - `interest`
+        The Interest to be encoded.
+
+:Returns:
+
+    The encoded byte array.
diff --git a/details/cpp.rst b/details/cpp.rst
new file mode 100644
index 0000000..37d47e1
--- /dev/null
+++ b/details/cpp.rst
@@ -0,0 +1,50 @@
+ptr_lib (C++)
+=============
+
+Some C++ methods need to use shared_ptr. Depending on where ./configure found shared_ptr, define the ptr_lib namespace as follows, so that the API always uses ndn::ptr_lib::shared_ptr.
+
+.. code-block:: c++
+
+    #if NDN_CPP_HAVE_STD_SHARED_PTR
+    #include
+    #include <memory>
+    namespace ndn { namespace ptr_lib = std; }
+    #elif NDN_CPP_HAVE_BOOST_SHARED_PTR
+    #include <boost/shared_ptr.hpp>
+    #include <boost/make_shared.hpp>
+    namespace ndn { namespace ptr_lib = boost; }
+    #else
+    // Use the boost header files in this distribution.
+    #include <ndnboost/shared_ptr.hpp>
+    #include <ndnboost/make_shared.hpp>
+    namespace ndn { namespace ptr_lib = ndnboost; }
+    #endif
+
+Time representation
+===================
+
+Some methods use calendar time or a time interval.  These are represented as follows.
+
+Milliseconds Typedef
+--------------------
+
+(C++ only) A time interval represented as the number of milliseconds.
+
+:[C++]:
+    Namespace: `ndn`
+
+.. code-block:: c++
+
+    typedef double Milliseconds;
+
+MillisecondsSince1970 Typedef
+-----------------------------
+
+(C++ only) The calendar time represented as the number of milliseconds since 1/1/1970.
+
+:[C++]:
+    Namespace: ndn
+
+.. code-block:: c++
+
+    typedef double MillisecondsSince1970;
diff --git a/details/forwarding-flags.rst b/details/forwarding-flags.rst
new file mode 100644
index 0000000..e499d02
--- /dev/null
+++ b/details/forwarding-flags.rst
@@ -0,0 +1,431 @@
+ForwardingFlags Class
+=====================
+
+A ForwardingFlags object holds the flags which specify how the forwarding daemon should forward an interest for a registered prefix.  We use a separate ForwardingFlags object to retain future compatibility if the daemon forwarding bits are changed, amended or deprecated.
+
+:[C++]:
+    Namespace: `ndn`
+
+ForwardingFlags Constructor
+
+Create a new ForwardingFlags with "active" and "childInherit" set and all other flags cleared.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        ForwardingFlags();
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        var ForwardingFlags = function ForwardingFlags()
+
+ForwardingFlags.getActive Method
+--------------------------------
+
+Get the value of the "active" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getActive() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getActive = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.getChildInherit Method
+--------------------------------------
+
+Get the value of the "childInherit" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getChildInherit() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getChildInherit = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.getAdvertise Method
+-----------------------------------
+
+Get the value of the "advertise" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getAdvertise() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getAdvertise = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.getLast Method
+------------------------------
+
+Get the value of the "last" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getLast() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getLast = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.getCapture Method
+---------------------------------
+
+Get the value of the "capture" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getCapture() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getCapture = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.getLocal Method
+-------------------------------
+
+Get the value of the "local" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getLocal() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getLocal = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.getTap Method
+-----------------------------
+
+Get the value of the "tap" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getTap() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getTap = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.getCaptureOk Method
+-----------------------------------
+
+Get the value of the "captureOk" flag.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        bool getCaptureOk() const;
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.getCaptureOk = function()
+
+:Returns:
+
+    true if the flag is set, false if it is cleared.
+
+ForwardingFlags.setActive Method
+--------------------------------
+
+Set the value of the "active" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setActive(
+
+            bool active;
+
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setActive = function(
+        
+            active    // boolean
+        
+        )
+
+:Parameters:
+
+    - `active`
+        true to set the flag, false to clear it.
+
+ForwardingFlags.setChildInherit Method
+--------------------------------------
+
+Set the value of the "childInherit" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setChildInherit(
+
+            bool childInherit;
+
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setChildInherit = function(
+        
+            childInherit    // boolean
+        
+        )
+
+:Parameters:
+
+    - `childInherit`
+        true to set the flag, false to clear it.
+
+ForwardingFlags.setAdvertise Method
+-----------------------------------
+
+Set the value of the "advertise" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setAdvertise(
+
+            bool advertise;
+
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setAdvertise = function(
+        
+            advertise    // boolean
+        
+        )
+
+:Parameters:
+
+    - `advertise`
+        true to set the flag, false to clear it.
+
+ForwardingFlags.setLast Method
+------------------------------
+
+Set the value of the "last" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setLast(
+        
+            bool last;
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setLast = function(
+        
+            last    // boolean
+        
+        )
+
+:Parameters:
+
+    - `last`
+        true to set the flag, false to clear it.
+
+ForwardingFlags.setCapture Method
+---------------------------------
+
+Set the value of the "capture" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setCapture(
+        
+            bool capture;
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setCapture = function(
+        
+            capture    // boolean
+        
+        )
+
+:Parameters:
+
+    - `capture`
+        true to set the flag, false to clear it.
+
+ForwardingFlags.setLocal Method
+-------------------------------
+
+Set the value of the "local" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setLocal(
+        
+            bool local;
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setLocal = function(
+        
+            local    // boolean
+        
+        )
+
+:Parameters:
+
+    - `local`
+        true to set the flag, false to clear it.
+
+ForwardingFlags.setTap Method
+-----------------------------
+
+Set the value of the "tap" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setTap(
+        
+            bool tap;
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setTap = function(
+        
+            tap    // boolean
+        
+        )
+
+:Parameters:
+
+    - `tap`
+        true to set the flag, false to clear it.
+
+ForwardingFlags.setCaptureOk Method
+-----------------------------------
+
+Set the value of the "captureOk" flag
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setCaptureOk(
+        
+            bool captureOk;
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        ForwardingFlags.prototype.setCaptureOk = function(
+        
+            captureOk    // boolean
+        
+        )
+
+:Parameters:
+
+    - `captureOk`
+        true to set the flag, false to clear it.
diff --git a/details/tcp-transport.rst b/details/tcp-transport.rst
new file mode 100644
index 0000000..ef9cf4c
--- /dev/null
+++ b/details/tcp-transport.rst
@@ -0,0 +1,125 @@
+TcpTransport.ConnectionInfo Class
+=================================
+
+:[C++]:
+    Namespace: ndn
+
+A TcpTransport::ConnectionInfo extends Transport::ConnectionInfo to hold the host and port info for the TCP connection.
+
+TcpTransport.ConnectionInfo Constructor
+---------------------------------------
+
+Create a TcpTransport.ConnectionInfo with the given host and port.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        TcpTransport(
+        
+            const char *host
+            [, unsigned short port]
+            
+        );
+
+:Parameters:
+
+    - `host`
+        The host for the connection.
+
+    - `port`
+        (optional) The port number for the connection. If omitted, use 9695.
+
+.. _TcpTransport:
+
+TcpTransport Class
+==================
+
+:[C++]:
+
+Namespace: `ndn`
+
+TcpTransport Constructor
+------------------------
+
+Create a TcpTransport which extends the Transport interface to implement communication over TCP/IP.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        TcpTransport();
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        var TcpTransport = function TcpTransport()
+
+TcpTransport.connect Method
+---------------------------
+
+Connect according to the info in ConnectionInfo, and use elementListener to receive data.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void connect(
+        
+            const Transport::ConnectionInfo& connectionInfo,
+            ElementListener& elementListener
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        TcpTransport.prototype.connect = function(
+        
+            ndn // NDN
+        
+        )
+
+:Parameters:
+
+    - `connectionInfo`
+        A TcpTransport.ConnectionInfo with the info for connecting.
+
+    - `elementListener`
+        The ElementListener called when an element is received.
+
+TcpTransport.send Method
+------------------------
+
+Send the data over the connection.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void send(
+        
+            const uint8_t* data,
+            size_t dataLength
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        TcpTransport.prototype.send = function(
+        
+            data // Uint8Array
+        
+        )
+
+:Parameters:
+
+    - `data`
+        The data byte array to send.
+
+    - `dataLength`
+        (C++ only) The length of the data byte array.
diff --git a/details/udp-transport.rst b/details/udp-transport.rst
new file mode 100644
index 0000000..7f57e94
--- /dev/null
+++ b/details/udp-transport.rst
@@ -0,0 +1,108 @@
+UdpTransport.ConnectionInfo Class
+=================================
+
+:[C++]:
+    Namespace: `ndn`
+
+A UdpTransport::ConnectionInfo extends Transport::ConnectionInfo to hold the host and port info for the UDP connection.
+
+UdpTransport.ConnectionInfo Constructor
+---------------------------------------
+
+Create a UdpTransport.ConnectionInfo with the given host and port.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        UdpTransport(
+        
+            const char *host
+            [, unsigned short port]
+        
+        );
+
+:Parameters:
+
+    - `host`
+        The host for the connection.
+
+    - `port`
+        (optional) The port number for the connection. If omitted, use 9695.
+
+.. _UdpTransport:
+
+UdpTransport Class
+==================
+
+:[C++]:
+    Namespace: `ndn`
+
+UdpTransport Constructor
+------------------------
+
+Create a UdpTransport which extends the Transport interface to implement communication over UDP.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        UdpTransport();
+
+UdpTransport.connect Method
+---------------------------
+
+Connect according to the info in ConnectionInfo, and use elementListener to receive data.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void connect(
+        
+            const Transport::ConnectionInfo& connectionInfo,
+            ElementListener& elementListener
+        
+        );
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        TcpTransport.prototype.connect = function(
+        
+            ndn // NDN
+        
+        )
+
+:Parameters:
+
+    - `connectionInfo`
+        A UdpTransport.ConnectionInfo with the info for connecting.
+
+    - `elementListener`
+        The ElementListener called when an element is received
+
+UdpTransport.send Method
+------------------------
+
+Send the data over the connection.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void send(
+        
+            const uint8_t* data,
+            size_t dataLength
+            
+        );
+
+:Parameters:
+
+    - `data`
+        The data byte array to send.
+
+    - `dataLength`
+        (C++ only) The length of the data byte array.
diff --git a/details/wire-format.rst b/details/wire-format.rst
new file mode 100644
index 0000000..a548d73
--- /dev/null
+++ b/details/wire-format.rst
@@ -0,0 +1,77 @@
+WireFormat Class
+================
+
+:[C++]:
+    Namespace: `ndn`
+
+WireFormat Constructor
+----------------------
+
+Create a base class WireFormat where the methods throw an "unimplemented" error. You should use a derived class like BinaryXmlWireFormat.
+
+:Realizations:
+
+    - BinaryXmlWireFormat
+
+:[C++]:
+
+    .. code-block:: c++
+
+        WireFormat();
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        var WireFormat = function WireFormat()
+
+WireFormat.setDefaultWireFormat Method
+--------------------------------------
+
+Set the static default WireFormat used by default encoding and decoding methods.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        static void setDefaultWireFormat(
+        
+            WireFormat* wireFormat
+        
+        )
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        WireFormat.setDefaultWireFormat = function(
+
+            wireFormat // WireFormat
+
+        )
+
+:Parameters:
+
+    - `wireFormat`
+        An object of a subclass of WireFormat.
+
+WireFormat.getDefaultWireFormat Method
+--------------------------------------
+
+Return the default WireFormat used by default encoding and decoding methods. The initial value is a BinaryXmlWireFormat object. If can be changed with setDefaultWireFormat.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        static WireFormat* getDefaultWireFormat();
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        WireFormat.getDefaultWireFormat = function()
+
+:Returns:
+
+    The default (subclass of) WireFormat object.
diff --git a/index.rst b/index.rst
index eb3c1a6..30ab826 100644
--- a/index.rst
+++ b/index.rst
@@ -12,7 +12,16 @@
    data
    signature
    face
-   :maxdepth: 2
+   details/forwarding-flags
+   transport
+   details/tcp-transport
+   details/udp-transport
+   details/wire-format
+   details/binary-xml-wire-format
+   blob
+   key-chain
+   details/cpp
+   :maxdepth: 3
 
 
 .. Indices and tables
diff --git a/key-chain.rst b/key-chain.rst
new file mode 100644
index 0000000..c2e0029
--- /dev/null
+++ b/key-chain.rst
@@ -0,0 +1,111 @@
+KeyChain Class
+==============
+
+:[C++]:
+    Namespace: `ndn`
+
+The Keychain class provides a set of interfaces to the security library such as identity management, policy configuration and packet signing and verification.
+
+KeyChain.sign Method
+--------------------
+
+Wire encode the Data object, sign it and set its signature. Note: the caller must make sure the timestamp is correct, if necessary calling ``data.getMetaInfo().setTimestampMilliseconds``.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void sign(
+        
+            Data& data,
+            const Name& certificateName
+            [, WireFormat& wireFormat]
+        
+        );
+
+:Parameters:
+
+    - `data`
+        The Data object to be signed.  This updates its signature and key locator field and wireEncoding.
+
+    - `certificateName`
+        The certificate name of the key to use for signing.
+
+    - `wireFormat`
+        (optional) A WireFormat object used to encode the Data object. If omitted, use WireFormat getDefaultWireFormat ().
+
+KeyChain.signByIdentity Method
+------------------------------
+
+Wire encode the Data object, sign it and set its signature. Note: the caller must make sure the timestamp is correct, if necessary calling ``data.getMetaInfo().setTimestampMilliseconds``.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void signByIdentity(
+        
+            Data& data
+            [, const Name& identityName]
+            [, WireFormat& wireFormat]
+            
+        );
+
+:Parameters:
+
+    - `data`
+        The Data object to be signed.  This updates its signature and key locator field and wireEncoding.
+
+    - `identityName`
+        (optional) The identity name for the key to use for signing.  If omitted, infer the signing identity from the data packet name.
+
+    - `wireFormat`
+        (optional) A WireFormat object used to encode the Data object. If omitted, use WireFormat getDefaultWireFormat ().
+
+KeyChain.verifyData Method
+--------------------------
+
+Check the signature on the Data object and call either ``onVerify`` or ``onVerifyFailed``. We use callback functions because verify may fetch information to check the signature.
+
+:[C++]:
+
+        void verifyData(
+        
+            const ptr_lib::shared_ptr<Data>& data,
+            const OnVerified& onVerified,
+            const OnVerifyFailed& onVerifyFailed
+            
+        );
+
+:Parameters:
+
+    - `data`
+        The Data object with the signature to check. It is an error if data does not have a wireEncoding. To set the wireEncoding, you can call data.wireDecode.
+
+    - `onVerified`
+        If the signature is verified, this calls ``onVerified(data)`` where:
+            - `data` is the given Data object.
+
+    - `onVerifyFailed`
+        If the signature check fails, this calls ``onVerifyFailed(data)`` where:
+            - `data` is the given Data object.
+
+KeyChain.setFace Method
+-----------------------
+
+Set the Face which will be used to fetch required certificates.
+
+:[C++]:
+
+    .. code-block:: c++
+
+        void setFace(
+        
+            Face* face
+        
+        );
+
+:Parameters:
+
+    - `face`
+        The Face object.
diff --git a/transport.rst b/transport.rst
new file mode 100644
index 0000000..3cc9361
--- /dev/null
+++ b/transport.rst
@@ -0,0 +1,38 @@
+Transport.ConnectionInfo Class
+==============================
+
+:[C++]:
+    Namespace: `ndn`
+
+
+A Transport.ConnectionInfo is a base class for connection information used by subclasses of Transport.
+
+Transport Class
+===============
+
+:[C++]:
+    Namespace: `ndn`
+
+Transport Constructor
+---------------------
+
+Create a base class Transport where the methods throw an "unimplemented" error. You should use a derived class like :ref:`UdpTransport <UdpTransport>`.
+
+:Realizations:
+
+    - :ref:`UdpTransport Class <UdpTransport>`
+    - :ref:`TcpTransport Class <TcpTransport>`
+
+:[C++]:
+
+    .. code-block:: c++
+
+        Transport();
+
+:[JavaScript]:
+
+    .. code-block:: javascript
+
+        var Transport = function Transport()
+
+
