diff --git a/.gitmodules b/.gitmodules
index 711a8dc9389695e697828324c4e2dccba1499db3..c90d4eb80abb69804b18162f6e0bed5f602c7047 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -16,3 +16,6 @@
 [submodule "libs/CLIUtils"]
 	path = libs/CLIUtils
 	url = https://github.com/CLIUtils/CLI11.git
+[submodule "libs/pcg-cpp"]
+	path = libs/pcg-cpp
+	url = https://github.com/imneme/pcg-cpp.git
diff --git a/app4mc.sim_lib/CMakeLists.txt b/app4mc.sim_lib/CMakeLists.txt
index 64b4a6a06edd1f0a9107b14aa19786c3ab5a6cf2..512e05978ce4b9173dc8cd780ee5eddd93256154 100644
--- a/app4mc.sim_lib/CMakeLists.txt
+++ b/app4mc.sim_lib/CMakeLists.txt
@@ -11,12 +11,13 @@ add_library (app4mc.sim_lib STATIC
 	"RandomScheduler.cpp" 
 	"PriorityScheduler.cpp" 
 	"MappingModel.cpp"
-	"Deviations.cpp"
+	"Deviation.cpp"
 	"BTFTracer.cpp"
 	"Tracer.cpp"
+	"SimParamParser.cpp"
 )
 
-target_link_libraries(app4mc.sim_lib SystemC::systemc effolkronium_random easyloggingpp gcem polymorphic_value::polymorphic_value CLI11)
+target_link_libraries(app4mc.sim_lib SystemC::systemc effolkronium_random easyloggingpp gcem polymorphic_value::polymorphic_value CLI11 pcg)
 
 #supress warning of sc_vector iterator definition
 target_compile_definitions(app4mc.sim_lib PUBLIC _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING=1)
diff --git a/app4mc.sim_lib/Deviations.cpp b/app4mc.sim_lib/Deviation.cpp
similarity index 52%
rename from app4mc.sim_lib/Deviations.cpp
rename to app4mc.sim_lib/Deviation.cpp
index 0a2e7b191dd6517427cef0fdfef3c717b7e27f62..f1e43163a74f54d1cabe93c300a5d9fc91eb6a3a 100644
--- a/app4mc.sim_lib/Deviations.cpp
+++ b/app4mc.sim_lib/Deviation.cpp
@@ -15,32 +15,6 @@
  */
 #include "Deviation.h"
 
-
-std::seed_seq& app4mcsim_seed::operator()() 
-{
-    auto seed = getSeed();
-    std::cout << "Simulation Random Seed: " << "0x" << std::hex << seed.seed1 << " 0x" << seed.seed2  << " 0x" << seed.seed3 << " 0x" << seed.seed4 << std::endl;
-    std::cout << "reuse seed with: app4mcsim_seed::setSeed(0x"<<  std::hex << seed.seed1 << ",0x" << seed.seed2 << ",0x"<< seed.seed3 << ",0x" << seed.seed4 <<");" << std::endl; 
-    return seq;
-}
-
-
-app4mcsim_seed::seed_t app4mcsim_seed::getSeed(std::optional<seed_t> userinit) 
-{
-    static seed_t seedSingelton = { std::random_device{ }( ),std::random_device{ }( ),std::random_device{ }( ),std::random_device{ }( ) };
-    if (userinit){
-    seedSingelton = *userinit;
-    }
-    return seedSingelton;
-}
-
-
-void app4mcsim_seed::setSeed(std::random_device::result_type seed1,std::random_device::result_type seed2,std::random_device::result_type seed3,std::random_device::result_type seed4) 
-{
-    seed_t userinit = {seed1,seed2,seed3,seed4} ;
-    getSeed(std::make_optional<seed_t>(userinit));
-}
-
 template class ValueWeibullDistribution<ELong>;
 template class ValueWeibullDistribution<double>;
 template class ValueWeibullDistribution<Time>;
@@ -59,4 +33,33 @@ template class ValueBetaDistribution<double>;
 
 template class ValueBoundaries<Time>;
 template class ValueBoundaries<ELong>;
-template class ValueBoundaries<double>;
\ No newline at end of file
+template class ValueBoundaries<double>;
+
+uint64_t app4mcsim_seed::operator()() {
+	auto seed = getSeed();
+	std::cout << "Simulation Random Seed: "
+	          << "0x" << std::hex << seed << std::endl;
+	std::cout << "reuse seed with: --seed 0x" << seed << std::endl;
+	return seed;
+}
+
+uint64_t& app4mcsim_seed::getSeed() {
+	static uint64_t seed = []() {
+  //seed 64bit with at least 64bit from the random device
+  //although random_device may always return 32bit number, this is not garuanteed by the std, so we calculate the number of random_device calls
+  //we shift in all rand_device values for the seed, which might throw away some random bits(but typically it exactly fits)
+	  constexpr auto countRandCalls = integerCeilDiv(std::numeric_limits<uint64_t>::digits, std::numeric_limits<std::random_device::result_type>::digits);
+	  std::random_device rnd;
+	  uint64_t rv = 0;
+	  for (int i = 0; i < countRandCalls; i++) {
+		rv = rv << static_cast<unsigned int>(std::numeric_limits<std::random_device::result_type>::digits);
+		rv |= rnd();
+	  }
+	  return rv;
+	}();
+	return seed;
+}
+
+void app4mcsim_seed::setSeed(uint64_t seed) {
+	getSeed() = seed;
+}
diff --git a/app4mc.sim_lib/SimParamParser.cpp b/app4mc.sim_lib/SimParamParser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b1ee47948f2d8b6b638e198add8a84a1ed174c95
--- /dev/null
+++ b/app4mc.sim_lib/SimParamParser.cpp
@@ -0,0 +1,91 @@
+/**
+ ********************************************************************************
+ * Copyright (c) 2021 University of Rostock and others
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * - Benjamin Beichler <Benjamin.Beichler@uni-rostock.de> - initial contribution
+ ********************************************************************************
+ */
+#include "SimParamParser.h"
+
+int SimParamParser::parse(int argc, char** argv, SimParam& args)
+
+{
+  CLI::App app("APP4MCsim: abstract timing simulation");
+  app.add_option("-o,--output", args.traceDirectory, "Trace output directory");
+  app.add_option("-t,--time", args.simulationTimeInMs, "simulation time ");
+  app.add_option("-r,--tracer", args.tracerNames, TraceManager::getCliHelpText())->delimiter(',');
+  app.add_flag("-p, --TracefileTimePrefix", args.useTraceFileTimePrefix, "add \"%Y-%m-%d-%H-%M-%S\" prefix to tracefiles to not override old files");
+  auto* seedArg = app.add_option("-s,--seed", args.simulationSeed, "seed for the underlying pcg pseudo random number generator; any non-negative 64bit value is possible");
+  seedArg->check(CLI::TypeValidator<uint64_t>());
+
+  CLI11_PARSE(app, argc, argv);
+
+  if (!seedArg->empty()) {
+	app4mcsim_seed::setSeed(args.simulationSeed);
+  }
+
+  if (args.useTraceFileTimePrefix) {
+	TraceManager::enableTimePrefix();
+  }
+
+  if (!args.traceDirectory.empty()) {
+	TraceManager::setTraceDirectory(args.traceDirectory);
+  }
+
+  for (auto& tracer : args.tracerNames) {
+	// remove any leading whitespace
+	tracer.erase(0, tracer.find_first_not_of(" \t\n\r\f\v"));
+  }
+
+
+  // code to keep old magic numbers option
+  for (auto& entry : args.tracerNames) {
+	int number = -1;
+
+	std::string_view entrySv = entry;
+	// we need pointer arithmetic here, otherwise from_chars is not working
+
+	auto rv = std::from_chars(&(*entrySv.begin()), &(*entrySv.begin()) + entrySv.size(), number);  // NOLINT cppcoreguidelines-pro-bounds-pointer-arithmetic
+
+	if (rv.ec == std::errc()) {
+	  switch (number) {
+	  case BTF:
+		entry = BtfTracer::tracerName();
+		break;
+	  case BTF_AGI:
+		entry = BtfTracerWithActivityGraphItemTracing::tracerName();
+		break;
+	  case BTF_AGI_BRANCH:
+		entry = BtfTracerWithActivityGraphItemTracingHierarchy::tracerName();
+		break;
+	  case BTF_SIGNAL:
+		entry = BtfTracerWithSignalTracing::tracerName();
+	  default:
+		// do nothing, the string is ignored in TraceManager
+		break;
+	  }
+	  args.tracerSelect = number;
+	}
+  }
+
+
+  // rework list of Tracernames, that every Tracer appear only once
+  std::sort(args.tracerNames.begin(), args.tracerNames.end());
+  auto last = std::unique(args.tracerNames.begin(), args.tracerNames.end());
+  args.tracerNames.erase(last, args.tracerNames.end());
+
+  // add default if nothing is given
+  if (args.tracerNames.empty()) {
+	args.tracerNames.emplace_back(std::string(BtfTracer::tracerName()));
+  }
+  TraceManager::createTracerFromList(args.tracerNames);
+  VLOG(0) << "app4mcsim called with" << std::endl << "\t-t " << args.simulationTimeInMs << std::endl << "\t-o " << args.traceDirectory << std::endl;
+  return 0;
+}
diff --git a/app4mc.sim_lib/SoftwareModel/Task.cpp b/app4mc.sim_lib/SoftwareModel/Task.cpp
index 96eb16425153646bba515a65541e660bc72d573e..a82a8c09032e3760fcb7c737c676530d7a13f84d 100644
--- a/app4mc.sim_lib/SoftwareModel/Task.cpp
+++ b/app4mc.sim_lib/SoftwareModel/Task.cpp
@@ -78,7 +78,7 @@ ExecutionItem Task::getNextExecItem(const std::shared_ptr<ProcessingUnit> &pu) {
 
     //create exec stack
     if (execStack.isEmpty()) {
-	  auto terminationCallback = [this, &pu]() {
+	  auto terminationCallback = [this, pu]() {
 	    scheduler->taskTerminate(shared_from_this(), pu);
 	    terminate();
 	  };
diff --git a/app4mc.sim_lib/include/Deviation.h b/app4mc.sim_lib/include/Deviation.h
index 13dd36982cfd9a31eeb3ae5f244ed2efcbb75d97..19282caa1dacadcd8257c968d536d7d78cd3a406 100644
--- a/app4mc.sim_lib/include/Deviation.h
+++ b/app4mc.sim_lib/include/Deviation.h
@@ -17,6 +17,7 @@
 
 #include "Common.h"
 #include "effolkronium/random.hpp"
+#include <cstdint>
 #include <random>
 #include <utility>
 
@@ -24,28 +25,22 @@
 #include <type_traits>
 #include <optional>
 #include "gcem.hpp"
+#include <pcg_random.hpp>
 
-/**
- * This singleton is used to set a seed for a Simulation
- * 
- **/
 struct app4mcsim_seed {
-    struct seed_t{
-        std::random_device::result_type seed1;
-        std::random_device::result_type seed2;
-        std::random_device::result_type seed3;
-        std::random_device::result_type seed4;
-    };
-        /// return seed sequence
-    std::seed_seq& operator() ();
-private:
-    
-    static seed_t getSeed(std::optional<seed_t> userinit = std::nullopt);
-    std::seed_seq seq = {getSeed().seed1,getSeed().seed2,getSeed().seed3,getSeed().seed4 };
-public:
-    static void setSeed(std::random_device::result_type seed1,std::random_device::result_type seed2,std::random_device::result_type seed3,std::random_device::result_type seed4);
+  static constexpr int integerCeilDiv(int nom, int den) {
+	return (nom + den - 1) / den;
+  }
+  
+  uint64_t operator()();
+
+ private:
+  static uint64_t& getSeed();
+
+ public:
+  static void setSeed(uint64_t seed);
 };
-using app4mcsim_rand = effolkronium::basic_random_static<std::mt19937,app4mcsim_seed>;
+using app4mcsim_rand = effolkronium::basic_random_static<pcg32, app4mcsim_seed>;
 
 constexpr int numberOfResampleBoundedDeviation = 10;
 template<typename T, typename sampleFun> 
diff --git a/app4mc.sim_lib/include/SimParamParser.h b/app4mc.sim_lib/include/SimParamParser.h
index 637e6765ef321bd3742b77cb30a9658c3970be99..e61f08c179ace3f4dcc888df70304921f11c5249 100644
--- a/app4mc.sim_lib/include/SimParamParser.h
+++ b/app4mc.sim_lib/include/SimParamParser.h
@@ -13,6 +13,7 @@
  ********************************************************************************
  */
 #pragma once
+#include <cstdint>
 #include <algorithm>
 #include "BTFTracer.h"
 #include "Tracer.h"
@@ -21,8 +22,10 @@
 #include "TracerFactory.h"
 #include "easylogging++.h"
 #include <charconv>
+#include <stdexcept>
 #include <string>
 #include <string_view>
+#include <Deviation.h>
 
 
 struct SimParam
@@ -32,6 +35,7 @@ struct SimParam
     int simulationTimeInMs = 1000;
     std::vector<std::string> tracerNames;
     bool useTraceFileTimePrefix = false;
+	uint64_t simulationSeed;
 	//legacy, only for compability
 	int tracerSelect = 0;
 
@@ -41,69 +45,5 @@ class SimParamParser {
 private:
     SimParamParser() = default;
 public:
-    static int parse(int argc, char** argv, SimParam& args)
-    {
-        CLI::App app("APP4MCsim: abstract timing simulation");
-        app.add_option("-o,--output", args.traceDirectory, "Trace output directory");
-        app.add_option("-t,--time", args.simulationTimeInMs, "simulation time ");
-	    app.add_option("-r,--tracer", args.tracerNames, TraceManager::getCliHelpText())->delimiter(',');
-	    app.add_flag("-p, --TracefileTimePrefix", args.useTraceFileTimePrefix, "add \"%Y-%m-%d-%H-%M-%S\" prefix to tracefiles to not override old files");
-	    CLI11_PARSE(app, argc, argv);
-
-	    if (args.useTraceFileTimePrefix) {
-	      TraceManager::enableTimePrefix();
-	    }
-
-		if (!args.traceDirectory.empty()){
-			TraceManager::setTraceDirectory(args.traceDirectory);
-		}
-
-	    for (auto& tracer : args.tracerNames) {
-	      // remove any leading whitespace
-	      tracer.erase(0, tracer.find_first_not_of(" \t\n\r\f\v"));
-	    }
-
-        // code to keep old magic numbers option
-	    for (auto& entry : args.tracerNames) {
-	      int number               = -1;
-	      std::string_view entrySv = entry;
-          //we need pointer arithmetic here, otherwise from_chars is not working
-	      auto rv                  = std::from_chars(&(*entrySv.begin()), &(*entrySv.begin())+entrySv.size(), number); //NOLINT cppcoreguidelines-pro-bounds-pointer-arithmetic
-	      if (rv.ec == std::errc()) {
-		    switch (number) {
-		    case BTF:
-		      entry = BtfTracer::tracerName();
-		      break;
-		    case BTF_AGI:
-		      entry = BtfTracerWithActivityGraphItemTracing::tracerName();
-		      break;
-		    case BTF_AGI_BRANCH:
-		      entry = BtfTracerWithActivityGraphItemTracingHierarchy::tracerName();
-		      break;
-		    case BTF_SIGNAL:
-		      entry = BtfTracerWithSignalTracing::tracerName();
-		    default:
-		      // do nothing, the string is ignored in TraceManager
-		      break;
-		    }
-			args.tracerSelect = number;
-	      }
-	    }
-
-	    // rework list of Tracernames, that every Tracer appear only once
-	    std::sort(args.tracerNames.begin(), args.tracerNames.end());
-	    auto last = std::unique(args.tracerNames.begin(), args.tracerNames.end());
-	    args.tracerNames.erase(last, args.tracerNames.end());
-
-	    // add default if nothing is given
-	    if (args.tracerNames.empty()) {
-	      args.tracerNames.emplace_back(std::string(BtfTracer::tracerName()));
-	    }
-
-	    TraceManager::createTracerFromList(args.tracerNames);
-
-	    VLOG(0)<<"app4mcsim called with"<<std::endl<<"\t-t "<<args.simulationTimeInMs<<std::endl<<"\t-o "<<args.traceDirectory<<std::endl;
-        return 0;
-    }
-
+    static int parse(int argc, char** argv, SimParam& args);
 };
\ No newline at end of file
diff --git a/examples/ActivityGraphItemTracing/CMakeLists.txt b/examples/ActivityGraphItemTracing/CMakeLists.txt
index cf144d7ab88def05b029864c7f79d25c67c4720d..2c9e9f86b18200b3ef7f53fcab1459cca7b2a844 100644
--- a/examples/ActivityGraphItemTracing/CMakeLists.txt
+++ b/examples/ActivityGraphItemTracing/CMakeLists.txt
@@ -2,7 +2,7 @@
 add_executable (activityGraphItemTracingFromTask "ActivityGraphItemTracingFromTask.cpp")
 target_link_libraries(activityGraphItemTracingFromTask app4mc.sim_lib)
 target_precompile_headers(activityGraphItemTracingFromTask REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_activityGraphItemTracingFromTask COMMAND activityGraphItemTracingFromTask)
+add_test(NAME Run_activityGraphItemTracingFromTask COMMAND activityGraphItemTracingFromTask ${ADDITIONAL_TEST_ARGS})
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
 #message(" >> CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX} )
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index ee2f7b98fdda04583a70e6b23d8c4efe70a9854f..0ea8df0b7576a3d2b4fa6b5820da0afaeb72f49d 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -7,6 +7,10 @@ if(MSVC)
 else(MSVC)
     add_compile_options(-Wall -Wextra -pedantic)
 endif(MSVC)
+
+# use all tracer for tests
+set (ADDITIONAL_TEST_ARGS --tracer BtfTracer,BtfTracerWithActivityGraphItemTracing,BtfTracerWithActivityGraphItemTracingHierarchy,BtfTracerWithSignalTracing)
+
 add_subdirectory("HWOnlyExample_hier")
 add_subdirectory("ChannelExample")
 add_subdirectory("ChannelExamplePriorities")
diff --git a/examples/ChannelExample/CMakeLists.txt b/examples/ChannelExample/CMakeLists.txt
index bf274c82e58ac86be491075c938ac52b058e8b41..b4e98c89c8b4eead4bc6bc960a057ed485a2f514 100644
--- a/examples/ChannelExample/CMakeLists.txt
+++ b/examples/ChannelExample/CMakeLists.txt
@@ -3,7 +3,7 @@ add_executable (ChannelExample "ChannelExample.cpp")
 target_link_libraries(ChannelExample app4mc.sim_lib)
 target_precompile_headers(ChannelExample REUSE_FROM app4mc.sim_lib)
 
-add_test(NAME RunChannelExample COMMAND ChannelExample)
+add_test(NAME RunChannelExample COMMAND ChannelExample ${ADDITIONAL_TEST_ARGS})
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
 #message(" >> CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX} )
diff --git a/examples/ChannelExamplePriorities/CMakeLists.txt b/examples/ChannelExamplePriorities/CMakeLists.txt
index bb14ee3a591cdf47105a44e40a7da49c7d847d54..c6a72a8b3d018abc0a661fdcbe2f80322f020416 100644
--- a/examples/ChannelExamplePriorities/CMakeLists.txt
+++ b/examples/ChannelExamplePriorities/CMakeLists.txt
@@ -3,7 +3,7 @@ add_executable (ChannelExamplePriorities "ChannelExamplePriorities.cpp")
 target_link_libraries(ChannelExamplePriorities app4mc.sim_lib)
 target_precompile_headers(ChannelExamplePriorities REUSE_FROM app4mc.sim_lib)
 
-add_test(NAME RunChannelExamplePriorities COMMAND ChannelExamplePriorities)
+add_test(NAME RunChannelExamplePriorities COMMAND ChannelExamplePriorities ${ADDITIONAL_TEST_ARGS})
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
 #message(" >> CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX} )
diff --git a/examples/ExecutionConditions/CMakeLists.txt b/examples/ExecutionConditions/CMakeLists.txt
index 75236f42a5b6f9e6782c4063d5665e96df69e989..61e6d2ee4ea5a76260a92fc9f73f020e0c5b22a3 100644
--- a/examples/ExecutionConditions/CMakeLists.txt
+++ b/examples/ExecutionConditions/CMakeLists.txt
@@ -2,7 +2,7 @@
 add_executable (executionConditions "ExecutionConditions.cpp")
 target_link_libraries(executionConditions app4mc.sim_lib)
 target_precompile_headers(executionConditions REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_executionConditions COMMAND executionConditions)
+add_test(NAME Run_executionConditions COMMAND executionConditions ${ADDITIONAL_TEST_ARGS})
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
 #message(" >> CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX} )
diff --git a/examples/HWOnlyExample_hier/CMakeLists.txt b/examples/HWOnlyExample_hier/CMakeLists.txt
index 680ce0034995e0ebb2ada0694c7c279e84634868..b731424dbcf89e88c0f265a68148b1c6509215f4 100644
--- a/examples/HWOnlyExample_hier/CMakeLists.txt
+++ b/examples/HWOnlyExample_hier/CMakeLists.txt
@@ -3,4 +3,4 @@ add_executable (hw_example_hier "HWOnlyExample_hier.cpp")
 target_link_libraries(hw_example_hier app4mc.sim_lib)
 target_precompile_headers(hw_example_hier REUSE_FROM app4mc.sim_lib)
 
-add_test(NAME Run_hw_example_hier COMMAND hw_example_hier)
\ No newline at end of file
+add_test(NAME Run_hw_example_hier COMMAND hw_example_hier ${ADDITIONAL_TEST_ARGS})
\ No newline at end of file
diff --git a/examples/InterprocessTrigger/CMakeLists.txt b/examples/InterprocessTrigger/CMakeLists.txt
index d5171d07a07cd954c3fd552fb58940b26e02e29e..8eda8bb2b1193683ff63f8a82200ee1ea3ffd8ad 100644
--- a/examples/InterprocessTrigger/CMakeLists.txt
+++ b/examples/InterprocessTrigger/CMakeLists.txt
@@ -4,7 +4,7 @@ target_link_libraries(InterprocessTrigger_example app4mc.sim_lib)
 target_include_directories(InterprocessTrigger_example PUBLIC "../exampleHardware")
 target_precompile_headers(InterprocessTrigger_example REUSE_FROM app4mc.sim_lib)
 
-add_test(NAME RunInterprocessTrigger_example COMMAND InterprocessTrigger_example)
+add_test(NAME RunInterprocessTrigger_example COMMAND InterprocessTrigger_example ${ADDITIONAL_TEST_ARGS})
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
 #message(" >> CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX} )
diff --git a/examples/ModeSwitches/CMakeLists.txt b/examples/ModeSwitches/CMakeLists.txt
index 18ecafe013683711f45867217ab9d6d14193c4d7..cedff6f2f614ddead393098120073ef62991e525 100644
--- a/examples/ModeSwitches/CMakeLists.txt
+++ b/examples/ModeSwitches/CMakeLists.txt
@@ -2,23 +2,23 @@
 add_executable (modeSwitchesLiteralValues "ModeSwitchesLiteralValues.cpp")
 target_link_libraries(modeSwitchesLiteralValues app4mc.sim_lib)
 target_precompile_headers(modeSwitchesLiteralValues REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_modeSwitchesLiteralValues COMMAND modeSwitchesLiteralValues)
+add_test(NAME Run_modeSwitchesLiteralValues COMMAND modeSwitchesLiteralValues ${ADDITIONAL_TEST_ARGS})
 
 add_executable (modeSwitchesLiteralLabels "ModeSwitchesLiteralLabels.cpp")
 target_link_libraries(modeSwitchesLiteralLabels app4mc.sim_lib)
 target_precompile_headers(modeSwitchesLiteralLabels REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_modeSwitchesLiteralLabels COMMAND modeSwitchesLiteralLabels)
+add_test(NAME Run_modeSwitchesLiteralLabels COMMAND modeSwitchesLiteralLabels ${ADDITIONAL_TEST_ARGS})
 
 
 add_executable (modeSwitchesNumericValues "ModeSwitchesNumericValues.cpp")
 target_link_libraries(modeSwitchesNumericValues app4mc.sim_lib)
 target_precompile_headers(modeSwitchesNumericValues REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_modeSwitchesNumericValues COMMAND modeSwitchesNumericValues)
+add_test(NAME Run_modeSwitchesNumericValues COMMAND modeSwitchesNumericValues ${ADDITIONAL_TEST_ARGS})
 
 add_executable (modeSwitchesNumericLabels "ModeSwitchesNumericLabels.cpp")
 target_link_libraries(modeSwitchesNumericLabels app4mc.sim_lib)
 target_precompile_headers(modeSwitchesNumericLabels REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_modeSwitchesNumericLabels COMMAND modeSwitchesNumericLabels)
+add_test(NAME Run_modeSwitchesNumericLabels COMMAND modeSwitchesNumericLabels ${ADDITIONAL_TEST_ARGS})
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
 #message(" >> CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX} )
diff --git a/examples/OsEvents/CMakeLists.txt b/examples/OsEvents/CMakeLists.txt
index 584422e072d37841f8572f57cb610544f5a942cf..0286a9220bba8333fe5a5130d08ea525a827238b 100644
--- a/examples/OsEvents/CMakeLists.txt
+++ b/examples/OsEvents/CMakeLists.txt
@@ -3,7 +3,7 @@ add_executable (os_events_example "OsEvents.cpp")
 target_link_libraries(os_events_example app4mc.sim_lib)
 target_precompile_headers(os_events_example REUSE_FROM app4mc.sim_lib)
 
-add_test(NAME Run_os_events_example COMMAND os_events_example)
+add_test(NAME Run_os_events_example COMMAND os_events_example ${ADDITIONAL_TEST_ARGS})
 
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
diff --git a/examples/Semaphore/CMakeLists.txt b/examples/Semaphore/CMakeLists.txt
index fcdcadd477b9306dad569bdbd91925e74a9e533c..c6e765b0f3506fd460b9d340c07ee480d035a336 100644
--- a/examples/Semaphore/CMakeLists.txt
+++ b/examples/Semaphore/CMakeLists.txt
@@ -1,7 +1,7 @@
 add_executable (semaphore "Semaphore.cpp")
 target_link_libraries(semaphore app4mc.sim_lib)
 target_precompile_headers(semaphore REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_semaphore COMMAND semaphore)
+add_test(NAME Run_semaphore COMMAND semaphore ${ADDITIONAL_TEST_ARGS})
 
 install(
     TARGETS semaphore 
diff --git a/examples/WhileLoop/CMakeLists.txt b/examples/WhileLoop/CMakeLists.txt
index 09150098dc234164150298731c2f727268502454..17c3d0770cec29ed787e685a948c147e905e1387 100644
--- a/examples/WhileLoop/CMakeLists.txt
+++ b/examples/WhileLoop/CMakeLists.txt
@@ -2,7 +2,7 @@
 add_executable (WhileLoop "WhileLoop.cpp")
 target_link_libraries(WhileLoop app4mc.sim_lib)
 target_precompile_headers(WhileLoop REUSE_FROM app4mc.sim_lib)
-add_test(NAME Run_WhileLoop COMMAND WhileLoop)
+add_test(NAME Run_WhileLoop COMMAND WhileLoop ${ADDITIONAL_TEST_ARGS})
 
 install(
     TARGETS WhileLoop 
diff --git a/examples/budget/CMakeLists.txt b/examples/budget/CMakeLists.txt
index cbacc5517bef32ecf3f5ed9ffd76d68febf9e1ed..6324b2ac695e10f3dd3acf5202a33381ac340561 100644
--- a/examples/budget/CMakeLists.txt
+++ b/examples/budget/CMakeLists.txt
@@ -3,7 +3,7 @@ add_executable (budget "budget.cpp")
 target_link_libraries(budget app4mc.sim_lib)
 target_precompile_headers(budget REUSE_FROM app4mc.sim_lib)
 
-add_test(NAME RunBudgetExample COMMAND budget)
+add_test(NAME RunBudgetExample COMMAND budget ${ADDITIONAL_TEST_ARGS})
 
 SET(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "install default path set to <cmakeroot>/install" FORCE)
 #message(" >> CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX} )
diff --git a/examples/hierarchicalScheduler/CMakeLists.txt b/examples/hierarchicalScheduler/CMakeLists.txt
index cd5caf7d46fa91e8f2b4b6b32f7de8ee84e5e34a..9e70367cf7baed5258106237e465a6f14e486c9d 100644
--- a/examples/hierarchicalScheduler/CMakeLists.txt
+++ b/examples/hierarchicalScheduler/CMakeLists.txt
@@ -6,4 +6,4 @@ target_link_libraries(${EXP_NAME} app4mc.sim_lib)
 target_include_directories(${EXP_NAME} PUBLIC "../exampleHardware")
 target_precompile_headers(${EXP_NAME} REUSE_FROM app4mc.sim_lib)
 
-add_test(NAME "Run${EXP_NAME}" COMMAND ${EXP_NAME})
\ No newline at end of file
+add_test(NAME "Run${EXP_NAME}" COMMAND ${EXP_NAME} ${ADDITIONAL_TEST_ARGS})
\ No newline at end of file
diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt
index 2682a9f6b0ff04edb56c4c673f59c77635ada34c..4cb91667a6e4f98b2bb464c1167be2a928e381fe 100644
--- a/libs/CMakeLists.txt
+++ b/libs/CMakeLists.txt
@@ -13,3 +13,6 @@ add_subdirectory("gcem")
 add_subdirectory("polymorphic_value")
 
 add_subdirectory("CLIUtils")
+
+add_library(pcg INTERFACE)
+target_include_directories(pcg INTERFACE "pcg-cpp/include")
\ No newline at end of file
diff --git a/libs/pcg-cpp b/libs/pcg-cpp
new file mode 160000
index 0000000000000000000000000000000000000000..ffd522e7188bef30a00c74dc7eb9de5faff90092
--- /dev/null
+++ b/libs/pcg-cpp
@@ -0,0 +1 @@
+Subproject commit ffd522e7188bef30a00c74dc7eb9de5faff90092