diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index bffc917..6b567c8 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -69,6 +69,25 @@
                    MakeTimeAccessor (&CcnxL3Protocol::GetBucketLeakInterval,
                                      &CcnxL3Protocol::SetBucketLeakInterval),
                    MakeTimeChecker ())
+    
+    .AddTraceSource ("TransmittedInterestTrace", "Interests that were transmitted",
+                    MakeTraceSourceAccessor (&CcnxL3Protocol::m_transmittedInterestsTrace))
+    
+    .AddTraceSource ("ReceivedInterestTrace", "Interests that were received",
+                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_receivedInterestsTrace))
+    
+    .AddTraceSource ("DroppedInterestTrace", "Interests that were dropped",
+                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_droppedInterestsTrace))
+
+    .AddTraceSource ("ReceivedDataTrace", "Data that were received",
+                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_receivedDataTrace))
+    
+    .AddTraceSource ("TransmittedDataTrace", "Data that were transmitted",
+                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_transmittedDataTrace))
+    
+    .AddTraceSource ("DroppedDataTrace", "Data that were dropped",
+                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_droppedDataTrace))
+
   ;
   return tid;
 }
@@ -240,7 +259,43 @@
   if (!face->IsUp ())
     {
       NS_LOG_LOGIC ("Dropping received packet -- interface is down");
-      // m_dropTrace (p, INTERFACE_DOWN, m_node->GetObject<Ccnx> ()/*this*/, face);
+        
+      //m_droppedDTrace (p, INTERFACE_DOWN, m_node->GetObject<Ccnx> ()/*this*/, face);
+        
+        Ptr<Packet> packet = p->Copy (); // give upper layers a rw copy of the packet
+        try
+        {
+            CcnxHeaderHelper::Type type = CcnxHeaderHelper::GetCcnxHeaderType (p);
+            switch (type)
+            {
+                case CcnxHeaderHelper::INTEREST:
+                {
+                    Ptr<CcnxInterestHeader> header = Create<CcnxInterestHeader> ();
+                    m_droppedInterestsTrace (header, INTERFACE_DOWN, m_node->GetObject<Ccnx> (), face);
+                    break;
+                }
+                case CcnxHeaderHelper::CONTENT_OBJECT:
+                {
+                    Ptr<CcnxContentObjectHeader> header = Create<CcnxContentObjectHeader> ();
+                    
+                    static CcnxContentObjectTail contentObjectTrailer; //there is no data in this object
+                    
+                    // Deserialization. Exception may be thrown
+                    packet->RemoveHeader (*header);
+                    packet->RemoveTrailer (contentObjectTrailer);
+                    
+                    m_droppedDataTrace (header, packet, INTERFACE_DOWN, m_node->GetObject<Ccnx> (), face);
+                    break;
+                }
+            }
+            
+            // exception will be thrown if packet is not recognized
+        }
+        catch (CcnxUnknownHeaderException)
+        {
+            NS_ASSERT_MSG (false, "Unknown CCNx header. Should not happen");
+        }
+        
       return;
     }
   NS_LOG_LOGIC ("Packet from face " << *face << " received on node " <<  m_node->GetId ());
@@ -305,6 +360,7 @@
   if (isNew || !isDuplicated) // potential flow
     {
       // somebody is doing something bad
+      m_droppedInterestsTrace (header, NACK_NONDUPLICATE, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
   
@@ -329,8 +385,6 @@
 
   m_pit->modify (m_pit->iterator_to (pitEntry),
                  ll::bind (&CcnxPitEntry::SetWaitingInVain, ll::_1, outFace));
-  
-  // m_droppedInterestsTrace (header, DROP_CONGESTION, m_node->GetObject<Ccnx> (), incomingFace);
 
   // If NACK is NACK_GIVEUP_PIT, then neighbor gave up trying to and removed it's PIT entry.
   // So, if we had an incoming entry to this neighbor, then we can remove it now
@@ -348,6 +402,7 @@
   if (pitEntry.m_incoming.size () == 0) // interest was actually satisfied
     {
       // no need to do anything
+      m_droppedInterestsTrace (header, NACK_AFTER_SATISFIED, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
 
@@ -356,6 +411,7 @@
       NS_LOG_DEBUG ("Not all outgoing are in vain");
       // suppress
       // Don't do anything, we are still expecting data from some other face
+      m_droppedInterestsTrace (header, NACK_SUPPRESSED, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
   
@@ -384,7 +440,7 @@
                                  const Ptr<const Packet> &packet)
 {
   NS_LOG_FUNCTION (incomingFace << header << packet);
-  // m_receivedInterestsTrace (header, m_node->GetObject<Ccnx> (), incomingFace);
+  //m_receivedInterestsTrace (header, m_node->GetObject<Ccnx> (), incomingFace);
 
   // Lookup of Pit (and associated Fib) entry for this Interest 
   tuple<const CcnxPitEntry&,bool,bool> ret = m_pit->Lookup (*header);
@@ -411,7 +467,7 @@
       incomingFace->Send (nack);
       
       // //Trace duplicate interest  
-      // m_droppedInterestsTrace (header, NDN_DUPLICATE_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
+      m_droppedInterestsTrace (header, NDN_DUPLICATE_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
 
@@ -424,14 +480,14 @@
       
       NS_LOG_LOGIC("Found in cache");
         
-      // TransmittedDataTrace (contentObject, CACHED,
-      //                       m_node->GetObject<Ccnx> (), incomingFace);
+      m_transmittedDataTrace (contentObjectHeader, contentObject, CACHED, m_node->GetObject<Ccnx> (), incomingFace);
       incomingFace->Send (contentObject);
 
       // Set pruning timout on PIT entry (instead of deleting the record)
       m_pit->modify (m_pit->iterator_to (pitEntry),
                      bind (&CcnxPitEntry::SetExpireTime, ll::_1,
                            Simulator::Now () + m_pit->GetPitEntryPruningTimeout ()));
+        
       return;
     }
 
@@ -481,7 +537,7 @@
     { // Suppress this interest if we're still expecting data from some other face
       
       // We are already expecting data later in future. Suppress the interest
-      // m_droppedInterestsTrace (header, NDN_SUPPRESSED_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
+      m_droppedInterestsTrace (header, NDN_SUPPRESSED_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
   
@@ -524,8 +580,8 @@
     {
       incoming.m_face->Send (packet->Copy ());
 
-      // m_droppedInterestsTrace (header, DROP_CONGESTION,
-      //                          m_node->GetObject<Ccnx> (), incomingFace);
+      //m_droppedInterestsTrace (header, DROP_CONGESTION,
+      //                         m_node->GetObject<Ccnx> (), incomingFace);
     }
   // All incoming interests cannot be satisfied. Remove them
   m_pit->modify (m_pit->iterator_to (pitEntry),
@@ -547,7 +603,7 @@
 {
     
   NS_LOG_FUNCTION (incomingFace << header << payload << packet);
-  // m_receivedDataTrace (header, payload, m_node->GetObject<Ccnx> ()/*this*/, incomingFace);
+  m_receivedDataTrace (header, payload, m_node->GetObject<Ccnx> (), incomingFace);
 
   // 1. Lookup PIT entry
   try
@@ -611,7 +667,7 @@
       //    (unsolicited data packets should not "poison" content store)
       
       //drop dulicated or not requested data packet
-      // m_droppedDataTrace (header, payload, NDN_UNSOLICITED_DATA, m_node->GetObject<Ccnx> (), incomingFace);
+      m_droppedDataTrace (header, payload, NDN_UNSOLICITED_DATA, m_node->GetObject<Ccnx> (), incomingFace);
       return; // do not process unsoliced data packets
     }
 }
