diff --git a/model/ndn-interest.cc b/model/ndn-interest.cc
index f0a4f29..195c4f9 100644
--- a/model/ndn-interest.cc
+++ b/model/ndn-interest.cc
@@ -31,24 +31,14 @@
 
 NS_OBJECT_ENSURE_REGISTERED (Interest);
 
-TypeId
-Interest::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::Interest")
-    .SetGroupName ("Ndn")
-    .SetParent<Header> ()
-    .AddConstructor<Interest> ()
-    ;
-  return tid;
-}
-  
-
 Interest::Interest ()
   : m_name ()
   , m_scope (0xFF)
   , m_interestLifetime (Seconds (0))
   , m_nonce (0)
   , m_nackType (NORMAL_INTEREST)
+  , m_payload (0)
+  , m_wire (0)
 {
 }
 
@@ -58,28 +48,23 @@
   , m_interestLifetime    (interest.m_interestLifetime)
   , m_nonce               (interest.m_nonce)
   , m_nackType            (interest.m_nackType)
+  , m_payload (interest.GetPayload ()->Copy ())
+  , m_wire (0)
 {
 }
 
-Ptr<Interest>
-Interest::GetInterest (Ptr<Packet> packet)
-{
-  Ptr<Interest> interest = Create<Interest> ();
-  packet->RemoveHeader (*interest);
-
-  return interest;
-}
-
 void
 Interest::SetName (Ptr<Name> name)
 {
   m_name = name;
+  m_wire = 0;
 }
 
 void
 Interest::SetName (const Name &name)
 {
   m_name = Create<Name> (name);
+  m_wire = 0;
 }
 
 const Name&
@@ -99,6 +84,7 @@
 Interest::SetScope (int8_t scope)
 {
   m_scope = scope;
+  m_wire = 0;
 }
 
 int8_t
@@ -111,6 +97,7 @@
 Interest::SetInterestLifetime (Time lifetime)
 {
   m_interestLifetime = lifetime;
+  m_wire = 0;
 }
 
 Time
@@ -123,6 +110,7 @@
 Interest::SetNonce (uint32_t nonce)
 {
   m_nonce = nonce;
+  m_wire = 0;
 }
 
 uint32_t
@@ -135,6 +123,7 @@
 Interest::SetNack (uint8_t nackType)
 {
   m_nackType = nackType;
+  m_wire = 0;
 }
 
 uint8_t
@@ -143,82 +132,18 @@
   return m_nackType;
 }
 
-uint32_t
-Interest::GetSerializedSize (void) const
-{
-  size_t size =
-    1/*version*/ + 1 /*type*/ + 2/*length*/ +
-    (4/*nonce*/ + 1/*scope*/ + 1/*nack type*/ + 2/*timestamp*/ +
-     (m_name->GetSerializedSize ()) +
-     (2 + 0)/* selectors */ +
-     (2 + 0)/* options */);
-  NS_LOG_INFO ("Serialize size = " << size);
-
-  return size;
-}
-    
 void
-Interest::Serialize (Buffer::Iterator start) const
+Interest::SetPayload (Ptr<Packet> payload)
 {
-  start.WriteU8 (0x80); // version
-  start.WriteU8 (0x00); // packet type
-
-  start.WriteU16 (GetSerializedSize () - 4);
-
-  start.WriteU32 (m_nonce);
-  start.WriteU8 (m_scope);
-  start.WriteU8 (m_nackType);
-
-  NS_ASSERT_MSG (0 <= m_interestLifetime.ToInteger (Time::S) && m_interestLifetime.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_interestLifetime.ToInteger (Time::S)));
-
-  uint32_t offset = m_name->Serialize (start);
-  start.Next (offset);
-  
-  start.WriteU16 (0); // no selectors
-  start.WriteU16 (0); // no options
+  m_payload = payload;
 }
 
-uint32_t
-Interest::Deserialize (Buffer::Iterator start)
+Ptr<const Payload>
+Interest::GetPayload () const
 {
-  Buffer::Iterator i = start;
-  
-  if (i.ReadU8 () != 0x80)
-    throw new InterestException ();
-
-  if (i.ReadU8 () != 0x00)
-    throw new InterestException ();
-
-  i.ReadU16 (); // length, don't need it right now
-  
-  m_nonce = i.ReadU32 ();
-  m_scope = i.ReadU8 ();
-  m_nackType = i.ReadU8 ();
-  
-  m_interestLifetime = Seconds (i.ReadU16 ());
-
-  m_name = Create<Name> ();
-  uint32_t offset = m_name->Deserialize (i);
-  i.Next (offset);
-  
-  i.ReadU16 ();
-  i.ReadU16 ();
-
-  NS_ASSERT (GetSerializedSize () == (i.GetDistanceFrom (start)));
-
-  return i.GetDistanceFrom (start);
+  return m_payload;
 }
 
-TypeId
-Interest::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-  
 void
 Interest::Print (std::ostream &os) const
 {
