diff --git a/model/fw/nacks.cc b/model/fw/nacks.cc
index 6ad5066..4a4245c 100644
--- a/model/fw/nacks.cc
+++ b/model/fw/nacks.cc
@@ -88,8 +88,6 @@
                Ptr<const InterestHeader> header,
                Ptr<const Packet> origPacket)
 {
-  NS_ASSERT (m_nacksEnabled);
-
   // NS_LOG_FUNCTION (inFace << header << origPacket);
   m_inNacks (header, inFace);
 
@@ -106,29 +104,29 @@
   //
   // inFace->LeakBucketByOnePacket ();
 
-  pitEntry->SetWaitingInVain (inFace);
+  // pitEntry->SetWaitingInVain (inFace);
 
   DidReceiveValidNack (inFace, header->GetNack (), pitEntry);
   
-  if (!pitEntry->AreAllOutgoingInVain ()) // not all ougtoing are in vain
-    {
-      NS_LOG_DEBUG ("Not all outgoing are in vain");
-      // suppress
-      // Don't do anything, we are still expecting data from some other face
-      m_dropNacks (header, inFace);
-      return;
-    }
+  // if (!pitEntry->AreAllOutgoingInVain ()) // not all ougtoing are in vain
+  //   {
+  //     NS_LOG_DEBUG ("Not all outgoing are in vain");
+  //     // suppress
+  //     // Don't do anything, we are still expecting data from some other face
+  //     m_dropNacks (header, inFace);
+  //     return;
+  //   }
   
-  Ptr<Packet> nonNackInterest = Create<Packet> ();
-  Ptr<InterestHeader> nonNackHeader = Create<InterestHeader> (*header);
-  nonNackHeader->SetNack (InterestHeader::NORMAL_INTEREST);
-  nonNackInterest->AddHeader (*nonNackHeader);
+  // Ptr<Packet> nonNackInterest = Create<Packet> ();
+  // Ptr<InterestHeader> nonNackHeader = Create<InterestHeader> (*header);
+  // nonNackHeader->SetNack (InterestHeader::NORMAL_INTEREST);
+  // nonNackInterest->AddHeader (*nonNackHeader);
   
-  bool propagated = DoPropagateInterest (inFace, nonNackHeader, nonNackInterest, pitEntry);
-  if (!propagated)
-    {
-      DidExhaustForwardingOptions (inFace, nonNackHeader, nonNackInterest, pitEntry);
-    }  
+  // bool propagated = DoPropagateInterest (inFace, nonNackHeader, nonNackInterest, pitEntry);
+  // if (!propagated)
+  //   {
+  //     DidExhaustForwardingOptions (inFace, nonNackHeader, nonNackInterest, pitEntry);
+  //   }  
 }
 
 void
diff --git a/model/fw/per-fib-limits.cc b/model/fw/per-fib-limits.cc
index d56d48c..9703bd7 100644
--- a/model/fw/per-fib-limits.cc
+++ b/model/fw/per-fib-limits.cc
@@ -68,8 +68,6 @@
 void
 PerFibLimits::RemoveFace (Ptr<Face> face)
 {  
-  super::RemoveFace (face);
-
   for (PitQueueMap::iterator item = m_pitQueues.begin ();
        item != m_pitQueues.end ();
        item ++)
@@ -77,6 +75,8 @@
       item->second.Remove (face);
     }
   m_pitQueues.erase (face);
+
+  super::RemoveFace (face);
 }
 
 
@@ -117,6 +117,10 @@
       NS_LOG_DEBUG ("Face limit for " << header->GetName ());
     }
 
+  // hack
+  // offset lifetime, so we don't keep entries in queue for too long
+  pitEntry->OffsetLifetime (Seconds (- 0.9 * pitEntry->GetInterest ()->GetInterestLifetime ().ToDouble (Time::S)));
+  
   bool enqueued = m_pitQueues[outFace].Enqueue (inFace, pitEntry);
   if (enqueued)
     {
@@ -133,6 +137,18 @@
   NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
   super::WillEraseTimedOutPendingInterest (pitEntry);
 
+  Ptr<Packet> pkt = Create<Packet> ();
+  Ptr<InterestHeader> nackHeader = Create<InterestHeader> (*pitEntry->GetInterest ());
+  nackHeader->SetNack (99);
+  pkt->AddHeader (*nackHeader);
+
+  for (pit::Entry::in_container::iterator face = pitEntry->GetIncoming ().begin ();
+       face != pitEntry->GetIncoming ().end ();
+       face ++)
+    {
+      face->m_face->Send (pkt->Copy ());
+    }
+  
   PitQueue::Remove (pitEntry);
   
   for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
@@ -184,8 +200,9 @@
           // now we have enqueued packet and have slot available. Send out delayed packet
           Ptr<pit::Entry> pitEntry = queue->second.Pop ();
 
-          // wrong, but for experimental purposes
-          // pitEntry->UpdateLifetime (pitEntry->GetInterest ()->GetInterestLifetime ());
+          // hack
+          // offset lifetime back, so PIT entry wouldn't prematurely expire
+          pitEntry->OffsetLifetime (Seconds (0.7 * pitEntry->GetInterest ()->GetInterestLifetime ().ToDouble (Time::S)));
           
           NS_ASSERT_MSG (pitEntry != 0, "There *have to* be an entry in queue");
           
@@ -201,15 +218,39 @@
     }
 }
 
-// void
-// PerFibLimits::DidReceiveValidNack (Ptr<Face> inFace,
-//                                    uint32_t nackCode,
-//                                    Ptr<pit::Entry> pitEntry)
-// {
-//   // super::DidReceiveValidNack (inFace, nackCode, pitEntry);
+void
+PerFibLimits::DidReceiveValidNack (Ptr<Face> inFace,
+                                   uint32_t nackCode,
+                                   Ptr<pit::Entry> pitEntry)
+{
+  // super::DidReceiveValidNack (inFace, nackCode, pitEntry);
+  // NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
 
-//   // ??
-// }
+  Ptr<Packet> pkt = Create<Packet> ();
+  Ptr<InterestHeader> nackHeader = Create<InterestHeader> (*pitEntry->GetInterest ());
+  nackHeader->SetNack (99);
+  pkt->AddHeader (*nackHeader);
+
+  for (pit::Entry::in_container::iterator face = pitEntry->GetIncoming ().begin ();
+       face != pitEntry->GetIncoming ().end ();
+       face ++)
+    {
+      face->m_face->Send (pkt->Copy ());
+    }
+  
+  PitQueue::Remove (pitEntry);
+
+  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
+       face != pitEntry->GetOutgoing ().end ();
+       face ++)
+    {
+      face->m_face->GetLimits ().RemoveOutstanding ();
+    }
+
+  m_pit->MarkErased (pitEntry);
+  
+  ProcessFromQueue ();
+}
 
 
 } // namespace fw
diff --git a/model/fw/per-fib-limits.h b/model/fw/per-fib-limits.h
index 3f23992..298c9ee 100644
--- a/model/fw/per-fib-limits.h
+++ b/model/fw/per-fib-limits.h
@@ -68,6 +68,11 @@
   WillSatisfyPendingInterest (Ptr<Face> inFace,
                               Ptr<pit::Entry> pitEntry);
 
+  virtual void
+  DidReceiveValidNack (Ptr<Face> inFace,
+                       uint32_t nackCode,
+                       Ptr<pit::Entry> pitEntry);
+  
 private:
   void
   ProcessFromQueue ();
