add Name and Selector classes
diff --git a/include/ccnx-common.h b/include/ccnx-common.h
index 0636a62..06e7700 100644
--- a/include/ccnx-common.h
+++ b/include/ccnx-common.h
@@ -1,6 +1,14 @@
 #ifndef CCNX_COMMON_H
 #define CCNX_COMMON_H
 
+extern "C" {
+#include <ccn/ccn.h>
+#include <ccn/charbuf.h>
+#include <ccn/keystore.h>
+#include <ccn/uri.h>
+#include <ccn/bloom.h>
+#include <ccn/signing.h>
+}
 #include <vector>
 #include <boost/shared_ptr.hpp>
 #include <boost/exception/all.hpp>
@@ -24,10 +32,8 @@
 
 // --- Bytes operations end ---
 
-// --- Name operation start ---
-void
-split(const string &name, Comps &comps);
-// --- Name operation end ---
+// Exceptions
+typedef boost::error_info<struct tag_errmsg, std::string> error_info_str;
 
 } // Ccnx
 #endif // CCNX_COMMON_H
diff --git a/include/ccnx-interest.h b/include/ccnx-interest.h
deleted file mode 100644
index fd1db18..0000000
--- a/include/ccnx-interest.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef CCNX_INTEREST_H
-#define CCNX_INTEREST_H
-#include "ccnx-common.h"
-
-namespace Ccnx {
-
-// Currently, other classes use string when Interest is needed.
-// The constructor from string ensures that if we change other classes' APIs to use Interest object 
-// instead of string, it is still backwards compatible
-// Using a separate Interest class instead of simple string allows us to add control fields
-// to the Interest, e.g. ChildSelector. Perhaps that's a separate Selectors class. Will do it after ChronoShare project finishes.
-
-// Since the selector is only useful when sending Interest (in callbacks, usually we only need to know the name of the Interest),
-// we currently only use Interest object in sendInterest of CcnxWrapper. In other places, Interest object is equivalent of
-// its string name.
-
-class Interest
-{
-public:
-  Interest(const string &name) : m_name(name) {}
-  virtual ~Interest() {}
-
-  string
-  name() const { return m_name; }
-
-protected:
-  string m_name;
-};
-
-} // Ccnx
-#endif
diff --git a/include/ccnx-name.h b/include/ccnx-name.h
new file mode 100644
index 0000000..84c045f
--- /dev/null
+++ b/include/ccnx-name.h
@@ -0,0 +1,134 @@
+#ifndef CCNX_NAME_H
+#define CCNX_NAME_H
+#include <boost/shared_ptr.hpp>
+#include "ccnx-common.h"
+
+namespace Ccnx {
+
+//  This class is mostly used in CcnxWrapper; users should not be directly using this class
+// The main purpose of this class to is avoid manually create and destroy charbuf everytime
+class CcnxCharbuf
+{
+public:
+  CcnxCharbuf();
+  CcnxCharbuf(ccn_charbuf *buf);
+  ~CcnxCharbuf();
+
+  // expose internal data structure, use with caution!!
+  ccn_charbuf *
+  getBuf() { return m_buf; }
+
+protected:
+  ccn_charbuf *m_buf;
+};
+
+typedef boost::shared_ptr<CcnxCharbuf> CcnxCharbufPtr;
+
+struct NameException:
+  virtual boost::exception, virtual exception {};
+class Name
+{
+public:
+  Name();
+  Name(const string &name);
+  Name(const vector<Bytes> &comps);
+  Name(const Name &other);
+  Name(const unsigned char *data, const ccn_indexbuf *comps);
+  virtual ~Name() {}
+
+  CcnxCharbufPtr
+  toCcnxCharbuf() const;
+
+  Name &
+  appendComp(const Bytes &comp);
+
+  Name &
+  appendComp(const string &compStr);
+
+  int
+  size() const {return m_comps.size();}
+
+  Bytes
+  getComp(int index) const;
+
+  // return string format of the comp
+  // if all characters are printable, simply returns the string
+  // if not, print the bytes in hex string format
+  string
+  getCompAsString(int index) const;
+
+  Name
+  getPartialName(int start, int n) const;
+
+
+protected:
+  vector<Bytes> m_comps;
+};
+
+ostream&
+operator <<(ostream &os, const Name &name);
+
+struct InterestSelectorException:
+  virtual boost::exception, virtual exception {};
+
+class Selectors
+{
+public:
+  Selectors();
+  Selectors(const Selectors &other);
+  ~Selectors(){};
+
+  typedef enum
+  {
+    AOK_CS = 0x1,
+    AOK_NEW = 0x2,
+    AOK_DEFAULT = 0x3, // (AOK_CS | AOK_NEW)
+    AOK_STALE = 0x4,
+    AOK_EXPIRE = 0x10
+  } AOK;
+
+  typedef enum
+  {
+    LEFT = 0,
+    RIGHT = 1,
+    DEFAULT = 2
+  } CHILD_SELECTOR;
+
+  inline Selectors &
+  maxSuffixComps(int maxSCs) {m_maxSuffixComps = maxSCs; return *this;}
+
+  inline Selectors &
+  minSuffixComps(int minSCs) {m_minSuffixComps = minSCs; return *this;}
+
+  inline Selectors &
+  answerOriginKind(AOK kind) {m_answerOriginKind = kind; return *this;}
+
+  inline Selectors &
+  interestLifetime(int lifetime) {m_interestLifetime = lifetime; return *this;}
+
+  inline Selectors &
+  scope(int scope) {m_scope = scope; return *this;}
+
+  inline Selectors &
+  childSelector(CHILD_SELECTOR child) {m_childSelector = child; return *this;}
+
+  // this has no effect now
+  inline Selectors &
+  publisherPublicKeyDigest(const Bytes &digest) {m_publisherPublicKeyDigest = digest; return *this;}
+
+  CcnxCharbufPtr
+  toCcnxCharbuf();
+
+private:
+  int m_maxSuffixComps;
+  int m_minSuffixComps;
+  AOK m_answerOriginKind;
+  double m_interestLifetime;
+  int m_scope;
+  CHILD_SELECTOR m_childSelector;
+  // not used now
+  Bytes m_publisherPublicKeyDigest;
+};
+
+} // Ccnx
+#endif
diff --git a/include/ccnx-tunnel.h b/include/ccnx-tunnel.h
index dff2f50..15d5223 100644
--- a/include/ccnx-tunnel.h
+++ b/include/ccnx-tunnel.h
@@ -39,7 +39,7 @@
   publishContentObject(const string &name, const Bytes &contentObject, int freshness);
 
   virtual int
-  sendInterest (const Interest &interest, Closure *closure);
+  sendInterest (const string &interest, Closure *closure);
 
 
   // prefix is topology-independent
diff --git a/include/ccnx-wrapper.h b/include/ccnx-wrapper.h
index 9b50ae8..90089e7 100644
--- a/include/ccnx-wrapper.h
+++ b/include/ccnx-wrapper.h
@@ -1,21 +1,12 @@
 #ifndef CCNX_WRAPPER_H
 #define CCNX_WRAPPER_H
 
-extern "C" {
-#include <ccn/ccn.h>
-#include <ccn/charbuf.h>
-#include <ccn/keystore.h>
-#include <ccn/uri.h>
-#include <ccn/bloom.h>
-#include <ccn/signing.h>
-}
-
 #include <boost/thread/locks.hpp>
 #include <boost/thread/recursive_mutex.hpp>
 #include <boost/thread/thread.hpp>
 
 #include "ccnx-common.h"
-#include "ccnx-interest.h"
+#include "ccnx-name.h"
 #include "ccnx-closure.h"
 
 using namespace std;
@@ -46,7 +37,7 @@
   clearInterestFilter (const string &prefix);
 
   virtual int
-  sendInterest (const Interest &interest, Closure *closure);
+  sendInterest (const string &interest, Closure *closure);
 
   virtual int
   publishData (const string &name, const unsigned char *buf, size_t len, int freshness);