diff --git a/utils/ndn-limits.cc b/utils/ndn-limits.cc
index ddd9a05..2e4a9ec 100644
--- a/utils/ndn-limits.cc
+++ b/utils/ndn-limits.cc
@@ -38,30 +38,6 @@
     .SetGroupName ("Ndn")
     .SetParent <Object> ()
     .AddConstructor <Limits> ()
-
-    .AddAttribute ("ExpDecayTau", "Parameter 'tau' for the exponential delay of the current maximum limit variable",
-                   TimeValue (Seconds (100.0)),
-                   MakeTimeAccessor (&Limits::m_exponentialDecayTau),
-                   MakeTimeChecker ()
-                   )
-
-    .AddAttribute ("NonDecreasePeriod", "Only one decrease is allowed per one NonDecreasePeriod",
-                   TimeValue (Seconds (0.1)),
-                   MakeTimeAccessor (&Limits::m_nonDecreasePeriod),
-                   MakeTimeChecker ()
-                   )
-
-    .AddAttribute ("AdditiveIncrease", "Parameter for additive increase",
-                   DoubleValue (1.0),
-                   MakeDoubleAccessor (&Limits::m_additiveIncrease),
-                   MakeDoubleChecker<double> ()
-                   )
-
-    .AddAttribute ("MultiplicativeDecrease", "Parameter for multiplicative decrease",
-                   DoubleValue (0.5),
-                   MakeDoubleAccessor (&Limits::m_multiplicativeDecrease),
-                   MakeDoubleChecker<double> ()
-                   )
     
     .AddTraceSource ("CurMaxLimit",
                      "Current maximum limit",
@@ -75,66 +51,26 @@
 }
 
 void
-Limits::SetMaxLimit (uint32_t max)
+Limits::SetMaxLimit (double max)
 {
   m_maxLimit = max;
   m_curMaxLimit = max;
 }
 
-uint32_t
+double
 Limits::GetMaxLimit () const
 {
   return m_maxLimit;
 }
 
 void
-Limits::DecayCurrentLimit ()
+Limits::UpdateCurrentLimit (double limit)
 {
-  if (!IsEnabled ()) return;
+  NS_ASSERT_MSG (limit >= 0.0, "Limit should be greater or equal to zero");
   
-  if (!m_lastDecay.IsZero ())
-    {
-      double timeDiff = (Simulator::Now () - m_lastDecay).ToDouble (Time::S);
-
-      NS_LOG_DEBUG ("m_maxLimit - (m_maxLimit - m_curMaxLimit) * exp (-timeDiff / tau)");
-      NS_LOG_DEBUG (m_maxLimit << " - " << " ( " << m_maxLimit << " - " << (double)m_curMaxLimit << " ) " << " * " << " exp (- " << timeDiff << " / " << m_exponentialDecayTau.ToDouble (Time::S) << " ) ");
-      
-      m_curMaxLimit = m_maxLimit - (m_maxLimit - m_curMaxLimit) * exp (-timeDiff / m_exponentialDecayTau.ToDouble (Time::S));
-    }
-
-  m_lastDecay = Simulator::Now ();
+  m_curMaxLimit = std::min (limit, m_maxLimit);
 }
 
-void
-Limits::IncreaseLimit ()
-{
-  if (!IsEnabled ()) return;
-  
-  // Additive increase
-  m_curMaxLimit = std::min (1.0 * m_maxLimit,
-                            (double)m_curMaxLimit + m_additiveIncrease / (double)m_curMaxLimit);
-}
-
-void
-Limits::DecreaseLimit ()
-{
-  if (!IsEnabled ()) return;
-
-//   m_curMaxLimit = std::max (0.0,
-//                             (double)m_curMaxLimit - m_multiplicativeDecrease / (double)m_curMaxLimit);
-// }
-  
-  if (m_lastDecrease.IsZero () ||
-      (!m_lastDecrease.IsZero () && Simulator::Now () - m_lastDecrease > m_nonDecreasePeriod)) // allow
-    {
-      // Multiplicative decrease... almost
-      m_curMaxLimit = m_multiplicativeDecrease * m_curMaxLimit;
-    
-      m_lastDecrease = Simulator::Now ();
-    }
-}
-
-
 bool
 Limits::IsBelowLimit ()
 {
@@ -144,19 +80,15 @@
     {
       // static UniformVariable acceptanceProbability (0, m_curMaxLimit);
       // double value = acceptanceProbability.GetValue ();
-      double value = m_outstanding+ 1;
+      double value = m_outstanding + 1;
       
       if (m_outstanding < value)
         {
           m_outstanding += 1.0;
-          // if (Simulator::GetContext () == 6) std::cout << "." << std::flush;
           return true;
         }
       else
         return false;
-      
-      // m_outstanding += 1;
-      // return true;
     }
   else
     return false;
@@ -165,9 +97,7 @@
 void
 Limits::RemoveOutstanding ()
 {
-  if (!IsEnabled ()) return; //limits are disabled
-  
-  // if (Simulator::GetContext () == 6) std::cout << "*" << std::flush;
+  if (!IsEnabled ()) return; 
 
   NS_LOG_DEBUG (m_outstanding);
   NS_ASSERT_MSG (m_outstanding >= (uint32_t)1, "Should not be possible, unless we decreasing this number twice somewhere");
