diff --git a/tests/chunks/producer.t.cpp b/tests/chunks/producer.t.cpp
index 479d03f..902c3fb 100644
--- a/tests/chunks/producer.t.cpp
+++ b/tests/chunks/producer.t.cpp
@@ -47,25 +47,26 @@
   ProducerFixture()
     : face(io, {true, true})
     , prefix("/ndn/chunks/test")
+    , version(1449227841747)
+    , keyLocatorName(m_keyChain.createIdentity("/ProducerFixture").getDefaultKey().getName())
     , testString(std::string(
         "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget "
         "dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, "
         "nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, "
         "sem. Nulla consequat massa Donec pede justo,"))
-    ,keyLocatorName(m_keyChain.createIdentity("/ProducerFixture").getDefaultKey().getName())
   {
+    options.maxSegmentSize = 40;
+    options.isQuiet = true;
   }
 
 protected:
   boost::asio::io_service io;
   util::DummyClientFace face;
-  security::SigningInfo signingInfo;
   Name prefix;
-  time::milliseconds freshnessPeriod = time::seconds(10);
-  size_t maxSegmentSize = 40;
-  std::istringstream testString;
-  uint64_t version = 1449227841747;
+  Producer::Options options;
+  uint64_t version;
   Name keyLocatorName;
+  std::istringstream testString;
 };
 
 BOOST_AUTO_TEST_SUITE(Chunks)
@@ -73,7 +74,7 @@
 
 BOOST_AUTO_TEST_CASE(InputData)
 {
-  std::vector<std::string> testStrings {
+  std::vector<std::string> testStrings{
       "",
 
       "a1b2c3%^&(#$&%^$$/><",
@@ -87,13 +88,12 @@
       "consequat massa Donec pede justo,"
   };
 
-  for (size_t i = 0; i <  testStrings.size(); ++i) {
-    std::istringstream str(testStrings[i]);
-    Producer prod(prefix, face, m_keyChain, signingInfo, time::seconds(4), maxSegmentSize, false,
-                  false, false, str);
+  for (size_t i = 0; i < testStrings.size(); ++i) {
+    std::istringstream input(testStrings[i]);
+    Producer prod(prefix, face, m_keyChain, input, options);
 
-    size_t expectedSize = std::ceil(static_cast<double>(testStrings[i].size()) / maxSegmentSize);
-    if (testStrings[i].size() == 0)
+    size_t expectedSize = std::ceil(static_cast<double>(testStrings[i].size()) / options.maxSegmentSize);
+    if (testStrings[i].empty())
       expectedSize = 1;
 
     BOOST_CHECK_EQUAL(prod.m_store.size(), expectedSize);
@@ -102,11 +102,9 @@
 
 BOOST_AUTO_TEST_CASE(RequestSegmentUnspecifiedVersion)
 {
-  Producer producer(prefix, face, m_keyChain, signingInfo, freshnessPeriod, maxSegmentSize,
-                    false, false, false, testString);
+  Producer producer(prefix, face, m_keyChain, testString, options);
   io.poll();
-
-  size_t nSegments = std::ceil(static_cast<double>(testString.str().size()) / maxSegmentSize);
+  size_t nSegments = std::ceil(static_cast<double>(testString.str().size()) / options.maxSegmentSize);
 
   // version request
   face.receive(*makeInterest(prefix));
@@ -139,11 +137,9 @@
 
 BOOST_AUTO_TEST_CASE(RequestSegmentSpecifiedVersion)
 {
-  Producer producer(prefix.appendVersion(version), face, m_keyChain, signingInfo, freshnessPeriod,
-                    maxSegmentSize, false, false, false, testString);
+  Producer producer(prefix.appendVersion(version), face, m_keyChain, testString, options);
   io.poll();
-
-  size_t nSegments = std::ceil(static_cast<double>(testString.str().size()) / maxSegmentSize);
+  size_t nSegments = std::ceil(static_cast<double>(testString.str().size()) / options.maxSegmentSize);
 
   // version request
   face.receive(*makeInterest(prefix));
@@ -177,11 +173,9 @@
 
 BOOST_AUTO_TEST_CASE(RequestNotExistingSegment)
 {
-  Producer producer(prefix, face, m_keyChain, signingInfo, freshnessPeriod, maxSegmentSize,
-                    false, false, false, testString);
+  Producer producer(prefix, face, m_keyChain, testString, options);
   io.poll();
-
-  size_t nSegments = std::ceil(static_cast<double>(testString.str().size()) / maxSegmentSize);
+  size_t nSegments = std::ceil(static_cast<double>(testString.str().size()) / options.maxSegmentSize);
 
   // version request
   face.receive(*makeInterest(prefix));
diff --git a/tools/chunks/putchunks/ndnputchunks.cpp b/tools/chunks/putchunks/ndnputchunks.cpp
index 7dbb5a8..ce3b88e 100644
--- a/tools/chunks/putchunks/ndnputchunks.cpp
+++ b/tools/chunks/putchunks/ndnputchunks.cpp
@@ -1,8 +1,8 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017,  Regents of the University of California,
- *                      Colorado State University,
- *                      University Pierre & Marie Curie, Sorbonne University.
+ * Copyright (c) 2016-2017, Regents of the University of California,
+ *                          Colorado State University,
+ *                          University Pierre & Marie Curie, Sorbonne University.
  *
  * This file is part of ndn-tools (Named Data Networking Essential Tools).
  * See AUTHORS.md for complete list of ndn-tools authors and contributors.
@@ -23,6 +23,7 @@
  * @author Wentao Shang
  * @author Steve DiBenedetto
  * @author Andrea Tosatto
+ * @author Davide Pesavento
  * @author Klaus Schneider
  */
 
@@ -35,48 +36,47 @@
 namespace chunks {
 
 static void
-usage(std::ostream& os, const std::string& programName, const po::options_description& visibleDesc) {
-  os << "Usage: " << programName << " [options] ndn:/name" << std::endl;
-  os << "\nPublish data under specified prefix. "
-     << "Note: this tool expects data from the standard input.\n" << std::endl;
-  os << visibleDesc;
+usage(std::ostream& os, const std::string& programName, const po::options_description& desc)
+{
+  os << "Usage: " << programName << " [options] ndn:/name\n"
+     << "\n"
+     << "Publish data under the specified prefix.\n"
+     << "Note: this tool expects data from the standard input.\n"
+     << "\n"
+     << desc;
 }
 
 static int
 main(int argc, char** argv)
 {
   std::string programName = argv[0];
-  uint64_t freshnessPeriod = 10000;
-  bool printVersion = false;
-  size_t maxChunkSize = MAX_NDN_PACKET_SIZE >> 1;
-  std::string signingStr;
-  bool isVerbose = false;
-  bool isQuiet = false;
   std::string prefix;
+  std::string signingStr;
+  Producer::Options opts;
 
   po::options_description visibleDesc("Options");
   visibleDesc.add_options()
     ("help,h",          "print this help message and exit")
-    ("freshness,f",     po::value<uint64_t>(&freshnessPeriod)->default_value(freshnessPeriod),
-                        "specify FreshnessPeriod, in milliseconds")
-    ("print-data-version,p",  po::bool_switch(&printVersion), "print Data version to the standard output")
-    ("size,s",          po::value<size_t>(&maxChunkSize)->default_value(maxChunkSize),
+    ("freshness,f",     po::value<time::milliseconds::rep>()->default_value(opts.freshnessPeriod.count()),
+                        "FreshnessPeriod of the published Data packets, in milliseconds")
+    ("print-data-version,p", po::bool_switch(&opts.wantShowVersion),
+                             "print Data version to the standard output")
+    ("size,s",          po::value<size_t>(&opts.maxSegmentSize)->default_value(opts.maxSegmentSize),
                         "maximum chunk size, in bytes")
-    ("signing-info,S",  po::value<std::string>(&signingStr)->default_value(signingStr),
-                        "set signing information")
-    ("quiet,q",         po::bool_switch(&isQuiet), "turn off all non-error output")
-    ("verbose,v",       po::bool_switch(&isVerbose), "turn on verbose output (per Interest information)")
+    ("signing-info,S",  po::value<std::string>(&signingStr), "signing information")
+    ("quiet,q",         po::bool_switch(&opts.isQuiet), "turn off all non-error output")
+    ("verbose,v",       po::bool_switch(&opts.isVerbose), "turn on verbose output (per Interest information)")
     ("version,V",       "print program version and exit")
     ;
 
-  po::options_description hiddenDesc("Hidden options");
+  po::options_description hiddenDesc;
   hiddenDesc.add_options()
     ("ndn-name,n", po::value<std::string>(&prefix), "NDN name for the served content");
 
   po::positional_options_description p;
   p.add("ndn-name", -1);
 
-  po::options_description optDesc("Allowed options");
+  po::options_description optDesc;
   optDesc.add(visibleDesc).add(hiddenDesc);
 
   po::variables_map vm;
@@ -108,30 +108,34 @@
     return 2;
   }
 
-  if (maxChunkSize < 1 || maxChunkSize > MAX_NDN_PACKET_SIZE) {
+  opts.freshnessPeriod = time::milliseconds(vm["freshness"].as<time::milliseconds::rep>());
+  if (opts.freshnessPeriod < time::milliseconds::zero()) {
+    std::cerr << "ERROR: FreshnessPeriod cannot be negative" << std::endl;
+    return 2;
+  }
+
+  if (opts.maxSegmentSize < 1 || opts.maxSegmentSize > MAX_NDN_PACKET_SIZE) {
     std::cerr << "ERROR: Maximum chunk size must be between 1 and " << MAX_NDN_PACKET_SIZE << std::endl;
     return 2;
   }
 
-  if (isQuiet && isVerbose) {
-    std::cerr << "ERROR: Cannot use flags -q and -v at the same time\n";
-    return 2;
-  }
-
-  security::SigningInfo signingInfo;
   try {
-    signingInfo = security::SigningInfo(signingStr);
+    opts.signingInfo = security::SigningInfo(signingStr);
   }
   catch (const std::invalid_argument& e) {
     std::cerr << "ERROR: " << e.what() << std::endl;
     return 2;
   }
 
+  if (opts.isQuiet && opts.isVerbose) {
+    std::cerr << "ERROR: Cannot be quiet and verbose at the same time" << std::endl;
+    return 2;
+  }
+
   try {
     Face face;
     KeyChain keyChain;
-    Producer producer(prefix, face, keyChain, signingInfo, time::milliseconds(freshnessPeriod),
-                      maxChunkSize, isQuiet, isVerbose, printVersion, std::cin);
+    Producer producer(prefix, face, keyChain, std::cin, opts);
     producer.run();
   }
   catch (const std::exception& e) {
diff --git a/tools/chunks/putchunks/producer.cpp b/tools/chunks/putchunks/producer.cpp
index 5e50900..3fb14c7 100644
--- a/tools/chunks/putchunks/producer.cpp
+++ b/tools/chunks/putchunks/producer.cpp
@@ -1,8 +1,8 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017,  Regents of the University of California,
- *                      Colorado State University,
- *                      University Pierre & Marie Curie, Sorbonne University.
+ * Copyright (c) 2016-2017, Regents of the University of California,
+ *                          Colorado State University,
+ *                          University Pierre & Marie Curie, Sorbonne University.
  *
  * This file is part of ndn-tools (Named Data Networking Essential Tools).
  * See AUTHORS.md for complete list of ndn-tools authors and contributors.
@@ -23,6 +23,7 @@
  * @author Wentao Shang
  * @author Steve DiBenedetto
  * @author Andrea Tosatto
+ * @author Davide Pesavento
  * @author Klaus Schneider
  */
 
@@ -31,23 +32,11 @@
 namespace ndn {
 namespace chunks {
 
-Producer::Producer(const Name& prefix,
-                   Face& face,
-                   KeyChain& keyChain,
-                   const security::SigningInfo& signingInfo,
-                   time::milliseconds freshnessPeriod,
-                   size_t maxSegmentSize,
-                   bool isQuiet,
-                   bool isVerbose,
-                   bool needToPrintVersion,
-                   std::istream& is)
+Producer::Producer(const Name& prefix, Face& face, KeyChain& keyChain, std::istream& is,
+                   const Options& opts)
   : m_face(face)
   , m_keyChain(keyChain)
-  , m_signingInfo(signingInfo)
-  , m_freshnessPeriod(freshnessPeriod)
-  , m_maxSegmentSize(maxSegmentSize)
-  , m_isQuiet(isQuiet)
-  , m_isVerbose(isVerbose)
+  , m_options(opts)
 {
   if (prefix.size() > 0 && prefix[-1].isVersion()) {
     m_prefix = prefix.getPrefix(-1);
@@ -60,7 +49,7 @@
 
   populateStore(is);
 
-  if (needToPrintVersion)
+  if (m_options.wantShowVersion)
     std::cout << m_versionedPrefix[-1] << std::endl;
 
   m_face.setInterestFilter(m_prefix,
@@ -68,7 +57,7 @@
                            RegisterPrefixSuccessCallback(),
                            bind(&Producer::onRegisterFailed, this, _1, _2));
 
-  if (!m_isQuiet)
+  if (!m_options.isQuiet)
     std::cerr << "Data published with name: " << m_versionedPrefix << std::endl;
 }
 
@@ -83,7 +72,7 @@
 {
   BOOST_ASSERT(m_store.size() > 0);
 
-  if (m_isVerbose)
+  if (m_options.isVerbose)
     std::cerr << "Interest: " << interest << std::endl;
 
   const Name& name = interest.getName();
@@ -104,7 +93,7 @@
   }
 
   if (data != nullptr) {
-    if (m_isVerbose)
+    if (m_options.isVerbose)
       std::cerr << "Data: " << *data << std::endl;
 
     m_face.put(*data);
@@ -114,37 +103,37 @@
 void
 Producer::populateStore(std::istream& is)
 {
-  BOOST_ASSERT(m_store.size() == 0);
+  BOOST_ASSERT(m_store.empty());
 
-  if (!m_isQuiet)
+  if (!m_options.isQuiet)
     std::cerr << "Loading input ..." << std::endl;
 
-  std::vector<uint8_t> buffer(m_maxSegmentSize);
+  std::vector<uint8_t> buffer(m_options.maxSegmentSize);
   while (is.good()) {
     is.read(reinterpret_cast<char*>(buffer.data()), buffer.size());
     const auto nCharsRead = is.gcount();
+
     if (nCharsRead > 0) {
       auto data = make_shared<Data>(Name(m_versionedPrefix).appendSegment(m_store.size()));
-      data->setFreshnessPeriod(m_freshnessPeriod);
-      data->setContent(&buffer[0], nCharsRead);
-
+      data->setFreshnessPeriod(m_options.freshnessPeriod);
+      data->setContent(buffer.data(), static_cast<size_t>(nCharsRead));
       m_store.push_back(data);
     }
   }
 
   if (m_store.empty()) {
     auto data = make_shared<Data>(Name(m_versionedPrefix).appendSegment(0));
-    data->setFreshnessPeriod(m_freshnessPeriod);
+    data->setFreshnessPeriod(m_options.freshnessPeriod);
     m_store.push_back(data);
   }
 
   auto finalBlockId = name::Component::fromSegment(m_store.size() - 1);
   for (const auto& data : m_store) {
     data->setFinalBlockId(finalBlockId);
-    m_keyChain.sign(*data, m_signingInfo);
+    m_keyChain.sign(*data, m_options.signingInfo);
   }
 
-  if (!m_isQuiet)
+  if (!m_options.isQuiet)
     std::cerr << "Created " << m_store.size() << " chunks for prefix " << m_prefix << std::endl;
 }
 
diff --git a/tools/chunks/putchunks/producer.hpp b/tools/chunks/putchunks/producer.hpp
index 86dcad7..f498ec7 100644
--- a/tools/chunks/putchunks/producer.hpp
+++ b/tools/chunks/putchunks/producer.hpp
@@ -1,8 +1,8 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017,  Regents of the University of California,
- *                      Colorado State University,
- *                      University Pierre & Marie Curie, Sorbonne University.
+ * Copyright (c) 2016-2017, Regents of the University of California,
+ *                          Colorado State University,
+ *                          University Pierre & Marie Curie, Sorbonne University.
  *
  * This file is part of ndn-tools (Named Data Networking Essential Tools).
  * See AUTHORS.md for complete list of ndn-tools authors and contributors.
@@ -23,6 +23,7 @@
  * @author Wentao Shang
  * @author Steve DiBenedetto
  * @author Andrea Tosatto
+ * @author Davide Pesavento
  * @author Klaus Schneider
  */
 
@@ -35,7 +36,7 @@
 namespace chunks {
 
 /**
- * @brief Segmented version Producer
+ * @brief Segmented & versioned data publisher
  *
  * Packetizes and publishes data from an input stream under /prefix/<version>/<segment number>.
  * The current time is used as the version number. The store has always at least one element (also
@@ -44,16 +45,25 @@
 class Producer : noncopyable
 {
 public:
+  struct Options
+  {
+    security::SigningInfo signingInfo;
+    time::milliseconds freshnessPeriod{10000};
+    size_t maxSegmentSize = MAX_NDN_PACKET_SIZE >> 1;
+    bool isQuiet = false;
+    bool isVerbose = false;
+    bool wantShowVersion = false;
+  };
+
+public:
   /**
    * @brief Create the Producer
    *
-   * @prefix prefix used to publish data, if the last component of prefix is not a version number
-   *         the current time is used as version number.
+   * @param prefix prefix used to publish data; if the last component is not a valid
+   *               version number, the current system time is used as version number.
    */
-  Producer(const Name& prefix, Face& face, KeyChain& keyChain,
-           const security::SigningInfo& signingInfo, time::milliseconds freshnessPeriod,
-           size_t maxSegmentSize, bool isQuiet = false, bool isVerbose = false,
-           bool needToPrintVersion = false, std::istream& is = std::cin);
+  Producer(const Name& prefix, Face& face, KeyChain& keyChain, std::istream& is,
+           const Options& opts);
 
   /**
    * @brief Run the Producer
@@ -62,9 +72,6 @@
   run();
 
 private:
-  void
-  onInterest(const Interest& interest);
-
   /**
    * @brief Split the input stream in data packets and save them to the store
    *
@@ -79,6 +86,9 @@
   populateStore(std::istream& is);
 
   void
+  onInterest(const Interest& interest);
+
+  void
   onRegisterFailed(const Name& prefix, const std::string& reason);
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
@@ -89,11 +99,7 @@
   Name m_versionedPrefix;
   Face& m_face;
   KeyChain& m_keyChain;
-  security::SigningInfo m_signingInfo;
-  time::milliseconds m_freshnessPeriod;
-  size_t m_maxSegmentSize;
-  bool m_isQuiet;
-  bool m_isVerbose;
+  const Options m_options;
 };
 
 } // namespace chunks
