diff --git a/model/fw/ndn-forwarding-strategy.cc b/model/fw/ndn-forwarding-strategy.cc
index 4219deb..9fc4d29 100644
--- a/model/fw/ndn-forwarding-strategy.cc
+++ b/model/fw/ndn-forwarding-strategy.cc
@@ -130,8 +130,10 @@
   m_inInterests (header, inFace);
 
   Ptr<pit::Entry> pitEntry = m_pit->Lookup (*header);
+  bool similarInterest = true;
   if (pitEntry == 0)
     {
+      similarInterest = false;
       pitEntry = m_pit->Create (header);
       if (pitEntry != 0)
         {
@@ -175,7 +177,7 @@
       return;
     }
 
-  if (ShouldSuppressIncomingInterest (inFace, header, origPacket, pitEntry))
+  if (similarInterest && ShouldSuppressIncomingInterest (inFace, header, origPacket, pitEntry))
     {
       pitEntry->AddIncoming (inFace/*, header->GetInterestLifetime ()*/);
       // update PIT entry lifetime
@@ -184,9 +186,16 @@
       // Suppress this interest if we're still expecting data from some other face
       NS_LOG_DEBUG ("Suppress interests");
       m_dropInterests (header, inFace);
+
+      DidSuppressSimilarInterest (inFace, header, origPacket, pitEntry);
       return;
     }
 
+  if (similarInterest)
+    {
+      DidForwardSimilarInterest (inFace, header, origPacket, pitEntry);
+    }
+
   PropagateInterest (inFace, header, origPacket, pitEntry);
 }
 
@@ -225,6 +234,21 @@
     }
 }
 
+void
+ForwardingStrategy::DidCreatePitEntry (Ptr<Face> inFace,
+                                       Ptr<const InterestHeader> header,
+                                       Ptr<const Packet> origPacket,
+                                       Ptr<pit::Entry> pitEntrypitEntry)
+{
+}
+
+void
+ForwardingStrategy::FailedToCreatePitEntry (Ptr<Face> inFace,
+                                            Ptr<const InterestHeader> header,
+                                            Ptr<const Packet> origPacket)
+{
+  m_dropInterests (header, inFace);
+}
 
 void
 ForwardingStrategy::DidReceiveDuplicateInterest (Ptr<Face> inFace,
@@ -232,7 +256,6 @@
                                                  Ptr<const Packet> origPacket,
                                                  Ptr<pit::Entry> pitEntry)
 {
-  NS_LOG_FUNCTION (this << boost::cref (*inFace));
   /////////////////////////////////////////////////////////////////////////////////////////
   //                                                                                     //
   // !!!! IMPORTANT CHANGE !!!! Duplicate interests will create incoming face entry !!!! //
@@ -243,6 +266,22 @@
 }
 
 void
+ForwardingStrategy::DidSuppressSimilarInterest (Ptr<Face> face,
+                                                Ptr<const InterestHeader> header,
+                                                Ptr<const Packet> origPacket,
+                                                Ptr<pit::Entry> pitEntry)
+{
+}
+
+void
+ForwardingStrategy::DidForwardSimilarInterest (Ptr<Face> inFace,
+                                               Ptr<const InterestHeader> header,
+                                               Ptr<const Packet> origPacket,
+                                               Ptr<pit::Entry> pitEntry)
+{
+}
+
+void
 ForwardingStrategy::DidExhaustForwardingOptions (Ptr<Face> inFace,
                                                  Ptr<const InterestHeader> header,
                                                  Ptr<const Packet> origPacket,
@@ -263,23 +302,8 @@
       m_pit->MarkErased (pitEntry);
     }
 }
-
-void
-ForwardingStrategy::FailedToCreatePitEntry (Ptr<Face> inFace,
-                                            Ptr<const InterestHeader> header,
-                                            Ptr<const Packet> origPacket)
-{
-  NS_LOG_FUNCTION (this);
-  m_dropInterests (header, inFace);
-}
   
-void
-ForwardingStrategy::DidCreatePitEntry (Ptr<Face> inFace,
-                                       Ptr<const InterestHeader> header,
-                                       Ptr<const Packet> origPacket,
-                                       Ptr<pit::Entry> pitEntrypitEntry)
-{
-}
+
 
 bool
 ForwardingStrategy::DetectRetransmittedInterest (Ptr<Face> inFace,
diff --git a/model/fw/ndn-forwarding-strategy.h b/model/fw/ndn-forwarding-strategy.h
index f164d7f..3f0a147 100644
--- a/model/fw/ndn-forwarding-strategy.h
+++ b/model/fw/ndn-forwarding-strategy.h
@@ -99,30 +99,116 @@
   RemoveFace (Ptr<Face> face);
   
 protected:
-  // events
+  /**
+   * @brief An event that is fired every time a new PIT entry is created
+   *
+   * Note that if NDN node is receiving a similar interest (interest for the same name),
+   * then either DidReceiveDuplicateInterest, DidSuppressSimilarInterest, or DidForwardSimilarInterest
+   * will be called
+   * 
+   * Suppression of similar Interests is controlled using ShouldSuppressIncomingInterest virtual method
+   *
+   * @param inFace  incoming face
+   * @param header  deserialized Interest header
+   * @param origPacket  original packet
+   * @param pitEntry created PIT entry (incoming and outgoing face sets are empty)
+   *
+   * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
+   */
+  virtual void
+  DidCreatePitEntry (Ptr<Face> inFace,
+                     Ptr<const InterestHeader> header,
+                     Ptr<const Packet> origPacket,
+                     Ptr<pit::Entry> pitEntry);
+  
+  /**
+   * @brief An event that is fired every time a new PIT entry cannot be created (e.g., PIT container imposes a limit)
+   *
+   * Note that this call can be called only for non-similar Interest (i.e., there is an attempt to create a new PIT entry).
+   * For any non-similar Interests, either FailedToCreatePitEntry or DidCreatePitEntry is called.
+   * 
+   * @param inFace  incoming face
+   * @param header  deserialized Interest header
+   * @param origPacket  original packet
+   */
+  virtual void
+  FailedToCreatePitEntry (Ptr<Face> inFace,
+                          Ptr<const InterestHeader> header,
+                          Ptr<const Packet> origPacket);
+  
+  /**
+   * @brief An event that is fired every time a duplicated Interest is received
+   *
+   * This even is the last action that is performed before the Interest processing is halted
+   *
+   * @param inFace  incoming face
+   * @param header  deserialized Interest header
+   * @param origPacket  original packet
+   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
+   *
+   * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
+   */
   virtual void
   DidReceiveDuplicateInterest (Ptr<Face> inFace,
                                Ptr<const InterestHeader> header,
                                Ptr<const Packet> origPacket,
                                Ptr<pit::Entry> pitEntry);
 
+  /**
+   * @brief An event that is fired every time when a similar Interest is received and suppressed (collapsed)
+   *
+   * This even is the last action that is performed before the Interest processing is halted
+   *
+   * @param inFace  incoming face
+   * @param header  deserialized Interest header
+   * @param origPacket  original packet
+   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
+   *
+   * @see DidReceiveDuplicateInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
+   */
+  virtual void
+  DidSuppressSimilarInterest (Ptr<Face> inFace,
+                              Ptr<const InterestHeader> header,
+                              Ptr<const Packet> origPacket,
+                              Ptr<pit::Entry> pitEntry);
+
+  /**
+   * @brief An event that is fired every time when a similar Interest is received and further forwarded (not suppressed/collapsed)
+   *
+   * This even is fired just before handling the Interest to PropagateInterest method
+   *
+   * @param inFace  incoming face
+   * @param header  deserialized Interest header
+   * @param origPacket  original packet
+   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
+   *
+   * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, ShouldSuppressIncomingInterest
+   */
+  virtual void
+  DidForwardSimilarInterest (Ptr<Face> inFace,
+                             Ptr<const InterestHeader> header,
+                             Ptr<const Packet> origPacket,
+                             Ptr<pit::Entry> pitEntry);
+
+  /**
+   * @brief An even that is fired when Interest cannot be forwarded
+   *
+   * Note that the event will not fire if  retransmission detection is enabled (by default)
+   * and retransmitted Interest cannot by forwarded.  For more details, refer to the implementation.
+   *
+   * @param inFace  incoming face
+   * @param header  deserialized Interest header
+   * @param origPacket  original packet
+   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
+   *
+   * @see DetectRetransmittedInterest
+   */
   virtual void
   DidExhaustForwardingOptions (Ptr<Face> inFace,
                                Ptr<const InterestHeader> header,
                                Ptr<const Packet> origPacket,
                                Ptr<pit::Entry> pitEntry);
 
-  virtual void
-  FailedToCreatePitEntry (Ptr<Face> inFace,
-                          Ptr<const InterestHeader> header,
-                          Ptr<const Packet> origPacket);
-  
-  virtual void
-  DidCreatePitEntry (Ptr<Face> inFace,
-                     Ptr<const InterestHeader> header,
-                     Ptr<const Packet> origPacket,
-                     Ptr<pit::Entry> pitEntry);
-
   virtual bool
   DetectRetransmittedInterest (Ptr<Face> inFace,
                                Ptr<const InterestHeader> header,
@@ -182,6 +268,19 @@
                       Ptr<const Packet> origPacket,
                       Ptr<pit::Entry> pitEntry);
 
+  /**
+   * @brief Wrapper method, which performs general tasks and calls DoPropagateInterest method
+   *
+   * General tasks so far are adding face to the list of incoming face, updating
+   * PIT entry lifetime, calling DoPropagateInterest, and retransmissions (enabled by default).
+   *
+   * @param inFace     incoming face
+   * @param header     Interest header
+   * @param origPacket original Interest packet
+   * @param pitEntry   reference to PIT entry (reference to corresponding FIB entry inside)
+   *
+   * @see DoPropagateInterest
+   */
   virtual void
   PropagateInterest (Ptr<Face> inFace,
                      Ptr<const InterestHeader> header,
@@ -189,15 +288,23 @@
                      Ptr<pit::Entry> pitEntry);
   
   /**
-   * @brief Base method to propagate the interest according to the forwarding strategy
+   * @brief Virtual method to perform Interest propagation according to the forwarding strategy logic
    *
-   * @param pitEntry      Reference to PIT entry (reference to corresponding FIB entry inside)
-   * @param incomingFace  Incoming face
-   * @param header        Interest header
-   * @param packet        Original Interest packet
-   * @param sendCallback  Send callback
+   * In most cases, this is the call that needs to be implemented/re-implemented in order
+   * to perform forwarding of Interests according to the desired logic.
+   *
+   * There is also PropagateInterest method (generally, do not require to be overriden)
+   * which performs general tasks (adding face to the list of incoming face, updating
+   * PIT entry lifetime, calling DoPropagateInterest, as well as perform retransmissions (enabled by default).
+   *
+   * @param inFace     incoming face
+   * @param header     Interest header
+   * @param origPacket original Interest packet
+   * @param pitEntry   reference to PIT entry (reference to corresponding FIB entry inside)
    *
    * @return true if interest was successfully propagated, false if all options have failed
+   *
+   * @see PropagateInterest
    */
   virtual bool
   DoPropagateInterest (Ptr<Face> inFace,
