diff --git a/ndn-cpp/encoding/der/der.hpp b/ndn-cpp/encoding/der/der.hpp
new file mode 100644
index 0000000..82089d6
--- /dev/null
+++ b/ndn-cpp/encoding/der/der.hpp
@@ -0,0 +1,385 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DER_HPP
+#define NDN_DER_HPP
+
+#include <vector>
+#include <string>
+#include <istream>
+#include <ostream>
+#include <sstream>
+
+#include <ndn-cpp/common.hpp>
+#include <ndn-cpp/encoding/oid.hpp>
+
+#include "visitor/visitor.hpp"
+#include "visitor/void-visitor.hpp"
+#include "visitor/no-arguments-visitor.hpp"
+#include "visitor/void-no-arguments-visitor.hpp"
+
+namespace ndn {
+
+// TODO: Implement Time values.
+class Time;
+
+namespace der {
+
+enum DerType {
+  DER_EOC = 0,
+  DER_BOOLEAN = 1,
+  DER_INTEGER = 2,
+  DER_BIT_STRING = 3,
+  DER_OCTET_STRING = 4,
+  DER_NULL = 5,
+  DER_OBJECT_IDENTIFIER = 6,
+  DER_OBJECT_DESCRIPTOR = 7,
+  DER_EXTERNAL = 40,
+  DER_REAL = 9,
+  DER_ENUMERATED = 10,
+  DER_EMBEDDED_PDV = 43,
+  DER_UTF8_STRING = 12,
+  DER_RELATIVE_OID = 13,
+  DER_SEQUENCE = 48,
+  DER_SET = 49,
+  DER_NUMERIC_STRING = 18,
+  DER_PRINTABLE_STRING = 19,
+  DER_T61_STRING = 20,
+  DER_VIDEOTEX_STRING = 21,
+  DER_IA5_STRING = 22,
+  DER_UTC_TIME = 23,
+  DER_GENERALIZED_TIME = 24,
+  DER_GRAPHIC_STRING = 25,
+  DER_VISIBLE_STRING = 26,
+  DER_GENERAL_STRING = 27,
+  DER_UNIVERSAL_STRING = 28,
+  DER_CHARACTER_STRING = 29,
+  DER_BMP_STRING = 30,
+};
+
+class DerComplex;
+
+class DerNode
+{
+public:
+  DerNode();
+
+  DerNode(DerType type);
+
+  DerNode(std::istream& start);
+
+  virtual
+  ~DerNode();
+
+  virtual int
+  getSize() { return m_header.size() + m_payload.size(); }
+
+  virtual void 
+  encode(std::ostream& start);
+  
+  void
+  setParent(DerComplex * parent) { m_parent = parent; }
+
+  static ptr_lib::shared_ptr<DerNode>
+  parse(std::istream& start);
+
+  const std::vector<uint8_t>& 
+  getHeader() const { return m_header; }
+
+  std::vector<uint8_t>& 
+  getHeader() { return m_header; }
+
+  const std::vector<uint8_t>& 
+  getPayload() const { return m_payload; }
+  
+  std::vector<uint8_t>& 
+  getPayload() { return m_payload; }
+
+  const DerType& 
+  getType() { return m_type; }
+
+  virtual ptr_lib::shared_ptr<std::vector<uint8_t> >
+  getRaw()
+  { 
+    ptr_lib::shared_ptr<std::vector<uint8_t> > blob(new std::vector<uint8_t>());
+    blob->insert(blob->end(), m_header.begin(), m_header.end());
+    blob->insert(blob->end(), m_payload.begin(), m_payload.end());
+
+    return blob;
+  }
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) = 0;
+  virtual void accept(VoidVisitor& visitor, Any param) = 0;
+  virtual Any accept(NoArgumentsVisitor& visitor) = 0;
+  virtual Any accept(Visitor& visitor, Any param) = 0;
+  
+protected:
+  void
+  decode(std::istream& start);
+
+  void
+  encodeHeader(int size);
+
+  int 
+  decodeHeader(std::istream& start);
+
+protected:
+  DerType m_type;
+  std::vector<uint8_t> m_header;
+  std::vector<uint8_t> m_payload;
+  DerComplex * m_parent;
+};
+
+
+typedef std::vector<ptr_lib::shared_ptr<DerNode> > DerNodePtrList;
+
+class DerComplex : public DerNode
+{
+public:
+  DerComplex();
+  
+  DerComplex(DerType type);
+
+  DerComplex(std::istream& start);
+
+  virtual 
+  ~DerComplex();
+
+  virtual int
+  getSize();
+
+  void 
+  addChild(ptr_lib::shared_ptr<DerNode> nodePtr, bool notifyParent = true);
+
+  virtual void
+  encode(std::ostream& start);
+
+  const DerNodePtrList& 
+  getChildren() const { return m_nodeList; }
+
+  DerNodePtrList& 
+  getChildren() { return m_nodeList; }
+
+  virtual ptr_lib::shared_ptr<std::vector<uint8_t> >
+  getRaw();
+
+private:
+  void
+  updateSize();
+
+  void
+  setChildChanged();
+
+private:
+  bool m_childChanged;
+  int m_size;
+  DerNodePtrList m_nodeList;
+};
+
+
+
+class DerByteString : public DerNode
+{
+public:
+  DerByteString(const std::string& str, DerType type);
+
+  DerByteString(const std::vector<uint8_t>& blob, DerType type);
+
+  DerByteString(std::istream& start);
+
+  virtual
+  ~DerByteString();
+};
+
+
+//0x01  
+class DerBool : public DerNode
+{
+public:
+  DerBool(bool value);
+
+  DerBool(std::istream& start);
+
+  virtual
+  ~DerBool();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+};
+
+//0x02  
+class DerInteger : public DerNode
+{
+public:
+  DerInteger(const std::vector<uint8_t>& blob);
+
+  DerInteger(std::istream& start);
+
+  virtual 
+  ~DerInteger();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+};
+
+//0x03
+class DerBitString : public DerNode
+{
+public:
+  DerBitString(const std::vector<uint8_t>& blob, uint8_t paddingLen);
+
+  DerBitString(std::istream& start);
+  
+  virtual
+  ~DerBitString();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+};
+
+//0x04
+class DerOctetString : public DerByteString
+{
+public:
+  DerOctetString(const std::string& str);
+  
+  DerOctetString(const std::vector<uint8_t>& blob);
+
+  DerOctetString(std::istream& start);
+
+  virtual
+  ~DerOctetString();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+};
+
+
+//0x05
+class DerNull : public DerNode
+{
+public:
+  DerNull();
+
+  DerNull(std::istream& start);
+  
+  virtual
+  ~DerNull();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+};
+
+
+//0x06
+class DerOid : public DerNode
+{
+public:
+  DerOid(const OID& oid);
+  
+  DerOid(const std::string& oidStr);
+
+  DerOid(const std::vector<int>& value);
+
+  DerOid(std::istream& start);
+  
+  virtual
+  ~DerOid();
+  
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+  int 
+  decode128(int& offset);
+
+private:
+  void 
+  prepareEncoding(const std::vector<int>& value);
+
+  void 
+  encode128(int value, std::ostringstream& os);    
+};
+
+
+//0x10
+class DerSequence : public DerComplex
+{
+public:
+  DerSequence();
+
+  DerSequence(std::istream& start);
+  
+  virtual
+  ~DerSequence();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+};
+
+//0x13
+class DerPrintableString : public DerByteString
+{
+public:
+  DerPrintableString(const std::string& str);
+
+  DerPrintableString(const std::vector<uint8_t>& blob);
+
+  DerPrintableString(std::istream& start);
+
+  virtual 
+  ~DerPrintableString();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+};
+
+//0x1b
+class DerGtime : public DerNode
+{
+public:
+  DerGtime(const Time& time);
+
+  DerGtime(std::istream& start);
+  
+  virtual 
+  ~DerGtime();
+
+  virtual void accept(VoidNoArgumentsVisitor& visitor) {        visitor.visit(*this);        }
+  virtual void accept(VoidVisitor& visitor, Any param) {        visitor.visit(*this, param); }
+  virtual Any accept(NoArgumentsVisitor& visitor)      { return visitor.visit(*this);        }
+  virtual Any accept(Visitor& visitor, Any param)      { return visitor.visit(*this, param); }
+
+};
+ 
+} // der
+
+}
+
+#endif
diff --git a/ndn-cpp/encoding/der/visitor/no-arguments-visitor.hpp b/ndn-cpp/encoding/der/visitor/no-arguments-visitor.hpp
new file mode 100644
index 0000000..61b0a65
--- /dev/null
+++ b/ndn-cpp/encoding/der/visitor/no-arguments-visitor.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DER_NO_ARGUMENTS_VISITOR_HPP
+#define NDN_DER_NO_ARGUMENTS_VISITOR_HPP
+
+#include "visitor.hpp"
+
+namespace ndn {
+
+namespace der {
+
+class NoArgumentsVisitor
+{
+public:
+  virtual Any visit(DerBool&           ) = 0;
+  virtual Any visit(DerInteger&        ) = 0;
+  virtual Any visit(DerPrintableString&) = 0;
+  virtual Any visit(DerBitString&      ) = 0;
+  virtual Any visit(DerNull&           ) = 0;
+  virtual Any visit(DerOctetString&    ) = 0;
+  virtual Any visit(DerOid&            ) = 0;
+  virtual Any visit(DerSequence&       ) = 0;
+  virtual Any visit(DerGtime&          ) = 0;
+};
+
+} // der
+
+}
+
+#endif
diff --git a/ndn-cpp/encoding/der/visitor/simple-visitor.hpp b/ndn-cpp/encoding/der/visitor/simple-visitor.hpp
new file mode 100644
index 0000000..4ec3a8c
--- /dev/null
+++ b/ndn-cpp/encoding/der/visitor/simple-visitor.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DER_SIMPLE_VISITOR_HPP
+#define NDN_DER_SIMPLE_VISITOR_HPP
+
+#include "no-arguments-visitor.hpp"
+
+namespace ndn {
+
+namespace der {
+
+class NoArgumentsVisitor : public NoArgumentsVisitor
+{
+public:
+  virtual Any visit(DerBool&           ) = 0;
+  virtual Any visit(DerInteger&        ) = 0;
+  virtual Any visit(DerPrintableString&) = 0;
+  virtual Any visit(DerBitString&      ) = 0;
+  virtual Any visit(DerNull&           ) = 0;
+  virtual Any visit(DerOctetString&    ) = 0;
+  virtual Any visit(DerOid&            ) = 0;
+  virtual Any visit(DerSequence&       ) = 0;
+  virtual Any visit(DerGtime&          ) = 0;
+};
+
+} // der
+
+}
+
+#endif
diff --git a/ndn-cpp/encoding/der/visitor/visitor.hpp b/ndn-cpp/encoding/der/visitor/visitor.hpp
new file mode 100644
index 0000000..a251701
--- /dev/null
+++ b/ndn-cpp/encoding/der/visitor/visitor.hpp
@@ -0,0 +1,47 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DER_VISITOR_HPP
+#define NDN_DER_VISITOR_HPP
+
+namespace ndn {
+
+namespace der {
+  
+// TODO: We want to implement an any type, but avoid boost::any which is not in the C++ standard library.
+typedef void *Any;
+
+class DerBool;
+class DerInteger;
+class DerPrintableString;
+class DerBitString;
+class DerNull;
+class DerOctetString;
+class DerOid;
+class DerSequence;
+class DerGtime;
+
+class Visitor
+{
+public:
+  virtual Any visit(DerBool&,             Any) = 0;
+  virtual Any visit(DerInteger&,          Any) = 0;
+  virtual Any visit(DerPrintableString&,  Any) = 0;
+  virtual Any visit(DerBitString&,        Any) = 0;
+  virtual Any visit(DerNull&,             Any) = 0;
+  virtual Any visit(DerOctetString&,      Any) = 0;
+  virtual Any visit(DerOid&,              Any) = 0;
+  virtual Any visit(DerSequence&,         Any) = 0;
+  virtual Any visit(DerGtime&,            Any) = 0;
+};
+
+} // der
+
+}
+
+#endif
diff --git a/ndn-cpp/encoding/der/visitor/void-no-arguments-visitor.hpp b/ndn-cpp/encoding/der/visitor/void-no-arguments-visitor.hpp
new file mode 100644
index 0000000..7e60d38
--- /dev/null
+++ b/ndn-cpp/encoding/der/visitor/void-no-arguments-visitor.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DER_VOID_NO_ARGUMENTS_VISITOR_HPP
+#define NDN_DER_VOID_NO_ARGUMENTS_VISITOR_HPP
+
+#include "visitor.hpp"
+
+namespace ndn {
+
+namespace der {
+
+class VoidNoArgumentsVisitor
+{
+public:
+  virtual void visit(DerBool&           ) = 0;
+  virtual void visit(DerInteger&        ) = 0;
+  virtual void visit(DerPrintableString&) = 0;
+  virtual void visit(DerBitString&      ) = 0;
+  virtual void visit(DerNull&           ) = 0;
+  virtual void visit(DerOctetString&    ) = 0;
+  virtual void visit(DerOid&            ) = 0;
+  virtual void visit(DerSequence&       ) = 0;
+  virtual void visit(DerGtime&          ) = 0;
+};
+
+} // der
+
+}
+
+#endif
diff --git a/ndn-cpp/encoding/der/visitor/void-visitor.hpp b/ndn-cpp/encoding/der/visitor/void-visitor.hpp
new file mode 100644
index 0000000..a041c10
--- /dev/null
+++ b/ndn-cpp/encoding/der/visitor/void-visitor.hpp
@@ -0,0 +1,36 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DER_VOID_VISITOR_HPP
+#define NDN_DER_VOID_VISITOR_HPP
+
+#include "visitor.hpp"
+
+namespace ndn {
+
+namespace der {
+
+class VoidVisitor
+{
+public:
+  virtual void visit(DerBool&,             Any) = 0;
+  virtual void visit(DerInteger&,          Any) = 0;
+  virtual void visit(DerPrintableString&,  Any) = 0;
+  virtual void visit(DerBitString&,        Any) = 0;
+  virtual void visit(DerNull&,             Any) = 0;
+  virtual void visit(DerOctetString&,      Any) = 0;
+  virtual void visit(DerOid&,              Any) = 0;
+  virtual void visit(DerSequence&,         Any) = 0;
+  virtual void visit(DerGtime&,            Any) = 0;
+};
+
+} // der
+
+}
+
+#endif
diff --git a/ndn-cpp/security/certificate/certificate-extension.cpp b/ndn-cpp/security/certificate/certificate-extension.cpp
new file mode 100644
index 0000000..9f6c39a
--- /dev/null
+++ b/ndn-cpp/security/certificate/certificate-extension.cpp
@@ -0,0 +1,50 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#include "../../encoding/der/der.hpp"
+#include <ndn-cpp/security/certificate/certificate-extension.hpp>
+
+using namespace std;
+using namespace ndn::ptr_lib;
+
+namespace ndn {
+
+shared_ptr<der::DerNode> 
+CertificateExtension::toDer()
+{
+  shared_ptr<der::DerSequence> root(new der::DerSequence);
+    
+  shared_ptr<der::DerOid> extensionId(new der::DerOid(extensionId_));
+  shared_ptr<der::DerBool> isCritical(new der::DerBool(isCritical_));
+  shared_ptr<der::DerOctetString> extensionValue(new der::DerOctetString(*extensionValue_));
+
+  root->addChild(extensionId);
+  root->addChild(isCritical);
+  root->addChild(extensionValue);
+
+  root->getSize();
+
+  return root;
+}
+
+Blob
+CertificateExtension::toDerBlob()
+{
+#if 0 // Need to convert blob_stream.
+  blob_stream blobStream;
+  ostream& start = reinterpret_cast<ostream&>(blobStream);
+
+  toDer()->encode(start);
+
+  return blobStream.buf();
+#else
+  throw std::runtime_error("not implemented");
+#endif
+}
+
+
+}
diff --git a/ndn-cpp/security/certificate/certificate-subject-description.cpp b/ndn-cpp/security/certificate/certificate-subject-description.cpp
new file mode 100644
index 0000000..ee2310c
--- /dev/null
+++ b/ndn-cpp/security/certificate/certificate-subject-description.cpp
@@ -0,0 +1,31 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Yingdi Yu <yingdi@cs.ucla.edu>
+ * @author: Jeff Thompson <jefft0@remap.ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+#include "../../encoding/der/der.hpp"
+#include <ndn-cpp/security/certificate/certificate-subject-description.hpp>
+
+using namespace std;
+using namespace ndn::ptr_lib;
+
+namespace ndn {
+
+shared_ptr<der::DerNode> 
+CertificateSubjectDescription::toDer()
+{
+  shared_ptr<der::DerSequence> root(new der::DerSequence());
+
+  shared_ptr<der::DerOid> oid(new der::DerOid(oid_));
+  shared_ptr<der::DerPrintableString> value(new der::DerPrintableString(value_));
+
+  root->addChild(oid);
+  root->addChild(value);
+
+  return root;
+}
+
+}
