diff --git a/utils/ndn-limits.cc b/utils/ndn-limits.cc
new file mode 100644
index 0000000..967c773
--- /dev/null
+++ b/utils/ndn-limits.cc
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ndn-limits.h"
+
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+
+NS_LOG_COMPONENT_DEFINE ("ndn.Limits");
+
+namespace ns3 {
+namespace ndn {
+
+NS_OBJECT_ENSURE_REGISTERED (Limits);
+
+TypeId
+Limits::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::ndn::Limits")
+    .SetGroupName ("Ndn")
+    .SetParent <Object> ()
+    .AddConstructor <Limits> ()
+
+    .AddTraceSource ("CurMaxLimit",
+                     "Current maximum limit",
+                     MakeTraceSourceAccessor (&Limits::m_curMaxLimit))
+                     
+    .AddTraceSource ("Outstanding",
+                     "Number of outstanding interests",
+                     MakeTraceSourceAccessor (&Limits::m_outstanding))
+    ;
+  return tid;
+}
+
+void
+Limits::SetMaxLimit (uint32_t max)
+{
+  m_maxLimit = max;
+  m_curMaxLimit = max;
+}
+
+
+void
+Limits::DecayCurrentLimit ()
+{
+  if (m_maxLimit == 0) return;
+  
+  if (!m_lastDecay.IsZero ())
+    {
+      const double tau = 100.0; // seconds
+      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 << " / " << tau << " ) ");
+      
+      m_curMaxLimit = m_maxLimit - (m_maxLimit - m_curMaxLimit) * exp (-timeDiff / tau);
+    }
+
+  m_lastDecay = Simulator::Now ();
+}
+
+void
+Limits::IncreaseLimit ()
+{
+  if (m_maxLimit == 0) return;
+  
+  // Additive increase
+  m_curMaxLimit = std::min (1.0 * m_maxLimit,
+                            (double)m_curMaxLimit + 1.0 / (double)m_curMaxLimit);
+}
+
+void
+Limits::DecreaseLimit ()
+{
+  if (m_maxLimit == 0) return;
+  
+  const double maxDecreaseFrequency = 10.0;
+
+  if (!m_lastDecrease.IsZero () && Simulator::Now () - m_lastDecrease < Seconds (1 / maxDecreaseFrequency))
+    return;
+
+  // Multiplicative decrease... almost
+  m_curMaxLimit = 0.5 * m_curMaxLimit;
+    
+  m_lastDecrease = Simulator::Now ();
+}
+
+
+bool
+Limits::IsBelowLimit ()
+{
+  if (m_maxLimit == 0) return true;
+
+  if (m_curMaxLimit - m_outstanding > 1.0)
+    {
+      m_outstanding += 1;
+      return true;
+    }
+  else
+    return false;
+}
+
+void
+Limits::RemoveOutstanding ()
+{
+  if (m_maxLimit == 0) return; //limits are disabled
+  
+  NS_LOG_DEBUG (m_outstanding);
+  NS_ASSERT_MSG (m_outstanding >= 1, "Should not be possible, unless we decreasing this number twice somewhere");
+  m_outstanding -= 1;
+}
+
+} // namespace ndn
+} // namespace ns3
diff --git a/utils/ndn-limits.h b/utils/ndn-limits.h
new file mode 100644
index 0000000..b8ca50d
--- /dev/null
+++ b/utils/ndn-limits.h
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef _NDN_LIMITS_H_
+#define	_NDN_LIMITS_H_
+
+#include "ns3/ptr.h"
+#include "ns3/object.h"
+#include "ns3/nstime.h"
+#include "ns3/traced-value.h"
+
+namespace ns3 {
+namespace ndn {
+
+/**
+ * \ingroup ndn
+ * \brief Structure to manage limits for outstanding interests
+ */
+class Limits :
+    public Object
+{
+public:
+  static TypeId
+  GetTypeId ();
+  
+  /**
+   * \brief Constructor
+   * \param prefix smart pointer to the prefix for the FIB entry
+   */
+  Limits ()
+  : m_maxLimit (0)
+  , m_curMaxLimit (0)
+  , m_outstanding (0)
+  { }
+ 
+  /**
+   * Set per-prefix limit
+   */
+  void
+  SetMaxLimit (uint32_t max);
+
+  /**
+   * Decay current limit (exponential decaying)
+   */
+  void
+  DecayCurrentLimit ();
+
+  /**
+   * Increase current limit (additive increase)
+   */
+  void
+  IncreaseLimit ();
+
+  /**
+   * Decrease current limit (multiplicative decrease)
+   */
+  void
+  DecreaseLimit ();
+
+  ////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////
+  
+  /**
+   * Check if new interest can be send out, if yes, number of outstanding will be increased
+   */
+  bool
+  IsBelowLimit ();
+
+  /**
+   * Remove outstanding interests
+   */
+  void
+  RemoveOutstanding ();
+  
+public:
+  uint32_t m_maxLimit;
+  
+  TracedValue< double >   m_curMaxLimit;
+  TracedValue< uint32_t > m_outstanding;
+
+  Time     m_lastDecrease;
+  Time     m_lastDecay;
+};
+
+} // namespace ndn
+} // namespace ns3
+
+#endif // _NDN_LIMITS_H_
