diff --git a/examples/interest-header-example.cc b/examples/interest-header-example.cc
index 8a4a57a..83895ad 100644
--- a/examples/interest-header-example.cc
+++ b/examples/interest-header-example.cc
@@ -12,46 +12,68 @@
 #include "ns3/log.h"
 
 using namespace ns3;
+#include <fstream>
 
 NS_LOG_COMPONENT_DEFINE ("InterestHeaderExample");
 
 int
 main (int argc, char *argv[])
 {
+	LogComponentEnable ("InterestHeaderExample", LOG_ALL);
+	
     NS_LOG_INFO ("Test started");
-    uint32_t randomNonce = UniformVariable().GetInteger(1, std::numeric_limits<uint32_t>::max ());
-    Ptr<CcnxNameComponents> testname = Create<CcnxNameComponents> ();
-    (*testname) ("test") ("test2");
-    
-    Ptr<CcnxNameComponents> exclude = Create<CcnxNameComponents> ();
-    (*testname) ("exclude") ("exclude2");
-    
-    Time lifetime = Seconds(4.0);
-    bool child = true;
-    
-    uint32_t maxSuffixComponents = 40;
-    uint32_t minSuffixComponents = 20;
-    
+
     CcnxInterestHeader interestHeader;
-    interestHeader.SetNonce(randomNonce);
+	
+    Ptr<CcnxNameComponents> testname = Create<CcnxNameComponents> ();
+    (*testname) ("first") ("second");
     interestHeader.SetName(testname);
-    interestHeader.SetInterestLifetime(lifetime);
-    interestHeader.SetChildSelector(child);
-    interestHeader.SetExclude(exclude);
-    interestHeader.SetMaxSuffixComponents(maxSuffixComponents);
+	
+    uint32_t minSuffixComponents = 20;
     interestHeader.SetMinSuffixComponents(minSuffixComponents);
+	
+    uint32_t maxSuffixComponents = 40;
+    interestHeader.SetMaxSuffixComponents(maxSuffixComponents);
+	
+    Time lifetime = Seconds(661777) + MicroSeconds(1234);
+    interestHeader.SetInterestLifetime(lifetime);
+
+    bool child = true;
+    interestHeader.SetChildSelector(child);
+
+    Ptr<CcnxNameComponents> exclude = Create<CcnxNameComponents> ();
+    (*exclude) ("exclude1") ("exclude2");
+    interestHeader.SetExclude(exclude);
+
+	UniformVariable random(1, std::numeric_limits<uint32_t>::max ());
+    uint32_t randomNonce = static_cast<uint32_t> (random.GetValue());
+    interestHeader.SetNonce(randomNonce);
+	NS_LOG_INFO ("Source: \n" <<interestHeader);
     
     uint32_t size = interestHeader.GetSerializedSize();
-    NS_LOG_INFO ("Size = " << size);
+    NS_LOG_INFO ("GetSerializedSize = " << size);
     //uint32_t size = 5;
     //NS_TEST_ASSERT_MSG_EQ (false, true, "GetSize = " << size);
     
-    Buffer buf(size);
+    Buffer buf;
+	buf.AddAtStart (size);
     Buffer::Iterator iter = buf.Begin ();
     //interestHeader.
-    //interestHeader.Serialize(iter);
-    
+    interestHeader.Serialize(iter);
+
+	std::ofstream of( "/tmp/file" );
+	of.write (reinterpret_cast<const char*> (buf.PeekData ()), size);
+	of.close ();
+
+	NS_LOG_INFO ("start = " << buf.GetCurrentStartOffset () << " " <<
+				 "end = " << buf.GetCurrentEndOffset ());	
+	
     iter = buf.Begin ();
     CcnxInterestHeader target;
-    
-}
\ No newline at end of file
+	NS_LOG_INFO ("Trying to deserialize");
+	std::cout << "\n";
+	size = target.Deserialize (iter);
+	buf.RemoveAtEnd (size);
+	NS_LOG_INFO ("Deserialized size = " << size);
+	NS_LOG_INFO ("Target: \n" << target);
+}
