diff --git a/model/wire/ndnsim.cc b/model/wire/ndnsim.cc
index 747d264..2152d99 100644
--- a/model/wire/ndnsim.cc
+++ b/model/wire/ndnsim.cc
@@ -10,11 +10,22 @@
 
 #include "ndnsim.h"
 
+using namespace std;
+
+#include <ns3/header.h>
+#include <ns3/packet.h>
+#include <ns3/log.h>
+
+NS_LOG_COMPONENT_DEFINE ("ndn.wire.ndnSIM");
+
 NDN_NAMESPACE_BEGIN
 
 namespace wire {
 namespace ndnSIM {
 
+NS_OBJECT_ENSURE_REGISTERED (Interest);
+NS_OBJECT_ENSURE_REGISTERED (Data);
+
 
 class Name
 {
@@ -29,7 +40,7 @@
   {
   }
 
-  Ptr<Name>
+  Ptr<ndn::Name>
   GetName ()
   {
     return m_name;
@@ -56,7 +67,7 @@
   {
     Buffer::Iterator i = start;
 
-    i.WriteU16 (static_cast<uint16_t> (m_name->GetSerializedSize ()-2));
+    i.WriteU16 (static_cast<uint16_t> (GetSerializedSize ()-2));
 
     for (std::list<std::string>::const_iterator item = m_name->begin ();
          item != m_name->end ();
@@ -119,7 +130,7 @@
 {
   static TypeId tid = TypeId ("ns3::ndn::Interest::ndnSIM")
     .SetGroupName ("Ndn")
-    .AddParent<Header> ()
+    .SetParent<Header> ()
     .AddConstructor<Interest> ()
     ;
   return tid;
@@ -137,10 +148,12 @@
   Ptr<const Packet> p = interest->GetWire ();
   if (!p)
     {
-      p = Create<Packet> (*interest->GetPayload ());
-      Interest wireEncoding (interest);
-      p->AddHeader (wireEncoding);
-      interest->SetWire (p);
+      Ptr<Packet> packet = Create<Packet> (*interest->GetPayload ());
+      Interest wireEncoding (ConstCast<ndn::Interest> (interest));
+      packet->AddHeader (wireEncoding);
+      interest->SetWire (packet);
+
+      p = packet;
     }
   
   return p->Copy ();
@@ -150,7 +163,7 @@
 Interest::FromWire (Ptr<Packet> packet)
 {
   Ptr<ndn::Interest> interest = Create<ndn::Interest> ();
-  // interest->SetWire (packet->Copy ()); /* not sure if this is needed */
+  interest->SetWire (packet->Copy ());
 
   Interest wireEncoding (interest);
   packet->RemoveHeader (wireEncoding);
@@ -166,7 +179,7 @@
   size_t size =
     1/*version*/ + 1 /*type*/ + 2/*length*/ +
     (4/*nonce*/ + 1/*scope*/ + 1/*nack type*/ + 2/*timestamp*/ +
-     (Name (ConstCast<ns3::Name> (m_interest->GetNamePtr ())).GetSerializedSize ()) +
+     (Name (ConstCast<ndn::Name> (m_interest->GetNamePtr ())).GetSerializedSize ()) +
      (2 + 0)/* selectors */ +
      (2 + 0)/* options */);
   
@@ -182,17 +195,17 @@
 
   start.WriteU16 (GetSerializedSize () - 4);
 
-  start.WriteU32 (m_nonce);
-  start.WriteU8 (m_scope);
-  start.WriteU8 (m_nackType);
+  start.WriteU32 (m_interest->GetNonce ());
+  start.WriteU8 (m_interest->GetScope ());
+  start.WriteU8 (m_interest->GetNack ());
 
-  NS_ASSERT_MSG (0 <= m_interest->GetInterestLifetime.ToInteger (Time::S) && m_interest->GetInterestLifetime.ToInteger (Time::S) < 65535,
+  NS_ASSERT_MSG (0 <= m_interest->GetInterestLifetime ().ToInteger (Time::S) && m_interest->GetInterestLifetime ().ToInteger (Time::S) < 65535,
                  "Incorrect InterestLifetime (should not be smaller than 0 and larger than 65535");
   
   // rounding timestamp value to seconds
-  start.WriteU16 (static_cast<uint16_t> (m_interest->GetInterestLifetime.ToInteger (Time::S)));
+  start.WriteU16 (static_cast<uint16_t> (m_interest->GetInterestLifetime ().ToInteger (Time::S)));
 
-  uint32_t offset = Name (ConstCast<ns3::Name> (m_interest->GetNamePtr ())).Serialize (start);
+  uint32_t offset = Name (ConstCast<ndn::Name> (m_interest->GetNamePtr ())).Serialize (start);
   start.Next (offset);
   
   start.WriteU16 (0); // no selectors
@@ -214,13 +227,13 @@
   
   m_interest->SetNonce (i.ReadU32 ());
   m_interest->SetScope (i.ReadU8 ());
-  m_interest->SetNackType (i.ReadU8 ());
+  m_interest->SetNack (i.ReadU8 ());
 
   m_interest->SetInterestLifetime (Seconds (i.ReadU16 ()));
 
   Name name;
   uint32_t offset = name.Deserialize (i);
-  m_interest->SetName (name->GetName ());
+  m_interest->SetName (name.GetName ());
   i.Next (offset);
   
   i.ReadU16 ();
@@ -231,6 +244,12 @@
   return i.GetDistanceFrom (start);
 }
 
+void
+Interest::Print (std::ostream &os) const
+{
+  m_interest->Print (os);
+}
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -265,7 +284,7 @@
 }
 
 Ptr<ndn::ContentObject>
-GetData ()
+Data::GetData ()
 {
   return m_data;
 }
@@ -276,10 +295,12 @@
   Ptr<const Packet> p = data->GetWire ();
   if (!p)
     {
-      p = Create<Packet> (*data->GetPayload ());
-      Data wireEncoding (data);
-      p->AddHeader (wireEncoding);
-      data->SetWire (p);
+      Ptr<Packet> packet = Create<Packet> (*data->GetPayload ());
+      Data wireEncoding (ConstCast<ndn::ContentObject> (data));
+      packet->AddHeader (wireEncoding);
+      data->SetWire (packet);
+
+      p = packet;
     }
   
   return p->Copy ();
@@ -289,7 +310,7 @@
 Data::FromWire (Ptr<Packet> packet)
 {
   Ptr<ndn::ContentObject> data = Create<ndn::ContentObject> ();
-  // data->SetWire (packet->Copy ()); /* not sure if this is needed */
+  data->SetWire (packet->Copy ());
 
   Data wireEncoding (data);
   packet->RemoveHeader (wireEncoding);
@@ -303,7 +324,7 @@
 Data::GetSerializedSize () const
 {
   uint32_t size = 1 + 1 + 2 +
-    ((2 + 2) + (Name (ConstCast<ns3::Name> (m_data->GetNamePtr ())).GetSerializedSize ()) + (2 + 2 + 4 + 2 + 2 + (2 + 0)));
+    ((2 + 2) + (Name (ConstCast<ndn::Name> (m_data->GetNamePtr ())).GetSerializedSize ()) + (2 + 2 + 4 + 2 + 2 + (2 + 0)));
   if (m_data->GetSignature () != 0)
     size += 4;
   
@@ -331,15 +352,15 @@
     }
 
   // name
-  uint32_t offset = Name (ConstCast<ns3::Name> (m_data->GetNamePtr ())).Serialize (start);
+  uint32_t offset = Name (ConstCast<ndn::Name> (m_data->GetNamePtr ())).Serialize (start);
   start.Next (offset);
 
   // content
   // for now assume that contentdata length is zero
   start.WriteU16 (2 + 4 + 2 + 2 + (2 + 0));
   start.WriteU16 (4 + 2 + 2 + (2 + 0));
-  start.WriteU32 (static_cast<uint32_t> (m_data->GetTimestamp.ToInteger (Time::S)));
-  start.WriteU16 (static_cast<uint16_t> (m_data->GetFreshness.ToInteger (Time::S)));
+  start.WriteU32 (static_cast<uint32_t> (m_data->GetTimestamp ().ToInteger (Time::S)));
+  start.WriteU16 (static_cast<uint16_t> (m_data->GetFreshness ().ToInteger (Time::S)));
   start.WriteU16 (0); // reserved 
   start.WriteU16 (0); // Length (ContentInfoOptions)
 
@@ -364,20 +385,20 @@
     {
       if (i.ReadU16 () != 0xFF00) // signature type
         throw new ContentObjectException ();
-      m_data.SetSignature (i.ReadU32 ());
+      m_data->SetSignature (i.ReadU32 ());
     }
   else if (signatureLength == 2)
     {
       if (i.ReadU16 () != 0) // signature type
         throw new ContentObjectException ();
-      m_data.SetSignature (0);
+      m_data->SetSignature (0);
     }
   else
     throw new ContentObjectException ();
 
   Name name;
   uint32_t offset = name.Deserialize (i);
-  m_data->SetName (name->GetName ());
+  m_data->SetName (name.GetName ());
   i.Next (offset);
 
   if (i.ReadU16 () != (2 + 4 + 2 + 2 + (2 + 0))) // content length
@@ -400,7 +421,13 @@
   return i.GetDistanceFrom (start);
 }
 
+void
+Data::Print (std::ostream &os) const
+{
+  m_data->Print (os);
 }
-}
+
+} // ndnSIM
+} // wire
 
 NDN_NAMESPACE_END
