diff --git a/model/ndn-name-components.h b/model/ndn-name-components.h
index c2076d1..04915df 100644
--- a/model/ndn-name-components.h
+++ b/model/ndn-name-components.h
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2011 University of California, Los Angeles
+ * Copyright (c) 2013 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
@@ -16,295 +16,13 @@
  * 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_COMPONENTS_H_
-#define _NDN_NAME_COMPONENTS_H_
+#ifndef NDN_NAME_COMPONENTS_H
+#define NDN_NAME_COMPONENTS_H
 
-#include "ns3/simple-ref-count.h"
-#include "ns3/attribute.h"
-#include "ns3/attribute-helper.h"
+// #warning ndn-name-components.h is now deprecated header. Please include ndn-name.h instead
 
-#include <string>
-#include <algorithm>
-#include <list>
-#include "ns3/object.h"
-#include "ns3/buffer.h"
+#include "ndn-name.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 NameComponents : public SimpleRefCount<NameComponents>
-{
-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 "/")
-   */
-  NameComponents ();
-  
-  /**
-   * \brief Constructor
-   * Creates a prefix from a list of strings where every string represents a prefix component
-   * @param[in] components A list of strings
-   */
-  NameComponents (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
-   */
-  NameComponents (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
-   */
-  NameComponents (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 NameComponents&
-  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
-   */
-  NameComponents
-  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 NameComponents
-   */
-  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 NameComponents
-   */
-  inline bool
-  operator== (const NameComponents &prefix) const;
-
-  /**
-   * \brief Less than operator for NameComponents
-   */
-  inline bool
-  operator< (const NameComponents &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 NameComponents &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, NameComponents &components);
-
-/**
- * \brief Returns the size of NameComponents object
- */  
-size_t
-NameComponents::size () const
-{
-  return m_prefix.size ();
-}
-
-NameComponents::iterator
-NameComponents::begin ()
-{
-  return m_prefix.begin ();
-}
-
-/**
- * @brief Get read-only begin() iterator
- */
-NameComponents::const_iterator
-NameComponents::begin () const
-{
-  return m_prefix.begin ();
-}  
-
-/**
- * @brief Get read-write end() iterator
- */
-NameComponents::iterator
-NameComponents::end ()
-{
-  return m_prefix.end ();
-}
-
-/**
- * @brief Get read-only end() iterator
- */
-NameComponents::const_iterator
-NameComponents::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>
-NameComponents&
-NameComponents::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
-NameComponents::Add (const T &value)
-{
-  std::ostringstream os;
-  os << value;
-  m_prefix.push_back (os.str ());
-}
-
-/**
- * \brief Equality operator for NameComponents
- */
-bool
-NameComponents::operator== (const NameComponents &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 NameComponents
- */
-bool
-NameComponents::operator< (const NameComponents &prefix) const
-{
-  return std::lexicographical_compare (m_prefix.begin (), m_prefix.end (),
-                                       prefix.m_prefix.begin (), prefix.m_prefix.end ());
-}
-
-    
-ATTRIBUTE_HELPER_HEADER (NameComponents);
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_NAME_COMPONENTS_H_
-
+#endif // NDN_NAME_COMPONENTS_H
diff --git a/model/ndn-name-components.cc b/model/ndn-name.cc
similarity index 81%
rename from model/ndn-name-components.cc
rename to model/ndn-name.cc
index 4a7965d..8e7a872 100644
--- a/model/ndn-name-components.cc
+++ b/model/ndn-name.cc
@@ -27,18 +27,19 @@
 
 using namespace std;
 
-NS_LOG_COMPONENT_DEFINE ("ndn.NameComponents");
+NS_LOG_COMPONENT_DEFINE ("ndn.Name");
 
 namespace ns3 {
 namespace ndn {
 
+ATTRIBUTE_HELPER_CPP (Name);
 ATTRIBUTE_HELPER_CPP (NameComponents);
 
-NameComponents::NameComponents (/* root */)
+Name::Name (/* root */)
 {
 }
 
-NameComponents::NameComponents (const std::list<boost::reference_wrapper<const std::string> > &components)
+Name::Name (const std::list<boost::reference_wrapper<const std::string> > &components)
 {
   BOOST_FOREACH (const boost::reference_wrapper<const std::string> &component, components)
     {
@@ -46,28 +47,28 @@
     }
 }
 
-NameComponents::NameComponents (const std::string &prefix)
+Name::Name (const std::string &prefix)
 {
   istringstream is (prefix);
   is >> *this;
 }
 
-NameComponents::NameComponents (const char *prefix)
+Name::Name (const char *prefix)
 {
   NS_ASSERT (prefix != 0);
-  
+
   istringstream is (prefix);
   is >> *this;
 }
 
 const std::list<std::string> &
-NameComponents::GetComponents () const
+Name::GetComponents () const
 {
   return m_prefix;
 }
 
 std::string
-NameComponents::GetLastComponent () const
+Name::GetLastComponent () const
 {
   if (m_prefix.size () == 0)
     {
@@ -78,25 +79,25 @@
 }
 
 std::list<boost::reference_wrapper<const std::string> >
-NameComponents::GetSubComponents (size_t num) const
+Name::GetSubComponents (size_t num) const
 {
   NS_ASSERT_MSG (0<=num && num<=m_prefix.size (), "Invalid number of subcomponents requested");
-  
+
   std::list<boost::reference_wrapper<const std::string> > subComponents;
   std::list<std::string>::const_iterator component = m_prefix.begin();
   for (size_t i=0; i<num; i++, component++)
     {
       subComponents.push_back (boost::ref (*component));
     }
-    
+
   return subComponents;
 }
 
-NameComponents
-NameComponents::cut (size_t minusComponents) const
+Name
+Name::cut (size_t minusComponents) const
 {
-  NameComponents retval;
-  std::list<std::string>::const_iterator component = m_prefix.begin (); 
+  Name retval;
+  std::list<std::string>::const_iterator component = m_prefix.begin ();
   for (uint32_t i = 0; i < m_prefix.size () - minusComponents; i++, component++)
     {
       retval.Add (*component);
@@ -106,10 +107,10 @@
 }
 
 size_t
-NameComponents::GetSerializedSize () const
+Name::GetSerializedSize () const
 {
   size_t nameSerializedSize = 2;
-  
+
   for (std::list<std::string>::const_iterator i = this->begin ();
        i != this->end ();
        i++)
@@ -122,7 +123,7 @@
 }
 
 uint32_t
-NameComponents::Serialize (Buffer::Iterator start) const
+Name::Serialize (Buffer::Iterator start) const
 {
   Buffer::Iterator i = start;
 
@@ -138,12 +139,12 @@
 
   return i.GetDistanceFrom (start);
 }
-  
+
 uint32_t
-NameComponents::Deserialize (Buffer::Iterator start)
+Name::Deserialize (Buffer::Iterator start)
 {
   Buffer::Iterator i = start;
-    
+
   uint16_t nameLength = i.ReadU16 ();
   while (nameLength > 0)
     {
@@ -160,7 +161,7 @@
 }
 
 void
-NameComponents::Print (std::ostream &os) const
+Name::Print (std::ostream &os) const
 {
   for (const_iterator i=m_prefix.begin(); i!=m_prefix.end(); i++)
     {
@@ -168,19 +169,19 @@
     }
   if (m_prefix.size ()==0) os << "/";
 }
-  
+
 std::ostream &
-operator << (std::ostream &os, const NameComponents &components)
+operator << (std::ostream &os, const Name &components)
 {
   components.Print (os);
   return os;
 }
 
 std::istream &
-operator >> (std::istream &is, NameComponents &components)
+operator >> (std::istream &is, Name &components)
 {
   istream_iterator<char> eos; // end of stream
-  
+
   std::string component = "";
   istream_iterator<char> it (is);
   for (; it != eos; it++)
@@ -197,9 +198,9 @@
   if (component != "")
       components.Add (component);
 
-  is.clear (); 
+  is.clear ();
   // NS_LOG_ERROR (components << ", bad: " << is.bad () <<", fail: " << is.fail ());
-  
+
   return is;
 }
 
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_
+
