diff --git a/README.md b/README.md
index 6c66ba2..ace6f72 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,51 @@
-Traffic Generator For NDN (ndn-traffic)
-=======================================
+Traffic Generator For NDN (ndn-traffic-generator)
+=================================================
 
 This tool is designed to generate interest and data traffic in an NDN network.
 The client and server tool accept traffic configuration files which can be
 used to specify the pattern of NDN traffic that is required to be generated.
-Sample configuration files are provided which include instructions on how 
-to configure various parameters. 
+Sample configuration files are provided which include instructions on how
+to configure various parameters.
 
-This is an application tool developed over ndn-cpp APIs for TLV packet
-based communication over NDN configured network. The NDN network has to
-be first created with 'ndnx' and 'ndnd-tlv'. This is followed by environment
-security setup with 'ndn-cpp-security-tools'. The application also requires
-installation of ndn-cpp and CPP boost libraries. The installations need to
-follow a strict order as the ndnd
+## Prerequisites ##
 
-To run the following must be ensured(FOLLOW ORDER STRICTLY)
+Compiling and running ndn-traffic-generator requires the following dependencies:
 
-1. Install ndnx (install all necessary dependencies)
-2. Install CPP Boost Library > 1.47
+1. C++ Boost Libraries version >= 1.48
+
+    On Ubuntu 12.04:
 
         sudo apt-get install libboost1.48-all-dev
 
-3. Install ndn-cpp-dev (install all necessary dependencies except boost)
-4. Install ndnd-tlv install all necessary dependencies except boost)
-5. Install and Configure Security Environment with ndn-cpp-security-tools
+    On Ubuntu 13.10 and later
+
+        sudo apt-get install libboost-all-dev
+
+    On OSX with macports
+
+        sudo port install boost
+
+    On OSX with brew
+
+        brew install boost
+
+    On other platforms Boost Libraries can be installed from the packaged version for the
+    distribution, if the version matches requirements, or compiled from source
+    (http://www.boost.org)
+
+2. ndn-cpp-dev library (https://github.com/named-data/ndn-cpp-dev)
+
+    For detailed installation instructions refer to
+    https://github.com/named-data/ndn-cpp-dev/blob/master/INSTALL.md and/or
+    https://github.com/named-data/ndn-cpp-dev
+
+3. NDN forwarding daemon (https://github.com/named-data/NFD)
 
 -----------------------------------------------------
 
 ## 1. Compile And Installation Instructions: ##
 
-    git clone git://github.com/jeraldabraham/ndn-traffic ndn-traffic
-    cd ndn-traffic
-    ./waf configure 
+    ./waf configure
     ./waf
     sudo ./waf install
 
@@ -57,26 +71,21 @@
 
 __ON MACHINE #1__
 
-Start the ndnd-tlv daemon
-
-        ndnd-tlv-start
+(NDN forwarding daemon should be running)
 
 Start traffic server
 
-        ndntrafficserver NDNTrafficServer.conf
+        ndn-traffic-server ndn-traffic-server.conf
 
 __ON MACHINE #2__
 
-Start the ndnd-tlv daemon
-
-        ndnd-tlv-start
+(NDN forwarding daemon should be running)
 
 Start the traffic client
-        
-        ndntraffic NDNTrafficClient.conf
+
+        ndn-traffic ndn-traffic-client.conf
 
 
 * These tools need not be used together and can be used individually as well.
 * Please refer sample configuration files provided for details on how to create your own.
 * Use command line options shown above to adjust traffic configuration.
-
diff --git a/NDNTrafficClient.sample.conf b/ndn-traffic-client.conf.sample
similarity index 99%
rename from NDNTrafficClient.sample.conf
rename to ndn-traffic-client.conf.sample
index 49d63da..d3556fd 100644
--- a/NDNTrafficClient.sample.conf
+++ b/ndn-traffic-client.conf.sample
@@ -47,3 +47,4 @@
 Name=/example/B
 ExpectedContent=BBBBBBBB
 ##########
+
diff --git a/NDNTrafficServer.sample.conf b/ndn-traffic-server.conf.sample
similarity index 99%
rename from NDNTrafficServer.sample.conf
rename to ndn-traffic-server.conf.sample
index b4b98e9..ab95676 100644
--- a/NDNTrafficServer.sample.conf
+++ b/ndn-traffic-server.conf.sample
@@ -33,3 +33,4 @@
 Name=/example/B
 Content=BBBBBBBB
 ##########
+
diff --git a/logger.hpp b/src/logger.hpp
similarity index 95%
rename from logger.hpp
rename to src/logger.hpp
index 192f28f..706c6df 100644
--- a/logger.hpp
+++ b/src/logger.hpp
@@ -84,14 +84,16 @@
               std::cout << "Log File Initialized: " << logFilename << std::endl;
             else
               {
-                std::cout << "ERROR - Unable To Initialize A Log File At: " << m_logLocation << std::endl
+                std::cout << "ERROR - Unable To Initialize A Log File At: "
+                          << m_logLocation << std::endl
                           << "Using Default Output For Logging." << std::endl;
                 m_logLocation = "";
               }
           }
         else
           {
-            std::cout << "Environment Variable NDN_TRAFFIC_LOGFOLDER Should Be A Folder." << std::endl
+            std::cout << "Environment Variable NDN_TRAFFIC_LOGFOLDER Should Be A Folder."
+                      << std::endl
                       << "Using Default Output For Logging." << std::endl;
             m_logLocation = "";
           }
diff --git a/ndn-traffic-client.cpp b/src/ndn-traffic-client.cpp
similarity index 77%
rename from ndn-traffic-client.cpp
rename to src/ndn-traffic-client.cpp
index 6206303..135d4ce 100644
--- a/ndn-traffic-client.cpp
+++ b/src/ndn-traffic-client.cpp
@@ -28,8 +28,7 @@
 class NdnTrafficClient
 {
 public:
-
-  NdnTrafficClient( char* programName )
+  NdnTrafficClient(char* programName)
     : m_logger("NDNTrafficClient")
     , ioService_(new boost::asio::io_service)
     , face_(ioService_)
@@ -51,7 +50,6 @@
   class InterestTrafficConfiguration
   {
   public:
-
     InterestTrafficConfiguration()
     {
       trafficPercentage = -1;
@@ -79,7 +77,7 @@
     }
 
     void
-    printTrafficConfiguration( Logger& logger )
+    printTrafficConfiguration(Logger& logger)
     {
       std::string detail;
       detail = "";
@@ -121,7 +119,7 @@
     }
 
     bool
-    extractParameterValue( std::string detail, std::string& parameter, std::string& value )
+    extractParameterValue(const std::string& detail, std::string& parameter, std::string& value)
     {
       int i;
       std::string allowedCharacters = ":/+._-%";
@@ -136,7 +134,8 @@
       if (i == detail.length())
         return false;
       i++;
-      while ((std::isalnum(detail[i]) || allowedCharacters.find(detail[i]) != std::string::npos) && i < detail.length())
+      while ((std::isalnum(detail[i]) || allowedCharacters.find(detail[i]) != std::string::npos) &&
+             i < detail.length())
         {
           value += detail[i];
           i++;
@@ -147,7 +146,7 @@
     }
 
     bool
-    processConfigurationDetail( std::string detail, Logger& logger, int lineNumber )
+    processConfigurationDetail(const std::string& detail, Logger& logger, int lineNumber)
     {
       std::string parameter, value;
       if (extractParameterValue(detail, parameter, value))
@@ -185,11 +184,13 @@
           else if (parameter == "ExpectedContent")
             expectedContent = value;
           else
-            logger.log("Line "+toString(lineNumber)+" \t- Invalid Parameter='"+parameter+"'", false, true);
+            logger.log("Line "+toString(lineNumber) +
+                       " \t- Invalid Parameter='"+parameter+"'", false, true);
         }
       else
         {
-          logger.log("Line "+toString(lineNumber)+" \t- Improper Traffic Configuration Line- "+detail, false, true);
+          logger.log("Line "+toString(lineNumber) +
+                     " \t- Improper Traffic Configuration Line- "+detail, false, true);
           return false;
         }
       return true;
@@ -223,8 +224,7 @@
     double totalInterestRoundTripTime;
     int contentInconsistencies;
     std::string expectedContent;
-
-  };
+  }; // class InterestTrafficConfiguration
 
   int
   getDefaultInterestLifetime()
@@ -233,7 +233,7 @@
   }
 
   static std::string
-  toString( int integerValue )
+  toString(int integerValue)
   {
     std::stringstream stream;
     stream << integerValue;
@@ -241,7 +241,7 @@
   }
 
   static std::string
-  toString( double doubleValue )
+  toString(double doubleValue)
   {
     std::stringstream stream;
     stream << doubleValue;
@@ -249,7 +249,7 @@
   }
 
   static int
-  toInteger( std::string stringValue )
+  toInteger(const std::string& stringValue)
   {
     int integerValue;
     std::stringstream stream(stringValue);
@@ -324,57 +324,64 @@
     double loss, average, inconsistency;
 
     m_logger.log("\n\n== Interest Traffic Report ==\n", false, true);
-    m_logger.log("Total Traffic Pattern Types = "+toString((int)trafficPattern_.size()), false, true);
-    m_logger.log("Total Interests Sent        = "+toString(totalInterestSent_), false, true);
-    m_logger.log("Total Responses Received    = "+toString(totalInterestReceived_), false, true);
+    m_logger.log("Total Traffic Pattern Types = " + toString((int)trafficPattern_.size()), false, true);
+    m_logger.log("Total Interests Sent        = " + toString(totalInterestSent_), false, true);
+    m_logger.log("Total Responses Received    = " + toString(totalInterestReceived_), false, true);
     if (totalInterestSent_ > 0)
       loss = (totalInterestSent_-totalInterestReceived_)*100.0/totalInterestSent_;
     else
       loss = 0;
-    m_logger.log("Total Interest Loss         = "+toString(loss)+"%", false, true);
+    m_logger.log("Total Interest Loss         = " + toString(loss)+"%", false, true);
     if (totalInterestReceived_ > 0)
-    {
-      average = totalInterestRoundTripTime_/totalInterestReceived_;
-      inconsistency = contentInconsistencies_*100.0/totalInterestReceived_;
-    }
+      {
+        average = totalInterestRoundTripTime_/totalInterestReceived_;
+        inconsistency = contentInconsistencies_*100.0/totalInterestReceived_;
+      }
     else
-    {
-      average = 0;
-      inconsistency = 0;
-    }
-    m_logger.log("Total Data Inconsistency    = "+toString(inconsistency)+"%", false, true);
-    m_logger.log("Total Round Trip Time       = "+toString(totalInterestRoundTripTime_)+"ms", false, true);
-    m_logger.log("Average Round Trip Time     = "+toString(average)+"ms\n", false, true);
+      {
+        average = 0;
+        inconsistency = 0;
+      }
+    m_logger.log("Total Data Inconsistency    = " + toString(inconsistency)+"%", false, true);
+    m_logger.log("Total Round Trip Time       = " +
+                 toString(totalInterestRoundTripTime_)+"ms", false, true);
+    m_logger.log("Average Round Trip Time     = " + toString(average)+"ms\n", false, true);
 
     for (patternId=0; patternId<trafficPattern_.size(); patternId++)
       {
-        m_logger.log("Traffic Pattern Type #"+toString(patternId+1), false, true);
+        m_logger.log("Traffic Pattern Type #" + toString(patternId+1), false, true);
         trafficPattern_[patternId].printTrafficConfiguration(m_logger);
-        m_logger.log("Total Interests Sent        = "+toString(trafficPattern_[patternId].totalInterestSent), false, true);
-        m_logger.log("Total Responses Received    = "+toString(trafficPattern_[patternId].totalInterestReceived), false, true);
+        m_logger.log("Total Interests Sent        = " +
+                     toString(trafficPattern_[patternId].totalInterestSent), false, true);
+        m_logger.log("Total Responses Received    = " +
+                     toString(trafficPattern_[patternId].totalInterestReceived), false, true);
         if (trafficPattern_[patternId].totalInterestSent > 0)
           {
-            loss = (trafficPattern_[patternId].totalInterestSent-trafficPattern_[patternId].totalInterestReceived);
+            loss = (trafficPattern_[patternId].totalInterestSent -
+                    trafficPattern_[patternId].totalInterestReceived);
             loss *= 100.0;
             loss /= trafficPattern_[patternId].totalInterestSent;
           }
         else
           loss = 0;
-        m_logger.log("Total Interest Loss         = "+toString(loss)+"%", false, true);
+        m_logger.log("Total Interest Loss         = " + toString(loss)+"%", false, true);
         if (trafficPattern_[patternId].totalInterestReceived > 0)
-        {
-          average = trafficPattern_[patternId].totalInterestRoundTripTime/trafficPattern_[patternId].totalInterestReceived;
-          inconsistency = trafficPattern_[patternId].contentInconsistencies;
-          inconsistency = inconsistency*100.0/trafficPattern_[patternId].totalInterestReceived;
-        }
+          {
+            average = (trafficPattern_[patternId].totalInterestRoundTripTime /
+                       trafficPattern_[patternId].totalInterestReceived);
+            inconsistency = trafficPattern_[patternId].contentInconsistencies;
+            inconsistency = inconsistency * 100.0 / trafficPattern_[patternId].totalInterestReceived;
+          }
         else
-        {
-          average = 0;
-          inconsistency = 0;
-        }
-        m_logger.log("Total Data Inconsistency    = "+toString(inconsistency)+"%", false, true);
-        m_logger.log("Total Round Trip Time       = "+toString(trafficPattern_[patternId].totalInterestRoundTripTime)+"ms", false, true);
-        m_logger.log("Average Round Trip Time     = "+toString(average)+"ms\n", false, true);
+          {
+            average = 0;
+            inconsistency = 0;
+          }
+        m_logger.log("Total Data Inconsistency    = " + toString(inconsistency)+"%", false, true);
+        m_logger.log("Total Round Trip Time       = " +
+                     toString(trafficPattern_[patternId].totalInterestRoundTripTime)+"ms",
+                     false, true);
+        m_logger.log("Average Round Trip Time     = " + toString(average)+"ms\n", false, true);
       }
   }
 
@@ -411,7 +418,8 @@
                     while (getline(patternFile, patternLine) && std::isalpha(patternLine[0]))
                       {
                         lineNumber++;
-                        if (!interestData.processConfigurationDetail(patternLine, m_logger, lineNumber))
+                        if (!interestData.processConfigurationDetail(patternLine,
+                                                                     m_logger, lineNumber))
                           {
                             skipLine = true;
                             break;
@@ -431,7 +439,8 @@
         patternFile.close();
         if (!checkTrafficPatternCorrectness())
           {
-            m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " + configurationFile_, false, true);
+            m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " +
+                         configurationFile_, false, true);
             m_logger.shutdownLogger();
             exit(1);
           }
@@ -445,7 +454,8 @@
       }
     else
       {
-        m_logger.log("ERROR - Unable To Open Traffic Configuration File: " + configurationFile_, false, true);
+        m_logger.log("ERROR - Unable To Open Traffic Configuration File: " +
+                     configurationFile_, false, true);
         m_logger.shutdownLogger();
         exit(1);
       }
@@ -462,14 +472,16 @@
           }
         else
           {
-            m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " + configurationFile_, false, true);
+            m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " +
+                         configurationFile_, false, true);
             m_logger.shutdownLogger();
             exit(1);
           }
       }
     else
       {
-        m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " + configurationFile_, false, true);
+        m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " +
+                     configurationFile_, false, true);
         m_logger.shutdownLogger();
         exit(1);
       }
@@ -543,19 +555,19 @@
     totalInterestReceived_++;
     trafficPattern_[patternId].totalInterestReceived++;
     if (trafficPattern_[patternId].expectedContent != "")
-    {
-      receivedContent = (char*)(data.getContent().value());
-      receivedContentLength = data.getContent().value_size();
-      receivedContent = receivedContent.substr(0, receivedContentLength);
-      if (receivedContent != trafficPattern_[patternId].expectedContent)
       {
-        contentInconsistencies_++;
-        trafficPattern_[patternId].contentInconsistencies++;
-        logLine += ", IsConsistent=No";
+        receivedContent = (char*)(data.getContent().value());
+        receivedContentLength = data.getContent().value_size();
+        receivedContent = receivedContent.substr(0, receivedContentLength);
+        if (receivedContent != trafficPattern_[patternId].expectedContent)
+          {
+            contentInconsistencies_++;
+            trafficPattern_[patternId].contentInconsistencies++;
+            logLine += ", IsConsistent=No";
+          }
+        else
+          logLine += ", IsConsistent=Yes";
       }
-      else
-        logLine += ", IsConsistent=Yes";
-    }
     else
       logLine += ", IsConsistent=NotChecked";
     m_logger.log(logLine, true, false);
@@ -622,7 +634,8 @@
                 if (trafficPattern_[patternId].maxSuffixComponents >= 0)
                   interest.setMaxSuffixComponents(trafficPattern_[patternId].maxSuffixComponents);
                 Exclude exclude;
-                if (trafficPattern_[patternId].excludeBefore != "" &&  trafficPattern_[patternId].excludeAfter != "")
+                if (trafficPattern_[patternId].excludeBefore != "" &&
+                    trafficPattern_[patternId].excludeAfter != "")
                   {
                     exclude.excludeRange(name::Component(trafficPattern_[patternId].excludeAfter),
                                          name::Component(trafficPattern_[patternId].excludeBefore));
@@ -638,20 +651,24 @@
                     exclude.excludeAfter(name::Component(trafficPattern_[patternId].excludeAfter));
                     interest.setExclude(exclude);
                   }
-                if (trafficPattern_[patternId].excludeBeforeBytes > 0 &&  trafficPattern_[patternId].excludeAfterBytes > 0)
+                if (trafficPattern_[patternId].excludeBeforeBytes > 0 &&
+                    trafficPattern_[patternId].excludeAfterBytes > 0)
                   {
-                    exclude.excludeRange(name::Component(getRandomByteString(trafficPattern_[patternId].excludeAfterBytes)),
-                                         name::Component(getRandomByteString(trafficPattern_[patternId].excludeBeforeBytes)));
+                    exclude.excludeRange(
+                      name::Component(getRandomByteString(trafficPattern_[patternId].excludeAfterBytes)),
+                      name::Component(getRandomByteString(trafficPattern_[patternId].excludeBeforeBytes)));
                     interest.setExclude(exclude);
                   }
                 else if (trafficPattern_[patternId].excludeBeforeBytes > 0)
                   {
-                    exclude.excludeBefore(name::Component(getRandomByteString(trafficPattern_[patternId].excludeBeforeBytes)));
+                    exclude.excludeBefore(
+                      name::Component(getRandomByteString(trafficPattern_[patternId].excludeBeforeBytes)));
                     interest.setExclude(exclude);
                   }
                 else if (trafficPattern_[patternId].excludeAfterBytes > 0)
                   {
-                    exclude.excludeAfter(name::Component(getRandomByteString(trafficPattern_[patternId].excludeAfterBytes)));
+                    exclude.excludeAfter(
+                      name::Component(getRandomByteString(trafficPattern_[patternId].excludeAfterBytes)));
                     interest.setExclude(exclude);
                   }
 
@@ -677,26 +694,28 @@
                 if (trafficPattern_[patternId].scope >= 0)
                   interest.setScope(trafficPattern_[patternId].scope);
                 if (trafficPattern_[patternId].interestLifetime >= 0)
-                  interest.setInterestLifetime(time::milliseconds(trafficPattern_[patternId].interestLifetime));
+                  interest.setInterestLifetime(
+                    time::milliseconds(trafficPattern_[patternId].interestLifetime));
                 else
-                  interest.setInterestLifetime(time::milliseconds(getDefaultInterestLifetime()));
+                  interest.setInterestLifetime(
+                    time::milliseconds(getDefaultInterestLifetime()));
                 try {
                   totalInterestSent_++;
                   trafficPattern_[patternId].totalInterestSent++;
                   boost::posix_time::ptime sentTime;
                   sentTime = boost::posix_time::microsec_clock::local_time();
                   face_.expressInterest(interest,
-                                        func_lib::bind( &NdnTrafficClient::onData,
-                                                        this, boost::ref(face_),
-                                                        _1, _2, totalInterestSent_,
-                                                        trafficPattern_[patternId].totalInterestSent,
-                                                        patternId,
-                                                        sentTime),
-                                        func_lib::bind( &NdnTrafficClient::onTimeout,
-                                                        this, boost::ref(face_),
-                                                        _1, totalInterestSent_,
-                                                        trafficPattern_[patternId].totalInterestSent,
-                                                        patternId));
+                                        bind( &NdnTrafficClient::onData,
+                                              this, boost::ref(face_),
+                                              _1, _2, totalInterestSent_,
+                                              trafficPattern_[patternId].totalInterestSent,
+                                              patternId,
+                                              sentTime),
+                                        bind( &NdnTrafficClient::onTimeout,
+                                              this, boost::ref(face_),
+                                              _1, totalInterestSent_,
+                                              trafficPattern_[patternId].totalInterestSent,
+                                              patternId));
                   std::string logLine;
                   logLine = "";
                   logLine += "Sending Interest   - PatternType="+toString(patternId+1);
@@ -706,10 +725,10 @@
                   m_logger.log(logLine, true, false);
                   deadlineTimer->expires_at(deadlineTimer->expires_at() +
                                             boost::posix_time::millisec(interestInterval_));
-                  deadlineTimer->async_wait(boost::bind(&NdnTrafficClient::generateTraffic,
-                                                        this,
-                                                        boost::asio::placeholders::error,
-                                                        deadlineTimer));
+                  deadlineTimer->async_wait(bind(&NdnTrafficClient::generateTraffic,
+                                                 this,
+                                                 boost::asio::placeholders::error,
+                                                 deadlineTimer));
                 }
                 catch (std::exception &e) {
                   m_logger.log("ERROR: "+(std::string)e.what(), true, true);
@@ -721,10 +740,10 @@
           {
             deadlineTimer->expires_at(deadlineTimer->expires_at() +
                                       boost::posix_time::millisec(interestInterval_));
-            deadlineTimer->async_wait(boost::bind(&NdnTrafficClient::generateTraffic,
-                                                  this,
-                                                  boost::asio::placeholders::error,
-                                                  deadlineTimer));
+            deadlineTimer->async_wait(bind(&NdnTrafficClient::generateTraffic,
+                                           this,
+                                           boost::asio::placeholders::error,
+                                           deadlineTimer));
           }
       }
   }
@@ -733,15 +752,15 @@
   initialize()
   {
     boost::asio::signal_set signalSet(*ioService_, SIGINT, SIGTERM);
-    signalSet.async_wait(boost::bind(&NdnTrafficClient::signalHandler, this));
+    signalSet.async_wait(bind(&NdnTrafficClient::signalHandler, this));
     m_logger.initializeLog(instanceId_);
     initializeTrafficConfiguration();
     boost::asio::deadline_timer deadlineTimer(*ioService_,
                                               boost::posix_time::millisec(interestInterval_));
-    deadlineTimer.async_wait(boost::bind(&NdnTrafficClient::generateTraffic,
-                                         this,
-                                         boost::asio::placeholders::error,
-                                         &deadlineTimer));
+    deadlineTimer.async_wait(bind(&NdnTrafficClient::generateTraffic,
+                                  this,
+                                  boost::asio::placeholders::error,
+                                  &deadlineTimer));
     try {
       face_.processEvents();
     }
diff --git a/ndn-traffic-server.cpp b/src/ndn-traffic-server.cpp
similarity index 82%
rename from ndn-traffic-server.cpp
rename to src/ndn-traffic-server.cpp
index 5efcb0a..0769c69 100644
--- a/ndn-traffic-server.cpp
+++ b/src/ndn-traffic-server.cpp
@@ -21,8 +21,7 @@
 class NdnTrafficServer
 {
 public:
-  
-  NdnTrafficServer( char* programName )
+  NdnTrafficServer(char* programName)
     : m_logger("NDNTrafficServer")
     , ioService_(new boost::asio::io_service)
     , face_(ioService_)
@@ -40,7 +39,6 @@
   class DataTrafficConfiguration
   {
   public:
-
     DataTrafficConfiguration()
     {
       name = "";
@@ -52,7 +50,7 @@
     }
 
     void
-    printTrafficConfiguration( Logger& logger )
+    printTrafficConfiguration(Logger& logger)
     {
       std::string detail;
       detail = "";
@@ -73,7 +71,8 @@
 
 
     bool
-    extractParameterValue( std::string detail, std::string& parameter, std::string& value )
+    extractParameterValue(const std::string& detail,
+                          std::string& parameter, std::string& value)
     {
       int i;
       std::string allowedCharacters = ":/+._-%";
@@ -88,7 +87,9 @@
       if (i == detail.length())
         return false;
       i++;
-      while ((std::isalnum(detail[i]) || allowedCharacters.find(detail[i]) != std::string::npos) && i < detail.length())
+      while ((std::isalnum(detail[i]) ||
+              allowedCharacters.find(detail[i]) != std::string::npos) &&
+             i < detail.length())
         {
           value += detail[i];
           i++;
@@ -99,7 +100,8 @@
     }
 
     bool
-    processConfigurationDetail( std::string detail, Logger& logger, int lineNumber )
+    processConfigurationDetail(const std::string& detail,
+                               Logger& logger, int lineNumber)
     {
       std::string parameter, value;
       if (extractParameterValue(detail, parameter, value))
@@ -115,11 +117,13 @@
           else if (parameter == "Content")
             content = value;
           else
-            logger.log("Line "+toString(lineNumber)+" \t- Invalid Parameter='"+parameter+"'", false, true);
+            logger.log("Line "+toString(lineNumber)+
+                       " \t- Invalid Parameter='"+parameter+"'", false, true);
         }
       else
         {
-          logger.log("Line "+toString(lineNumber)+" \t- Improper Traffic Configuration Line- "+detail, false, true);
+          logger.log("Line "+toString(lineNumber)+
+                     " \t- Improper Traffic Configuration Line- "+detail, false, true);
           return false;
         }
       return true;
@@ -147,7 +151,7 @@
   }
 
   static std::string
-  toString( int integerValue )
+  toString(int integerValue)
   {
     std::stringstream stream;
     stream << integerValue;
@@ -155,7 +159,7 @@
   }
 
   static int
-  toInteger( std::string stringValue )
+  toInteger(std::string stringValue)
   {
     int integerValue;
     std::stringstream stream(stringValue);
@@ -185,7 +189,7 @@
   }
 
   void
-  setContentDelayTime( int contentDelayTime )
+  setContentDelayTime(int contentDelayTime)
   {
     if (contentDelayTime < 0)
       usage();
@@ -193,7 +197,7 @@
   }
 
   void
-  setConfigurationFile( char* configurationFile )
+  setConfigurationFile(char* configurationFile)
   {
     configurationFile_ = configurationFile;
   }
@@ -213,13 +217,17 @@
   {
     int patternId;
     m_logger.log("\n\n== Interest Traffic Report ==\n", false, true);
-    m_logger.log("Total Traffic Pattern Types = "+toString((int)trafficPattern_.size()), false, true);
-    m_logger.log("Total Interests Received    = "+toString(totalInterestReceived_), false, true);
+    m_logger.log("Total Traffic Pattern Types = " +
+                 toString((int)trafficPattern_.size()), false, true);
+    m_logger.log("Total Interests Received    = " +
+                 toString(totalInterestReceived_), false, true);
+
     for (patternId=0; patternId<trafficPattern_.size(); patternId++)
       {
         m_logger.log("\nTraffic Pattern Type #"+toString(patternId+1), false, true);
         trafficPattern_[patternId].printTrafficConfiguration(m_logger);
-        m_logger.log("Total Interests Received    = "+toString(trafficPattern_[patternId].totalInterestReceived)+"\n", false, true);
+        m_logger.log("Total Interests Received    = " +
+                     toString(trafficPattern_[patternId].totalInterestReceived)+"\n", false, true);
       }
   }
 
@@ -276,7 +284,8 @@
         patternFile.close();
         if (!checkTrafficPatternCorrectness())
           {
-            m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " + configurationFile_, false, true);
+            m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " +
+                         configurationFile_, false, true);
             m_logger.shutdownLogger();
             exit(1);
           }
@@ -290,7 +299,8 @@
       }
     else
       {
-        m_logger.log("ERROR - Unable To Open Traffic Configuration File: " + configurationFile_, false, true);
+        m_logger.log("ERROR - Unable To Open Traffic Configuration File: " +
+                     configurationFile_, false, true);
         m_logger.shutdownLogger();
         exit(1);
       }
@@ -307,21 +317,23 @@
           }
         else
           {
-            m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " + configurationFile_, false, true);
+            m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " +
+                         configurationFile_, false, true);
             m_logger.shutdownLogger();
             exit(1);
           }
       }
     else
       {
-        m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " + configurationFile_, false, true);
+        m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " +
+                     configurationFile_, false, true);
         m_logger.shutdownLogger();
         exit(1);
       }
   }
 
   static std::string
-  getRandomByteString( int randomSize )
+  getRandomByteString(int randomSize)
   {
     int i;
     std::string characterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw0123456789";
@@ -332,7 +344,7 @@
   }
 
   void
-  onInterest( const Name& name, const Interest& interest, int patternId )
+  onInterest(const Name& name, const Interest& interest, int patternId)
   {
     std::string content, logLine;
     content = "";
@@ -361,7 +373,7 @@
   }
 
   void
-  onRegisterFailed( const ndn::Name& prefix, const std::string& reason, int patternId )
+  onRegisterFailed(const ndn::Name& prefix, const std::string& reason, int patternId)
   {
     std::string logLine;
     logLine = "";
@@ -382,15 +394,15 @@
     initializeTrafficConfiguration();
 
     int patternId;
-    for (patternId=0; patternId<trafficPattern_.size(); patternId++ )
+    for (patternId=0; patternId<trafficPattern_.size(); patternId++)
       {
-        face_.setInterestFilter(  trafficPattern_[patternId].name,
-                                  func_lib::bind( &NdnTrafficServer::onInterest,
-                                                  this, _1, _2,
-                                                  patternId),
-                                  func_lib::bind( &NdnTrafficServer::onRegisterFailed,
-                                                  this, _1, _2,
-                                                  patternId));
+        face_.setInterestFilter(trafficPattern_[patternId].name,
+                                bind(&NdnTrafficServer::onInterest,
+                                     this, _1, _2,
+                                     patternId),
+                                bind(&NdnTrafficServer::onRegisterFailed,
+                                     this, _1, _2,
+                                     patternId));
       }
 
     try {
@@ -403,7 +415,6 @@
   }
 
 private:
-
   KeyChain keyChain_;
   std::string programName_;
   std::string instanceId_;
@@ -415,12 +426,12 @@
   Face face_;
   std::vector<DataTrafficConfiguration> trafficPattern_;
   int totalInterestReceived_;
-
 };
 
 } // namespace ndn
 
-int main( int argc, char* argv[] )
+int
+main(int argc, char* argv[])
 {
   int option;
   ndn::NdnTrafficServer ndnTrafficServer (argv[0]);
diff --git a/wscript b/wscript
index bb8df5b..946b472 100644
--- a/wscript
+++ b/wscript
@@ -1,25 +1,29 @@
 # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-VERSION='0.3'
-NAME="ndn-traffic"
+VERSION='0.1'
+NAME="ndn-traffic-generator"
 
 def options(opt):
-    opt.load('compiler_cxx')
+    opt.load('compiler_cxx gnu_dirs')
 
 def configure(conf):
-    conf.load("compiler_cxx")
-    conf.check_cfg(package='libndn-cpp-dev', args=['--cflags', '--libs'], uselib_store='NDN_CPP', mandatory=True)
+    conf.load("compiler_cxx gnu_dirs")
+    conf.check_cfg(package='libndn-cpp-dev', args=['--cflags', '--libs'],
+                   uselib_store='NDN_CPP', mandatory=True)
 
 def build (bld):
     bld.program (
         features = 'cxx',
-        target   = 'ndntraffic',
-        source   = 'ndn-traffic-client.cpp',
+        target   = 'ndn-traffic',
+        source   = 'src/ndn-traffic-client.cpp',
         use      = 'NDN_CPP',
         )
 
     bld.program (
         features = 'cxx',
-        target   = 'ndntrafficserver',
-        source   = 'ndn-traffic-server.cpp',
+        target   = 'ndn-traffic-server',
+        source   = 'src/ndn-traffic-server.cpp',
         use      = 'NDN_CPP',
         )
+
+    bld.install_files('${SYSCONFDIR}/ndn', ['ndn-traffic-client.conf.sample',
+                                            'ndn-traffic-server.conf.sample'])
