diff --git a/src/detail/pending-interest.hpp b/src/detail/pending-interest.hpp
new file mode 100644
index 0000000..85acb23
--- /dev/null
+++ b/src/detail/pending-interest.hpp
@@ -0,0 +1,112 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DETAIL_PENDING_INTEREST_HPP
+#define NDN_DETAIL_PENDING_INTEREST_HPP
+
+#include "../common.hpp"
+#include "../interest.hpp"
+#include "../data.hpp"
+#include "../util/time.hpp"
+
+namespace ndn {
+
+class PendingInterest {
+public:
+  typedef function<void(const shared_ptr<const Interest>&, const shared_ptr<Data>&)> OnData;
+  typedef function<void(const shared_ptr<const Interest>&)> OnTimeout;
+
+  /**
+   * Create a new PitEntry and set the timeoutTime_ based on the current time and the interest lifetime.
+   * @param interest A shared_ptr for the interest.
+   * @param onData A function object to call when a matching data packet is received.
+   * @param onTimeout A function object to call if the interest times out.  If onTimeout is an empty OnTimeout(), this does not use it.
+   */
+  PendingInterest(const shared_ptr<const Interest>& interest, const OnData& onData, 
+                  const OnTimeout& onTimeout)
+    : interest_(interest),
+      onData_(onData), onTimeout_(onTimeout)
+  {
+    // Set up timeoutTime_.
+    if (interest_->getInterestLifetime() >= 0)
+      timeoutTimeMilliseconds_ = getNowMilliseconds() + interest_->getInterestLifetime();
+    else
+      // No timeout.
+      /**
+       * @todo Set more meaningful default timeout.  This timeout MUST exist.
+       */
+      timeoutTimeMilliseconds_ = getNowMilliseconds() + 4000;
+  }
+    
+  const shared_ptr<const Interest>& 
+  getInterest()
+  {
+    return interest_;
+  }
+    
+  const OnData& 
+  getOnData()
+  {
+    return onData_;
+  }
+    
+  /**
+   * Check if this interest is timed out.
+   * @param nowMilliseconds The current time in milliseconds from getNowMilliseconds.
+   * @return true if this interest timed out, otherwise false.
+   */
+  bool 
+  isTimedOut(MillisecondsSince1970 nowMilliseconds)
+  {
+    return timeoutTimeMilliseconds_ >= 0.0 && nowMilliseconds >= timeoutTimeMilliseconds_;
+  }
+
+  /**
+   * Call onTimeout_ (if defined).  This ignores exceptions from the onTimeout_.
+   */
+  void 
+  callTimeout()
+  {
+    if (onTimeout_) {
+      onTimeout_(interest_);
+    }
+  }
+    
+private:
+  shared_ptr<const Interest> interest_;
+  const OnData onData_;
+  const OnTimeout onTimeout_;
+
+  /** The time when the interest times out in milliseconds according to getNowMilliseconds, or -1 for no timeout. */
+  MillisecondsSince1970 timeoutTimeMilliseconds_;
+};
+
+
+struct PendingInterestId;
+
+/**
+ * @brief Functor to match pending interests against PendingInterestId
+ */
+struct MatchPendingInterestId
+{
+  MatchPendingInterestId(const PendingInterestId *pendingInterestId)
+    : id_(pendingInterestId)
+  {
+  }
+
+  bool
+  operator()(const shared_ptr<const PendingInterest> &pendingInterest) const
+  {
+    return (reinterpret_cast<const PendingInterestId *>(pendingInterest.get()) == id_);
+  }
+private:
+  const PendingInterestId *id_;
+};
+
+
+} // namespace ndn
+
+#endif // NDN_DETAIL_PENDING_INTEREST_HPP
diff --git a/src/detail/registered-prefix.hpp b/src/detail/registered-prefix.hpp
new file mode 100644
index 0000000..5cb5523
--- /dev/null
+++ b/src/detail/registered-prefix.hpp
@@ -0,0 +1,72 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_DETAIL_REGISTERED_PREFIX_HPP
+#define NDN_DETAIL_REGISTERED_PREFIX_HPP
+
+#include "../common.hpp"
+#include "../interest.hpp"
+
+namespace ndn {
+
+class RegisteredPrefix {
+public:
+  typedef function<void
+  (const shared_ptr<const Name>&, const shared_ptr<const Interest>&)> OnInterest;
+
+  /**
+   * Create a new PrefixEntry.
+   * @param prefix A shared_ptr for the prefix.
+   * @param onInterest A function object to call when a matching data packet is received.
+   */
+  RegisteredPrefix(const Name& prefix, const OnInterest& onInterest)
+    : prefix_(new Name(prefix))
+    , onInterest_(onInterest)
+  {
+  }
+    
+  const Name& 
+  getPrefix() const
+  {
+    return *prefix_;
+  }
+    
+  const OnInterest& 
+  getOnInterest() const
+  {
+    return onInterest_;
+  }
+    
+private:
+  shared_ptr<Name> prefix_;
+  const OnInterest onInterest_;
+};
+
+
+struct RegisteredPrefixId;
+
+/**
+ * @brief Functor to match pending interests against PendingInterestId
+ */
+struct MatchRegisteredPrefixId
+{
+  MatchRegisteredPrefixId(const RegisteredPrefixId *registeredPrefixId)
+    : id_(registeredPrefixId)
+  {
+  }
+
+  bool
+  operator()(const shared_ptr<RegisteredPrefix> &registeredPrefix) const
+  {
+    return (reinterpret_cast<const RegisteredPrefixId *>(registeredPrefix.get()) == id_);
+  }
+private:
+  const RegisteredPrefixId *id_;
+};
+
+} // namespace ndn
+
+#endif // NDN_DETAIL_REGISTERED_PREFIX_HPP
