diff --git a/model/ccn/README b/model/ccn/README
deleted file mode 100644
index 6b9ef69..0000000
--- a/model/ccn/README
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory contains files borrowed and adapted from CCNx implementation
-
diff --git a/model/ccn/ccn.h b/model/ccn/ccn.h
deleted file mode 100644
index af9dcae..0000000
--- a/model/ccn/ccn.h
+++ /dev/null
@@ -1,407 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-/*
- *  ccn_ccn.h
- *  Abstraction
- *
- *  Created by Ilya on 7/29/11.
- *  Copyright 2011 __MyCompanyName__. All rights reserved.
- *
- */
-
-#ifndef CCN_CCN_DEFINED
-#define CCN_CCN_DEFINED
-
-#include <stdint.h>
-#include "ccn_coding.h"
-#include "ccn_charbuf.h"
-#include "ccn_indexbuf.h"
-
-/***********************************
- * Writing Names
- * Names for interests are constructed in charbufs using 
- * the following routines.
- */
-
-/*
- * ccn_name_init: reset charbuf to represent an empty Name in binary format
- * Return value is 0, or -1 for error.
- */
-int ccn_name_init(struct ccn_charbuf *c);
-
-/*
- * ccn_name_append: add a Component to a Name
- * The component is an arbitrary string of n octets, no escaping required.
- * Return value is 0, or -1 for error.
- */
-int ccn_name_append(struct ccn_charbuf *c, const void *component, size_t n);
-
-/*
- * ccn_name_append_str: add a Component that is a \0 terminated string.
- * The component added is the bytes of the string without the \0.
- * This function is convenient for those applications that construct 
- * component names from simple strings.
- * Return value is 0, or -1 for error
- */
-int ccn_name_append_str(struct ccn_charbuf *c, const char *s);
-
-/*
- * ccn_name_append_components: add sequence of ccnb-encoded Components
- *    to a ccnb-encoded Name
- * start and stop are offsets from ccnb
- * Return value is 0, or -1 for obvious error
- */
-int ccn_name_append_components(struct ccn_charbuf *c,
-                               const unsigned char *ccnb,
-                               size_t start, size_t stop);
-
-enum ccn_marker {
-    CCN_MARKER_NONE = -1,
-    CCN_MARKER_SEQNUM  = 0x00, /**< consecutive block sequence numbers */
-    CCN_MARKER_CONTROL = 0xC1, /**< commands, etc. */ 
-    CCN_MARKER_OSEQNUM = 0xF8, /**< deprecated */
-    CCN_MARKER_BLKID   = 0xFB, /**< nonconsecutive block ids */
-    CCN_MARKER_VERSION = 0xFD  /**< timestamp-based versioning */
-};
-
-/*
- * ccn_name_append_numeric: add binary Component to ccnb-encoded Name
- * These are special components used for marking versions, fragments, etc.
- * Return value is 0, or -1 for error
- * see doc/technical/NameConventions.html
- */
-int ccn_name_append_numeric(struct ccn_charbuf *c,
-                            enum ccn_marker tag, uintmax_t value);
-
-/*
- * ccn_name_append_nonce: add nonce Component to ccnb-encoded Name
- * Uses %C1.N.n marker.
- * see doc/technical/NameConventions.html
- */
-int ccn_name_append_nonce(struct ccn_charbuf *c);
-
-/*
- * ccn_name_split: find Component boundaries in a ccnb-encoded Name
- * Thin veneer over ccn_parse_Name().
- * returns -1 for error, otherwise the number of Components
- * components arg may be NULL to just do a validity check
- */
-int ccn_name_split(const struct ccn_charbuf *c,
-                   struct ccn_indexbuf* components);
-
-/*
- * ccn_name_chop: Chop the name down to n components.
- * returns -1 for error, otherwise the new number of Components
- * components arg may be NULL; if provided it must be consistent with
- * some prefix of the name, and is updated accordingly.
- * n may be negative to say how many components to remove instead of how
- * many to leave, e.g. -1 will remove just the last component.
- */
-int ccn_name_chop(struct ccn_charbuf *c,
-                  struct ccn_indexbuf* components, int n);
-
-
-
-
-/*********** Interest parsing ***********/
-
-/*
- * The parse of an interest results in an array of offsets into the 
- * wire representation, with the start and end of each major element and
- * a few of the inportant sub-elements.  The following enum allows those
- * array items to be referred to symbolically.  The *_B_* indices correspond
- * to beginning offsets and the *_E_* indices correspond to ending offsets.
- * An omitted element has its beginning and ending offset equal to each other.
- * Normally these offsets will end up in non-decreasing order.
- * Some aliasing tricks may be played here, e.g. since
- * offset[CCN_PI_E_ComponentLast] is always equal to
- * offset[CCN_PI_E_LastPrefixComponent],
- * we may define CCN_PI_E_ComponentLast = CCN_PI_E_LastPrefixComponent.
- * However, code should not rely on that,
- * since it may change from time to time as the
- * interest schema evolves.
- */
-enum ccn_parsed_interest_offsetid {
-  CCN_PI_B_Name,
-  CCN_PI_B_Component0,
-  CCN_PI_B_LastPrefixComponent,
-  CCN_PI_E_LastPrefixComponent,
-  CCN_PI_E_ComponentLast = CCN_PI_E_LastPrefixComponent,
-  CCN_PI_E_Name,
-  CCN_PI_B_MinSuffixComponents,
-  CCN_PI_E_MinSuffixComponents,
-  CCN_PI_B_MaxSuffixComponents,
-  CCN_PI_E_MaxSuffixComponents,
-  CCN_PI_B_PublisherID, // XXX - rename
-  CCN_PI_B_PublisherIDKeyDigest,
-  CCN_PI_E_PublisherIDKeyDigest,
-  CCN_PI_E_PublisherID,
-  CCN_PI_B_Exclude,
-  CCN_PI_E_Exclude,
-  CCN_PI_B_ChildSelector,
-  CCN_PI_E_ChildSelector,
-  CCN_PI_B_AnswerOriginKind,
-  CCN_PI_E_AnswerOriginKind,
-  CCN_PI_B_Scope,
-  CCN_PI_E_Scope,
-  CCN_PI_B_InterestLifetime,
-  CCN_PI_E_InterestLifetime,
-  CCN_PI_B_Nonce,
-  CCN_PI_E_Nonce,
-  CCN_PI_B_OTHER,
-  CCN_PI_E_OTHER,
-  CCN_PI_E
-};
-
-
-struct ccn_parsed_interest {
-  int magic;
-  int prefix_comps;
-  int min_suffix_comps;
-  int max_suffix_comps;
-  int orderpref;
-  int answerfrom;
-  int scope;
-  unsigned short offset[CCN_PI_E+1];
-};
-
-/*
- * Bitmasks for AnswerOriginKind
- */
-#define CCN_AOK_CS      0x1     /* Answer from content store */
-#define CCN_AOK_NEW     0x2     /* OK to produce new content */
-#define CCN_AOK_DEFAULT (CCN_AOK_CS | CCN_AOK_NEW)
-#define CCN_AOK_STALE   0x4     /* OK to answer with stale data */
-#define CCN_AOK_EXPIRE  0x10    /* Mark as stale (must have Scope 0) */
-
-/***********************************
- * Low-level binary formatting
- */
-
-/*
- * Append a ccnb start marker
- *
- * This forms the basic building block of ccnb-encoded data.
- * c is the buffer to append to.
- * Return value is 0, or -1 for error.
- */
-int ccn_charbuf_append_tt(struct ccn_charbuf *c, size_t val, enum ccn_tt tt);
-
-/**
- * Append a CCN_CLOSE
- *
- * Use this to close off an element in ccnb-encoded data.
- * @param c is the buffer to append to.
- * @returns 0 for success or -1 for error.
- */
-int ccn_charbuf_append_closer(struct ccn_charbuf *c);
-
-/***********************************
- * Slightly higher level binary formatting
- */
-
-/*
- * Append a non-negative integer as a UDATA.
- */
-int ccnb_append_number(struct ccn_charbuf *c, int nni);
-
-/*
- * Append a binary timestamp
- * as a BLOB using the ccn binary Timestamp representation (12-bit fraction).
- */
-int ccnb_append_timestamp_blob(struct ccn_charbuf *c,
-                               enum ccn_marker marker,
-                               long long secs, int nsecs);
-
-/*
- * Append a binary timestamp, using the current time.
- */
-int ccnb_append_now_blob(struct ccn_charbuf *c, enum ccn_marker marker);
-
-/*
- * Append a start-of-element marker.
- */
-int ccnb_element_begin(struct ccn_charbuf *c, enum ccn_dtag dtag);
-
-/*
- * Append an end-of-element marker.
- * This is the same as ccn_charbuf_append_closer()
- */
-int ccnb_element_end(struct ccn_charbuf *c);
-
-/*
- * Append a tagged BLOB
- */
-int ccnb_append_tagged_blob(struct ccn_charbuf *c, enum ccn_dtag dtag,
-                            const void *data, size_t size);
-
-/*
- * Append a tagged UDATA string, with printf-style formatting
- */
-int ccnb_tagged_putf(struct ccn_charbuf *c, enum ccn_dtag dtag,
-                     const char *fmt, ...);
-
-
-
-/***********************************
- * Binary decoding
- * These routines require that the whole binary object be buffered.
- */
-
-struct ccn_buf_decoder {
-  struct ccn_skeleton_decoder decoder;
-  const unsigned char *buf;
-  size_t size;
-};
-
-struct ccn_buf_decoder *ccn_buf_decoder_start(struct ccn_buf_decoder *d,
-                                              const unsigned char *buf, size_t size);
-
-void ccn_buf_advance(struct ccn_buf_decoder *d);
-int ccn_buf_advance_past_element(struct ccn_buf_decoder *d);
-
-/* The match routines return a boolean - true for match */
-int ccn_buf_match_dtag(struct ccn_buf_decoder *d, enum ccn_dtag dtag);
-
-int ccn_buf_match_some_dtag(struct ccn_buf_decoder *d);
-
-int ccn_buf_match_some_blob(struct ccn_buf_decoder *d);
-int ccn_buf_match_blob(struct ccn_buf_decoder *d,
-                       const unsigned char **bufp, size_t *sizep);
-
-int ccn_buf_match_udata(struct ccn_buf_decoder *d, const char *s);
-
-int ccn_buf_match_attr(struct ccn_buf_decoder *d, const char *s);
-
-/* On error, the parse routines enter an error state and return a negative value. */
-/*int ccn_parse_required_tagged_BLOB(struct ccn_buf_decoder *d,
-                                   enum ccn_dtag dtag,
-                                   int minlen, int maxlen);
-int ccn_parse_optional_tagged_BLOB(struct ccn_buf_decoder *d,
-                                   enum ccn_dtag dtag,
-                                   int minlen, int maxlen);
-int ccn_parse_nonNegativeInteger(struct ccn_buf_decoder *d);
-int ccn_parse_optional_tagged_nonNegativeInteger(struct ccn_buf_decoder *d,
-                                                 enum ccn_dtag dtag);
-int ccn_parse_uintmax(struct ccn_buf_decoder *d, uintmax_t *result);
-int ccn_parse_tagged_string(struct ccn_buf_decoder *d,
-                            enum ccn_dtag dtag, struct ccn_charbuf *store);*/
-/* check the decoder error state for these two - result can't be negative */
-/*uintmax_t ccn_parse_required_tagged_binary_number(struct ccn_buf_decoder *d,
-                                                  enum ccn_dtag dtag,
-                                                  int minlen, int maxlen);
-uintmax_t ccn_parse_optional_tagged_binary_number(struct ccn_buf_decoder *d,
-                                                  enum ccn_dtag dtag,
-                                                  int minlen, int maxlen,
-                                                  uintmax_t default_value);*/
-
-/**
- * Enter an error state if element closer not found.
- */
-void ccn_buf_check_close(struct ccn_buf_decoder *d);
-
-/*
- * ccn_ref_tagged_BLOB: Get address & size associated with blob-valued element
- * Returns 0 for success, negative value for error.
- */
-int ccn_ref_tagged_BLOB(enum ccn_dtag tt,
-                        const unsigned char *buf,
-                        size_t start, size_t stop,
-                        const unsigned char **presult, size_t *psize);
-
-/*
- * ccn_parse_Name: Parses a ccnb-encoded name
- * components may be NULL, otherwise is filled in with Component boundary offsets
- * Returns the number of Components in the Name, or -1 if there is an error.
- */
-int ccn_parse_Name(struct ccn_buf_decoder *d, struct ccn_indexbuf *components);
-
-/***********************************
- * Authenticators and signatures for content are constructed in charbufs
- * using the following routines.
- */
-
-enum ccn_content_type {
-  CCN_CONTENT_DATA = 0x0C04C0,
-  CCN_CONTENT_ENCR = 0x10D091,
-  CCN_CONTENT_GONE = 0x18E344,
-  CCN_CONTENT_KEY  = 0x28463F,
-  CCN_CONTENT_LINK = 0x2C834A,
-  CCN_CONTENT_NACK = 0x34008A
-};
-
-
-/*********** ContentObject parsing ***********/
-/* Analogous to enum ccn_parsed_interest_offsetid, but for content */
-enum ccn_parsed_content_object_offsetid {
-  CCN_PCO_B_Signature,
-  CCN_PCO_B_DigestAlgorithm,
-  CCN_PCO_E_DigestAlgorithm,
-  CCN_PCO_B_Witness,
-  CCN_PCO_E_Witness,
-  CCN_PCO_B_SignatureBits,
-  CCN_PCO_E_SignatureBits,
-  CCN_PCO_E_Signature,
-  CCN_PCO_B_Name,
-  CCN_PCO_B_Component0,
-  CCN_PCO_E_ComponentN,
-  CCN_PCO_E_ComponentLast = CCN_PCO_E_ComponentN,
-  CCN_PCO_E_Name,
-  CCN_PCO_B_SignedInfo,
-  CCN_PCO_B_PublisherPublicKeyDigest,
-  CCN_PCO_E_PublisherPublicKeyDigest,
-  CCN_PCO_B_Timestamp,
-  CCN_PCO_E_Timestamp,
-  CCN_PCO_B_Type,
-  CCN_PCO_E_Type,
-  CCN_PCO_B_FreshnessSeconds,
-  CCN_PCO_E_FreshnessSeconds,
-  CCN_PCO_B_FinalBlockID,
-  CCN_PCO_E_FinalBlockID,
-  CCN_PCO_B_KeyLocator,
-  /* Exactly one of Key, Certificate, or KeyName will be present */
-  CCN_PCO_B_Key_Certificate_KeyName,
-  CCN_PCO_B_KeyName_Name,
-  CCN_PCO_E_KeyName_Name,
-  CCN_PCO_B_KeyName_Pub,
-  CCN_PCO_E_KeyName_Pub,
-  CCN_PCO_E_Key_Certificate_KeyName,
-  CCN_PCO_E_KeyLocator,
-  CCN_PCO_E_SignedInfo,
-  CCN_PCO_B_Content,
-  CCN_PCO_E_Content,
-  CCN_PCO_E
-};
-
-struct ccn_parsed_ContentObject {
-  int magic;
-  enum ccn_content_type type;
-  int name_ncomps;
-  unsigned short offset[CCN_PCO_E+1];
-  unsigned char digest[32];	/* Computed only when needed */
-  int digest_bytes;
-};
-
-int ccn_encode_ContentObject(struct ccn_charbuf *buf,
-                             const struct ccn_charbuf *Name,
-                             const void *data,
-                             size_t size);
-#endif
diff --git a/model/ccn/ccn_buf_decoder.cc b/model/ccn/ccn_buf_decoder.cc
deleted file mode 100644
index eeb51fa..0000000
--- a/model/ccn/ccn_buf_decoder.cc
+++ /dev/null
@@ -1,930 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include "ccn.h"
-#include "ccn_charbuf.h"
-#include "ccn_coding.h"
-#include "ccn_indexbuf.h"
-
-
-struct ccn_buf_decoder *
-ccn_buf_decoder_start(struct ccn_buf_decoder *d,
-                      const unsigned char *buf, size_t size)
-{
-  memset(&d->decoder, 0, sizeof(d->decoder));
-  d->decoder.state |= CCN_DSTATE_PAUSE;
-  d->buf = buf;
-  d->size = size;
-  ccn_skeleton_decode(&d->decoder, buf, size);
-  return(d);
-}
-
-void
-ccn_buf_advance(struct ccn_buf_decoder *d)
-{
-  ccn_skeleton_decode(&d->decoder,
-                      d->buf + d->decoder.index,
-                      d->size - d->decoder.index);
-}
-
-int
-ccn_buf_match_dtag(struct ccn_buf_decoder *d, enum ccn_dtag dtag)
-{
-  return (d->decoder.state >= 0 &&
-          CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_DTAG &&
-          (int)d->decoder.numval == dtag);
-}
-
-int
-ccn_buf_match_some_dtag(struct ccn_buf_decoder *d)
-{
-  return(d->decoder.state >= 0 &&
-         CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_DTAG);
-}
-
-int
-ccn_buf_match_some_blob(struct ccn_buf_decoder *d)
-{
-  return(d->decoder.state >= 0 &&
-         CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_BLOB);
-}
-
-int
-ccn_buf_match_blob(struct ccn_buf_decoder *d,
-                   const unsigned char **bufp, size_t *sizep)
-{
-  if (ccn_buf_match_some_blob(d)) {
-    if (bufp != NULL)
-      *bufp = d->buf + d->decoder.index;
-    if (sizep != NULL)
-      *sizep = d->decoder.numval;
-    return (1);
-  }
-  if (bufp != NULL)
-    *bufp = d->buf + d->decoder.token_index;
-  if (sizep != NULL)
-    *sizep = 0;
-  return(0);
-}
-
-int
-ccn_buf_match_udata(struct ccn_buf_decoder *d, const char *s)
-{
-  size_t len = strlen(s);
-  return (d->decoder.state >= 0 &&
-          CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_UDATA &&
-          d->decoder.numval == len &&
-          0 == memcmp(d->buf + d->decoder.index, s, len));
-}
-
-int
-ccn_buf_match_attr(struct ccn_buf_decoder *d, const char *s)
-{
-  size_t len = strlen(s);
-  return (d->decoder.state >= 0 &&
-          CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_ATTR &&
-          d->decoder.numval == len &&
-          0 == memcmp(d->buf + d->decoder.index, s, len));
-}
-
-void
-ccn_buf_check_close(struct ccn_buf_decoder *d)
-{
-  if (d->decoder.state >= 0) {
-    if (CCN_GET_TT_FROM_DSTATE(d->decoder.state) != CCN_NO_TOKEN)
-      d->decoder.state = CCN_DSTATE_ERR_NEST;
-    else
-      ccn_buf_advance(d);
-  }
-}
-
-int
-ccn_buf_advance_past_element(struct ccn_buf_decoder *d)
-{
-  enum ccn_tt tt;
-  int nest;
-  if (d->decoder.state < 0)
-    return(d->decoder.state);
-  tt = (ccn_tt)CCN_GET_TT_FROM_DSTATE(d->decoder.state);
-  if (tt == CCN_DTAG || tt == CCN_TAG) {
-    nest = d->decoder.nest;
-    ccn_buf_advance(d);
-    while (d->decoder.state >= 0 && d->decoder.nest >= nest)
-      ccn_buf_advance(d);
-    /* The nest decrements before the closer is consumed */
-    ccn_buf_check_close(d);
-  }
-  else
-    return(-1);
-  if (d->decoder.state < 0)
-    return(d->decoder.state);
-  return (0);
-}
-
-int
-ccn_parse_required_tagged_BLOB(struct ccn_buf_decoder *d, enum ccn_dtag dtag,
-                               int minlen, int maxlen)
-{
-  int res = -1;
-  size_t len = 0;
-  if (ccn_buf_match_dtag(d, dtag)) {
-    res = d->decoder.element_index;
-    ccn_buf_advance(d);
-    if (ccn_buf_match_some_blob(d)) {
-      len = d->decoder.numval;
-      ccn_buf_advance(d);
-    }
-    ccn_buf_check_close(d);
-    if ((int)len < minlen || (maxlen >= 0 && (int)len > maxlen)) {
-      d->decoder.state = -__LINE__;
-    }
-  }
-  else
-    d->decoder.state = -__LINE__;
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  return(res);
-}
-
-int
-ccn_parse_optional_tagged_BLOB(struct ccn_buf_decoder *d, enum ccn_dtag dtag,
-                               int minlen, int maxlen)
-{
-  if (ccn_buf_match_dtag(d, dtag))
-    return(ccn_parse_required_tagged_BLOB(d, dtag, minlen, maxlen));
-  return(-1);
-}
-
-uintmax_t
-ccn_parse_required_tagged_binary_number(struct ccn_buf_decoder *d,
-                                        enum ccn_dtag dtag,
-                                        int minlen, int maxlen)
-{
-  uintmax_t value = 0;
-  const unsigned char *p = NULL;
-  size_t len = 0;
-  int i;
-  if (0 <= minlen && minlen <= maxlen && maxlen <= (int)sizeof(value) &&
-      ccn_buf_match_dtag(d, dtag)) {
-    ccn_buf_advance(d);
-    if (ccn_buf_match_blob(d, &p, &len))
-      ccn_buf_advance(d);
-    ccn_buf_check_close(d);
-    if (d->decoder.state < 0)
-      return(value);
-    if (minlen <= (int)len && (int)len <= maxlen)
-      for (i = 0; i < (int)len; i++)
-        value = (value << 8) + p[i];
-    else
-      d->decoder.state = -__LINE__;
-  }
-  else
-    d->decoder.state = -__LINE__;
-  return(value);
-}
-
-uintmax_t
-ccn_parse_optional_tagged_binary_number(struct ccn_buf_decoder *d, enum ccn_dtag dtag,
-                                        int minlen, int maxlen, uintmax_t default_value)
-{
-  if (ccn_buf_match_dtag(d, dtag))
-    return(ccn_parse_required_tagged_binary_number(d, dtag, minlen, maxlen));
-  return(default_value);
-}
-
-int
-ccn_parse_required_tagged_UDATA(struct ccn_buf_decoder *d, enum ccn_dtag dtag)
-{
-  int res = -1;
-  if (ccn_buf_match_dtag(d, dtag)) {
-    res = d->decoder.element_index;
-    ccn_buf_advance(d);
-    if (d->decoder.state >= 0 &&
-        CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_UDATA)
-      ccn_buf_advance(d);
-    else
-      d->decoder.state = -__LINE__;
-    ccn_buf_check_close(d);
-  }
-  else
-    d->decoder.state = -__LINE__;
-  if (d->decoder.state < 0)
-    return (-1);
-  return(res);
-}
-
-int
-ccn_parse_optional_tagged_UDATA(struct ccn_buf_decoder *d, enum ccn_dtag dtag)
-{
-  if (ccn_buf_match_dtag(d, dtag))
-    return(ccn_parse_required_tagged_UDATA(d, dtag));
-  return(-1);
-}
-
-/**
- * Parses a ccnb-encoded element expected to contain a UDATA string.
- * @param d is the decoder
- * @param dtag is the expected dtag value
- * @param store - on success, the string value is appended to store,
- *        with null termination.
- * @returns the offset into the store buffer of the copied value, or -1 for error.
- *        If a parse error occurs, d->decoder.state is set to a negative value.
- *        If the element is not present, -1 is returned but no parse error
- *        is indicated.
- */
-int
-ccn_parse_tagged_string(struct ccn_buf_decoder *d, enum ccn_dtag dtag, struct ccn_charbuf *store)
-{
-  const unsigned char *p = NULL;
-  size_t size = 0;
-  int res;
-  
-  if (ccn_buf_match_dtag(d, dtag)) {
-    ccn_buf_advance(d);
-    if (d->decoder.state >= 0 &&
-        CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_UDATA) {
-      res = store->length;
-      p = d->buf + d->decoder.index;
-      size = d->decoder.numval;
-      ccn_buf_advance(d);
-    }
-    ccn_buf_check_close(d);
-    if (d->decoder.state >= 0) {
-      // XXX - should check for valid utf-8 data.
-      res = store->length;
-      if (size > 0)
-        ccn_charbuf_append(store, p, size);
-      ccn_charbuf_append_value(store, 0, 1);
-      return(res);
-    }
-  }
-  return(-1);
-}
-
-/**
- * Parses a ccnb-encoded name
- * @param d is the decoder
- * @param components may be NULL, otherwise is filled in with the 
- *        Component boundary offsets
- * @returns the number of Components in the Name, or -1 if there is an error.
- */
-int
-ccn_parse_Name(struct ccn_buf_decoder *d, struct ccn_indexbuf *components)
-{
-  int ncomp = 0;
-  if (ccn_buf_match_dtag(d, CCN_DTAG_Name)) {
-    if (components != NULL) components->n = 0;
-    ccn_buf_advance(d);
-    while (ccn_buf_match_dtag(d, CCN_DTAG_Component)) {
-      if (components != NULL)
-        ccn_indexbuf_append_element(components, d->decoder.token_index);
-      ncomp += 1;
-      ccn_buf_advance(d);
-      if (ccn_buf_match_blob(d, NULL, NULL))
-        ccn_buf_advance(d);
-      ccn_buf_check_close(d);
-    }
-    if (components != NULL)
-      ccn_indexbuf_append_element(components, d->decoder.token_index);
-    ccn_buf_check_close(d);
-  }
-  else
-    d->decoder.state = -__LINE__;
-  if (d->decoder.state < 0)
-    return(-1);
-  else
-    return(ncomp);
-}
-
-int
-ccn_parse_PublisherID(struct ccn_buf_decoder *d, struct ccn_parsed_interest *pi)
-{
-  int res = -1;
-  int iskey = 0;
-  unsigned pubstart = d->decoder.token_index;
-  unsigned keystart = pubstart;
-  unsigned keyend = pubstart;
-  unsigned pubend = pubstart;
-  iskey = ccn_buf_match_dtag(d, CCN_DTAG_PublisherPublicKeyDigest);
-  if (iskey                                                          ||
-      ccn_buf_match_dtag(d, CCN_DTAG_PublisherCertificateDigest)     ||
-      ccn_buf_match_dtag(d, CCN_DTAG_PublisherIssuerKeyDigest)       ||
-      ccn_buf_match_dtag(d, CCN_DTAG_PublisherIssuerCertificateDigest)) {
-    res = d->decoder.element_index;
-    ccn_buf_advance(d);
-    keystart = d->decoder.token_index;
-    if (!ccn_buf_match_some_blob(d))
-      return (d->decoder.state = -__LINE__);
-    ccn_buf_advance(d);
-    keyend = d->decoder.token_index;
-    ccn_buf_check_close(d);
-    pubend = d->decoder.token_index;
-  }
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  if (pi != NULL) {
-    pi->offset[CCN_PI_B_PublisherID] = pubstart;
-    pi->offset[CCN_PI_B_PublisherIDKeyDigest] = keystart;
-    pi->offset[CCN_PI_E_PublisherIDKeyDigest] = iskey ? keyend : keystart;
-    pi->offset[CCN_PI_E_PublisherID] = pubend;
-  }
-  return(res);
-}
-
-static int
-ccn_parse_optional_Any_or_Bloom(struct ccn_buf_decoder *d)
-{
-  int res;
-  res = ccn_parse_optional_tagged_BLOB(d, CCN_DTAG_Bloom, 1, 1024+8);
-  if (res >= 0)
-    return(res);
-  if (ccn_buf_match_dtag(d, CCN_DTAG_Any)) {
-    ccn_buf_advance(d);
-    ccn_buf_check_close(d);
-    res = 0;
-  }
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  return(res);
-}
-
-int
-ccn_parse_Exclude(struct ccn_buf_decoder *d)
-{
-  int res = -1;
-  if (ccn_buf_match_dtag(d, CCN_DTAG_Exclude)) {
-    res = d->decoder.element_index;
-    ccn_buf_advance(d);
-    ccn_parse_optional_Any_or_Bloom(d);
-    while (ccn_buf_match_dtag(d, CCN_DTAG_Component)) {
-      ccn_parse_required_tagged_BLOB(d, CCN_DTAG_Component, 0, -1);
-      ccn_parse_optional_Any_or_Bloom(d);
-    }
-    ccn_buf_check_close(d);
-  }
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  return(res);
-}
-
-
-
-int
-ccn_parse_nonNegativeInteger(struct ccn_buf_decoder *d)
-{
-  const unsigned char *p;
-  int i;
-  int n;
-  int val;
-  int newval;
-  unsigned char c;
-  if (d->decoder.state < 0)
-    return(d->decoder.state);
-  if (CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_UDATA) {
-    p = d->buf + d->decoder.index;
-    n = d->decoder.numval;
-    if (n < 1)
-      return(d->decoder.state = -__LINE__);
-    val = 0;
-    for (i = 0; i < n; i++) {
-      c = p[i];
-      if ('0' <= c && c <= '9') {
-        newval = val * 10 + (c - '0');
-        if (newval < val)
-          return(d->decoder.state = -__LINE__);
-        val = newval;
-      }
-      else
-        return(d->decoder.state = -__LINE__);
-    }
-    ccn_buf_advance(d);
-    return(val);
-  }
-  return(d->decoder.state = -__LINE__);
-}
-
-/**
- * Parse a potentially large non-negative integer.
- *
- * @returns 0 for success, and the value is place in *result; for an error
- * a negative value is returned and *result is unchanged.
- */
-int
-ccn_parse_uintmax(struct ccn_buf_decoder *d, uintmax_t *result)
-{
-  const unsigned char *p;
-  int i;
-  int n;
-  uintmax_t val;
-  uintmax_t newval;
-  unsigned char c;
-  if (d->decoder.state < 0)
-    return(d->decoder.state);
-  if (CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_UDATA) {
-    p = d->buf + d->decoder.index;
-    n = d->decoder.numval;
-    if (n < 1)
-      return(d->decoder.state = -__LINE__);
-    val = 0;
-    for (i = 0; i < n; i++) {
-      c = p[i];
-      if ('0' <= c && c <= '9') {
-        newval = val * 10 + (c - '0');
-        if (newval < val)
-          return(d->decoder.state = -__LINE__);
-        val = newval;
-      }
-      else
-        return(d->decoder.state = -__LINE__);
-    }
-    ccn_buf_advance(d);
-    *result = val;
-    return(0);
-  }
-  return(d->decoder.state = -__LINE__);
-}
-
-int
-ccn_parse_timestamp(struct ccn_buf_decoder *d)
-{
-  const unsigned char dlm[] = "--T::.Z";
-  const unsigned char *p;
-  int i;
-  int k;
-  int n;
-  if (d->decoder.state < 0)
-    return(d->decoder.state);
-  if (CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_BLOB) {
-    /* New-style binary timestamp, 12-bit fraction */
-    n = d->decoder.numval;
-    if (n < 3 || n > 7)
-      return(d->decoder.state = -__LINE__);
-    ccn_buf_advance(d);
-    return(0);
-  }
-  if (CCN_GET_TT_FROM_DSTATE(d->decoder.state) == CCN_UDATA) {
-    /* This is for some temporary back-compatibility */
-    p = d->buf + d->decoder.index;
-    n = d->decoder.numval;
-    if (n < 8 || n > 40)
-      return(d->decoder.state = -__LINE__);
-    if (p[n - 1] != 'Z')
-      return(d->decoder.state = -__LINE__);
-    for (i = 0, k = 0; i < n && '0' <= p[i] && p[i] <= '9';) {
-      i++;
-      if (i < n && p[i] == dlm[k]) {
-        if (dlm[k++] == 0)
-          return(d->decoder.state = -__LINE__);
-        i++;
-      }
-    }
-    if (k < 5)
-      return(d->decoder.state = -__LINE__);
-    if (!(i == n || i == n - 1))
-      return(d->decoder.state = -__LINE__);
-    ccn_buf_advance(d);
-    return(0);
-  }
-  return(d->decoder.state = -__LINE__);
-}
-
-int
-ccn_parse_required_tagged_timestamp(struct ccn_buf_decoder *d, enum ccn_dtag dtag)
-{
-  int res = -1;
-  if (ccn_buf_match_dtag(d, dtag)) {
-    res = d->decoder.element_index;
-    ccn_buf_advance(d);
-    ccn_parse_timestamp(d);
-    ccn_buf_check_close(d);
-  }
-  else
-    d->decoder.state = -__LINE__;
-  if (d->decoder.state < 0)
-    return (-1);
-  return(res);
-}
-
-int
-ccn_parse_optional_tagged_nonNegativeInteger(struct ccn_buf_decoder *d, enum ccn_dtag dtag)
-{
-  int res = -1;
-  if (ccn_buf_match_dtag(d, dtag)) {
-    ccn_buf_advance(d);
-    res = ccn_parse_nonNegativeInteger(d);
-    ccn_buf_check_close(d);
-  }
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  return(res);
-}
-
-int
-ccn_fetch_tagged_nonNegativeInteger(enum ccn_dtag tt,
-                                    const unsigned char *buf,
-                                    size_t start, size_t stop)
-{
-  struct ccn_buf_decoder decoder;
-  struct ccn_buf_decoder *d;
-  int result = -1;
-  if (stop < start) return(-1);
-  d = ccn_buf_decoder_start(&decoder, buf + start, stop - start);
-  if (ccn_buf_match_dtag(d, tt)) {
-    ccn_buf_advance(d);
-    result = ccn_parse_nonNegativeInteger(d);
-    ccn_buf_check_close(d);
-  }
-  if (result < 0)
-    return(-1);
-  return(result);
-}
-
-
-int
-ccn_parse_interest(const unsigned char *msg, size_t size,
-                   struct ccn_parsed_interest *interest,
-                   struct ccn_indexbuf *components)
-{
-  struct ccn_buf_decoder decoder;
-  struct ccn_buf_decoder *d = ccn_buf_decoder_start(&decoder, msg, size);
-  int magic = 0;
-  int ncomp = 0;
-  int res;
-  if (ccn_buf_match_dtag(d, CCN_DTAG_Interest)) {
-    if (components == NULL) {
-      /* We need to have the component offsets. */
-      components = ccn_indexbuf_create();
-      if (components == NULL) return(-1);
-      res = ccn_parse_interest(msg, size, interest, components);
-      ccn_indexbuf_destroy(&components);
-      return(res);
-    }
-    ccn_buf_advance(d);
-    interest->offset[CCN_PI_B_Name] = d->decoder.element_index;
-    interest->offset[CCN_PI_B_Component0] = d->decoder.index;
-    ncomp = ccn_parse_Name(d, components);
-    if (d->decoder.state < 0) {
-      memset(interest->offset, 0, sizeof(interest->offset));
-      return(d->decoder.state);
-    }
-    interest->offset[CCN_PI_E_ComponentLast] = d->decoder.token_index - 1;
-    interest->offset[CCN_PI_E_Name] = d->decoder.token_index;
-    interest->prefix_comps = ncomp;
-    interest->offset[CCN_PI_B_LastPrefixComponent] = components->buf[(ncomp > 0) ? (ncomp - 1) : 0];
-    interest->offset[CCN_PI_E_LastPrefixComponent] = components->buf[ncomp];
-    /* optional MinSuffixComponents, MaxSuffixComponents */
-    interest->min_suffix_comps = 0;
-    interest->max_suffix_comps = 32767;
-    interest->offset[CCN_PI_B_MinSuffixComponents] = d->decoder.token_index;
-    res = ccn_parse_optional_tagged_nonNegativeInteger(d,
-                                                       CCN_DTAG_MinSuffixComponents);
-    interest->offset[CCN_PI_E_MinSuffixComponents] = d->decoder.token_index;
-    if (res >= 0)
-      interest->min_suffix_comps = res;
-    interest->offset[CCN_PI_B_MaxSuffixComponents] = d->decoder.token_index;
-    res = ccn_parse_optional_tagged_nonNegativeInteger(d,
-                                                       CCN_DTAG_MaxSuffixComponents);
-    interest->offset[CCN_PI_E_MaxSuffixComponents] = d->decoder.token_index;
-    if (res >= 0)
-      interest->max_suffix_comps = res;
-    if (interest->max_suffix_comps < interest->min_suffix_comps)
-      return (d->decoder.state = -__LINE__);
-    /* optional PublisherID */
-    res = ccn_parse_PublisherID(d, interest);
-    /* optional Exclude element */
-    interest->offset[CCN_PI_B_Exclude] = d->decoder.token_index;
-    res = ccn_parse_Exclude(d);
-    interest->offset[CCN_PI_E_Exclude] = d->decoder.token_index;
-    /* optional ChildSelector */
-    interest->offset[CCN_PI_B_ChildSelector] = d->decoder.token_index;
-    res = ccn_parse_optional_tagged_nonNegativeInteger(d,
-                                                       CCN_DTAG_ChildSelector);
-    if (res < 0)
-      res = 0;
-    interest->orderpref = res;
-    interest->offset[CCN_PI_E_ChildSelector] = d->decoder.token_index;
-    if (interest->orderpref > 5)
-      return (d->decoder.state = -__LINE__);        
-    /* optional AnswerOriginKind */
-    interest->offset[CCN_PI_B_AnswerOriginKind] = d->decoder.token_index;
-    interest->answerfrom = ccn_parse_optional_tagged_nonNegativeInteger(d,
-                                                                        CCN_DTAG_AnswerOriginKind);
-    interest->offset[CCN_PI_E_AnswerOriginKind] = d->decoder.token_index;
-    if (interest->answerfrom == -1)
-      interest->answerfrom = CCN_AOK_DEFAULT;
-    else if ((interest->answerfrom & CCN_AOK_NEW) != 0 &&
-             (interest->answerfrom & CCN_AOK_CS) == 0)
-      return (d->decoder.state = -__LINE__);
-    /* optional Scope */
-    interest->offset[CCN_PI_B_Scope] = d->decoder.token_index;
-    interest->scope = ccn_parse_optional_tagged_nonNegativeInteger(d,
-                                                                   CCN_DTAG_Scope);
-    interest->offset[CCN_PI_E_Scope] = d->decoder.token_index;
-    if (interest->scope > 9)
-      return (d->decoder.state = -__LINE__);
-    if ((interest->answerfrom & CCN_AOK_EXPIRE) != 0 &&
-        interest->scope != 0)
-      return (d->decoder.state = -__LINE__);
-    /* optional InterestLifetime */
-    interest->offset[CCN_PI_B_InterestLifetime] = d->decoder.token_index;
-    res = ccn_parse_optional_tagged_BLOB(d, CCN_DTAG_InterestLifetime, 1, 8);
-    if (res >= 0)
-      magic |= 20100401;
-    interest->offset[CCN_PI_E_InterestLifetime] = d->decoder.token_index;
-    /* optional Nonce */
-    interest->offset[CCN_PI_B_Nonce] = d->decoder.token_index;
-    res = ccn_parse_optional_tagged_BLOB(d, CCN_DTAG_Nonce, 4, 64);
-    interest->offset[CCN_PI_E_Nonce] = d->decoder.token_index;
-    /* Allow for no experimental stuff */
-    interest->offset[CCN_PI_B_OTHER] = d->decoder.token_index;
-    interest->offset[CCN_PI_E_OTHER] = d->decoder.token_index;
-    ccn_buf_check_close(d);
-    interest->offset[CCN_PI_E] = d->decoder.index;
-  }
-  else
-    return (d->decoder.state = -__LINE__);
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  if (d->decoder.index != (int)size || !CCN_FINAL_DSTATE(d->decoder.state))
-    return (CCN_DSTATE_ERR_CODING);
-  if (magic == 0)
-    magic = 20090701;
-  if (!(magic == 20090701 || magic == 20100401))
-    return (d->decoder.state = -__LINE__);
-  interest->magic = magic;
-  return (ncomp);
-}
-
-struct parsed_KeyName {
-  int Name;
-  int endName;
-  int PublisherID;
-  int endPublisherID;
-};
-
-static int
-ccn_parse_KeyName(struct ccn_buf_decoder *d, struct parsed_KeyName *x)
-{
-  int res = -1;
-  if (ccn_buf_match_dtag(d, CCN_DTAG_KeyName)) {
-    res = d->decoder.element_index;
-    ccn_buf_advance(d);
-    x->Name = d->decoder.token_index;
-    ccn_parse_Name(d, NULL);
-    x->endName = d->decoder.token_index;
-    x->PublisherID = ccn_parse_PublisherID(d, NULL);
-    x->endPublisherID = d->decoder.token_index;
-    ccn_buf_check_close(d);
-  }
-  else
-    d->decoder.state = -__LINE__;
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  return(res);
-}
-
-static int
-ccn_parse_Signature(struct ccn_buf_decoder *d, struct ccn_parsed_ContentObject *x)
-{
-  int res = -1;
-  int i;
-  struct ccn_parsed_ContentObject dummy;
-  if (x == NULL)
-    x = &dummy;
-  for (i = CCN_PCO_B_Signature; i <= CCN_PCO_E_Signature; i++) {
-    x->offset[i] = d->decoder.token_index;
-  }
-  if (ccn_buf_match_dtag(d, CCN_DTAG_Signature)) {
-    res = d->decoder.element_index;
-    ccn_buf_advance(d);
-    x->offset[CCN_PCO_B_DigestAlgorithm] = d->decoder.token_index;
-    ccn_parse_optional_tagged_UDATA(d, CCN_DTAG_DigestAlgorithm);
-    x->offset[CCN_PCO_E_DigestAlgorithm] = d->decoder.token_index;
-    x->offset[CCN_PCO_B_Witness] = d->decoder.token_index;
-    ccn_parse_optional_tagged_BLOB(d, CCN_DTAG_Witness, 8, -1);
-    x->offset[CCN_PCO_E_Witness] = d->decoder.token_index;
-    x->offset[CCN_PCO_B_SignatureBits] = d->decoder.token_index;
-    ccn_parse_required_tagged_BLOB(d, CCN_DTAG_SignatureBits, 16, -1);
-    x->offset[CCN_PCO_E_SignatureBits] = d->decoder.token_index;
-    ccn_buf_check_close(d);
-    x->offset[CCN_PCO_E_Signature] = d->decoder.token_index;
-  }
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  return(res);
-}
-
-static int
-ccn_parse_SignedInfo(struct ccn_buf_decoder *d, struct ccn_parsed_ContentObject *x)
-{
-  x->offset[CCN_PCO_B_SignedInfo] = d->decoder.token_index;
-  if (ccn_buf_match_dtag(d, CCN_DTAG_SignedInfo)) {
-    ccn_buf_advance(d);
-    x->offset[CCN_PCO_B_PublisherPublicKeyDigest] = d->decoder.token_index;
-    ccn_parse_required_tagged_BLOB(d, CCN_DTAG_PublisherPublicKeyDigest, 16, 64);
-    x->offset[CCN_PCO_E_PublisherPublicKeyDigest] = d->decoder.token_index;
-    
-    x->offset[CCN_PCO_B_Timestamp] = d->decoder.token_index;
-    ccn_parse_required_tagged_timestamp(d, CCN_DTAG_Timestamp);
-    x->offset[CCN_PCO_E_Timestamp] = d->decoder.token_index;
-    
-    x->offset[CCN_PCO_B_Type] = d->decoder.token_index;
-    x->type = CCN_CONTENT_DATA;
-    x->type = (ccn_content_type)ccn_parse_optional_tagged_binary_number(d, CCN_DTAG_Type, 3, 3, CCN_CONTENT_DATA);
-    x->offset[CCN_PCO_E_Type] = d->decoder.token_index;
-    
-    x->offset[CCN_PCO_B_FreshnessSeconds] = d->decoder.token_index;
-    ccn_parse_optional_tagged_nonNegativeInteger(d, CCN_DTAG_FreshnessSeconds);
-    x->offset[CCN_PCO_E_FreshnessSeconds] = d->decoder.token_index;
-    
-    x->offset[CCN_PCO_B_FinalBlockID] = d->decoder.token_index;
-    ccn_parse_optional_tagged_BLOB(d, CCN_DTAG_FinalBlockID, 1, -1);
-    x->offset[CCN_PCO_E_FinalBlockID] = d->decoder.token_index;
-    
-    x->offset[CCN_PCO_B_KeyLocator] = d->decoder.token_index;
-    x->offset[CCN_PCO_B_Key_Certificate_KeyName] = d->decoder.token_index;
-    x->offset[CCN_PCO_E_Key_Certificate_KeyName] = d->decoder.token_index;
-    x->offset[CCN_PCO_B_KeyName_Name] = d->decoder.token_index;
-    x->offset[CCN_PCO_E_KeyName_Name] = d->decoder.token_index;
-    x->offset[CCN_PCO_B_KeyName_Pub] = d->decoder.token_index;
-    x->offset[CCN_PCO_E_KeyName_Pub] = d->decoder.token_index;
-    if (ccn_buf_match_dtag(d, CCN_DTAG_KeyLocator)) {
-      ccn_buf_advance(d);
-      x->offset[CCN_PCO_B_Key_Certificate_KeyName] = d->decoder.token_index;
-      if (ccn_buf_match_dtag(d, CCN_DTAG_Key)) {
-        (void)ccn_parse_required_tagged_BLOB(d, CCN_DTAG_Key, 0, -1);
-      }
-      else if (ccn_buf_match_dtag(d, CCN_DTAG_Certificate)) {
-        (void)ccn_parse_required_tagged_BLOB(d, CCN_DTAG_Certificate, 0, -1);
-      }
-      else {
-        struct parsed_KeyName keyname = {-1, -1, -1, -1};
-        if (ccn_parse_KeyName(d, &keyname) >= 0) {
-          if (keyname.Name >= 0) {
-            x->offset[CCN_PCO_B_KeyName_Name] = keyname.Name;
-            x->offset[CCN_PCO_E_KeyName_Name] = keyname.endName;
-          }
-          if (keyname.PublisherID >= 0) {
-            x->offset[CCN_PCO_B_KeyName_Pub] = keyname.PublisherID;
-            x->offset[CCN_PCO_E_KeyName_Pub] = keyname.endPublisherID;
-          }
-        }
-      }
-      x->offset[CCN_PCO_E_Key_Certificate_KeyName] = d->decoder.token_index;
-      ccn_buf_check_close(d);
-    }
-    x->offset[CCN_PCO_E_KeyLocator] = d->decoder.token_index;
-    ccn_buf_check_close(d);
-  }
-  else
-    d->decoder.state = -__LINE__;
-  x->offset[CCN_PCO_E_SignedInfo] = d->decoder.token_index;
-  if (d->decoder.state < 0)
-    return (d->decoder.state);
-  return(0);
-}
-
-int
-ccn_parse_ContentObject(const unsigned char *msg, size_t size,
-                        struct ccn_parsed_ContentObject *x,
-                        struct ccn_indexbuf *components)
-{
-  struct ccn_buf_decoder decoder;
-  struct ccn_buf_decoder *d = ccn_buf_decoder_start(&decoder, msg, size);
-  int res;
-  x->magic = 20090415;
-  x->digest_bytes = 0;
-  if (ccn_buf_match_dtag(d, CCN_DTAG_ContentObject)) {
-    ccn_buf_advance(d);
-    res = ccn_parse_Signature(d, x);
-    x->offset[CCN_PCO_B_Name] = d->decoder.token_index;
-    x->offset[CCN_PCO_B_Component0] = d->decoder.index;
-    res = ccn_parse_Name(d, components);
-    if (res < 0)
-      d->decoder.state = -__LINE__;
-    x->name_ncomps = res;
-    x->offset[CCN_PCO_E_ComponentLast] = d->decoder.token_index - 1;
-    x->offset[CCN_PCO_E_Name] = d->decoder.token_index;
-    ccn_parse_SignedInfo(d, x);
-    x->offset[CCN_PCO_B_Content] = d->decoder.token_index;
-    ccn_parse_required_tagged_BLOB(d, CCN_DTAG_Content, 0, -1);
-    x->offset[CCN_PCO_E_Content] = d->decoder.token_index;
-    ccn_buf_check_close(d);
-    x->offset[CCN_PCO_E] = d->decoder.index;
-  }
-  else
-    d->decoder.state = -__LINE__;
-  if (d->decoder.index != (int)size || !CCN_FINAL_DSTATE(d->decoder.state))
-    return (CCN_DSTATE_ERR_CODING);
-  return(0);
-}
-
-int
-ccn_ref_tagged_BLOB(enum ccn_dtag tt,
-                    const unsigned char *buf, size_t start, size_t stop,
-                    const unsigned char **presult, size_t *psize)
-{
-  struct ccn_buf_decoder decoder;
-  struct ccn_buf_decoder *d;
-  if (stop < start) return(-1);
-  d = ccn_buf_decoder_start(&decoder, buf + start, stop - start);
-  if (ccn_buf_match_dtag(d, tt)) {
-    ccn_buf_advance(d);
-    if (ccn_buf_match_blob(d, presult, psize))
-      ccn_buf_advance(d);
-    ccn_buf_check_close(d);
-  }
-  else
-    return(-1);
-  if (d->decoder.index != (int)d->size || !CCN_FINAL_DSTATE(d->decoder.state))
-    return (CCN_DSTATE_ERR_CODING);
-  return(0);
-}
-
-static struct ccn_buf_decoder *
-ccn_buf_decoder_start_at_components(struct ccn_buf_decoder *d,
-                                    const unsigned char *buf, size_t buflen)
-{
-  ccn_buf_decoder_start(d, buf, buflen);
-  while (ccn_buf_match_dtag(d, CCN_DTAG_Name) ||
-         ccn_buf_match_dtag(d, CCN_DTAG_Interest) ||
-         ccn_buf_match_dtag(d, CCN_DTAG_ContentObject)
-         ) {
-    ccn_buf_advance(d);
-    ccn_parse_Signature(d, NULL);
-  }
-  return(d);
-}
-
-int
-ccn_content_get_value(const unsigned char *data, size_t data_size,
-                      const struct ccn_parsed_ContentObject *content,
-                      const unsigned char **value, size_t *value_size)
-{
-  int res;
-  res = ccn_ref_tagged_BLOB(CCN_DTAG_Content, data,
-                            content->offset[CCN_PCO_B_Content],
-                            content->offset[CCN_PCO_E_Content],
-                            value, value_size);
-  return(res);
-}
-
-int
-ccn_compare_names(const unsigned char *a, size_t asize,
-                  const unsigned char *b, size_t bsize)
-{
-  struct ccn_buf_decoder a_decoder;
-  struct ccn_buf_decoder b_decoder;
-  struct ccn_buf_decoder *aa =
-  ccn_buf_decoder_start_at_components(&a_decoder, a, asize);
-  struct ccn_buf_decoder *bb =
-  ccn_buf_decoder_start_at_components(&b_decoder, b, bsize);
-  const unsigned char *acp = NULL;
-  const unsigned char *bcp = NULL;
-  size_t acsize;
-  size_t bcsize;
-  int cmp = 0;
-  int more_a;
-  for (;;) {
-    more_a = ccn_buf_match_dtag(aa, CCN_DTAG_Component);
-    cmp = more_a - ccn_buf_match_dtag(bb, CCN_DTAG_Component);
-    if (more_a == 0 || cmp != 0)
-      break;
-    ccn_buf_advance(aa);
-    ccn_buf_advance(bb);
-    acsize = bcsize = 0;
-    if (ccn_buf_match_blob(aa, &acp, &acsize))
-      ccn_buf_advance(aa);
-    if (ccn_buf_match_blob(bb, &bcp, &bcsize))
-      ccn_buf_advance(bb);
-    cmp = acsize - bcsize;
-    if (cmp != 0)
-      break;
-    cmp = memcmp(acp, bcp, acsize);
-    if (cmp != 0)
-      break;
-    ccn_buf_check_close(aa);
-    ccn_buf_check_close(bb);
-  }
-  return (cmp);
-}
-
diff --git a/model/ccn/ccn_buf_encoder.cc b/model/ccn/ccn_buf_encoder.cc
deleted file mode 100644
index d0d157b..0000000
--- a/model/ccn/ccn_buf_encoder.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/time.h>
-#include "ccn.h"
-#include "ccn_charbuf.h"
-#include "ccn_coding.h"
-#include "ccn_indexbuf.h"
-
-/**
- * Encode and sign a ContentObject.
- * @param buf is the output buffer where encoded object is written.
- * @param Name is the ccnb-encoded name from ccn_name_init and friends.
- * @param SignedInfo is the ccnb-encoded info from ccn_signed_info_create.
- * @param data pintes to the raw data to be encoded.
- * @param size is the size, in bytes, of the raw data to be encoded.
- * @param digest_algorithm may be NULL for default.
- * @param private_key is the private key to use for signing.
- * @returns 0 for success or -1 for error.
- */
-int
-ccn_encode_ContentObject(struct ccn_charbuf *buf,
-                         const struct ccn_charbuf *Name,
-                         /*const struct ccn_charbuf *SignedInfo,*/
-                         const void *data,
-                         size_t size
-                         /*const char *digest_algorithm,
-                         const struct ccn_pkey *private_key*/
-                         )
-{
-    int res = 0;
-    
-    res |= ccn_charbuf_append_tt(buf, CCN_DTAG_ContentObject, CCN_DTAG);
-    //res |= ccn_encode_Signature(buf, digest_algorithm,
-    //                            NULL, 0, signature, signature_size);
-    res |= ccn_charbuf_append_charbuf(buf, Name);
-    //res |= ccn_charbuf_append_charbuf(buf, SignedInfo);
-    res |= ccnb_append_tagged_blob(buf, CCN_DTAG_Content, data, size);
-    res |= ccn_charbuf_append_closer(buf);
-    //free(signature);
-    ccn_charbuf_destroy(&content_header);
-    return(res == 0 ? 0 : -1);
-}
-
-/**
- * Append a tagged BLOB
- *
- * This is a ccnb-encoded element with containing the BLOB as content
- * @param c is the buffer to append to.
- * @param dtag is the element's dtab
- * @param data points to the binary data
- * @param size is the size of the data, in bytes
- * @returns 0 for success or -1 for error.
- */
-int
-ccnb_append_tagged_blob(struct ccn_charbuf *c,
-                        enum ccn_dtag dtag,
-                        const void *data,
-                        size_t size)
-{
-    int res;
-    
-    res = ccn_charbuf_append_tt(c, dtag, CCN_DTAG);
-    if (size != 0) {
-        res |= ccn_charbuf_append_tt(c, size, CCN_BLOB);
-        res |= ccn_charbuf_append(c, data, size);
-    }
-    res |= ccn_charbuf_append_closer(c);
-    return(res == 0 ? 0 : -1);
-}
diff --git a/model/ccn/ccn_charbuf.cc b/model/ccn/ccn_charbuf.cc
deleted file mode 100644
index 06c6544..0000000
--- a/model/ccn/ccn_charbuf.cc
+++ /dev/null
@@ -1,215 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ccn_charbuf.h"
-
-/**
- * @file ccn_charbuf.c
- * @brief Support expandable buffer for counted sequences of arbitrary bytes.
- * 
- * Part of the CCNx C Library.
- *
- * Copyright (C) 2008, 2009 Palo Alto Research Center, Inc.
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- * This library 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
- * Lesser General Public License for more details. You should have received
- * a copy of the GNU Lesser General Public License along with this library;
- * if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
- * Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/time.h>
-#include "ccn_coding.h"
-
-struct ccn_charbuf *
-ccn_charbuf_create(void)
-{
-  struct ccn_charbuf *c;
-  c = (ccn_charbuf*)calloc(1, sizeof(*c));
-  return(c);
-}
-
-void
-ccn_charbuf_destroy(struct ccn_charbuf **cbp)
-{
-  struct ccn_charbuf *c = *cbp;
-  if (c != NULL) {
-    if (c->buf != NULL)
-      free(c->buf);
-    free(c);
-    *cbp = NULL;
-  }
-}
-
-/*
- * ccn_charbuf_reserve: expand buffer as necessary to hold n more chars
- */
-unsigned char *
-ccn_charbuf_reserve(struct ccn_charbuf *c, size_t n)
-{
-  size_t newsz = n + c->length;
-  unsigned char *buf = c->buf;
-  if (newsz < n)
-    return(NULL);
-  if (newsz > c->limit) {
-    if (2 * c->limit > newsz)
-      newsz = 2 * c->limit;
-    buf = (unsigned char*)realloc(c->buf, newsz);
-    if (buf == NULL)
-      return(NULL);
-    memset(buf + c->limit, 0, newsz - c->limit);
-    c->buf = buf;
-    c->limit = newsz;
-  }
-  buf += c->length;
-  return(buf);
-}
-
-void ccn_charbuf_reset(struct ccn_charbuf *c)
-{
-  if (c == NULL) {
-    return;
-  } 
-  c->length = 0;
-}
-
-int
-ccn_charbuf_append(struct ccn_charbuf *c, const void *p, size_t n)
-{
-  unsigned char *dst = ccn_charbuf_reserve(c, n);
-  if (dst == NULL)
-    return(-1);
-  memcpy(dst, p, n);
-  c->length += n;
-  return(0);
-}
-
-int
-ccn_charbuf_append_value(struct ccn_charbuf *c, unsigned val, unsigned n)
-{
-  unsigned char *dst;
-  unsigned i;
-  if (n > sizeof(val))
-    return(-1);
-  dst = ccn_charbuf_reserve(c, n);
-  if (dst == NULL)
-    return(-1);
-  for (i = 0; i < n; i++)
-    dst[i] = (unsigned char)(val >> (8 * (n-1-i)));
-  c->length += n;
-  return(0);
-}
-
-int
-ccn_charbuf_append_charbuf(struct ccn_charbuf *c, const struct ccn_charbuf *in)
-{
-  return(ccn_charbuf_append(c, in->buf, in->length));
-}
-
-int
-ccn_charbuf_append_string(struct ccn_charbuf *c, const char *s)
-{
-  return(ccn_charbuf_append(c, s, strlen(s)));
-}
-
-int
-ccn_charbuf_putf(struct ccn_charbuf *c, const char *fmt, ...)
-{
-  int sz;
-  va_list ap;
-  char *buf;
-  buf = (char *)ccn_charbuf_reserve(c, strlen(fmt) + 10); /* estimate */
-  if (buf == NULL) return(-1);
-  va_start(ap, fmt);
-  sz = vsnprintf(buf, c->limit - c->length, fmt, ap);
-  va_end(ap);
-  if (sz < 0)
-    return(sz);
-  if (c->length + sz < c->limit) {
-    c->length += sz;
-    return(sz);
-  }
-  va_end(ap);
-  buf = (char *)ccn_charbuf_reserve(c, sz + 1); /* accurate */
-  if (buf == NULL) return(-1);
-  va_start(ap, fmt);
-  sz = vsnprintf(buf, c->limit - c->length, fmt, ap);
-  va_end(ap);
-  if (c->length + sz < c->limit) {
-    c->length += sz;
-    return(sz);
-  }
-  return(-1);
-}
-
-/* This formats time into xs:dateTime format */
-int
-ccn_charbuf_append_datetime(struct ccn_charbuf *c, time_t secs, int nsecs)
-{
-  char timestring[32];
-  int timelen;
-  struct tm time_tm;
-  int res;
-  
-  timelen = strftime(timestring, sizeof(timestring),
-                     "%FT%T", gmtime_r(&secs, &time_tm));
-  if (timelen >= (int)sizeof(timestring))
-    return(-1);
-  if (nsecs != 0) {
-    if (nsecs < 0 || nsecs >= 1000000000)
-      return(-1);
-    timelen += snprintf(&timestring[timelen], sizeof(timestring) - timelen,
-                        ".%09d", nsecs);
-    if (timelen >= (int)sizeof(timestring))
-      return(-1);
-    while (timestring[timelen - 1] == '0') timelen--;
-  }
-  timestring[timelen++] = 'Z';
-  res = ccn_charbuf_append(c, timestring, timelen);
-  return (res);
-}
-
-char *
-ccn_charbuf_as_string(struct ccn_charbuf *c)
-{
-  unsigned char *r;
-  r = ccn_charbuf_reserve(c, 1);
-  if (r == NULL)
-    return(NULL);
-  r[0] = 0;
-  return((char *)c->buf);
-}
-
-int
-ccn_charbuf_append_closer(struct ccn_charbuf *c)
-{
-  int res;
-  const unsigned char closer = CCN_CLOSE;
-  res = ccn_charbuf_append(c, &closer, 1);
-  return(res);
-}
diff --git a/model/ccn/ccn_charbuf.h b/model/ccn/ccn_charbuf.h
deleted file mode 100644
index 066eda2..0000000
--- a/model/ccn/ccn_charbuf.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-/**
- * @file ccn/charbuf.h
- * 
- * Expandable character buffer for counted sequences of arbitrary octets.
- *
- * Part of the CCNx C Library.
- *
- * Copyright (C) 2008, 2009 Palo Alto Research Center, Inc.
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- * This library 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
- * Lesser General Public License for more details. You should have received
- * a copy of the GNU Lesser General Public License along with this library;
- * if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
- * Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef CCN_CHARBUF_DEFINED
-#define CCN_CHARBUF_DEFINED
-
-#include <stddef.h>
-#include <time.h>
-
-struct ccn_charbuf {
-  size_t length;
-  size_t limit;
-  unsigned char *buf;
-};
-
-/*
- * ccn_charbuf_create:  allocate a new charbuf
- * ccn_charbuf_destroy: destroy a charbuf
- */
-struct ccn_charbuf *ccn_charbuf_create(void);
-void ccn_charbuf_destroy(struct ccn_charbuf **cbp);
-
-/*
- * ccn_charbuf_reserve: reserve some space in the buffer
- * Grows c->buf if needed and returns a pointer to the new region.
- * Does not modify c->length
- */ 
-unsigned char *ccn_charbuf_reserve(struct ccn_charbuf *c, size_t n);
-
-/*
- * ccn_charbuf_reset: reset to empty for reuse
- * Sets c->length to 0
- */
-void ccn_charbuf_reset(struct ccn_charbuf *c);
-
-/*
- * ccn_charbuf_append: append character content
- */ 
-int ccn_charbuf_append(struct ccn_charbuf *c, const void *p, size_t n);
-
-/*
- * ccn_charbuf_append: append n bytes of val
- * The n low-order bytes are appended in network byte order (big-endian) 
- */ 
-int ccn_charbuf_append_value(struct ccn_charbuf *c, unsigned val, unsigned n);
-
-
-/*
- * ccn_charbuf_append_charbuf: append content from another charbuf
- */ 
-int ccn_charbuf_append_charbuf(struct ccn_charbuf *c, const struct ccn_charbuf *i);
-
-/*
- * ccn_charbuf_append: append a string
- * Sometimes you have a null-terminated string in hand...
- */ 
-int ccn_charbuf_append_string(struct ccn_charbuf *c, const char *s);
-
-/*
- * ccn_charbuf_putf: formatting output
- * Use this in preference to snprintf to simplify bookkeeping.
- */ 
-int ccn_charbuf_putf(struct ccn_charbuf *c, const char *fmt, ...);
-
-/*
- * ccn_charbuf_append_datetime: append a date/time string
- * Appends a dateTime string in canonical form according to
- * http://www.w3.org/TR/xmlschema-2/
- * Return value is 0, or -1 for error.
- * example: 2008-07-22T17:33:14.109Z
- */ 
-int ccn_charbuf_append_datetime(struct ccn_charbuf *c, time_t secs, int nsecs);
-
-/*
- * ccn_charbuf_append_datetime_now: append a date/time string
- * Appends a dateTime string representing the current date and time
- * in canonical form according to
- * http://www.w3.org/TR/xmlschema-2/
- * precision, a non-negative number, indicates the maximum number
- * of fractional digits in the seconds.  Only values 0..6 have
- * any effect, at this times, since the gettimeofday() function
- * is defined to return microsecond resolution.
- * Return value is 0, or -1 for error.
- * example: 2008-07-22T17:33:14.109Z
- */ 
-#define CCN_DATETIME_PRECISION_USEC 6
-#define CCN_DATETIME_PRECISION_MAX 6
-int ccn_charbuf_append_datetime_now(struct ccn_charbuf *c, int precision);
-
-/*
- * ccn_charbuf_as_string: view charbuf contents as a string
- * This assures that c->buf has a null termination, and simply
- * returns the pointer into the buffer.  If the result needs to
- * persist beyond the next operation on c, the caller is
- * responsible for copying it.
- */ 
-char *ccn_charbuf_as_string(struct ccn_charbuf *c);
-
-#endif
diff --git a/model/ccn/ccn_indexbuf.cc b/model/ccn/ccn_indexbuf.cc
deleted file mode 100644
index 034c5db..0000000
--- a/model/ccn/ccn_indexbuf.cc
+++ /dev/null
@@ -1,247 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ccn_indexbuf.h"
-
-/**
- * @file ccn_indexbuf.c
- * @brief Support for expandable buffer of non-negative values.
- * 
- * Part of the CCNx C Library.
- *
- * Copyright (C) 2008, 2009 Palo Alto Research Center, Inc.
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- * This library 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
- * Lesser General Public License for more details. You should have received
- * a copy of the GNU Lesser General Public License along with this library;
- * if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
- * Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define ELEMENT size_t
-
-/**
- * Create a new indexbuf.
- */
-struct ccn_indexbuf *
-ccn_indexbuf_create(void)
-{
-  struct ccn_indexbuf *c;
-  c = (ccn_indexbuf*)calloc(1, sizeof(*c));
-  return(c);
-}
-
-/**
- * Deallocate indexbuf.
- */
-void
-ccn_indexbuf_destroy(struct ccn_indexbuf **cbp)
-{
-  struct ccn_indexbuf *c = *cbp;
-  if (c != NULL) {
-    if (c->buf != NULL) {
-      free(c->buf);
-    }
-    free(c);
-    *cbp = NULL;
-  }
-}
-
-/**
- * Expand buffer as necessary to hold at least n more values.
- * @returns pointer to reserved space
- */
-ELEMENT *
-ccn_indexbuf_reserve(struct ccn_indexbuf *c, size_t n)
-{
-  size_t newlim = n + c->n;
-  size_t oldlim = c->limit;
-  ELEMENT *buf = c->buf;
-  if (newlim < n)
-    return(NULL);
-  if (newlim > oldlim) {
-    if (2 * oldlim > newlim)
-      newlim = 2 * oldlim;
-    buf = (size_t*)realloc(c->buf, newlim * sizeof(ELEMENT));
-    if (buf == NULL)
-      return(NULL);
-    memset(buf + oldlim, 0, (newlim - oldlim) * sizeof(ELEMENT));
-    c->buf = buf;
-    c->limit = newlim;
-  }
-  buf += c->n;
-  return(buf);
-}
-
-/**
- * Append multiple elements to the indexbuf.
- * @returns 0 for success, -1 for failure.
- */
-int
-ccn_indexbuf_append(struct ccn_indexbuf *c, const ELEMENT *p, size_t n)
-{
-  ELEMENT *dst = ccn_indexbuf_reserve(c, n);
-  if (dst == NULL)
-    return(-1);
-  memcpy(dst, p, n * sizeof(ELEMENT));
-  c->n += n;
-  return(0);
-}
-
-/**
- * Append v to the indexbuf
- * @returns 0 for success, -1 for failure.
- */
-int
-ccn_indexbuf_append_element(struct ccn_indexbuf *c, ELEMENT v)
-{
-  ELEMENT *dst = ccn_indexbuf_reserve(c, 1);
-  if (dst == NULL)
-    return(-1);
-  *dst = v;
-  c->n += 1;
-  return(0);
-}
-
-/**
- * @returns index at which the element was found or appended, or -1 if not found.
- */
-int
-ccn_indexbuf_member(struct ccn_indexbuf *x, ELEMENT val)
-{
-  int i;
-  if (x == NULL)
-    return (-1);
-  for (i = x->n - 1; i >= 0; i--)
-    if (x->buf[i] == val)
-      return(i);
-  return(-1);
-}
-
-/**
- * Removes up to one instance of val from the indexbuf.
- * Order of elements not preserved.
- */
-void
-ccn_indexbuf_remove_element(struct ccn_indexbuf *x, ELEMENT val)
-{
-  int i;
-  if (x == NULL) return;
-  for (i = x->n - 1; i >= 0; i--)
-    if (x->buf[i] == val) {
-      x->buf[i] = x->buf[--x->n]; /* move last element into vacant spot */
-      return;
-    }
-}
-
-/**
- * @returns index at which the element was found or appended,
- *          or -1 in case of error.
- */
-int
-ccn_indexbuf_set_insert(struct ccn_indexbuf *x, ELEMENT val)
-{
-  int i;
-  if (x == NULL)
-    return (-1);
-  for (i = 0; i < (int)x->n; i++)
-    if (x->buf[i] == val)
-      return(i);
-  if (ccn_indexbuf_append_element(x, val) < 0)
-    return(-1);
-  return(i);
-}
-
-/**
- * Removes first occurrence of val, preserving order
- * @returns index at which the element was found,
- *          or -1 if the element was not found.
- */
-int
-ccn_indexbuf_remove_first_match(struct ccn_indexbuf *x, ELEMENT val)
-{
-  int i;
-  int n;
-  if (x == NULL)
-    return (-1);
-  for (i = 0, n = x->n; i < n; i++) {
-    if (x->buf[i] == val) {
-      if (i + 1 < n)
-        memmove(&(x->buf[i]),
-                &(x->buf[i + 1]),
-                sizeof(x->buf[i]) * (n - i - 1));
-      x->n--;
-      return(i);
-    }
-  }
-  return(-1);
-}
-
-/**
- * If val is present in the indexbuf, move it to the final place.
- */
-void
-ccn_indexbuf_move_to_end(struct ccn_indexbuf *x, ELEMENT val)
-{
-  int i;
-  int n;
-  if (x == NULL)
-    return;
-  for (i = 0, n = x->n; i + 1 < n; i++) {
-    if (x->buf[i] == val) {
-      memmove(&(x->buf[i]),
-              &(x->buf[i + 1]),
-              sizeof(x->buf[i]) * (n - i - 1));
-      x->buf[n - 1] = val;
-      return;
-    }
-  }
-}
-
-/**
- * If val is present in the indexbuf, move it to the first place.
- */
-void
-ccn_indexbuf_move_to_front(struct ccn_indexbuf *x, ELEMENT val)
-{
-  int i;
-  int n;
-  if (x == NULL)
-    return;
-  for (i = 0, n = x->n; i < n; i++) {
-    if (x->buf[i] == val) {
-      memmove(&(x->buf[1]),
-              &(x->buf[0]),
-              sizeof(x->buf[i]) * i);
-      x->buf[0] = val;
-      return;
-    }
-  }
-  
-}
-
diff --git a/model/ccn/ccn_indexbuf.h b/model/ccn/ccn_indexbuf.h
deleted file mode 100644
index 3e133c3..0000000
--- a/model/ccn/ccn_indexbuf.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-/**
- * @file ccn/indexbuf.h
- * 
- * Expandable buffer of non-negative values.
- *
- * Part of the CCNx C Library.
- *
- * Copyright (C) 2008, 2009 Palo Alto Research Center, Inc.
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- * This library 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
- * Lesser General Public License for more details. You should have received
- * a copy of the GNU Lesser General Public License along with this library;
- * if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
- * Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef CCN_INDEXBUF_DEFINED
-#define CCN_INDEXBUF_DEFINED
-
-#include <stddef.h>
-
-struct ccn_indexbuf {
-  size_t n;
-  size_t limit;
-  size_t *buf;
-};
-
-struct ccn_indexbuf *ccn_indexbuf_create(void);
-void ccn_indexbuf_destroy(struct ccn_indexbuf **cbp);
-size_t *ccn_indexbuf_reserve(struct ccn_indexbuf *c, size_t n);
-int ccn_indexbuf_append(struct ccn_indexbuf *c, const size_t *p, size_t n);
-int ccn_indexbuf_append_element(struct ccn_indexbuf *c, size_t v);
-int ccn_indexbuf_member(struct ccn_indexbuf *x, size_t val);
-void ccn_indexbuf_remove_element(struct ccn_indexbuf *x, size_t val);
-int ccn_indexbuf_set_insert(struct ccn_indexbuf *x, size_t val);
-int ccn_indexbuf_remove_first_match(struct ccn_indexbuf *x, size_t val);
-void ccn_indexbuf_move_to_end(struct ccn_indexbuf *x, size_t val);
-void ccn_indexbuf_move_to_front(struct ccn_indexbuf *x, size_t val);
-
-#endif
diff --git a/model/ccn/ccn_name_util.cc b/model/ccn/ccn_name_util.cc
deleted file mode 100644
index 64405ce..0000000
--- a/model/ccn/ccn_name_util.cc
+++ /dev/null
@@ -1,326 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ccn_name_util.h"
-#include "ccn_coding.h"
-#include "ccn_charbuf.h"
-#include "ccn_indexbuf.h"
-#include <string.h>
-#include <stdlib.h>
-#include "ccn_random.h"
-#include "ccn.h"
-
-/**
- * @file ccn_name_util.c
- * @brief Support for manipulating ccnb-encoded Names.
- * 
- * Part of the CCNx C Library.
- *
- * Copyright (C) 2008-2010 Palo Alto Research Center, Inc.
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- * This library 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
- * Lesser General Public License for more details. You should have received
- * a copy of the GNU Lesser General Public License along with this library;
- * if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
- * Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-//#include <ccn/ccn.h>
-
-/**
- * Reset charbuf to represent an empty Name in binary format.
- * @returns 0, or -1 for error.
- */
-int
-ccn_name_init(struct ccn_charbuf *c)
-{
-  int res;
-  c->length = 0;
-  res = ccn_charbuf_append_tt(c, CCN_DTAG_Name, CCN_DTAG);
-  if (res == -1) return(res);
-  res = ccn_charbuf_append_closer(c);
-  return(res);
-}
-
-/**
- * Add a Component to a Name.
- *
- * The component is an arbitrary string of n octets, no escaping required.
- * @returns 0, or -1 for error.
- */
-int
-ccn_name_append(struct ccn_charbuf *c, const void *component, size_t n)
-{
-  int res;
-  const unsigned char closer[2] = {CCN_CLOSE, CCN_CLOSE};
-  if (c->length < 2 || c->buf[c->length-1] != closer[1])
-    return(-1);
-  c->length -= 1;
-  ccn_charbuf_reserve(c, n + 8);
-  res = ccn_charbuf_append_tt(c, CCN_DTAG_Component, CCN_DTAG);
-  if (res == -1) return(res);
-  res = ccn_charbuf_append_tt(c, n, CCN_BLOB);
-  if (res == -1) return(res);
-  res = ccn_charbuf_append(c, component, n);
-  if (res == -1) return(res);
-  res = ccn_charbuf_append(c, closer, sizeof(closer));
-  return(res);
-}
-
-/**
- * Add a Component that is a NUL-terminated string.
- *
- * The component added consists of the bytes of the string without the NUL.
- * This function is convenient for those applications that construct 
- * component names from simple strings.
- * @returns 0, or -1 for error.
- */
-int 
-ccn_name_append_str(struct ccn_charbuf *c, const char *s)
-{
-  return(ccn_name_append(c, s, strlen(s)));
-}
-
-/**
- * Add a binary Component to a ccnb-encoded Name
- *
- * These are special components used for marking versions, fragments, etc.
- * @returns 0, or -1 for error
- * see doc/technical/NameConventions.html
- */
-int
-ccn_name_append_numeric(struct ccn_charbuf *c,
-                        enum ccn_marker marker, unsigned long long value)
-{
-  //uintmax_t v;
-  unsigned long long v;
-  int i;
-  char b[32];
-  
-  for (v = value, i = sizeof(b); v != 0 && i > 0; i--, v >>= 8)
-    b[i-1] = v & 0xff;
-  if (i < 1)
-    return(-1);
-  if (marker >= 0)
-    b[--i] = marker;
-  return(ccn_name_append(c, b + i, sizeof(b) - i));
-}
-
-/**
- * Add nonce Component to ccnb-encoded Name
- *
- * Uses %C1.N namespace.
- * @returns 0, or -1 for error
- * see doc/technical/NameConventions.html
- */
-int
-ccn_name_append_nonce(struct ccn_charbuf *c)
-{
-  const unsigned char pre[4] = { CCN_MARKER_CONTROL, '.', 'N', 0 };
-  unsigned char b[15];
-  
-  memcpy(b, pre, sizeof(pre));
-  ccn_random_bytes(b + sizeof(pre), sizeof(b) - sizeof(pre));
-  return(ccn_name_append(c, b, sizeof(b)));
-}
-
-/**
- * Add sequence of ccnb-encoded Components to a ccnb-encoded Name.
- *
- * start and stop are offsets from ccnb
- * @returns 0, or -1 for obvious error
- */
-int
-ccn_name_append_components(struct ccn_charbuf *c,
-                           const unsigned char *ccnb,
-                           size_t start, size_t stop)
-{
-  int res;
-  if (c->length < 2 || start > stop)
-    return(-1);
-  c->length -= 1;
-  ccn_charbuf_reserve(c, stop - start + 1);
-  res = ccn_charbuf_append(c, ccnb + start, stop - start);
-  if (res == -1) return(res);
-  res = ccn_charbuf_append_closer(c);
-  return(res);
-}
-
-/**
- * Extract a pointer to and size of component at
- * given index i.  The first component is index 0.
- * @returns 0, or -1 for error.
- */
-int
-ccn_name_comp_get(const unsigned char *data,
-                  const struct ccn_indexbuf *indexbuf,
-                  unsigned int i,
-                  const unsigned char **comp, size_t *size)
-{
-  int len;
-  struct ccn_buf_decoder decoder;
-  struct ccn_buf_decoder *d;
-  /* indexbuf should have an extra value marking end of last component,
-   so we need to use last 2 values */
-  if (indexbuf->n < 2 || i > indexbuf->n - 2) {
-    /* There isn't a component at this index */
-    return(-1);
-  }
-  len = indexbuf->buf[i + 1]-indexbuf->buf[i];
-  d = ccn_buf_decoder_start(&decoder, data + indexbuf->buf[i], len);
-  if (ccn_buf_match_dtag(d, CCN_DTAG_Component)) {
-    ccn_buf_advance(d);
-    if (ccn_buf_match_blob(d, comp, size))
-	    return(0);
-    *comp = d->buf + d->decoder.index;
-    *size = 0;
-    ccn_buf_check_close(d);
-    if (d->decoder.state >= 0)
-      return(0);
-  }
-  return(-1);
-}
-
-int
-ccn_name_comp_strcmp(const unsigned char *data,
-                     const struct ccn_indexbuf *indexbuf,
-                     unsigned int i, const char *val)
-{
-  const unsigned char *comp_ptr;
-  size_t comp_size;
-  
-  // XXX - We probably want somewhat different semantics in the API -
-  // comparing a string against a longer string with a 0 byte should
-  // not claim equality.
-  if (ccn_name_comp_get(data, indexbuf, i, &comp_ptr, &comp_size) == 0)
-    return(strncmp(val, (const char *)comp_ptr, comp_size));
-  /* Probably no such component, say query is greater-than */
-  return(1);
-}
-
-/**
- * Find Component boundaries in a ccnb-encoded Name.
- *
- * Thin veneer over ccn_parse_Name().
- * components arg may be NULL to just do a validity check
- *
- * @returns -1 for error, otherwise the number of Components.
- */
-int
-ccn_name_split(const struct ccn_charbuf *c, struct ccn_indexbuf *components)
-{
-  struct ccn_buf_decoder decoder;
-  struct ccn_buf_decoder *d;
-  d = ccn_buf_decoder_start(&decoder, c->buf, c->length);
-  return(ccn_parse_Name(d, components));
-}
-
-/**
- * Chop the name down to n components.
- * @param c contains a ccnb-encoded Name
- * @param components may be NULL; if provided it must be consistent with
- *        some prefix of the name, and is updated accordingly.
- * @param n is the number or components to leave, or, if negative, specifies
- *        how many components to remove,
- e.g. -1 will remove just the last component.
- * @returns -1 for error, otherwise the new number of Components
- */
-int
-ccn_name_chop(struct ccn_charbuf *c, struct ccn_indexbuf *components, int n)
-{
-  if (components == NULL) {
-    int res;
-    components = ccn_indexbuf_create();
-    if (components == NULL)
-      return(-1);
-    res = ccn_name_split(c, components);
-    if (res >= 0)
-      res = ccn_name_chop(c, components, n);
-    ccn_indexbuf_destroy(&components);
-    return(res);
-  }
-  /* Fix up components if needed. We could be a little smarter about this. */
-  if (components->n == 0 || components->buf[components->n-1] + 1 != c->length)
-    if (ccn_name_split(c, components) < 0)
-      return(-1);
-  if (n < 0)
-    n += (components->n - 1); /* APL-style indexing */
-  if (n < 0)
-    return(-1);
-  if (n < (int)(components->n)) {
-    c->length = components->buf[n];
-    ccn_charbuf_append_value(c, CCN_CLOSE, 1);
-    components->n = n + 1;
-    return(n);
-  }
-  return(-1);
-}
-
-/**
- * Advance the last Component of a Name to the next possible value.
- * @param c contains a ccnb-encoded Name to be updated.
- * @returns -1 for error, otherwise the number of Components
- */
-int
-ccn_name_next_sibling(struct ccn_charbuf *c)
-{
-  int res = -1;
-  struct ccn_indexbuf *ndx;
-  unsigned char *lastcomp = NULL;
-  size_t lastcompsize = 0;
-  size_t i;
-  int carry;
-  struct ccn_charbuf *newcomp;
-  
-  ndx = ccn_indexbuf_create();
-  if (ndx == NULL) goto Finish;
-  res = ccn_name_split(c, ndx);
-  if (res <= 0) {
-    res = -1;
-    goto Finish;
-  }
-  res = ccn_ref_tagged_BLOB(CCN_DTAG_Component, c->buf,
-                            ndx->buf[res-1], ndx->buf[res],
-                            (const unsigned char **)&lastcomp,
-                            &lastcompsize);
-  if (res < 0) goto Finish;
-  for (carry = 1, i = lastcompsize; carry && i > 0; i--) {
-    carry = (((++lastcomp[i-1]) & 0xFF) == 0x00);
-  }
-  if (carry) {
-    newcomp = ccn_charbuf_create();
-    res |= ccn_charbuf_append_value(newcomp, 0, 1);
-    res |= ccn_charbuf_append(newcomp, lastcomp, lastcompsize);
-    res |= ccn_name_chop(c, ndx, ndx->n - 2);
-    res |= ccn_name_append(c, newcomp->buf, newcomp->length);
-    ccn_charbuf_destroy(&newcomp);
-    if (res < 0) goto Finish;
-  }
-  res = ndx->n - 1;
-Finish:
-  ccn_indexbuf_destroy(&ndx);
-  return(res);
-}
-
diff --git a/model/ccn/ccn_name_util.h b/model/ccn/ccn_name_util.h
deleted file mode 100644
index 6e5fda7..0000000
--- a/model/ccn/ccn_name_util.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
diff --git a/model/ccn/ccn_random.cc b/model/ccn/ccn_random.cc
deleted file mode 100644
index 6176c79..0000000
--- a/model/ccn/ccn_random.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ccn_random.h"
-#include <openssl/rand.h>
-//#include <openssl/rand.c>
-
-/**
- * Generate pseudo-random bytes.
- *
- * @param buf is the destination buffer
- * @param size is in bytes
- */
-void
-ccn_random_bytes(unsigned char *buf, size_t size)
-{
-  int num = size;
-  
-  if (num < 0 || num != (int)size)
-    abort();
-  RAND_bytes(buf, num);
-}
-
-/**
- * Feed some entropy to the random number generator.
- * 
- * @param buf is the source buffer
- * @param size is in bytes
- * @param bits_of_entropy is an estimate; use 0 to make me guess
- */
-void
-ccn_add_entropy(const void *buf, size_t size, int bits_of_entropy)
-{
-  int num = size;
-  
-  if (num < 0 || num != (int)size)
-    abort();
-  /* Supply a hopefully conservative estimate of entropy. */
-  if (bits_of_entropy <= 0)
-    bits_of_entropy = (num < 32) ? 1 : num / 32;
-  RAND_add((unsigned char *)buf, num, bits_of_entropy * 0.125);
-}
diff --git a/model/ccn/ccn_random.h b/model/ccn/ccn_random.h
deleted file mode 100644
index ddd0a38..0000000
--- a/model/ccn/ccn_random.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-/**
- * @file random.h
- * @brief Pseudo-random number generation
- * 
- * Part of the CCNx C Library.
- *
- * Copyright (C) 2010 Palo Alto Research Center, Inc.
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1
- * as published by the Free Software Foundation.
- * This library 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
- * Lesser General Public License for more details. You should have received
- * a copy of the GNU Lesser General Public License along with this library;
- * if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
- * Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef CCN_RANDOM_DEFINED
-#define CCN_RANDOM_DEFINED
-
-#include <stddef.h>
-#include <openssl/rand.h>
-
-void ccn_random_bytes(unsigned char *buf, size_t size);
-void ccn_add_entropy(const void *buf, size_t size, int bits_of_entropy);
-
-#endif
diff --git a/model/ccnx-face.cc b/model/ccnx-face.cc
index 15ddb84..6ce6b92 100644
--- a/model/ccnx-face.cc
+++ b/model/ccnx-face.cc
@@ -151,7 +151,7 @@
     }
 
   m_device->Send (packet, m_device->GetBroadcast (), 
-                  CcnxL3Protocol::PROT_NUMBER);
+                  CcnxL3Protocol::ETHERNET_FRAME_TYPE);
 }
 
 std::ostream& operator<< (std::ostream& os, CcnxFace const& face)
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index 2ea1414..2a13f4c 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -43,7 +43,7 @@
 
 namespace ns3 {
 
-const uint16_t CcnxL3Protocol::PROT_NUMBER = 0x7777;
+const uint16_t CcnxL3Protocol::ETHERNET_FRAME_TYPE = 0x7777;
 
 NS_OBJECT_ENSURE_REGISTERED (CcnxL3Protocol);
 
@@ -53,19 +53,19 @@
   static TypeId tid = TypeId ("ns3::CcnxL3Protocol")
     .SetParent<Ccnx> ()
     .AddConstructor<CcnxL3Protocol> ()
-    .AddTraceSource ("Tx", "Send ccnx packet to outgoing interface.",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_txTrace))
-    .AddTraceSource ("Rx", "Receive ccnx packet from incoming interface.",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_rxTrace))
-    .AddTraceSource ("Drop", "Drop ccnx packet",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_dropTrace))
+    // .AddTraceSource ("Tx", "Send ccnx packet to outgoing interface.",
+    //                  MakeTraceSourceAccessor (&CcnxL3Protocol::m_txTrace))
+    // .AddTraceSource ("Rx", "Receive ccnx packet from incoming interface.",
+    //                  MakeTraceSourceAccessor (&CcnxL3Protocol::m_rxTrace))
+    // .AddTraceSource ("Drop", "Drop ccnx packet",
+    //                  MakeTraceSourceAccessor (&CcnxL3Protocol::m_dropTrace))
     .AddAttribute ("InterfaceList", "The set of Ccnx interfaces associated to this Ccnx stack.",
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&CcnxL3Protocol::m_faces),
                    MakeObjectVectorChecker<CcnxFace> ())
 
-    .AddTraceSource ("SendOutgoing", "A newly-generated packet by this node is about to be queued for transmission",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_sendOutgoingTrace))
+    // .AddTraceSource ("SendOutgoing", "A newly-generated packet by this node is about to be queued for transmission",
+    //                  MakeTraceSourceAccessor (&CcnxL3Protocol::m_sendOutgoingTrace))
 
   ;
   return tid;
@@ -137,7 +137,7 @@
 }
 
 uint32_t 
-CcnxL3Protocol::AddFace (Ptr<CcnxFace> face)
+CcnxL3Protocol::AddFace (const Ptr<CcnxFace> &face)
 {
   NS_LOG_FUNCTION (this << *face);
 
@@ -147,7 +147,7 @@
   if (face->GetDevice() != 0)
     {
       m_node->RegisterProtocolHandler (MakeCallback (&CcnxL3Protocol::ReceiveFromLower, this), 
-                                       CcnxL3Protocol::PROT_NUMBER, face->GetDevice(), true/*promiscuous mode*/);
+                                       CcnxL3Protocol::ETHERNET_FRAME_TYPE, face->GetDevice(), true/*promiscuous mode*/);
     }
 
   uint32_t index = m_faces.size ();
@@ -218,7 +218,7 @@
   if (incomingFace->IsUp ())
     {
       NS_LOG_LOGIC ("Dropping received packet -- interface is down");
-      m_dropTrace (packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ccnx> (), incomingFace);
+      // m_dropTrace (packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
 
@@ -242,7 +242,7 @@
   if (incomingFace->IsUp ())
     {
       NS_LOG_LOGIC ("Dropping received packet -- interface is down");
-      m_dropTrace (packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ccnx> (), incomingFace);
+      // m_dropTrace (packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
 
@@ -258,29 +258,29 @@
 
 
 void
-CcnxL3Protocol::Send (Ptr<Packet> packet, Ptr<CcnxRoute> route)
+CcnxL3Protocol::Send (Ptr<Packet> packet, const Ptr<CcnxFace> &face)
 {
-  NS_LOG_FUNCTION (this << "packet: " << packet << ", route: "<< route);
+  // NS_LOG_FUNCTION (this << "packet: " << packet << ", route: "<< route);
   
-  if (route == 0)
-    {
-      NS_LOG_WARN ("No route to host.  Drop.");
-      m_dropTrace (packet, DROP_NO_ROUTE, m_node->GetObject<Ccnx> (), 0);
-      return;
-    }
-  Ptr<CcnxFace> outFace = route->GetOutputFace ();
+  // if (route == 0)
+  //   {
+  //     NS_LOG_WARN ("No route to host.  Drop.");
+  //     // m_dropTrace (packet, DROP_NO_ROUTE, m_node->GetObject<Ccnx> (), 0);
+  //     return;
+  //   }
+  // Ptr<CcnxFace> outFace = route->GetOutputFace ();
 
-  if (outFace->IsUp ())
-    {
-      NS_LOG_LOGIC ("Sending via face " << *outFace);
-      m_txTrace (packet, m_node->GetObject<Ccnx> (), outFace);
-      outFace->Send (packet);
-    }
-  else
-    {
-      NS_LOG_LOGIC ("Dropping -- outgoing interface is down: " << *outFace);
-      m_dropTrace (packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ccnx> (), outFace);
-    }
+  // if (outFace->IsUp ())
+  //   {
+  //     NS_LOG_LOGIC ("Sending via face " << *outFace);
+  //     // m_txTrace (packet, m_node->GetObject<Ccnx> (), outFace);
+  //     outFace->Send (packet);
+  //   }
+  // else
+  //   {
+  //     NS_LOG_LOGIC ("Dropping -- outgoing interface is down: " << *outFace);
+  //     // m_dropTrace (packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ccnx> (), outFace);
+  //   }
 }
 
 
@@ -339,12 +339,4 @@
     }
 }
 
-void
-CcnxL3Protocol::RouteInputError (Ptr<Packet> p)//, Socket::SocketErrno sockErrno)
-{
-  // NS_LOG_FUNCTION (this << p << ipHeader << sockErrno);
-  // NS_LOG_LOGIC ("Route input failure-- dropping packet to " << ipHeader << " with errno " << sockErrno); 
-  m_dropTrace (p, DROP_ROUTE_ERROR, m_node->GetObject<Ccnx> (), 0);
-}
-
 } //namespace ns3
diff --git a/model/ccnx-l3-protocol.h b/model/ccnx-l3-protocol.h
index 32425c4..e8a0d22 100644
--- a/model/ccnx-l3-protocol.h
+++ b/model/ccnx-l3-protocol.h
@@ -1,22 +1,22 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-//
-// Copyright (c) 2006 Georgia Tech Research Corporation
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License version 2 as
-// published by the Free Software Foundation;
-//
-// 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, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-//
-// Author: 
-//
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
 
 #ifndef CCNX_L3_PROTOCOL_H
 #define CCNX_L3_PROTOCOL_H
@@ -43,10 +43,10 @@
 class CcnxContentObjectHeader;
   
 /**
- * \brief Implement the Ccnx layer.
+ * \ingroup ccnx
+ * \brief Actual implementation of the Ccnx network layer
  * 
- * This is the actual implementation of IP.  It contains APIs to send and
- * receive packets at the IP layer, as well as APIs for IP routing.
+ * \todo This description is incorrect. Should be changed accordingly
  *
  * This class contains two distinct groups of trace sources.  The
  * trace sources 'Rx' and 'Tx' are called, respectively, immediately
@@ -61,9 +61,20 @@
 class CcnxL3Protocol : public Ccnx
 {
 public:
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
   static TypeId GetTypeId (void);
-  static const uint16_t PROT_NUMBER;
 
+  static const uint16_t ETHERNET_FRAME_TYPE; ///< \brief Ethernet Frame Type of CCNx
+  static const uint16_t IP_PROTOCOL_TYPE;    ///< \brief IP protocol type of CCNx
+  static const uint16_t UDP_PORT;            ///< \brief UDP port of CCNx
+
+  /**
+   * \brief Default constructor. Creates an empty stack without forwarding strategy set
+   */
   CcnxL3Protocol();
   virtual ~CcnxL3Protocol ();
 
@@ -78,16 +89,35 @@
     DROP_CONGESTION, /**< Congestion detected */
     DROP_NO_ROUTE,   /**< No route to host */
     DROP_INTERFACE_DOWN,   /**< Interface is down so can not send packet */
-    DROP_ROUTE_ERROR,   /**< Route error */
   };
 
+  /**
+   * \brief Assigns node to the CCNx stack
+   *
+   * \param node Simulation node
+   */
   void SetNode (Ptr<Node> node);
 
+  ////////////////////////////////////////////////////////////////////
   // functions defined in base class Ccnx
   
   void SetForwardingStrategy (Ptr<CcnxForwardingStrategy> forwardingStrategy);
   Ptr<CcnxForwardingStrategy> GetForwardingStrategy (void) const;
 
+  virtual void Send (Ptr<Packet> packet, const Ptr<CcnxFace> &face);
+
+  virtual uint32_t AddFace (const Ptr<CcnxFace> &face);
+  virtual uint32_t GetNFaces (void) const;
+  virtual Ptr<CcnxFace> GetFace (uint32_t face) const;
+
+  virtual void SetMetric (uint32_t i, uint16_t metric);
+  virtual uint16_t GetMetric (uint32_t i) const;
+  virtual uint16_t GetMtu (uint32_t i) const;
+  virtual bool IsUp (uint32_t i) const;
+  virtual void SetUp (uint32_t i);
+  virtual void SetDown (uint32_t i);
+
+protected:
   /**
    * Lower layer calls this method after calling L3Demux::Lookup
    *
@@ -119,29 +149,10 @@
    */
   virtual void
   ReceiveAndProcess (Ptr<CcnxFace> face, Ptr<CcnxContentObjectHeader> header, Ptr<Packet> p);
-  
-  /**
-   * \param packet packet to send
-   * \param route route entry
-   *
-   * Higher-level layers call this method to send a packet
-   * down the stack to the MAC and PHY layers.
-   */
-  virtual void Send (Ptr<Packet> packet, Ptr<CcnxRoute> route);
-
-  virtual uint32_t AddFace (Ptr<CcnxFace> face);
-  virtual uint32_t GetNFaces (void) const;
-  virtual Ptr<CcnxFace> GetFace (uint32_t face) const;
-
-  virtual void SetMetric (uint32_t i, uint16_t metric);
-  virtual uint16_t GetMetric (uint32_t i) const;
-  virtual uint16_t GetMtu (uint32_t i) const;
-  virtual bool IsUp (uint32_t i) const;
-  virtual void SetUp (uint32_t i);
-  virtual void SetDown (uint32_t i);
 
 protected:
   virtual void DoDispose (void);
+
   /**
    * This function will notify other components connected to the node that a new stack member is now connected
    * This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them together.
@@ -149,20 +160,16 @@
   virtual void NotifyNewAggregate ();
 
 private:
-  // friend class CcnxL3ProtocolTestCase;
-  CcnxL3Protocol(const CcnxL3Protocol &);
-  CcnxL3Protocol &operator = (const CcnxL3Protocol &);
+  CcnxL3Protocol(const CcnxL3Protocol &); ///< copy constructor is disabled
+  CcnxL3Protocol &operator = (const CcnxL3Protocol &); ///< copy operator is disabled
 
   /**
    * Helper function to get CcnxFace from NetDevice
    */
   Ptr<CcnxFace> GetFaceForDevice (Ptr<const NetDevice> device) const;
-  
-  void RouteInputError (Ptr<Packet> p);
-                        //, Socket::SocketErrno sockErrno);
 
   /**
-   * false function. should never be called. Just to trick C++ to compile
+   * \brief Fake function. should never be called. Just to trick C++ to compile
    */
   virtual void
   ReceiveAndProcess (Ptr<CcnxFace> face, Ptr<Header> header, Ptr<Packet> p);
@@ -174,15 +181,15 @@
   Ptr<Node> m_node;
   Ptr<CcnxForwardingStrategy> m_forwardingStrategy;
 
-  TracedCallback<Ptr<const Packet>, Ptr<const CcnxFace> > m_sendOutgoingTrace;
-  TracedCallback<Ptr<const Packet>, Ptr<const CcnxFace> > m_unicastForwardTrace;
-  TracedCallback<Ptr<const Packet>, Ptr<const CcnxFace> > m_localDeliverTrace;
+  // TracedCallback<Ptr<const Packet>, Ptr<const CcnxFace> > m_sendOutgoingTrace;
+  // TracedCallback<Ptr<const Packet>, Ptr<const CcnxFace> > m_unicastForwardTrace;
+  // TracedCallback<Ptr<const Packet>, Ptr<const CcnxFace> > m_localDeliverTrace;
 
-  // The following two traces pass a packet with an IP header
-  TracedCallback<Ptr<const Packet>, Ptr<Ccnx>, Ptr<const CcnxFace> > m_txTrace;
-  TracedCallback<Ptr<const Packet>, Ptr<Ccnx>, Ptr<const CcnxFace> > m_rxTrace;
-  // <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
-  TracedCallback<Ptr<const Packet>, DropReason, Ptr<const Ccnx>, Ptr<const CcnxFace> > m_dropTrace;
+  // // The following two traces pass a packet with an IP header
+  // TracedCallback<Ptr<const Packet>, Ptr<Ccnx>, Ptr<const CcnxFace> > m_txTrace;
+  // TracedCallback<Ptr<const Packet>, Ptr<Ccnx>, Ptr<const CcnxFace> > m_rxTrace;
+  // // <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
+  // TracedCallback<Ptr<const Packet>, DropReason, Ptr<const Ccnx>, Ptr<const CcnxFace> > m_dropTrace;
 };
   
 } // Namespace ns3
diff --git a/model/ccnx.cc b/model/ccnx.cc
index 7716366..a940c36 100644
--- a/model/ccnx.cc
+++ b/model/ccnx.cc
@@ -37,12 +37,4 @@
   return tid;
 }
 
-Ccnx::Ccnx ()
-{
-}
-
-Ccnx::~Ccnx ()
-{
-}
-
 } // namespace ns3
diff --git a/model/ccnx.h b/model/ccnx.h
index 1e1aa0b..c7627ab 100644
--- a/model/ccnx.h
+++ b/model/ccnx.h
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2007 INRIA
+ * Copyright (c) 2011 University of California, Los Angeles
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -15,17 +15,17 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: 
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
-#ifndef CCNX_H
-#define CCNX_H
 
-#include <stdint.h>
+#ifndef _CCNX_H_
+#define _CCNX_H_
+
 #include "ns3/object.h"
 #include "ns3/socket.h"
 #include "ns3/callback.h"
 
-#include "ccnx-route.h"
+#include "ccnx-face.h"
 
 namespace ns3 {
 
@@ -35,76 +35,87 @@
 class CcnxForwardingStrategy;
 
 /**
- * \ingroup internet
- * \defgroup ccnx Ccnx
+ * \defgroup ccnx NDN abstraction
+ *
+ * This is an abstract implementation of NDN protocol
  */
 /**
  * \ingroup ccnx
- * \brief Access to the Ccnx forwarding table, interfaces, and configuration
+ * \brief Interface to manage Ccnx stack
  *
  * This class defines the API to manipulate the following aspects of
- * the Ccnx implementation:
- * -# register a NetDevice for use by the Ccnx layer (basically, to
- * create Ccnx-related state such as addressing and neighbor cache that 
- * is associated with a NetDevice)
- * -# manipulate the status of the NetDevice from the Ccnx perspective, 
- * such as marking it as Up or Down, 
- // * -# adding, deleting, and getting addresses associated to the Ccnx 
- // * interfaces.
- * -# exporting Ccnx configuration attributes
+ * the Ccnx stack implementation:
+ * -# register a face (CcnxFace-derived object) for use by the Ccnx
+ *    layer
+ * -# register forwarding strategy (CcnxForwardingStrategy-derived
+ *    object) to use by Ccnx stack
+ * -# export Ccnx configuration attributes
  * 
- * Each NetDevice has conceptually a single Ccnx interface associated
- * with it.
+ * Each CcnxFace-derived object has conceptually a single Ccnx
+ * interface associated with it.
+ *
+ * In addition, this class defines CCNx packet coding constants
+ *
+ * \see CcnxFace, CcnxForwardingStrategy
  */
 class Ccnx : public Object
 {
 public:
-  static TypeId GetTypeId (void);
-  Ccnx ();
-  virtual ~Ccnx ();
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
+  static TypeId GetTypeId ();
 
   /**
-   * \brief Register a new forwarding protocol to be used by this Ccnx stack
+   * \brief Register a new forwarding strategy to be used by this Ccnx
+   * stack
    *
-   * This call will replace any forwarding protocol that has been previously 
-   * registered.  If you want to add multiple forwarding protocols, you must
-   * add them to a CcnxListForwardingStrategy directly.
+   * This call will replace any forwarding strategy that has been
+   * previously registered.
    * 
-   * \param forwardingStrategy smart pointer to CcnxForwardingStrategy object
+   * \param forwardingStrategy smart pointer to CcnxForwardingStrategy
+   * object
    */
   virtual void SetForwardingStrategy (Ptr<CcnxForwardingStrategy> forwardingStrategy) = 0;
 
   /**
-   * \brief Get the forwarding protocol to be used by this Ccnx stack
+   * \brief Get the forwarding strategy being used by this Ccnx stack
    * 
-   * \returns smart pointer to CcnxForwardingStrategy object, or null pointer if none
+   * \returns smart pointer to CcnxForwardingStrategy object, or null
+   * pointer if none
    */
   virtual Ptr<CcnxForwardingStrategy> GetForwardingStrategy (void) const = 0;
 
   /**
-   * \param device device to add to the list of Ccnx interfaces
-   *        which can be used as output interfaces during packet forwarding.
-   * \returns the index of the Ccnx interface added.
+   * \brief Add face to CCNx stack
    *
-   * Once a device has been added, it can never be removed: if you want
-   * to disable it, you can invoke Ccnx::SetDown which will
-   * make sure that it is never used during packet forwarding.
+   * \param face smart pointer to CcnxFace-derived object
+   * (CcnxLocalFace, CcnxNetDeviceFace, CcnxUdpFace) \returns the
+   * index of the Ccnx interface added.
+   * 
+   * \see CcnxLocalFace, CcnxNetDeviceFace, CcnxUdpFace
    */
-  virtual uint32_t AddFace (Ptr<CcnxFace> face) = 0;
+  virtual uint32_t AddFace (const Ptr<CcnxFace> &face) = 0;
 
   /**
-   * \returns the number of interfaces added by the user.
+   * \brief Get current number of faces added to CCNx stack
+   *
+   * \returns the number of faces
    */
   virtual uint32_t GetNFaces (void) const = 0;
 
   /**
-   * \param packet packet to send
-   * \param route route entry
+   * \brief Send a packet to a specified face
    *
-   * Higher-level layers call this method to send a packet
-   * down the stack to the MAC and PHY layers.
+   * \param packet fully prepared CCNx packet to send
+   * \param face face where to send this packet
+   *
+   * Higher-level layers (forwarding strategy in particular) call this
+   * method to send a packet down the stack to the MAC and PHY layers.
    */
-  // virtual void Send (Ptr<Packet> packet, Ptr<CcnxRoute> route) = 0;
+  virtual void Send (Ptr<Packet> packet, const Ptr<CcnxFace> &face) = 0;
 
   /**
    * \param face The face number of an Ccnx interface.
@@ -112,59 +123,9 @@
    */
   virtual Ptr<CcnxFace> GetFace (uint32_t face) const = 0;
 
-  // /**
-  //  * \param face CcnxFace object pointer 
-  //  * \returns The interface number of an Ccnx face or -1 if not found.
-  //  */
-  // virtual int32_t GetFaceForDevice (Ptr<const CcnxFace> face) const = 0;
-
-  /**
-   * \param face The face number of an Ccnx face
-   * \param metric forwarding metric (cost) associated to the underlying 
-   *          Ccnx interface
-   */
-  virtual void SetMetric (uint32_t face, uint16_t metric) = 0;
-
-  /**
-   * \param face The interface number of an Ccnx interface
-   * \returns forwarding metric (cost) associated to the underlying 
-   *          Ccnx interface
-   */
-  virtual uint16_t GetMetric (uint32_t face) const = 0;
-
-  /**
-   * \param face Interface number of Ccnx interface
-   * \returns the Maximum Transmission Unit (in bytes) associated
-   *          to the underlying Ccnx interface
-   */
-  virtual uint16_t GetMtu (uint32_t face) const = 0;
-
-  /**
-   * \param face Interface number of Ccnx interface
-   * \returns true if the underlying interface is in the "up" state,
-   *          false otherwise.
-   */
-  virtual bool IsUp (uint32_t face) const = 0;
-
-  /**
-   * \param face Interface number of Ccnx interface
-   * 
-   * Set the interface into the "up" state. In this state, it is
-   * considered valid during Ccnx forwarding.
-   */
-  virtual void SetUp (uint32_t face) = 0;
-
-  /**
-   * \param face Interface number of Ccnx interface
-   *
-   * Set the interface into the "down" state. In this state, it is
-   * ignored during Ccnx forwarding.
-   */
-  virtual void SetDown (uint32_t face) = 0;
-
 public:
-    /**
-   * Type tag for a ccnb start marker.
+   /**
+   * \brief Type tag for a ccnb start marker.
    *
    * \see http://www.ccnx.org/releases/latest/doc/technical/DTAG.html
    */
@@ -179,16 +140,11 @@
     CCN_NO_TOKEN    /**< should not occur in encoding */
   };
 
-  /** CCN_CLOSE terminates composites */
+  /** \brief CCN_CLOSE terminates composites */
   enum {CCN_CLOSE = 0};
 
-  // enum ccn_ext_subtype {
-  //   /* skip smallest values for now */
-  //   CCN_PROCESSING_INSTRUCTIONS = 16 /* <?name:U value:U?> */
-  // };
-
   /**
-   * DTAG identifies ccnb-encoded elements.
+   * \brief DTAG identifies ccnb-encoded elements.
    *
    * \see http://www.ccnx.org/releases/latest/doc/technical/DTAG.html
    */
@@ -288,30 +244,8 @@
     CCN_DTAG_SequenceNumber = 256,
     CCN_DTAG_CCNProtocolDataUnit = 17702112
   };
-
-  /**
-   * The decoder state is one of these, possibly with some
-   * additional bits set for internal use.  A complete parse
-   * ends up in state 0 or an error state.  Not all possible
-   * error states are listed here.
-   */
-  enum ccn_decoder_state {
-    CCN_DSTATE_INITIAL = 0,
-    CCN_DSTATE_NEWTOKEN,
-    CCN_DSTATE_NUMVAL,
-    CCN_DSTATE_UDATA,
-    CCN_DSTATE_TAGNAME,
-    CCN_DSTATE_ATTRNAME,
-    CCN_DSTATE_BLOB,
-    /* All error states are negative */
-    CCN_DSTATE_ERR_OVERFLOW = -1,
-    CCN_DSTATE_ERR_ATTR     = -2,       
-    CCN_DSTATE_ERR_CODING   = -3,
-    CCN_DSTATE_ERR_NEST     = -4, 
-    CCN_DSTATE_ERR_BUG      = -5
-  };
 };
 
 } // namespace ns3 
 
-#endif /* CCNX_H */
+#endif /* _CCNX_H_ */
