diff --git a/model/ndn-name.h b/model/ndn-name.h
new file mode 100644
index 0000000..7f24784
--- /dev/null
+++ b/model/ndn-name.h
@@ -0,0 +1,327 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#ifndef _NDN_NAME_H_
+#define _NDN_NAME_H_
+
+#include "ns3/simple-ref-count.h"
+#include "ns3/attribute.h"
+#include "ns3/attribute-helper.h"
+
+#include <string>
+#include <algorithm>
+#include <list>
+#include "ns3/object.h"
+#include "ns3/buffer.h"
+
+#include <boost/ref.hpp>
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * \ingroup ndn
+ * \brief Hierarchical NDN name
+ * A Name element represents a hierarchical name for Ndn content.
+ * It simply contains a sequence of Component elements.
+ * Each Component element contains a sequence of zero or more bytes.
+ * There are no restrictions on what byte sequences may be used.
+ * The Name element in an Interest is often referred to with the term name prefix or simply prefix.
+ */
+class Name : public SimpleRefCount<Name>
+{
+public:
+  typedef std::list<std::string>::iterator       iterator;
+  typedef std::list<std::string>::const_iterator const_iterator;
+
+  /**
+   * \brief Constructor
+   * Creates a prefix with zero components (can be looked as root "/")
+   */
+  Name ();
+
+  /**
+   * \brief Constructor
+   * Creates a prefix from a list of strings where every string represents a prefix component
+   * @param[in] components A list of strings
+   */
+  Name (const std::list<boost::reference_wrapper<const std::string> > &components);
+
+  /**
+   * @brief Constructor
+   * Creates a prefix from the string (string is parsed using operator>>)
+   * @param[in] prefix A string representation of a prefix
+   */
+  Name (const std::string &prefix);
+
+  /**
+   * @brief Constructor
+   * Creates a prefix from the string (string is parsed using operator>>)
+   * @param[in] prefix A string representation of a prefix
+   */
+  Name (const char *prefix);
+
+  /**
+   * \brief Generic Add method
+   * Appends object of type T to the list of components
+   * @param[in] value The object to be appended
+   */
+  template<class T>
+  inline void
+  Add (const T &value);
+
+  /**
+   * \brief Generic constructor operator
+   * The object of type T will be appended to the list of components
+   */
+  template<class T>
+  inline Name&
+  operator () (const T &value);
+
+  /**
+   * \brief Get a name
+   * Returns a list of components (strings)
+   */
+  const std::list<std::string> &
+  GetComponents () const;
+
+  /**
+   * @brief Helper call to get the last component of the name
+   */
+  std::string
+  GetLastComponent () const;
+
+  /**
+   * \brief Get subcomponents of the name, starting with first component
+   * @param[in] num Number of components to return. Valid value is in range [1, GetComponents ().size ()]
+   */
+  std::list<boost::reference_wrapper<const std::string> >
+  GetSubComponents (size_t num) const;
+
+  /**
+   * @brief Get prefix of the name, containing less  minusComponents right components
+   */
+  Name
+  cut (size_t minusComponents) const;
+
+  /**
+   * \brief Print name
+   * @param[in] os Stream to print
+   */
+  void Print (std::ostream &os) const;
+
+  /**
+   * @brief Get serialized size for ndnSIM packet encoding
+   */
+  size_t
+  GetSerializedSize () const;
+
+  /**
+   * @brief Serialize Name in ndnSIM packet encoding
+   * @param[in] start buffer to contain serialized name
+   */
+  uint32_t
+  Serialize (Buffer::Iterator start) const;
+
+  /**
+   * \brief Deserialize Name in ndnSIM packet encoding
+   * @param[in] start buffer that contains serialized name
+   */
+  uint32_t
+  Deserialize (Buffer::Iterator start);
+
+  /**
+   * \brief Returns the size of Name
+   */
+  inline size_t
+  size () const;
+
+  /**
+   * @brief Get read-write begin() iterator
+   */
+  inline iterator
+  begin ();
+
+  /**
+   * @brief Get read-only begin() iterator
+   */
+  inline const_iterator
+  begin () const;
+
+  /**
+   * @brief Get read-write end() iterator
+   */
+  inline iterator
+  end ();
+
+  /**
+   * @brief Get read-only end() iterator
+   */
+  inline const_iterator
+  end () const;
+
+  /**
+   * \brief Equality operator for Name
+   */
+  inline bool
+  operator== (const Name &prefix) const;
+
+  /**
+   * \brief Less than operator for Name
+   */
+  inline bool
+  operator< (const Name &prefix) const;
+
+  typedef std::string partial_type;
+
+private:
+  std::list<std::string> m_prefix;                              ///< \brief a list of strings (components)
+};
+
+/**
+ * \brief Print out name components separated by slashes, e.g., /first/second/third
+ */
+std::ostream &
+operator << (std::ostream &os, const Name &components);
+
+/**
+ * \brief Read components from input and add them to components. Will read input stream till eof
+ * Substrings separated by slashes will become separate components
+ */
+std::istream &
+operator >> (std::istream &is, Name &components);
+
+/**
+ * \brief Returns the size of Name object
+ */
+size_t
+Name::size () const
+{
+  return m_prefix.size ();
+}
+
+Name::iterator
+Name::begin ()
+{
+  return m_prefix.begin ();
+}
+
+/**
+ * @brief Get read-only begin() iterator
+ */
+Name::const_iterator
+Name::begin () const
+{
+  return m_prefix.begin ();
+}
+
+/**
+ * @brief Get read-write end() iterator
+ */
+Name::iterator
+Name::end ()
+{
+  return m_prefix.end ();
+}
+
+/**
+ * @brief Get read-only end() iterator
+ */
+Name::const_iterator
+Name::end () const
+{
+  return m_prefix.end ();
+}
+
+
+/**
+ * \brief Generic constructor operator
+ * The object of type T will be appended to the list of components
+ */
+template<class T>
+Name&
+Name::operator () (const T &value)
+{
+  Add (value);
+  return *this;
+}
+
+/**
+ * \brief Generic Add method
+ * Appends object of type T to the list of components
+ * @param[in] value The object to be appended
+ */
+template<class T>
+void
+Name::Add (const T &value)
+{
+  std::ostringstream os;
+  os << value;
+  m_prefix.push_back (os.str ());
+}
+
+/**
+ * \brief Equality operator for Name
+ */
+bool
+Name::operator== (const Name &prefix) const
+{
+  if (m_prefix.size () != prefix.m_prefix.size ())
+    return false;
+
+  return std::equal (m_prefix.begin (), m_prefix.end (), prefix.m_prefix.begin ());
+}
+
+/**
+ * \brief Less than operator for Name
+ */
+bool
+Name::operator< (const Name &prefix) const
+{
+  return std::lexicographical_compare (m_prefix.begin (), m_prefix.end (),
+                                       prefix.m_prefix.begin (), prefix.m_prefix.end ());
+}
+
+ATTRIBUTE_HELPER_HEADER (Name);
+
+/**
+ * @ingroup Ndn
+ * @brief For backwards compatibility
+ */
+class NameComponents : public Name
+{
+public:
+  NameComponents () : Name () { }
+
+  NameComponents (const std::list<boost::reference_wrapper<const std::string> > &components) : Name (components) { }
+
+  NameComponents (const std::string &prefix) : Name (prefix) { }
+
+  NameComponents (const char *prefix) : Name (prefix) { }
+};
+
+ATTRIBUTE_HELPER_HEADER (NameComponents);
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // _NDN_NAME_H_
+
