diff --git a/src/data.hpp b/src/data.hpp
index 078938a..b12061b 100644
--- a/src/data.hpp
+++ b/src/data.hpp
@@ -310,7 +310,7 @@
   bool
   operator!=(const Data& other) const;
 
-private:
+protected:
   /**
    * @brief Clear the wire encoding.
    */
diff --git a/src/encoding/tlv.hpp b/src/encoding/tlv.hpp
index 01a8679..da7b8ea 100644
--- a/src/encoding/tlv.hpp
+++ b/src/encoding/tlv.hpp
@@ -84,6 +84,9 @@
   SignatureType = 27,
   KeyLocator    = 28,
   KeyDigest     = 29,
+  LinkPreference = 30,
+  LinkDelegation = 31,
+  SelectedDelegation = 32,
 
   AppPrivateBlock1 = 128,
   AppPrivateBlock2 = 32767
diff --git a/src/link.cpp b/src/link.cpp
new file mode 100644
index 0000000..07ac0d9
--- /dev/null
+++ b/src/link.cpp
@@ -0,0 +1,199 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2015 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx 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 copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#include "link.hpp"
+#include "interest.hpp"
+#include "encoding/block-helpers.hpp"
+#include "util/crypto.hpp"
+#include "security/key-chain.hpp"
+#include "util/concepts.hpp"
+
+#include <algorithm>
+
+#include <boost/range/adaptors.hpp>
+
+namespace ndn {
+
+BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Link>));
+BOOST_CONCEPT_ASSERT((WireEncodable<Link>));
+BOOST_CONCEPT_ASSERT((WireDecodable<Link>));
+static_assert(std::is_base_of<Data::Error, Link::Error>::value,
+              "Link::Error should inherit from Data::Error");
+
+Link::Link(const Block& block)
+{
+  wireDecode(block);
+}
+
+Link::Link(const Name& name)
+  : Data(name)
+{
+}
+
+Link::Link(const Name& name, std::initializer_list<std::pair<uint32_t, Name>> links)
+  : Data(name)
+{
+  m_delegations.insert(links);
+  encodeContent();
+}
+
+void
+Link::addDelegation(uint32_t preference, const Name& name)
+{
+  this->removeDelegationNoEncode(name);
+  m_delegations.insert({preference, name});
+  encodeContent();
+}
+
+bool
+Link::removeDelegation(const Name& name)
+{
+  bool hasRemovedDelegation = this->removeDelegationNoEncode(name);
+  if (hasRemovedDelegation) {
+    encodeContent();
+  }
+  return hasRemovedDelegation;
+}
+
+const Link::DelegationSet&
+Link::getDelegations() const
+{
+  return m_delegations;
+}
+
+template<encoding::Tag TAG>
+size_t
+Link::encodeContent(EncodingImpl<TAG>& encoder) const
+{
+  // LinkContent ::= CONTENT-TYPE TLV-LENGTH
+  //                    Delegation+
+
+  // Delegation ::= LINK-DELEGATION-TYPE TLV-LENGTH
+  //              Preference
+  //              Name
+
+  // Preference ::= LINK-PREFERENCE-TYPE TLV-LENGTH
+  //       nonNegativeInteger
+
+  size_t totalLength = 0;
+  for (const auto& delegation : m_delegations |  boost::adaptors::reversed) {
+    size_t delegationLength = 0;
+    delegationLength += std::get<1>(delegation).wireEncode(encoder);
+    delegationLength += prependNonNegativeIntegerBlock(encoder, tlv::LinkPreference,
+                                                       std::get<0>(delegation));
+    delegationLength += encoder.prependVarNumber(delegationLength);
+    delegationLength += encoder.prependVarNumber(tlv::LinkDelegation);
+    totalLength += delegationLength;
+  }
+  totalLength += encoder.prependVarNumber(totalLength);
+  totalLength += encoder.prependVarNumber(tlv::Content);
+  return totalLength;
+}
+
+template size_t
+Link::encodeContent<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
+
+template size_t
+Link::encodeContent<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
+
+void
+Link::encodeContent()
+{
+  onChanged();
+
+  EncodingEstimator estimator;
+  size_t estimatedSize = encodeContent(estimator);
+
+  EncodingBuffer buffer(estimatedSize, 0);
+  encodeContent(buffer);
+
+  setContentType(tlv::ContentType_Link);
+  setContent(buffer.block());
+}
+
+void
+Link::decodeContent()
+{
+  // LinkContent ::= CONTENT-TYPE TLV-LENGTH
+  //                    Delegation+
+
+  // Delegation ::= LINK-DELEGATION-TYPE TLV-LENGTH
+  //              Preference
+  //              Name
+
+  // Preference ::= LINK-PREFERENCE-TYPE TLV-LENGTH
+  //       nonNegativeInteger
+
+  if (getContentType() != tlv::ContentType_Link)
+    {
+      throw Error("Expected Content Type Link");
+    }
+
+  const Block& content = getContent();
+  content.parse();
+
+  for (auto& delegation : content.elements()) {
+    delegation.parse();
+    Block::element_const_iterator val = delegation.elements_begin();
+    if (val == delegation.elements_end()) {
+      throw Error("Unexpected Link Encoding");
+    }
+    uint32_t preference;
+    try {
+      preference = static_cast<uint32_t>(readNonNegativeInteger(*val));
+    }
+    catch (tlv::Error&) {
+      throw Error("Missing preference field in Link Encoding");
+    }
+    ++val;
+    if (val == delegation.elements_end()) {
+      throw Error("Missing name field in Link Encoding");
+    }
+    Name name(*val);
+    m_delegations.insert({preference, name});
+  }
+}
+
+void
+Link::wireDecode(const Block& wire)
+{
+  Data::wireDecode(wire);
+  decodeContent();
+}
+
+bool
+Link::removeDelegationNoEncode(const Name& name)
+{
+  bool hasRemoved = false;
+  auto i = m_delegations.begin();
+  while (i != m_delegations.end()) {
+    if (i->second == name) {
+      hasRemoved = true;
+      i = m_delegations.erase(i);
+    }
+    else {
+      ++i;
+    }
+  }
+  return hasRemoved;
+}
+
+} // namespace ndn
diff --git a/src/link.hpp b/src/link.hpp
new file mode 100644
index 0000000..3ccb7a3
--- /dev/null
+++ b/src/link.hpp
@@ -0,0 +1,161 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2015 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx 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 copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#ifndef NDN_LINK_HPP
+#define NDN_LINK_HPP
+
+#include "data.hpp"
+#include <set>
+
+namespace ndn {
+
+const size_t INVALID_SELECTED_DELEGATION_INDEX = std::numeric_limits<size_t>::max();
+
+/** @brief represents a Link instance
+ */
+class Link : public Data
+{
+public:
+  class Error : public Data::Error
+  {
+  public:
+    explicit
+    Error(const std::string& what)
+      : Data::Error(what)
+    {
+    }
+  };
+
+  // The ordering is based on the preference number and needs to be preserved
+  typedef std::set<std::pair<uint32_t, Name>> DelegationSet;
+
+  /**
+   * @brief Create an empty Link object
+   *
+   * Note that in certain contexts that use Link::shared_from_this(), Link must be
+   * created using `make_shared`:
+   *
+   *     shared_ptr<Link> linkObject = make_shared<Link>();
+   *
+   * Otherwise, Link::shared_from_this() will throw std::bad_weak_ptr.
+   */
+  Link() = default;
+
+  /**
+   * @brief Create a Link object from a Block
+   *
+   * Note that in certain contexts that use Link::shared_from_this(), Link must be
+   * created using `make_shared`:
+   *
+   *     shared_ptr<Link> linkObject = make_shared<Link>(block);
+   *
+   * Otherwise, Link::shared_from_this() will throw std::bad_weak_ptr.
+   */
+  explicit
+  Link(const Block& block);
+
+  /**
+   * @brief Create a Link object with the given name
+   *
+   * @param name A reference to the name of the redirected namespace
+   *
+   * Note that in certain contexts that use Link::shared_from_this(), Link must be
+   * created using `make_shared`:
+   *
+   *     shared_ptr<Link> link = make_shared<Link>(name);
+   *
+   * Otherwise, Link::shared_from_this() will throw std::bad_weak_ptr.
+   */
+  explicit
+  Link(const Name& name);
+
+ /**
+   * @brief Create a Link object with the given name and pairs of <Preference, Name>
+   *
+   * @param name A reference to the name of the redirected namespace
+   * @param links A reference to the list of pairs of the redirected namespace
+   * along with its priority
+   *
+   * Note that in certain contexts that use Link::shared_from_this(), Link must be
+   * created using `make_shared`:
+   *
+   *     shared_ptr<Link> link = make_shared<Link>(name, links);
+   *
+   * Otherwise, Link::shared_from_this() will throw std::bad_weak_ptr.
+   */
+  Link(const Name& name, std::initializer_list<std::pair<uint32_t, Name>> links);
+
+  /**
+   * @brief Add a delegation in the format of <Name, Preference>
+   * @param preference The preference of the delegation to be added
+   * @param name The name of the delegation to be added
+   * @note If a delegation with @p name exists, its preference will be updated
+   */
+  void
+  addDelegation(uint32_t preference, const Name& name);
+
+  /**
+   * @brief Remove a delegation whose name is @p name
+   * @param name The name of the delegation to be removed
+   * @return true if delegation is removed, otherwise false
+   */
+  bool
+  removeDelegation(const Name& name);
+
+  /**
+   * @brief Get the pairs of <Name, Preference>
+   * @return a set of delegations
+   */
+  const DelegationSet&
+  getDelegations() const;
+
+  /**
+   * @brief Decode from the wire format
+   */
+  void
+  wireDecode(const Block& wire);
+
+protected:
+  /** \brief prepend Link object as a Content block to the encoder
+   *
+   *  The outermost Content element is not part of Link object structure.
+   */
+  template<encoding::Tag TAG>
+  size_t
+  encodeContent(EncodingImpl<TAG>& encoder) const;
+
+  void
+  encodeContent();
+
+  void
+  decodeContent();
+
+private:
+  bool
+  removeDelegationNoEncode(const Name& name);
+
+private:
+  DelegationSet m_delegations;
+};
+
+} // namespace ndn
+
+#endif // NDN_LINK_HPP
diff --git a/tests/unit-tests/link.t.cpp b/tests/unit-tests/link.t.cpp
new file mode 100644
index 0000000..d771b7b
--- /dev/null
+++ b/tests/unit-tests/link.t.cpp
@@ -0,0 +1,400 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2015 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx 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 copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#include "link.hpp"
+#include "security/key-chain.hpp"
+#include "security/cryptopp.hpp"
+#include "encoding/buffer-stream.hpp"
+
+#include "boost-test.hpp"
+
+namespace ndn {
+namespace tests {
+
+const uint8_t LinkTest[] = {
+0x06, 0xda, // Data
+    0x07, 0x14, // Name
+        0x08, 0x05,
+            0x6c, 0x6f, 0x63, 0x61, 0x6c,
+        0x08, 0x03,
+            0x6e, 0x64, 0x6e,
+        0x08, 0x06,
+            0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+    0x14, 0x07, // MetaInfo
+        0x18, 0x01, // ContentType
+            0x01,
+        0x19, 0x02, // FreshnessPeriod
+            0x27, 0x10,
+    0x15, 0x1a, // Content
+        0x1f, 0x0c, // LinkDelegation
+            0x1e, 0x01, // LinkPreference
+                0x0a,
+            0x07, 0x07, // Name
+                0x08, 0x05,
+                    0x6c, 0x6f, 0x63, 0x61, 0x6c,
+        0x1f, 0x0a, // LinkDelegation
+            0x1e, 0x01, // LinkPreference
+                0x14,
+            0x07, 0x05, // Name
+                0x08, 0x03,
+                    0x6e, 0x64, 0x6e,
+    0x16, 0x1b, // SignatureInfo
+        0x1b, 0x01, // SignatureType
+            0x01,
+        0x1c, 0x16, // KeyLocator
+            0x07, 0x14, // Name
+                0x08, 0x04,
+                    0x74, 0x65, 0x73, 0x74,
+                0x08, 0x03,
+                    0x6b, 0x65, 0x79,
+                0x08, 0x07,
+                    0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
+    0x17, 0x80, // SignatureValue
+        0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+        0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+        0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+        0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+        0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+        0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+        0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+        0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+        0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+        0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
+};
+
+const uint8_t IncorrectContentTypeLink[] = {
+0x06, 0xda, // Data
+    0x07, 0x14, // Name
+        0x08, 0x05,
+            0x6c, 0x6f, 0x63, 0x61, 0x6c,
+        0x08, 0x03,
+            0x6e, 0x64, 0x6e,
+        0x08, 0x06,
+            0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+    0x14, 0x07, // MetaInfo
+        0x18, 0x01, // ContentType
+            0x02,
+        0x19, 0x02, // FreshnessPeriod
+            0x27, 0x10,
+    0x15, 0x1a, // Content
+        0x1f, 0x0c,  // LinkDelegation
+            0x1e, 0x01, // LinkPreference
+                0x0a,
+            0x07, 0x07, // Name
+                0x08, 0x05,
+                    0x6c, 0x6f, 0x63, 0x61, 0x6c,
+        0x1f, 0x0a, // LinkDelegation
+            0x1e, 0x01, // LinkPreference
+                0x14,
+            0x07, 0x05, // Name
+                0x08, 0x03,
+                    0x6e, 0x64, 0x6e,
+    0x16, 0x1b, // SignatureInfo
+        0x1b, 0x01, // SignatureType
+            0x01,
+        0x1c, 0x16, // KeyLocator
+            0x07, 0x14, // Name
+                0x08, 0x04,
+                    0x74, 0x65, 0x73, 0x74,
+                0x08, 0x03,
+                    0x6b, 0x65, 0x79,
+                0x08, 0x07,
+                    0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
+    0x17, 0x80, // SignatureValue
+        0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+        0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+        0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+        0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+        0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+        0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+        0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+        0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+        0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+        0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
+};
+
+const uint8_t MissingPreferenceLink[] = {
+0x06, 0xd7, // Data
+    0x07, 0x14, // Name
+        0x08, 0x05,
+            0x6c, 0x6f, 0x63, 0x61, 0x6c,
+        0x08, 0x03,
+            0x6e, 0x64, 0x6e,
+        0x08, 0x06,
+            0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+    0x14, 0x07, // MetaInfo
+        0x18, 0x01, // ContentType
+            0x01,
+        0x19, 0x02, // FreshnessPeriod
+            0x27, 0x10,
+    0x15, 0x17, // Content
+        0x1f, 0x09, // LinkDelegation
+            0x07, 0x07, // Name
+                0x08, 0x05,
+                    0x6c, 0x6f, 0x63, 0x61, 0x6c,
+        0x1f, 0x0a, // LinkDelegation
+            0x1e, 0x01, // LinkPreference
+                0x14,
+            0x07, 0x05, // Name
+                0x08, 0x03,
+                    0x6e, 0x64, 0x6e,
+    0x16, 0x1b, // SignatureInfo
+        0x1b, 0x01, // SignatureType
+            0x01,
+        0x1c, 0x16, // KeyLocator
+            0x07, 0x14, // Name
+                0x08, 0x04,
+                    0x74, 0x65, 0x73, 0x74,
+                0x08, 0x03,
+                    0x6b, 0x65, 0x79,
+                0x08, 0x07,
+                    0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
+    0x17, 0x80, // SignatureValue
+        0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+        0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+        0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+        0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+        0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+        0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+        0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+        0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+        0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+        0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
+};
+
+const uint8_t MissingNameLink[] = {
+0x06, 0xd1, // Data
+    0x07, 0x14, // Name
+        0x08, 0x05,
+            0x6c, 0x6f, 0x63, 0x61, 0x6c,
+        0x08, 0x03,
+            0x6e, 0x64, 0x6e,
+        0x08, 0x06,
+            0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+    0x14, 0x07, // MetaInfo
+        0x18, 0x01, // ContentType
+            0x01,
+        0x19, 0x02, // FreshnessPeriod
+            0x27, 0x10,
+    0x15, 0x11, // Content
+        0x1f, 0x03, // LinkDelegation
+            0x1e, 0x01, // LinkPreference
+                0x0a,
+        0x1f, 0x0a, // LinkDelegation
+            0x1e, 0x01, // LinkPreference
+                0x14,
+            0x07, 0x05, // Name
+                0x08, 0x03,
+                    0x6e, 0x64, 0x6e,
+    0x16, 0x1b, // SignatureInfo
+        0x1b, 0x01, // SignatureType
+            0x01,
+        0x1c, 0x16, // KeyLocator
+            0x07, 0x14, // Name
+                0x08, 0x04,
+                    0x74, 0x65, 0x73, 0x74,
+                0x08, 0x03,
+                    0x6b, 0x65, 0x79,
+                0x08, 0x07,
+                    0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,
+    0x17, 0x80, // SignatureValue
+        0x2f, 0xd6, 0xf1, 0x6e, 0x80, 0x6f, 0x10, 0xbe, 0xb1, 0x6f, 0x3e, 0x31, 0xec,
+        0xe3, 0xb9, 0xea, 0x83, 0x30, 0x40, 0x03, 0xfc, 0xa0, 0x13, 0xd9, 0xb3, 0xc6,
+        0x25, 0x16, 0x2d, 0xa6, 0x58, 0x41, 0x69, 0x62, 0x56, 0xd8, 0xb3, 0x6a, 0x38,
+        0x76, 0x56, 0xea, 0x61, 0xb2, 0x32, 0x70, 0x1c, 0xb6, 0x4d, 0x10, 0x1d, 0xdc,
+        0x92, 0x8e, 0x52, 0xa5, 0x8a, 0x1d, 0xd9, 0x96, 0x5e, 0xc0, 0x62, 0x0b, 0xcf,
+        0x3a, 0x9d, 0x7f, 0xca, 0xbe, 0xa1, 0x41, 0x71, 0x85, 0x7a, 0x8b, 0x5d, 0xa9,
+        0x64, 0xd6, 0x66, 0xb4, 0xe9, 0x8d, 0x0c, 0x28, 0x43, 0xee, 0xa6, 0x64, 0xe8,
+        0x55, 0xf6, 0x1c, 0x19, 0x0b, 0xef, 0x99, 0x25, 0x1e, 0xdc, 0x78, 0xb3, 0xa7,
+        0xaa, 0x0d, 0x14, 0x58, 0x30, 0xe5, 0x37, 0x6a, 0x6d, 0xdb, 0x56, 0xac, 0xa3,
+        0xfc, 0x90, 0x7a, 0xb8, 0x66, 0x9c, 0x0e, 0xf6, 0xb7, 0x64, 0xd1
+};
+
+BOOST_AUTO_TEST_SUITE(TestLink)
+
+BOOST_AUTO_TEST_CASE(PairParsingCheck)
+{
+  Link link("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  BOOST_CHECK_EQUAL(link.getDelegations().size(), static_cast<uint32_t>(3));
+}
+
+BOOST_AUTO_TEST_CASE(CheckInsertDelegation)
+{
+  Link link("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+
+  link.addDelegation(30, Name("test4"));
+  Link::DelegationSet delegations = link.getDelegations();
+  int counter = 0;
+  for (auto i = delegations.begin(); i != delegations.end(); i++) {
+    counter++;
+    if (counter == 1)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 10);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test1"));
+      }
+    if (counter == 2)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 20);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test2"));
+      }
+    if (counter == 3)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 30);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test4"));
+      }
+    if (counter == 4)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 100);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test3"));
+      }
+  }
+}
+
+BOOST_AUTO_TEST_CASE(CheckRemoveDelegation)
+{
+  Link link("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+
+  link.removeDelegation(Name("test2"));
+  Link::DelegationSet delegations = link.getDelegations();
+  int counter = 0;
+  for (auto i = delegations.begin(); i != delegations.end(); i++) {
+    counter++;
+    if (counter == 1)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 10);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test1"));
+      }
+    if (counter == 2)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 100);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test3"));
+      }
+  }
+}
+
+BOOST_AUTO_TEST_CASE(CheckEncodeDecode)
+{
+  Link link1("test", {{10, "/test1"}, {20, "/test2"}, {100, "/test3"}});
+  KeyChain keyChain;
+  keyChain.sign(link1);
+  Block wire = link1.wireEncode();
+
+  Link link2;
+  link2.wireDecode(wire);
+  Name name = link2.getName();
+  BOOST_CHECK_EQUAL(Name("test"), name);
+
+  Link::DelegationSet delegations;
+  delegations = link2.getDelegations();
+  int counter = 0;
+  for (auto i = delegations.begin(); i != delegations.end(); i++) {
+    counter++;
+    if (counter == 1)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 10);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test1"));
+      }
+    if (counter == 2)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 20);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test2"));
+      }
+    if (counter == 3)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 100);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test3"));
+      }
+  }
+
+  Link link3(wire);
+  name = link3.getName();
+  BOOST_CHECK_EQUAL(Name("test"), name);
+
+  delegations = link3.getDelegations();
+  counter = 0;
+  for (auto i = delegations.begin(); i != delegations.end(); i++) {
+    counter++;
+    if (counter == 1)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 10);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test1"));
+      }
+    if (counter == 2)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 20);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test2"));
+      }
+    if (counter == 3)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 100);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("test3"));
+      }
+  }
+}
+
+BOOST_AUTO_TEST_CASE(Decode)
+{
+  Block linkBlock(LinkTest, sizeof(LinkTest));
+  Link link(linkBlock);
+  BOOST_CHECK_EQUAL(link.getName(), Name("/local/ndn/prefix"));
+  Link::DelegationSet delegations = link.getDelegations();
+  int counter = 0;
+
+  for (auto i = delegations.begin(); i != delegations.end(); i++) {
+    counter++;
+    if (counter == 1)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 10);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("local"));
+      }
+    if (counter == 2)
+      {
+        BOOST_CHECK_EQUAL(std::get<0>(*i), 20);
+        BOOST_CHECK_EQUAL(std::get<1>(*i), Name("ndn"));
+      }
+  }
+}
+
+BOOST_AUTO_TEST_CASE(IncorrectContentType)
+{
+  Block linkBlock(IncorrectContentTypeLink, sizeof(IncorrectContentTypeLink));
+  Link link;
+  BOOST_REQUIRE_THROW(link.wireDecode(linkBlock), Link::Error);
+}
+
+BOOST_AUTO_TEST_CASE(MissingPreferenceEncoding)
+{
+  Block linkBlock(MissingPreferenceLink, sizeof(MissingPreferenceLink));
+  Link link;
+  BOOST_REQUIRE_THROW(link.wireDecode(linkBlock), Link::Error);
+}
+
+BOOST_AUTO_TEST_CASE(MissingNameEncoding)
+{
+  Block linkBlock(MissingNameLink, sizeof(MissingNameLink));
+  Link link;
+  BOOST_REQUIRE_THROW(link.wireDecode(linkBlock), Link::Error);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace ndn
