diff --git a/src/encrypted-content.cpp b/src/encrypted-content.cpp
new file mode 100644
index 0000000..0a7c9e1
--- /dev/null
+++ b/src/encrypted-content.cpp
@@ -0,0 +1,162 @@
+#include "encrypted-content.hpp"
+#include <ndn-cxx/encoding/block-helpers.hpp>
+#include <ndn-cxx/util/concepts.hpp>
+
+#include <boost/lexical_cast.hpp>
+
+namespace ndn {
+namespace gep {
+
+BOOST_CONCEPT_ASSERT((boost::EqualityComparable<EncryptedContent>));
+BOOST_CONCEPT_ASSERT((WireEncodable<EncryptedContent>));
+BOOST_CONCEPT_ASSERT((WireDecodable<EncryptedContent>));
+static_assert(std::is_base_of<ndn::tlv::Error, EncryptedContent::Error>::value,
+              "EncryptedContent::Error must inherit from tlv::Error");
+
+EncryptedContent::EncryptedContent()
+  : m_type(-1)
+  , m_hasKeyLocator(false)
+{
+}
+
+EncryptedContent::EncryptedContent(tlv::AlgorithmTypeValue type, const KeyLocator& keyLocator, const ConstBufferPtr& payload)
+  : m_type(type)
+  , m_hasKeyLocator(true)
+  , m_keyLocator(keyLocator)
+  , m_payload(payload)
+{
+}
+
+EncryptedContent::EncryptedContent(const Block& block)
+{
+  wireDecode(block);
+}
+
+void
+EncryptedContent::setAlgorithmType(tlv::AlgorithmTypeValue type)
+{
+  m_wire.reset();
+  m_type = type;
+}
+
+void
+EncryptedContent::setKeyLocator(const KeyLocator& keyLocator)
+{
+  m_wire.reset();
+  m_keyLocator = keyLocator;
+  m_hasKeyLocator = true;
+}
+
+const KeyLocator&
+EncryptedContent::getKeyLocator() const
+{
+  if (m_hasKeyLocator)
+    return m_keyLocator;
+  else
+    throw Error("KeyLocator does not exist");
+}
+
+void
+EncryptedContent::setPayload(const ConstBufferPtr& payload)
+{
+  m_wire.reset();
+  m_payload = payload;
+}
+
+const ConstBufferPtr
+EncryptedContent::getPayload() const
+{
+  return m_payload;
+}
+
+template<encoding::Tag TAG>
+size_t
+EncryptedContent::wireEncode(EncodingImpl<TAG>& block) const
+{
+  size_t totalLength = 0;
+
+  totalLength += block.appendByteArrayBlock(tlv::EncryptedPayload, m_payload->buf(), m_payload->size());
+
+  if (m_type != -1)
+    totalLength += prependNonNegativeIntegerBlock(block, tlv::EncryptionAlgorithm, m_type);
+  else
+    throw Error("EncryptedContent does not have an encryption algorithm");
+
+  if (m_hasKeyLocator)
+    totalLength += m_keyLocator.wireEncode(block);
+  else
+    throw Error("EncryptedContent does not have key locator");
+
+  totalLength += block.prependVarNumber(totalLength);
+  totalLength += block.prependVarNumber(tlv::EncryptedContent);
+  return totalLength;
+}
+
+const Block&
+EncryptedContent::wireEncode() const
+{
+  if (m_wire.hasWire())
+    return m_wire;
+
+  EncodingEstimator estimator;
+  size_t estimatedSize = wireEncode(estimator);
+
+  EncodingBuffer buffer(estimatedSize, 0);
+  wireEncode(buffer);
+
+  m_wire = buffer.block();
+  return m_wire;
+}
+
+void
+EncryptedContent::wireDecode(const Block& wire)
+{
+  if (!wire.hasWire()) {
+    throw Error("The supplied block does not contain wire format");
+  }
+
+  m_hasKeyLocator = false;
+
+  m_wire = wire;
+  m_wire.parse();
+
+  if (m_wire.type() != tlv::EncryptedContent)
+    throw Error("Unexpected TLV type when decoding Name");
+
+  Block::element_const_iterator it = m_wire.elements_begin();
+
+  if (it != m_wire.elements_end() && it->type() == ndn::tlv::KeyLocator) {
+    m_keyLocator.wireDecode(*it);
+    m_hasKeyLocator = true;
+    it++;
+  }
+  else
+    throw Error("EncryptedContent does not have key locator");
+
+  if (it != m_wire.elements_end() && it->type() == tlv::EncryptionAlgorithm) {
+    m_type = readNonNegativeInteger(*it);
+    it++;
+  }
+  else
+    throw Error("EncryptedContent does not have encryption algorithm");
+
+  if (it != m_wire.elements_end() && it->type() == tlv::EncryptedPayload) {
+    m_payload = make_shared<Buffer>(it->value_begin(),it->value_end());
+    it++;
+  }
+  else
+    throw Error("EncryptedContent has missing payload");
+
+  if (it != m_wire.elements_end()) {
+    throw Error("EncryptedContent has extraneous sub-TLVs");
+  }
+}
+
+bool
+EncryptedContent::operator==(const EncryptedContent& rhs) const
+{
+  return (wireEncode() == rhs.wireEncode());
+}
+
+} // namespace gep
+} // namespace ndn
diff --git a/src/encrypted-content.hpp b/src/encrypted-content.hpp
new file mode 100644
index 0000000..2d0203e
--- /dev/null
+++ b/src/encrypted-content.hpp
@@ -0,0 +1,92 @@
+#ifndef NDN_ENCRYPTED_CONTENT_HPP
+#define NDN_ENCRYPTED_CONTENT_HPP
+
+#include <ndn-cxx/encoding/tlv.hpp>
+#include <ndn-cxx/key-locator.hpp>
+#include <list>
+
+#include "tlv.hpp"
+
+namespace ndn {
+namespace gep {
+
+class EncryptedContent
+{
+public:
+  class Error : public ndn::tlv::Error
+  {
+    public:
+      explicit
+      Error(const std::string& what)
+      : ndn::tlv::Error(what)
+      {
+      }
+  };
+
+public:
+  EncryptedContent();
+
+  EncryptedContent(tlv::AlgorithmTypeValue type, const KeyLocator& keyLocator, const ConstBufferPtr& payload);
+
+  explicit
+  EncryptedContent(const Block& block);
+
+  void
+  setAlgorithmType(tlv::AlgorithmTypeValue type);
+
+  int32_t
+  getAlgorithmType() const
+  {
+    return m_type;
+  }
+
+  bool
+  hasKeyLocator() const
+  {
+   return m_hasKeyLocator;
+  }
+
+  void
+  setKeyLocator(const KeyLocator& keyLocator);
+
+  const KeyLocator&
+  getKeyLocator() const;
+
+  void
+  setPayload(const ConstBufferPtr& payload);
+
+  const ConstBufferPtr
+  getPayload() const;
+
+  template<encoding::Tag TAG>
+  size_t
+  wireEncode(EncodingImpl<TAG>& block) const;
+
+  const Block&
+  wireEncode() const;
+
+  void
+  wireDecode(const Block& wire);
+
+public:
+  bool
+  operator==(const EncryptedContent& rhs) const;
+  bool
+  operator!=(const EncryptedContent& rhs) const
+  {
+    return !(*this == rhs);
+  }
+
+private:
+  int32_t m_type;
+  bool m_hasKeyLocator;
+  KeyLocator m_keyLocator;
+  ConstBufferPtr m_payload;
+
+  mutable Block m_wire;
+};
+
+} // namespace gep
+} // namespace ndn
+
+#endif // NDN_ENCRYPTED_CONTENT_HPP
diff --git a/src/tlv.hpp b/src/tlv.hpp
new file mode 100644
index 0000000..92f2f4e
--- /dev/null
+++ b/src/tlv.hpp
@@ -0,0 +1,44 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+* Copyright (c) 2013-2014 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_GEP_TLV_HPP
+#define NDN_GEP_TLV_HPP
+
+namespace ndn {
+namespace gep {
+namespace tlv {
+
+enum {
+  EncryptedContent = 130,
+  EncryptionAlgorithm = 131,
+  EncryptedPayload = 132
+};
+
+enum AlgorithmTypeValue {
+  AlgorithmSha256WithRsa = 0,
+  AlgorithmSha256WithEcdsa = 1
+};
+
+} // namespace tlv
+} // namespace gep
+} // namespace ndn
+
+#endif // NDN_GEP_TLV_HPP
