diff --git a/src/util/segment-fetcher.cpp b/src/util/segment-fetcher.cpp
index 0d54915..b23b991 100644
--- a/src/util/segment-fetcher.cpp
+++ b/src/util/segment-fetcher.cpp
@@ -46,7 +46,7 @@
 {
 }
 
-void
+shared_ptr<SegmentFetcher>
 SegmentFetcher::fetch(Face& face,
                       const Interest& baseInterest,
                       security::v2::Validator& validator,
@@ -54,10 +54,10 @@
                       const ErrorCallback& errorCallback)
 {
   shared_ptr<security::v2::Validator> validatorPtr(&validator, [] (security::v2::Validator*) {});
-  fetch(face, baseInterest, validatorPtr, completeCallback, errorCallback);
+  return fetch(face, baseInterest, validatorPtr, completeCallback, errorCallback);
 }
 
-void
+shared_ptr<SegmentFetcher>
 SegmentFetcher::fetch(Face& face,
                       const Interest& baseInterest,
                       shared_ptr<security::v2::Validator> validator,
@@ -68,6 +68,8 @@
                                                         errorCallback));
 
   fetcher->fetchFirstSegment(baseInterest, fetcher);
+
+  return fetcher;
 }
 
 void
@@ -79,8 +81,8 @@
   interest.setMustBeFresh(true);
 
   m_face.expressInterest(interest,
-                         bind(&SegmentFetcher::afterSegmentReceived, this, _1, _2, true, self),
-                         bind(&SegmentFetcher::afterNackReceived, this, _1, _2, 0, self),
+                         bind(&SegmentFetcher::afterSegmentReceivedCb, this, _1, _2, true, self),
+                         bind(&SegmentFetcher::afterNackReceivedCb, this, _1, _2, 0, self),
                          bind(m_errorCallback, INTEREST_TIMEOUT, "Timeout"));
 }
 
@@ -95,16 +97,17 @@
   interest.setMustBeFresh(false);
   interest.setName(dataName.getPrefix(-1).appendSegment(segmentNo));
   m_face.expressInterest(interest,
-                         bind(&SegmentFetcher::afterSegmentReceived, this, _1, _2, false, self),
-                         bind(&SegmentFetcher::afterNackReceived, this, _1, _2, 0, self),
+                         bind(&SegmentFetcher::afterSegmentReceivedCb, this, _1, _2, false, self),
+                         bind(&SegmentFetcher::afterNackReceivedCb, this, _1, _2, 0, self),
                          bind(m_errorCallback, INTEREST_TIMEOUT, "Timeout"));
 }
 
 void
-SegmentFetcher::afterSegmentReceived(const Interest& origInterest,
-                                     const Data& data, bool isSegmentZeroExpected,
-                                     shared_ptr<SegmentFetcher> self)
+SegmentFetcher::afterSegmentReceivedCb(const Interest& origInterest,
+                                       const Data& data, bool isSegmentZeroExpected,
+                                       shared_ptr<SegmentFetcher> self)
 {
+  afterSegmentReceived(data);
   m_validator->validate(data,
                         bind(&SegmentFetcher::afterValidationSuccess, this, _1,
                              isSegmentZeroExpected, origInterest, self),
@@ -127,7 +130,7 @@
     else {
       m_buffer->write(reinterpret_cast<const char*>(data.getContent().value()),
                       data.getContent().value_size());
-
+      afterSegmentValidated(data);
       const name::Component& finalBlockId = data.getMetaInfo().getFinalBlockId();
       if (finalBlockId.empty() || (finalBlockId > currentSegment)) {
         fetchNextSegment(origInterest, data.getName(), currentSegment.toSegment() + 1, self);
@@ -151,8 +154,8 @@
 
 
 void
-SegmentFetcher::afterNackReceived(const Interest& origInterest, const lp::Nack& nack,
-                                  uint32_t reExpressCount, shared_ptr<SegmentFetcher> self)
+SegmentFetcher::afterNackReceivedCb(const Interest& origInterest, const lp::Nack& nack,
+                                    uint32_t reExpressCount, shared_ptr<SegmentFetcher> self)
 {
   if (reExpressCount >= MAX_INTEREST_REEXPRESS) {
     m_errorCallback(NACK_ERROR, "Nack Error");
@@ -189,9 +192,9 @@
   }
 
   m_face.expressInterest(interest,
-                         bind(&SegmentFetcher::afterSegmentReceived, this, _1, _2,
+                         bind(&SegmentFetcher::afterSegmentReceivedCb, this, _1, _2,
                               isSegmentZeroExpected, self),
-                         bind(&SegmentFetcher::afterNackReceived, this, _1, _2,
+                         bind(&SegmentFetcher::afterNackReceivedCb, this, _1, _2,
                               ++reExpressCount, self),
                          bind(m_errorCallback, INTEREST_TIMEOUT, "Timeout"));
 }
diff --git a/src/util/segment-fetcher.hpp b/src/util/segment-fetcher.hpp
index 99510f5..cc9725a 100644
--- a/src/util/segment-fetcher.hpp
+++ b/src/util/segment-fetcher.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2017 Regents of the University of California.
+ * Copyright (c) 2013-2018 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,10 +22,11 @@
 #ifndef NDN_UTIL_SEGMENT_FETCHER_HPP
 #define NDN_UTIL_SEGMENT_FETCHER_HPP
 
-#include "scheduler.hpp"
 #include "../common.hpp"
 #include "../face.hpp"
 #include "../security/v2/validator.hpp"
+#include "scheduler.hpp"
+#include "signal.hpp"
 
 namespace ndn {
 
@@ -120,7 +121,7 @@
   };
 
   /**
-   * @brief Initiate segment fetching
+   * @brief Initiates segment fetching
    *
    * @param face          Reference to the Face that should be used to fetch data
    * @param baseInterest  An Interest for the initial segment of requested data.
@@ -135,9 +136,10 @@
    *
    * @param completeCallback    Callback to be fired when all segments are fetched
    * @param errorCallback       Callback to be fired when an error occurs (@see Errors)
+   * @return A shared_ptr to the constructed SegmentFetcher
    */
   static
-  void
+  shared_ptr<SegmentFetcher>
   fetch(Face& face,
         const Interest& baseInterest,
         security::v2::Validator& validator,
@@ -158,9 +160,10 @@
    *
    * @param completeCallback    Callback to be fired when all segments are fetched
    * @param errorCallback       Callback to be fired when an error occurs (@see Errors)
+   * @return A shared_ptr to the constructed SegmentFetcher
    */
   static
-  void
+  shared_ptr<SegmentFetcher>
   fetch(Face& face,
         const Interest& baseInterest,
         shared_ptr<security::v2::Validator> validator,
@@ -181,9 +184,9 @@
                    shared_ptr<SegmentFetcher> self);
 
   void
-  afterSegmentReceived(const Interest& origInterest,
-                       const Data& data, bool isSegmentZeroExpected,
-                       shared_ptr<SegmentFetcher> self);
+  afterSegmentReceivedCb(const Interest& origInterest,
+                         const Data& data, bool isSegmentZeroExpected,
+                         shared_ptr<SegmentFetcher> self);
   void
   afterValidationSuccess(const Data& data,
                          bool isSegmentZeroExpected,
@@ -194,13 +197,24 @@
   afterValidationFailure(const Data& data, const security::v2::ValidationError& error);
 
   void
-  afterNackReceived(const Interest& origInterest, const lp::Nack& nack,
-                    uint32_t reExpressCount, shared_ptr<SegmentFetcher> self);
+  afterNackReceivedCb(const Interest& origInterest, const lp::Nack& nack,
+                      uint32_t reExpressCount, shared_ptr<SegmentFetcher> self);
 
   void
   reExpressInterest(Interest interest, uint32_t reExpressCount,
                     shared_ptr<SegmentFetcher> self);
 
+public:
+  /**
+   * @brief Emits whenever a data segment received
+   */
+  Signal<SegmentFetcher, Data> afterSegmentReceived;
+
+  /**
+   * @brief Emits whenever a received data segment has been successfully validated
+   */
+  Signal<SegmentFetcher, Data> afterSegmentValidated;
+
 private:
   Face& m_face;
   Scheduler m_scheduler;
