diff --git a/src/ndn-traffic-client.cpp b/src/ndn-traffic-client.cpp
index adba253..005b8d4 100644
--- a/src/ndn-traffic-client.cpp
+++ b/src/ndn-traffic-client.cpp
@@ -18,7 +18,6 @@
  * Author: Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
  */
 
-#include "logger.hpp"
 #include "util.hpp"
 
 #include <ndn-cxx/face.hpp>
@@ -27,7 +26,6 @@
 #include <ndn-cxx/util/backports.hpp>
 #include <ndn-cxx/util/random.hpp>
 
-#include <cctype>
 #include <limits>
 #include <vector>
 
@@ -36,7 +34,6 @@
 #include <boost/asio/signal_set.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/lexical_cast.hpp>
-#include <boost/logic/tribool.hpp>
 #include <boost/noncopyable.hpp>
 #include <boost/program_options/options_description.hpp>
 #include <boost/program_options/parsers.hpp>
@@ -58,12 +55,6 @@
   {
   }
 
-  bool
-  hasError() const
-  {
-    return m_hasError;
-  }
-
   void
   setMaximumInterests(uint64_t maxInterests)
   {
@@ -83,15 +74,30 @@
     m_wantQuiet = true;
   }
 
-  void
+  int
   run()
   {
     m_logger.initializeLog(to_string(random::generateWord32()));
-    initializeTrafficConfiguration();
+
+    if (!readConfigurationFile(m_configurationFile, m_trafficPatterns, m_logger)) {
+      return 2;
+    }
+
+    if (!checkTrafficPatternCorrectness()) {
+      m_logger.log("ERROR: Traffic configuration provided is not proper", false, true);
+      return 2;
+    }
+
+    m_logger.log("Traffic configuration file processing completed.\n", true, false);
+    for (std::size_t i = 0; i < m_trafficPatterns.size(); i++) {
+      m_logger.log("Traffic Pattern Type #" + to_string(i + 1), false, false);
+      m_trafficPatterns[i].printTrafficConfiguration(m_logger);
+      m_logger.log("", false, false);
+    }
 
     if (m_nMaximumInterests == 0) {
       logStatistics();
-      return;
+      return 0;
     }
 
     m_signalSet.async_wait([this] (auto&&...) { this->stop(); });
@@ -102,11 +108,12 @@
 
     try {
       m_face.processEvents();
+      return m_hasError ? 1 : 0;
     }
     catch (const std::exception& e) {
       m_logger.log("ERROR: "s + e.what(), true, true);
-      m_hasError = true;
       m_ioService.stop();
+      return 1;
     }
   }
 
@@ -120,14 +127,12 @@
       std::string detail;
 
       detail += "TrafficPercentage=" + to_string(m_trafficPercentage) + ", ";
-      if (!m_name.empty())
-        detail += "Name=" + m_name + ", ";
+      detail += "Name=" + m_name + ", ";
       if (m_nameAppendBytes)
         detail += "NameAppendBytes=" + to_string(*m_nameAppendBytes) + ", ";
       if (m_nameAppendSeqNum)
         detail += "NameAppendSequenceNumber=" + to_string(*m_nameAppendSeqNum) + ", ";
-      if (!boost::logic::indeterminate(m_mustBeFresh))
-        detail += "MustBeFresh=" + to_string(bool(m_mustBeFresh)) + ", ";
+      detail += "MustBeFresh=" + to_string(m_mustBeFresh) + ", ";
       if (m_nonceDuplicationPercentage > 0)
         detail += "NonceDuplicationPercentage=" + to_string(m_nonceDuplicationPercentage) + ", ";
       if (m_interestLifetime >= 0_ms)
@@ -143,36 +148,45 @@
     }
 
     bool
-    processConfigurationDetail(const std::string& detail, Logger& logger, int lineNumber)
+    parseConfigurationLine(const std::string& line, Logger& logger, int lineNumber)
     {
       std::string parameter, value;
-      if (parseParameterAndValue(detail, parameter, value)) {
-        if (parameter == "TrafficPercentage")
-          m_trafficPercentage = std::stoul(value);
-        else if (parameter == "Name")
-          m_name = value;
-        else if (parameter == "NameAppendBytes")
-          m_nameAppendBytes = std::stoul(value);
-        else if (parameter == "NameAppendSequenceNumber")
-          m_nameAppendSeqNum = std::stoull(value);
-        else if (parameter == "MustBeFresh")
-          m_mustBeFresh = bool(std::stoul(value));
-        else if (parameter == "NonceDuplicationPercentage")
-          m_nonceDuplicationPercentage = std::stoul(value);
-        else if (parameter == "InterestLifetime")
-          m_interestLifetime = time::milliseconds(std::stoul(value));
-        else if (parameter == "NextHopFaceId")
-          m_nextHopFaceId = std::stoull(value);
-        else if (parameter == "ExpectedContent")
-          m_expectedContent = value;
-        else
-          logger.log("Line " + to_string(lineNumber) +
-                     " - Unknown parameter '" + parameter + "'", false, true);
+      if (!extractParameterAndValue(line, parameter, value)) {
+        logger.log("Line " + to_string(lineNumber) + " - Invalid syntax: " + line,
+                   false, true);
+        return false;
+      }
+
+      if (parameter == "TrafficPercentage") {
+        m_trafficPercentage = std::stoul(value);
+      }
+      else if (parameter == "Name") {
+        m_name = value;
+      }
+      else if (parameter == "NameAppendBytes") {
+        m_nameAppendBytes = std::stoul(value);
+      }
+      else if (parameter == "NameAppendSequenceNumber") {
+        m_nameAppendSeqNum = std::stoull(value);
+      }
+      else if (parameter == "MustBeFresh") {
+        m_mustBeFresh = parseBoolean(value);
+      }
+      else if (parameter == "NonceDuplicationPercentage") {
+        m_nonceDuplicationPercentage = std::stoul(value);
+      }
+      else if (parameter == "InterestLifetime") {
+        m_interestLifetime = time::milliseconds(std::stoul(value));
+      }
+      else if (parameter == "NextHopFaceId") {
+        m_nextHopFaceId = std::stoull(value);
+      }
+      else if (parameter == "ExpectedContent") {
+        m_expectedContent = value;
       }
       else {
-        logger.log("Line " + to_string(lineNumber) +
-                   " - Invalid traffic configuration line: " + detail, false, true);
-        return false;
+        logger.log("Line " + to_string(lineNumber) + " - Ignoring unknown parameter: " + parameter,
+                   false, true);
       }
       return true;
     }
@@ -188,7 +202,7 @@
     std::string m_name;
     optional<std::size_t> m_nameAppendBytes;
     optional<uint64_t> m_nameAppendSeqNum;
-    boost::logic::tribool m_mustBeFresh = boost::logic::indeterminate;
+    bool m_mustBeFresh = false;
     uint8_t m_nonceDuplicationPercentage = 0;
     time::milliseconds m_interestLifetime = -1_ms;
     uint64_t m_nextHopFaceId = 0;
@@ -272,88 +286,10 @@
   bool
   checkTrafficPatternCorrectness() const
   {
+    // TODO
     return true;
   }
 
-  void
-  parseConfigurationFile()
-  {
-    std::ifstream patternFile;
-    m_logger.log("Parsing traffic configuration file: " + m_configurationFile, true, true);
-
-    patternFile.open(m_configurationFile.data());
-    if (patternFile.is_open()) {
-      int lineNumber = 0;
-      std::string patternLine;
-      while (getline(patternFile, patternLine)) {
-        lineNumber++;
-        if (std::isalpha(patternLine[0])) {
-          InterestTrafficConfiguration interestData;
-          bool shouldSkipLine = false;
-          if (interestData.processConfigurationDetail(patternLine, m_logger, lineNumber)) {
-            while (getline(patternFile, patternLine) && std::isalpha(patternLine[0])) {
-              lineNumber++;
-              if (!interestData.processConfigurationDetail(patternLine, m_logger, lineNumber)) {
-                shouldSkipLine = true;
-                break;
-              }
-            }
-            lineNumber++;
-          }
-          else {
-            shouldSkipLine = true;
-          }
-          if (!shouldSkipLine) {
-            if (interestData.checkTrafficDetailCorrectness()) {
-              m_trafficPatterns.push_back(interestData);
-            }
-          }
-        }
-      }
-      patternFile.close();
-
-      if (!checkTrafficPatternCorrectness()) {
-        m_logger.log("ERROR: Traffic configuration provided is not proper - " +
-                     m_configurationFile, false, true);
-        exit(2);
-      }
-
-      m_logger.log("Traffic configuration file processing completed.\n", true, false);
-      for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++) {
-        m_logger.log("Traffic Pattern Type #" + to_string(patternId + 1), false, false);
-        m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
-        m_logger.log("", false, false);
-      }
-    }
-    else {
-      m_logger.log("ERROR: Unable to open traffic configuration file: " + m_configurationFile, false, true);
-      exit(2);
-    }
-  }
-
-  void
-  initializeTrafficConfiguration()
-  {
-    namespace fs = boost::filesystem;
-
-    fs::path configPath(m_configurationFile);
-    if (fs::exists(configPath)) {
-      if (fs::is_regular_file(configPath)) {
-        parseConfigurationFile();
-      }
-      else {
-        m_logger.log("ERROR: Traffic configuration file is not a regular file: " +
-                     m_configurationFile, false, true);
-        exit(2);
-      }
-    }
-    else {
-      m_logger.log("ERROR: Traffic configuration file does not exist: " +
-                   m_configurationFile, false, true);
-      exit(2);
-    }
-  }
-
   uint32_t
   getNewNonce()
   {
@@ -409,10 +345,7 @@
     }
     interest.setName(name);
 
-    if (pattern.m_mustBeFresh)
-      interest.setMustBeFresh(true);
-    else if (!pattern.m_mustBeFresh)
-      interest.setMustBeFresh(false);
+    interest.setMustBeFresh(pattern.m_mustBeFresh);
 
     static std::uniform_int_distribution<> duplicateNonceDist(1, 100);
     if (duplicateNonceDist(random::getRandomNumberEngine()) <= pattern.m_nonceDuplicationPercentage)
@@ -688,7 +621,5 @@
     client.setQuietLogging();
   }
 
-  client.run();
-
-  return client.hasError() ? 1 : 0;
+  return client.run();
 }
