diff --git a/scapy/config.py b/scapy/config.py
index 823414ee95596b76d46f1996fb22134e61929c9d..783e809244d038bc29bd62721a0695ce16e32734 100644
--- a/scapy/config.py
+++ b/scapy/config.py
@@ -153,17 +153,53 @@ class CacheInstance(dict):
     def update(self, other):
         dict.update(self, other)
         self._timetable.update(other._timetable)
-    def __repr__(self):
+    def iteritems(self):
+        if self.timeout is None:
+            return dict.iteritems(self)
+        t0=time.time()
+        return ((k,v) for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout) 
+    def iterkeys(self):
+        if self.timeout is None:
+            return dict.iterkeys(self)
+        t0=time.time()
+        return (k for k in dict.iterkeys(self) if t0-self._timetable[k] < self.timeout)
+    def __iter__(self):
+        return self.iterkeys()
+    def itervalues(self):
+        if self.timeout is None:
+            return dict.itervalues(self)
+        t0=time.time()
+        return (v for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout)
+    def items(self):
+        if self.timeout is None:
+            return dict.items(self)
+        t0=time.time()
+        return [(k,v) for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout]
+    def keys(self):
         if self.timeout is None:
-            n = len(self)
-        else:
-            n = 0
-            t0 = time.time()
-            for k,v in self.iteritems():
-                t = self._timetable[k]
-                if t0-t <= self.timeout:
-                    n += 1
-        return "%s: %i valid items. Timeout=%rs" % (self.name, n, self.timeout)
+            return dict.keys(self)
+        t0=time.time()
+        return [k for k in dict.iterkeys(self) if t0-self._timetable[k] < self.timeout]
+    def values(self):
+        if self.timeout is None:
+            return dict.values(self)
+        t0=time.time()
+        return [v for (k,v) in dict.iteritems(self) if t0-self._timetable[k] < self.timeout]
+    def __len__(self):
+        if self.timeout is None:
+            return dict.__len__(self)
+        return len(self.keys())
+    def summary(self):
+        return "%s: %i valid items. Timeout=%rs" % (self.name, len(self), self.timeout)
+    def __repr__(self):
+        s = []
+        if self:
+            mk = max(len(k) for k in self.iterkeys())
+            fmt = "%%-%is %%s" % (mk+1)
+            for item in self.iteritems():
+                s.append(fmt % item)
+        return "\n".join(s)
+            
             
 
 
@@ -190,7 +226,7 @@ class NetCache:
         for c in self._caches_list:
             c.flush()
     def __repr__(self):
-        return "\n".join(repr(c) for c in self._caches_list)
+        return "\n".join(c.summary() for c in self._caches_list)
         
 
 class LogLevel(object):