diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.cpp b/ameasure2/src/provisioner/MeasurementProvisioner.cpp
index f84e897a464ea5a463bfd53eef2ac92406714ddc..7da6532e7faa1ffa8e6e50423124cf42b9e94498 100644
--- a/ameasure2/src/provisioner/MeasurementProvisioner.cpp
+++ b/ameasure2/src/provisioner/MeasurementProvisioner.cpp
@@ -3,13 +3,8 @@
  */
 
 #include "MeasurementProvisioner.hpp"
-#include "exception/AlibException.h"
+#include "exception/CommonException.h"
 #include "sax/SaxParseInterface.h"
-#include <unistd.h>
-#include <err.h>
-#include <wordexp.h>
-#include <glob.h>
-#include <sys/wait.h>
 #include <iostream>
 
 #include "MeasurementProvisionerUtils.hpp"
@@ -22,67 +17,29 @@ namespace provisioner {
 MeasurementProvisionerResults MeasurementProvisioner::runConfiguration ( const MeasurementProvisionerConfiguration & cfg ) {
 	MeasurementProvisionerResults results;
 
-	MPInputData mpiData ( cfg );
+	prepareEnvironment ( cfg );
 
-	cout << mpiData.getSubstitutionMaps() << endl;
+	MPInputData mpiData ( cfg );
 
-	int b;
-	cin >> b;
+	for ( const MPSubstitutionMap & substitutionMap : mpiData.getSubstitutionMaps ( ) )
+		for ( const MPPipeline & pipeline : mpiData.getSubstitutionPipelines ( ) )
+			for ( const MPPipelineCommand & command : pipeline )
+				cout << command.substitute ( substitutionMap ) << endl;
 
 	return results;
 }
 
+void MeasurementProvisioner::prepareEnvironment ( const MeasurementProvisionerConfiguration & cfg ) {
+	list < string > binariesDirectoryExpansion = MPUtils::shellExpand ( cfg.binariesDirectory );
+
+	if ( binariesDirectoryExpansion.size ( ) != 1 )
+		throw::exception::CommonException ( "MeasurementProvisioner: binaries directory: \"" + cfg.binariesDirectory + "\"expansion failed" );
+
+	if ( chdir ( binariesDirectoryExpansion.begin ( )->c_str ( ) ) != 0 )
+		throw::exception::CommonException ( "MeasurementProvisioner: chdir to binaries directory: \"" + cfg.binariesDirectory + "\" failed" );
+}
+
 /*
- * void MeasurementProvisioner::prepareEnvironment ( const MeasurementProvisionerConfiguration & cfg ) {
- *  list < string > binariesDirectoryExpansion = shellExpand ( cfg.binariesDirectory );
- *
- *  if ( binariesDirectoryExpansion.size ( ) != 1 )
- *      throw ::exception::AlibException ( "BinariesDirectory expansion failed" );
- *
- *  if ( chdir ( binariesDirectoryExpansion.begin ( )->c_str ( ) ) != 0 )
- *      throw ::exception::AlibException ( "chdir to BinariesDirectory failed" );
- * }
- *
- *
- * map < int, vector < string > > MeasurementProvisioner::prepareInputData ( const MeasurementProvision & mp ) {
- *  map < int, vector < string > > inputData;
- *
- *  for ( auto mid : mp.inputData ) {
- *
- *  }
- *
- *  return inputData;
- * }
- *
- * MeasurementProvisionResults MeasurementProvisioner::runProvision ( const MeasurementProvision & mp ) {
- *
- *  MeasurementProvisionResults results;
- *
- *  map < int, vector < string > > preparedInputData = prepareInputData ( mp );
- *
- *
- *   // * list < string > expandedInputDataFiles;
- *   // *
- *   // * for ( const string & inputDataFile : mp.inputDataFiles )
- *   // *  expandedInputDataFiles.splice ( expandedInputDataFiles.end ( ), shellExpand ( inputDataFile ) );
- *   // *
- *   // * for ( string & expandedInputDataFile : expandedInputDataFiles ) {
- *   // *  clog << "input: " << expandedInputDataFile << endl;
- *   // *
- *   // *  vector < PipelineResults > pipelinesResults;
- *   // *
- *   // *  for ( const vector < string > & pipeline : mp.pipelines ) {
- *   // *      clog << "$ " << flush;
- *   // *      pipelinesResults.emplace_back ( runPipeline ( expandedInputDataFile, pipeline ) );
- *   // *  }
- *   // *
- *   // *  results.emplace_back ( move ( expandedInputDataFile ), move ( pipelinesResults ) );
- *   // * }
- *
- *  return results;
- * }
- *
- *
  * PipelineResults MeasurementProvisioner::runPipeline ( const string & inputDataFile, const vector < string > & pipeline ) {
  *
  *  PipelineResults pipelineResults;
diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.hpp b/ameasure2/src/provisioner/MeasurementProvisioner.hpp
index 7c005869cb207181f25349a983987da0b45cfb18..d0d5db5dcee9cf0c2a51f43b3edf156d78fa9da9 100644
--- a/ameasure2/src/provisioner/MeasurementProvisioner.hpp
+++ b/ameasure2/src/provisioner/MeasurementProvisioner.hpp
@@ -13,11 +13,12 @@
 
 namespace provisioner {
 
-
 class MeasurementProvisioner {
 
+	static void prepareEnvironment ( const MeasurementProvisionerConfiguration & );
+
 	/*
-	 * static void prepareEnvironment ( const MeasurementProvisionerConfiguration & );
+	 *
 	 * static std::map < int, std::vector < std::string > > prepareInputData ( const MeasurementProvision & );
 	 *
 	 * static MeasurementProvisionResults runProvision ( const MeasurementProvision & );
diff --git a/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp b/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp
index 8518561dfeb161800b800f2aecf3c59c846f5202..1d247d58e5356f9e6eaa49b7ec76b05df42435d3 100644
--- a/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp
+++ b/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp
@@ -103,6 +103,15 @@ bool MPSubstitution::containsSubstitution ( const string & str ) {
 
 /*---------------------------------------------------------------------------------------------------------------*/
 
+MPPipelineCommand::MPPipelineCommand ( std::string str ) : MPSubstitution ( str ), rawCommand ( std::move ( str ) ) {
+}
+
+const string & MPPipelineCommand::getRawCommand ( ) const {
+	return rawCommand;
+}
+
+/*---------------------------------------------------------------------------------------------------------------*/
+
 MPInputData::MPInputData ( const MeasurementProvisionerConfiguration & mpc ) {
 	processMPCInputData ( mpc );
 }
@@ -118,19 +127,30 @@ const list < MPSubstitutionMap > & MPInputData::getSubstitutionMaps ( ) const {
 	return this->substitutionMaps;
 }
 
+const list < MPPipeline > & MPInputData::getSubstitutionPipelines ( ) const {
+	return this->substitutionPipelines;
+}
+
 void MPInputData::processMPCInputData ( const MeasurementProvisionerConfiguration & mpc ) {
 
 	 // get requried substitution pattern and ensure every command has the same pattern
-	for ( const MPCPipeline & pipeline : mpc.pipelines )
+	for ( const MPCPipeline & pipeline : mpc.pipelines ) {
+		MPPipeline mpp;
+
 		for ( const string & command : pipeline ) {
-			set < int > substitutionPattern = MPSubstitution::requiredSubstitutionPattern ( command );
+			MPPipelineCommand mppc ( command );
 
 			if ( this->requiredSubstitutionPattern.size ( ) == 0 )
-				this->requiredSubstitutionPattern = std::move ( substitutionPattern );
-			else if ( substitutionPattern.size ( ) && ( this->requiredSubstitutionPattern != substitutionPattern ) )
+				this->requiredSubstitutionPattern = mppc.getSubstitutionPattern ( );
+			else if ( mppc.getSubstitutionPattern ( ).size ( ) && ( this->requiredSubstitutionPattern != mppc.getSubstitutionPattern ( ) ) )
 				throw::exception::CommonException ( "MPInputData: Substitution pattern is not consistent across commands" );
+
+			mpp.push_back ( std::move ( mppc ) );
 		}
 
+		substitutionPipelines.push_back ( std::move ( mpp ) );
+	}
+
 	// process input batches and generated substitution maps, throw if there is any discrepancy in substitution patterns or errors during data generation
 
 	for ( const MPCInputBatch & inputBatch : mpc.inputBatches ) {
diff --git a/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp b/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp
index 3127712409d2775fb1b2bc39ed1fb9f778419ded..4c81d98649d5c0d6e7954464534c743a0ea53d28 100644
--- a/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp
+++ b/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp
@@ -54,16 +54,29 @@ public:
 	static const char SUBSTITUTION_DELIM = '$';
 };
 
+class MPPipelineCommand : public MPSubstitution {
+	std::string rawCommand;
+
+public:
+	MPPipelineCommand ( std::string );
+	const std::string & getRawCommand ( ) const;
+};
+
+using MPPipeline = std::list < MPPipelineCommand >;
+
 class MPInputData {
 	std::map < std::string, MPInputDatum > mpidHandles;
 	std::list < MPSubstitutionMap > substitutionMaps;
 	std::set < int > requiredSubstitutionPattern;
 
+	std::list < MPPipeline > substitutionPipelines;
+
 	void insertMPInputDatum ( MPInputDatum::Type, std::string, std::string );
 
 public:
 	const MPInputDatum & getMPIDHandle ( const std::string & ) const;
 	const std::list < MPSubstitutionMap > & getSubstitutionMaps ( ) const;
+	const std::list < MPPipeline > & getSubstitutionPipelines ( ) const;
 	MPInputData ( const MeasurementProvisionerConfiguration & );
 
 private: