ccnx tunnel; in progress
diff --git a/include/ccnx-tunnel.h b/include/ccnx-tunnel.h
new file mode 100644
index 0000000..cddfcd5
--- /dev/null
+++ b/include/ccnx-tunnel.h
@@ -0,0 +1,84 @@
+#ifndef CCNX_TUNNEL_H
+#define CCNX_TUNNEL_H
+
+#include <sync/sync-ccnx-wrapper.h>
+#include <string>
+#include <boost/function.hpp>
+#include <boost/variant.hpp>
+#include <boost/thread/locks.hpp>
+#include <utility>
+#include <map>
+
+using namespace Sync;
+using namespace std;
+
+// Eventually, Sync::CcnxWrapper should be moved to this namespace. 
+// It has nothing to do with Sync.
+namespace Ccnx
+{
+
+class CcnxTunnel : public CcnxWrapper 
+{
+public: 
+  typedef boost::variant<StringDataCallback, RawDataCallback> DataCallback;
+  typedef multimap<string, DataCallback> PendingInterestTable;
+  typedef multimap<string, InterestCallback> RegisteredInterestTable;
+  typedef multimap<string, DataCallback>iterator PitIter;
+  typedef multimap<string, InterestCallback>iterator RitIter;
+  typedef boost::shared_mutex Lock;
+  typedef boost::unique_lock<Lock> WriteLock;
+  typedef boost::shared_lock<Lock> ReadLock;
+
+
+  CcnxTunnel(); 
+  virtual ~CcnxTunnel();
+
+  // name is topology-independent
+  virtual int
+  publishRawData(const string &name, const char *buf, size_t len, int freshness);
+
+  // prefix is topology-independent
+  virtual int
+  setInterestFilter(const string &prefix, const InterestCallback &interestCallback);
+
+  // prefix is topology-independent
+  // this clears all entries with key equal to prefix
+  virtual void
+  clearInterestFilter(const string &prefix);
+
+  // subclass should provide translation service from topology-independent name
+  // to routable name
+  virtual string
+  queryRoutableName(string &name) = 0;
+
+  // subclass should implement the function to store ContentObject with topoloy-independent
+  // name to the permanent storage; default does nothing
+  virtual void
+  storeContentObject(string &name, ContentObjectPtr co) {}
+
+  // should be called  when connect to a different network
+  void
+  refreshLocalPrefix();
+
+  static bool
+  isPrefix(string &prefix, string &name);
+
+protected:
+  void
+  handleTunneledInterest(string tunneldInterest);
+
+  virtual int
+  sendInterest (const std::string &strInterest, void *dataPass);
+
+protected:
+  // need a way to update local prefix, perhaps using macports trick, but eventually we need something more portable
+  string m_localPrefix;
+  PendingInterestTable m_pit;
+  RegisteredInterestTable m_rit;
+  Lock m_pitLock;
+  Lock m_ritLock;
+};
+
+};
+
+#endif