diff --git a/src/app/ndn-app.hpp b/src/app/ndn-app.hpp
new file mode 100644
index 0000000..00595ea
--- /dev/null
+++ b/src/app/ndn-app.hpp
@@ -0,0 +1,170 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS 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
+ * NDNS, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef NDNS_NDN_APP_HPP
+#define NDNS_NDN_APP_HPP
+
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/security/key-chain.hpp>
+
+#include <boost/asio.hpp>
+#include <boost/bind.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/noncopyable.hpp>
+
+using namespace std;
+
+namespace ndn {
+namespace ndns{
+
+class NDNApp {
+public:
+  NDNApp(const char *programName, const char *prefix);
+  virtual ~NDNApp();
+
+  virtual void
+  onData(const ndn::Interest& interest, Data& data)
+  {
+  }
+  virtual void
+  onTimeout(const ndn::Interest& interest)
+  {
+    std::cout<<"!- Interest Timeout"<<interest.getName()<<std::endl;
+  }
+
+  virtual void
+  onRegisterFailed(const ndn::Name& prefix, const std::string& reason)
+  {
+    m_error = "ERROR: Failed to register prefix in local hub's daemon";
+    m_error += " due to: ";
+    m_error += reason;
+    m_hasError = true;
+    this->stop();
+  }
+
+
+  virtual void
+  onInterest(const Name &name, const Interest& interest)
+  {
+
+  }
+
+  virtual void
+  signalHandler()
+  {
+    this->stop();
+    exit(1);
+  }
+
+
+  virtual void
+  stop()
+  {
+    std::cout<<m_programName<<" stops"<<std::endl;
+    m_ioService.stop();
+    m_face.shutdown();
+    if (hasError())
+    {
+      cout<<m_error<<endl;
+    }
+  }
+
+
+
+  bool hasError() const {
+    return m_hasError;
+  }
+
+  void setHasError(bool hasError) {
+    m_hasError = hasError;
+  }
+
+  const char* getPrefix() const {
+    return m_prefix;
+  }
+
+  void setPrefix(char* prefix) {
+    m_prefix = prefix;
+  }
+
+  const char* getProgramName() const {
+    return m_programName;
+  }
+
+  void setProgramName(char* programName) {
+    m_programName = programName;
+  }
+
+  const string& getErr() const {
+    return m_error;
+  }
+
+  void setErr(const string& err) {
+    m_error = err;
+  }
+
+  uint32_t getInterestTriedMax() const {
+    return m_interestTriedMax;
+  }
+
+  void setInterestTriedMax(uint32_t interestTriedMax) {
+    m_interestTriedMax = interestTriedMax;
+  }
+
+  time::milliseconds getContentFreshness() const {
+    return m_contentFreshness;
+  }
+
+  void setContentFreshness(time::milliseconds contentFreshness) {
+    m_contentFreshness = contentFreshness;
+  }
+
+  time::milliseconds getInterestLifetime() const {
+    return m_interestLifetime;
+  }
+
+  void setInterestLifetime(time::milliseconds interestLifetime) {
+    m_interestLifetime = interestLifetime;
+  }
+
+public:
+  const char* m_programName;
+  const char* m_prefix;
+  bool m_hasError;
+  string m_error;
+  time::milliseconds m_contentFreshness;
+  time::milliseconds m_interestLifetime;
+
+  uint32_t m_interestTriedMax;
+  uint32_t m_interestTriedNum;
+
+  //Name m_name;
+  boost::asio::io_service m_ioService;
+  //Zone m_zone;
+  //ZoneMgr m_zoneMgr;
+
+
+  Face m_face;
+  KeyChain m_keyChain;
+};
+
+} //namespace ndns
+} /* namespace ndn */
+
+#endif /* NDN_APP_HPP_ */
