diff --git a/src/ndns-enum.cpp b/src/ndns-enum.cpp
new file mode 100644
index 0000000..efc1bbf
--- /dev/null
+++ b/src/ndns-enum.cpp
@@ -0,0 +1,43 @@
+/* -*- 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/>.
+ */
+
+#include "ndns-enum.hpp"
+
+namespace ndn {
+namespace ndns {
+
+std::string
+toString(NdnsType ndnsType)
+{
+  switch (ndnsType) {
+  case NDNS_RESP:
+    return "NDNS-Resp";
+  case NDNS_NACK:
+    return "NDNS-Nack";
+  case NDNS_AUTH:
+    return "NDNS-Auth";
+  case NDNS_NULL:
+    return "NDNS-Null";
+  default:
+    return "UNKNOWN";
+  }
+}
+
+} // namespace ndns
+} // namespace ndn
diff --git a/src/ndns-enum.hpp b/src/ndns-enum.hpp
new file mode 100644
index 0000000..c2bee36
--- /dev/null
+++ b/src/ndns-enum.hpp
@@ -0,0 +1,49 @@
+/* -*- 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_NDNS_ENUM_HPP
+#define NDNS_NDNS_ENUM_HPP
+
+#include <string>
+
+namespace ndn {
+namespace ndns {
+
+/**
+ * @brief NdnsType defined in Response.NdnsMetaInfo.NdnsType
+ */
+enum NdnsType {
+  NDNS_NULL = 0, ///< this is not a real type, just mean that MetaInfo does not contain NdnsType
+  NDNS_RESP = 1, ///< response type means there are requested RR
+  NDNS_NACK = 2, ///< no requested RR
+  NDNS_AUTH = 3, ///< only has RR for detailed (longer) label
+
+  NDNS_UNKNOWN = 255
+};
+
+/*
+ * @brief convert the ResponseType to String
+ */
+std::string
+toString(NdnsType ndnsType);
+
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_NDNS_ENUM_HPP
diff --git a/src/ndns-label.cpp b/src/ndns-label.cpp
new file mode 100644
index 0000000..6d0d1ae
--- /dev/null
+++ b/src/ndns-label.cpp
@@ -0,0 +1,99 @@
+/* -*- 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/>.
+ */
+
+#include "ndns-label.hpp"
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/interest.hpp>
+
+namespace ndn {
+namespace ndns {
+namespace label {
+
+inline size_t
+calculateSkip(const Name& name,
+              const Name& hint, const Name& zone)
+{
+  size_t skip = 0;
+
+  if (!hint.empty()) {
+    // These are only asserts. The caller should supply the right parameters
+    skip = hint.size() + 1 + zone.size();
+    BOOST_ASSERT(name.size() > skip);
+
+    BOOST_ASSERT(name.getPrefix(hint.size()) == hint);
+    BOOST_ASSERT(name.get(hint.size()) == ForwardingHintLabel);
+    BOOST_ASSERT(name.getSubName(hint.size() + 1, zone.size()) == zone);
+
+  }
+  else {
+    skip = zone.size();
+    BOOST_ASSERT(name.size() > skip);
+    BOOST_ASSERT(name.getPrefix(zone.size()) == zone);
+  }
+
+  BOOST_ASSERT(name.get(skip) == NdnsIterativeQuery ||
+               name.get(skip) == NdnsCertQuery);
+
+  ++skip;
+  return skip;
+}
+
+bool
+matchName(const Interest& interest,
+          const Name& hint, const Name& zone,
+          MatchResult& result)
+{
+  // [hint / FHLabel] / zoneName / <Update>|rrLabel / UPDATE|rrType
+
+  const Name& name = interest.getName();
+  size_t skip = calculateSkip(name, hint, zone);
+
+  if (name.size() - skip < 1)
+    return false;
+
+  result.rrType = name.get(-1);
+  result.rrLabel = name.getSubName(skip, std::max<size_t>(0, name.size() - skip - 1));
+  result.version = name::Component();
+
+  return true;
+}
+
+bool
+matchName(const Data& data,
+          const Name& hint, const Name& zone,
+          MatchResult& result)
+{
+  // [hint / FHLabel] / zoneName / <Update>|rrLabel / UPDATE|rrType
+
+  const Name& name = data.getName();
+  size_t skip = calculateSkip(name, hint, zone);
+
+  if (name.size() - skip < 2)
+    return false;
+
+  result.version = name.get(-1);
+  result.rrType = name.get(-2);
+  result.rrLabel = name.getSubName(skip, std::max<size_t>(0, name.size() - skip - 2));
+
+  return true;
+}
+
+} // namespace label
+} // namespace ndns
+} // namespace ndn
diff --git a/src/ndns-label.hpp b/src/ndns-label.hpp
new file mode 100644
index 0000000..accab00
--- /dev/null
+++ b/src/ndns-label.hpp
@@ -0,0 +1,123 @@
+/* -*- 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_NDNS_LABEL_HPP
+#define NDNS_NDNS_LABEL_HPP
+
+#include "ndns-enum.hpp"
+
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/interest.hpp>
+
+#include <string>
+
+namespace ndn {
+namespace ndns {
+namespace label {
+
+/**
+ * @brief NDNS iterative query type
+ */
+
+const name::Component NdnsIterativeQuery("NDNS");
+
+/**
+ * @brief NDNS recursive query type
+ */
+const name::Component NdnsRecursiveQuery("NDNS-R");
+
+/**
+ * @brief NDNS ID-CERT query type
+ */
+const name::Component NdnsCertQuery("KEY");
+
+/////////////////////////////////////////////
+
+/**
+ * @brief label of forwarding hint
+ * @todo not support forwarding hint yet, for future use
+ */
+const name::Component ForwardingHintLabel("\xF0.");
+
+/**
+ * @brief label of update message, located at the last component in Interest name
+ */
+const name::Component NdnsUpdateLabel("UPDATE");
+
+//////////////////////////////////////////////
+
+/**
+ * @brief NS resource record type
+ */
+const name::Component NsRrType("NS");
+
+/**
+ * @brief ID-CERT resource record type
+ */
+const name::Component CertRrType("ID-CERT");
+
+//////////////////////////////////////////
+
+/**
+ * @brief result of Matching. version only works when matching a Interest Name
+ */
+struct MatchResult
+{
+  Name rrLabel;
+  name::Component rrType;
+  name::Component version;
+};
+
+/**
+ * @brief match the Interest (NDNS query, NDNS update) name
+ *
+ * @param[in] interest Interest to parse
+ * @param[in] hint Forwarding hint that is part of the Interest
+ *            (only the length will be taken into account)
+ * @param[in] zone Zone that the Interest is related to
+ *            (only the length will be taken into account)
+ * @param[out] result The matching result
+ * @return true if match succeeds, or false
+ */
+bool
+matchName(const Interest& interest,
+           const Name& hint, const Name& zone,
+           MatchResult& result);
+
+/**
+ * @brief match the Data (NDNS query response, NDNS update response) name
+ *
+ * @param[in] data Data to parse
+ * @param[in] hint Forwarding hint that is part of the Data
+ *            (only the length will be taken into account)
+ * @param[in] zone Zone that the Data is related to
+ *            (only the length will be taken into account)
+ * @param[out] result The matching result
+ * @return true if match succeeds, or false
+ */
+bool
+matchName(const Data& data,
+          const Name& hint, const Name& zone,
+          MatchResult& result);
+
+} // namespace label
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_NDNS_LABEL_HPP
diff --git a/src/ndns-tlv.hpp b/src/ndns-tlv.hpp
new file mode 100644
index 0000000..c81c1a6
--- /dev/null
+++ b/src/ndns-tlv.hpp
@@ -0,0 +1,42 @@
+/* -*- 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_NDNS_TLV_HPP
+#define NDNS_NDNS_TLV_HPP
+
+#include <ndn-cxx/encoding/tlv.hpp>
+
+namespace ndn {
+namespace ndns {
+namespace tlv {
+
+/**
+ * @brief the field defined in NDNS packet format
+ */
+enum {
+  NdnsType = 180, ///< Detailed Types are defined in NdnsType in ndns-enum.hpp
+  RrType = 190,
+  RrDataType = 191
+};
+
+} // namespace tlv
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_NDNS_TLV_HPP
