diff --git a/ndn-cpp/node.cpp b/ndn-cpp/node.cpp
index fed4c8e..26a6ecd 100644
--- a/ndn-cpp/node.cpp
+++ b/ndn-cpp/node.cpp
@@ -13,14 +13,52 @@
 
 namespace ndn {
 
+Node::PitEntry::PitEntry(const Name &name, Closure *closure)
+: interest_(name), interestStructIsStale_(true), closure_(closure)
+{
+  if (interest_.getInterestLifetimeMilliseconds() >= 0.0)
+    timeoutTime_ = ::clock() + (clock_t)((interest_.getInterestLifetimeMilliseconds() / 1000.0) * (double)CLOCKS_PER_SEC);
+  else
+    // No timeout.
+    timeoutTime_ = 0;
+}
+
+const struct ndn_Interest &Node::PitEntry::getInterestStruct()
+{
+  if (interestStructIsStale_) {
+    nameComponents_.reserve(interest_.getName().getComponentCount());
+    excludeEntries_.reserve(interest_.getExclude().getEntryCount());
+    ndn_Interest_init
+      (&interestStruct_, &nameComponents_[0], nameComponents_.capacity(), &excludeEntries_[0], excludeEntries_.capacity());
+    interest_.get(interestStruct_);
+    
+    interestStructIsStale_ = false;
+  }
+  
+  return interestStruct_;
+}
+
 void Node::expressInterest(const Name &name, Closure *closure, const Interest *interestTemplate)
 {
-  Interest interest(name);
-  shared_ptr<vector<unsigned char> > encoding = interest.wireEncode();  
-
-  // TODO: This should go in the PIT.
-  tempClosure_ = closure;
+  shared_ptr<PitEntry> pitEntry(new PitEntry(name, closure));
+  if (interestTemplate) {
+		pitEntry->getInterest().setMinSuffixComponents(interestTemplate->getMinSuffixComponents());
+		pitEntry->getInterest().setMaxSuffixComponents(interestTemplate->getMaxSuffixComponents());
+		pitEntry->getInterest().getPublisherPublicKeyDigest() = interestTemplate->getPublisherPublicKeyDigest();
+		pitEntry->getInterest().getExclude() = interestTemplate->getExclude();
+		pitEntry->getInterest().setChildSelector(interestTemplate->getChildSelector());
+		pitEntry->getInterest().setAnswerOriginKind(interestTemplate->getAnswerOriginKind());
+		pitEntry->getInterest().setScope(interestTemplate->getScope());
+		pitEntry->getInterest().setInterestLifetimeMilliseconds(interestTemplate->getInterestLifetimeMilliseconds());
+  }
+  else
+    pitEntry->getInterest().setInterestLifetimeMilliseconds(4000.0);   // default interest timeout value.
   
+  pit_.push_back(pitEntry);
+  
+  shared_ptr<vector<unsigned char> > encoding = pitEntry->getInterest().wireEncode();  
+  
+  // TODO: Check if we are already connected.
   transport_->connect(*this);
   transport_->send(*encoding);
 }
@@ -38,9 +76,16 @@
     shared_ptr<Data> data(new Data());
     data->wireDecode(element, elementLength);
     
-    shared_ptr<Interest> dummyInterest;
-    UpcallInfo upcallInfo(this, dummyInterest, 0, data);
-    tempClosure_->upcall(UPCALL_DATA, upcallInfo);
+    int iPitEntry = getEntryIndexForExpressedInterest(data->getName());
+    if (iPitEntry >= 0) {
+      shared_ptr<Interest> interestCopy(new Interest(pit_[iPitEntry]->getInterest()));
+      UpcallInfo upcallInfo(this, interestCopy, 0, data);
+      
+      // Remove the PIT entry before the calling the callback.
+      Closure *closure = pit_[iPitEntry]->getClosure();
+      pit_.erase(pit_.begin() + iPitEntry);
+      closure->upcall(UPCALL_DATA, upcallInfo);
+    }
   }
 }
 
@@ -49,4 +94,26 @@
   transport_->close();
 }
 
+int Node::getEntryIndexForExpressedInterest(const Name &name)
+{
+  // TODO: Doesn't this belong in the Name class?
+  vector<struct ndn_NameComponent> nameComponents;
+  nameComponents.reserve(name.getComponentCount());
+  struct ndn_Name nameStruct;
+  ndn_Name_init(&nameStruct, &nameComponents[0], nameComponents.capacity());
+  name.get(nameStruct);
+  
+  int iResult = -1;
+    
+	for (unsigned int i = 0; i < pit_.size(); ++i) {
+		if (ndn_Interest_matchesName((struct ndn_Interest *)&pit_[i]->getInterestStruct(), &nameStruct)) {
+      if (iResult < 0 || 
+          pit_[i]->getInterest().getName().getComponentCount() > pit_[iResult]->getInterest().getName().getComponentCount())
+        iResult = i;
+    }
+	}
+    
+	return iResult;
+}
+
 }
