diff --git a/apps/ccam/ccam.cpp b/apps/ccam/ccam.cpp
index d71d885..e6f615d 100644
--- a/apps/ccam/ccam.cpp
+++ b/apps/ccam/ccam.cpp
@@ -1,307 +1,279 @@
 //===-- apps/ccam/ccam.cpp --------------------------------------*- C++ -*-===//
 //
 //                 The RoSA Framework -- Application CCAM
 //
 //===----------------------------------------------------------------------===//
 ///
 /// \file apps/ccam/ccam.cpp
 ///
 /// \author Maximilian Goetzinger (maximilian.goetzinger@tuwien.ac.at)
 /// \author Benedikt Tutzer (benedikt.tutzer@tuwien.ac.at)
 ///
 /// \date 2019
 ///
 /// \brief The application CCAM implements the case study from the paper:
 /// M. Goetzinger, N. TaheriNejad, H. A. Kholerdi, A. Jantsch, E. Willegger,
 /// T. Glatzl, A.M. Rahmani, T.Sauter, P. Liljeberg: Model - Free Condition
 /// Monitoring with Confidence
 //===----------------------------------------------------------------------===//
 #include "rosa/agent/Abstraction.hpp"
 #include "rosa/agent/Confidence.hpp"
 #include "rosa/agent/FunctionAbstractions.hpp"
 #include <iostream>
 
 #include "rosa/config/version.h"
 
 #include "rosa/agent/SignalStateDetector.hpp"
 #include "rosa/agent/SystemStateDetector.hpp"
 #include "rosa/deluxe/DeluxeContext.hpp"
 
 #include "rosa/support/csv/CSVReader.hpp"
 #include "rosa/support/csv/CSVWriter.hpp"
 
 #include <fstream>
 #include <limits>
 #include <memory>
 #include <streambuf>
 
 #include "configuration.h"
 #include "statehandlerutils.h"
 
 using namespace rosa;
 using namespace rosa::agent;
 using namespace rosa::deluxe;
 using namespace rosa::terminal;
 
 const std::string AppName = "CCAM";
 
 int main(int argc, char **argv) {
 
   LOG_INFO_STREAM << '\n'
                   << library_string() << " -- " << Color::Red << AppName
                   << "app" << Color::Default << '\n';
 
   if (argc < 2) {
     LOG_ERROR("Specify config File!\nUsage:\n\tccam config.json");
     return 1;
   }
   std::string ConfigPath = argv[1];
 
   if (!readConfigFile(ConfigPath)) {
     LOG_ERROR_STREAM << "Could not read config from \"" << ConfigPath << "\"\n";
     return 2;
   }
 
   std::string InputFilePath, OutputFilePath;
 
   LOG_INFO("Creating Context");
   std::unique_ptr<DeluxeContext> C = DeluxeContext::create(AppName);
 
+  std::shared_ptr<PartialFunction<float, float>> BrokenDelayFunction(
+      new PartialFunction<float, float>(
+          {{{0, AppConfig.BrokenCounter},
+            std::make_shared<LinearFunction<float, float>>(
+                0, 0.f, AppConfig.BrokenCounter, 1.f)},
+           {{AppConfig.BrokenCounter, std::numeric_limits<float>::max()},
+            std::make_shared<LinearFunction<float, float>>(1.f, 0.f)}},
+          0));
+
+  std::shared_ptr<PartialFunction<float, float>> OkDelayFunction(
+      new PartialFunction<float, float>(
+          {{{0, AppConfig.BrokenCounter},
+            std::make_shared<LinearFunction<float, float>>(
+                0, 1.f, AppConfig.BrokenCounter, 0.f)},
+           {{AppConfig.BrokenCounter, std::numeric_limits<float>::max()},
+            std::make_shared<LinearFunction<float, float>>(0.f, 0.f)}},
+          1));
+
+  //
+  // Create a DeluxeAgent with SystemStateDetector functionality.
+  //
+  LOG_INFO("Create SystemStateDetector agent.");
+  AgentHandle SystemStateDetectorAgent = createSystemStateDetectorAgent(
+      C, "SystemStateDetector", AppConfig.SignalConfigurations.size(),
+      BrokenDelayFunction, OkDelayFunction);
+
   LOG_INFO("Creating sensors, SignalStateDetector functionalities and their "
            "Abstractions.");
   std::vector<AgentHandle> Sensors;
   std::vector<std::shared_ptr<PartialFunction<float, float>>>
       SampleMatchesFunctions;
   std::vector<std::shared_ptr<PartialFunction<float, float>>>
       SampleMismatchesFunctions;
   std::vector<std::shared_ptr<PartialFunction<float, float>>>
       SignalIsStableFunctions;
   std::vector<std::shared_ptr<PartialFunction<float, float>>>
       SignalIsDriftingFunctions;
   std::vector<std::shared_ptr<StepFunction<float, float>>>
       NumOfSamplesMatchFunctions;
   std::vector<std::shared_ptr<StepFunction<float, float>>>
       NumOfSamplesMismatchFunctions;
   std::vector<std::shared_ptr<
       SignalStateDetector<float, float, float, HistoryPolicy::FIFO>>>
       SignalStateDetectors;
   std::vector<AgentHandle> SignalStateDetectorAgents;
+
   for (auto SignalConfiguration : AppConfig.SignalConfigurations) {
     //
     // Create deluxe sensors.
     //
     Sensors.emplace_back(C->createSensor<float>(SignalConfiguration.Name));
 
     //
     // Create functionalities for SignalStateDetector.
     //
     SampleMatchesFunctions.emplace_back(new PartialFunction<float, float>(
         {
             {{-SignalConfiguration.OuterBound, -SignalConfiguration.InnerBound},
              std::make_shared<LinearFunction<float, float>>(
                  -SignalConfiguration.OuterBound, 0.f,
                  -SignalConfiguration.InnerBound, 1.f)},
             {{-SignalConfiguration.InnerBound, SignalConfiguration.InnerBound},
              std::make_shared<LinearFunction<float, float>>(1.f, 0.f)},
             {{SignalConfiguration.InnerBound, SignalConfiguration.OuterBound},
              std::make_shared<LinearFunction<float, float>>(
                  SignalConfiguration.InnerBound, 1.f,
                  SignalConfiguration.OuterBound, 0.f)},
         },
         0));
 
     SampleMismatchesFunctions.emplace_back(new PartialFunction<float, float>(
         {
             {{-SignalConfiguration.OuterBound, -SignalConfiguration.InnerBound},
              std::make_shared<LinearFunction<float, float>>(
                  -SignalConfiguration.OuterBound, 1.f,
                  -SignalConfiguration.InnerBound, 0.f)},
             {{-SignalConfiguration.InnerBound, SignalConfiguration.InnerBound},
              std::make_shared<LinearFunction<float, float>>(0.f, 0.f)},
             {{SignalConfiguration.InnerBound, SignalConfiguration.OuterBound},
              std::make_shared<LinearFunction<float, float>>(
                  SignalConfiguration.InnerBound, 0.f,
                  SignalConfiguration.OuterBound, 1.f)},
         },
         1));
 
     SignalIsStableFunctions.emplace_back(new PartialFunction<float, float>(
         {
             {{-SignalConfiguration.OuterBoundDrift,
               -SignalConfiguration.InnerBoundDrift},
              std::make_shared<LinearFunction<float, float>>(
                  -SignalConfiguration.OuterBoundDrift, 0.f,
                  -SignalConfiguration.InnerBoundDrift, 1.f)},
             {{-SignalConfiguration.InnerBoundDrift,
               SignalConfiguration.InnerBoundDrift},
              std::make_shared<LinearFunction<float, float>>(1.f, 0.f)},
             {{SignalConfiguration.InnerBoundDrift,
               SignalConfiguration.OuterBoundDrift},
              std::make_shared<LinearFunction<float, float>>(
                  SignalConfiguration.InnerBoundDrift, 1.f,
                  SignalConfiguration.OuterBoundDrift, 0.f)},
         },
         0));
 
     SignalIsDriftingFunctions.emplace_back(new PartialFunction<float, float>(
         {
             {{-SignalConfiguration.OuterBoundDrift,
               -SignalConfiguration.InnerBoundDrift},
              std::make_shared<LinearFunction<float, float>>(
                  -SignalConfiguration.OuterBoundDrift, 1.f,
                  -SignalConfiguration.InnerBoundDrift, 0.f)},
             {{-SignalConfiguration.InnerBoundDrift,
               SignalConfiguration.InnerBoundDrift},
              std::make_shared<LinearFunction<float, float>>(0.f, 0.f)},
             {{SignalConfiguration.InnerBoundDrift,
               SignalConfiguration.OuterBoundDrift},
              std::make_shared<LinearFunction<float, float>>(
                  SignalConfiguration.InnerBoundDrift, 0.f,
                  SignalConfiguration.OuterBoundDrift, 1.f)},
         },
         1));
 
     NumOfSamplesMatchFunctions.emplace_back(new StepFunction<float, float>(
         1.0f / SignalConfiguration.SampleHistorySize, StepDirection::StepUp));
 
     NumOfSamplesMismatchFunctions.emplace_back(new StepFunction<float, float>(
         1.0f / SignalConfiguration.SampleHistorySize, StepDirection::StepDown));
 
     //
     // Create SignalStateDetector functionality
     //
     SignalStateDetectors.emplace_back(
         new SignalStateDetector<float, float, float, HistoryPolicy::FIFO>(
             SignalConfiguration.Output ? SignalProperties::OUTPUT
                                        : SignalProperties::INPUT,
             std::numeric_limits<int>::max(), SampleMatchesFunctions.back(),
             SampleMismatchesFunctions.back(), NumOfSamplesMatchFunctions.back(),
             NumOfSamplesMismatchFunctions.back(),
             SignalIsDriftingFunctions.back(), SignalIsStableFunctions.back(),
             SignalConfiguration.SampleHistorySize, SignalConfiguration.DABSize,
             SignalConfiguration.DABHistorySize));
 
     //
     // Create low-level deluxe agents
     //
     SignalStateDetectorAgents.push_back(createSignalStateDetectorAgent(
         C, SignalConfiguration.Name, SignalStateDetectors.back()));
 
     //
     // Connect sensors to low-level agents.
     //
     LOG_INFO("Connect sensors to their corresponding low-level agents.");
 
     C->connectSensor(SignalStateDetectorAgents.back(), 0, Sensors.back(),
                      SignalConfiguration.Name);
-  }
-
-  std::shared_ptr<PartialFunction<float, float>> BrokenDelayFunction(
-      new PartialFunction<float, float>(
-          {{{0, AppConfig.BrokenCounter},
-            std::make_shared<LinearFunction<float, float>>(
-                0, 0.f, AppConfig.BrokenCounter, 1.f)},
-           {{AppConfig.BrokenCounter, std::numeric_limits<float>::max()},
-            std::make_shared<LinearFunction<float, float>>(1.f, 0.f)}},
-          0));
 
-  std::shared_ptr<PartialFunction<float, float>> OkDelayFunction(
-      new PartialFunction<float, float>(
-          {{{0, AppConfig.BrokenCounter},
-            std::make_shared<LinearFunction<float, float>>(
-                0, 1.f, AppConfig.BrokenCounter, 0.f)},
-           {{AppConfig.BrokenCounter, std::numeric_limits<float>::max()},
-            std::make_shared<LinearFunction<float, float>>(0.f, 0.f)}},
-          1));
-
-  //
-  // Create a DeluxeAgent with SystemStateDetector functionality.
-  //
-  LOG_INFO("Create SystemStateDetector agent.");
-  AgentHandle SystemStateDetector = createSystemStateDetectorAgent(
-      C, "SystemStateDetector", AppConfig.SignalConfigurations.size(),
-      BrokenDelayFunction, OkDelayFunction);
-
-  // The new agent logs its input values and results in the the sum of them.
-  /**  AgentHandle BodyAgent = C->createAgent(
-        "Body Agent",
-        DeluxeAgent::D<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t,
-                       uint32_t>(
-            [](std::pair<uint32_t, bool> HR, std::pair<uint32_t, bool> BR,
-               std::pair<uint32_t, bool> SpO2, std::pair<uint32_t, bool> BPSys,
-               std::pair<uint32_t, bool> BodyTemp) -> Optional<uint32_t> {
-              LOG_INFO_STREAM << "\n*******\nBody Agent trigged with values:\n"
-                              << (HR.second ? "<New>" : "<Old>")
-                              << " HR warning score: " << HR.first << "\n"
-                              << (BR.second ? "<New>" : "<Old>")
-                              << " BR warning score: " << BR.first << "\n"
-                              << (SpO2.second ? "<New>" : "<Old>")
-                              << " SpO2 warning score: " << SpO2.first << "\n"
-                              << (BPSys.second ? "<New>" : "<Old>")
-                              << " BPSys warning score: " << BPSys.first << "\n"
-                              << (BodyTemp.second ? "<New>" : "<Old>")
-                              << " BodyTemp warning score: " << BodyTemp.first
-                              << "\n******\n";
-              return {HR.first + BR.first + SpO2.first + BPSys.first +
-                      BodyTemp.first};
-            }));
-  */
-  //
-  // Connect low-level agents to the high-level agent.
-  //
-  LOG_INFO("Connect low-level agents to the high-level agent.");
-
-  /// C->connectAgents(BodyAgent, 0, HRAgent, "HR Agent Channel");
+    C->connectAgents(SystemStateDetectorAgent, SignalStateDetectors.size() - 1,
+                     SignalStateDetectorAgents.back(),
+                     SignalConfiguration.Name);
+  }
 
   //
   // For simulation output, create a logger agent writing the output of the
   // high-level agent into a CSV file.
   //
   LOG_INFO("Create a logger agent.");
 
   // Create CSV writer.
-  /// std::ofstream ScoreCSV(ScoreCSVPath);
-  /// csv::CSVWriter<uint32_t> ScoreWriter(ScoreCSV);
+  std::ofstream OutputCSV(AppConfig.OutputFilePath);
 
   // The agent writes each new input value into a CSV file and produces nothing.
-  /** AgentHandle LoggerAgent = C->createAgent(
-      "Logger Agent",
-      DeluxeAgent::D<unit_t, uint32_t>(
-          [&ScoreWriter](std::pair<uint32_t, bool> Score) -> Optional<unit_t> {
-            if (Score.second) {
-              // The state of \p ScoreWriter is not checked, expecting good.
-              ScoreWriter << Score.first;
-            }
-            return {};
-          }));
-  */
+  using Input = std::pair<SystemStateTuple, bool>;
+  using Result = Optional<DeluxeTuple<unit_t>>;
+  using Handler = std::function<Result(Input)>;
+  std::string Name = "Logger Agent";
+
+  AgentHandle LoggerAgent =
+      C->createAgent("Logger Agent", Handler([&OutputCSV](Input I) -> Result {
+                       OutputCSV << std::get<0>(I.first) << std::endl;
+                       return Result();
+                     }));
   //
   // Connect the high-level agent to the logger agent.
   //
   LOG_INFO("Connect the high-level agent to the logger agent.");
 
-  /// C->connectAgents(LoggerAgent, 0, BodyAgent, "Body Agent Channel");
+  C->connectAgents(LoggerAgent, 0, SystemStateDetectorAgent,
+                   "SystemStateDetector Channel");
 
   //
   // Do simulation.
   //
   LOG_INFO("Setting up and performing simulation.");
 
   //
   // Initialize deluxe context for simulation.
   //
-
-  // C->initializeSimulation();
+  C->initializeSimulation();
 
   //
   // Open CSV files and register them for their corresponding sensors.
   //
 
   //
   // Simulate.
   //
 
-  /// C->simulate(NumberOfSimulationCycles);
+  C->simulate(AppConfig.NumberOfSimulationCycles);
 
   return 0;
 }
diff --git a/apps/ccam/configuration.h b/apps/ccam/configuration.h
index 42e0cf6..4db55b4 100644
--- a/apps/ccam/configuration.h
+++ b/apps/ccam/configuration.h
@@ -1,83 +1,85 @@
 #ifndef CONFIGURATION_H
 #define CONFIGURATION_H
 
 // clang-tidy off
 // clang-format off
 #include "json.hpp"
 // clang-format on
 // clang-tidy on
 #include "rosa/config/version.h"
 #include "rosa/deluxe/DeluxeContext.hpp"
 #include <fstream>
 
 using namespace rosa;
 using nlohmann::json;
 
 struct SignalConfiguration {
   std::string Name;
   bool Output;
   float InnerBound;
   float OuterBound;
   float InnerBoundDrift;
   float OuterBoundDrift;
   uint32_t SampleHistorySize;
   uint32_t DABSize;
   uint32_t DABHistorySize;
 };
 
 struct AppConfiguration {
   std::string InputFilePath;
   std::string OutputFilePath;
   uint32_t BrokenCounter;
+  uint32_t NumberOfSimulationCycles;
   std::vector<SignalConfiguration> SignalConfigurations;
 };
 
 void from_json(const json &J, SignalConfiguration &SC) {
   J.at("Name").get_to(SC.Name);
   J.at("Output").get_to(SC.Output);
   J.at("InnerBound").get_to(SC.InnerBound);
   J.at("OuterBound").get_to(SC.OuterBound);
   J.at("InnerBoundDrift").get_to(SC.InnerBoundDrift);
   J.at("OuterBoundDrift").get_to(SC.OuterBoundDrift);
   J.at("SampleHistorySize").get_to(SC.SampleHistorySize);
   J.at("DABSize").get_to(SC.DABSize);
   J.at("DABHistorySize").get_to(SC.DABHistorySize);
 }
 
 void from_json(const json &J, AppConfiguration &AC) {
   J.at("InputFilePath").get_to(AC.InputFilePath);
   J.at("OutputFilePath").get_to(AC.OutputFilePath);
   J.at("BrokenCounter").get_to(AC.BrokenCounter);
+  J.at("NumberOfSimulationCycles").get_to(AC.NumberOfSimulationCycles);
   J.at("SignalConfigurations").get_to(AC.SignalConfigurations);
 }
 
 AppConfiguration AppConfig;
 
 bool readConfigFile(std::string ConfigPath) {
 
   LOG_INFO("READING CONFIG FILE");
   LOG_INFO_STREAM << "Looking for config file at \"" << ConfigPath << "\"\n";
 
   std::ifstream ConfigFile;
   ConfigFile.open(ConfigPath);
 
   if (!ConfigFile) {
     LOG_ERROR("Unable to open config file");
     return false;
   }
 
   json ConfigObj;
   ConfigFile >> ConfigObj;
   LOG_INFO_STREAM << "Read JSON file as \"" << ConfigObj << "\"\n";
 
   try {
     ConfigObj.get_to(AppConfig);
   } catch (nlohmann::detail::type_error ex) {
     LOG_ERROR("Misformatted Config File");
     return false;
   }
 
   return true;
 }
 
 #endif // CONFIGURATION_H
diff --git a/apps/ccam/statehandlerutils.h b/apps/ccam/statehandlerutils.h
index 0d33d6a..477bafe 100644
--- a/apps/ccam/statehandlerutils.h
+++ b/apps/ccam/statehandlerutils.h
@@ -1,182 +1,182 @@
 #ifndef STATEHANDLERUTILS_H
 #define STATEHANDLERUTILS_H
 #include "rosa/agent/Abstraction.hpp"
 #include "rosa/agent/Confidence.hpp"
 #include "rosa/agent/FunctionAbstractions.hpp"
 #include <functional>
 #include <iostream>
 #include <tuple>
 #include <vector>
 
 #include "rosa/config/version.h"
 
 #include "rosa/agent/SignalStateDetector.hpp"
 #include "rosa/agent/SystemStateDetector.hpp"
 #include "rosa/deluxe/DeluxeContext.hpp"
 
 #include "rosa/support/csv/CSVReader.hpp"
 #include "rosa/support/csv/CSVWriter.hpp"
 
 #include <fstream>
 #include <limits>
 #include <memory>
 #include <streambuf>
 using namespace rosa;
 using namespace rosa::agent;
 using namespace rosa::deluxe;
 using namespace rosa::terminal;
 
 // Signal State
 
 using SignalStateTuple = DeluxeTuple<float, uint32_t, uint8_t, float, uint8_t,
                                      uint32_t, bool, bool, bool>;
 
 AgentHandle createSignalStateDetectorAgent(
     std::unique_ptr<DeluxeContext> &C, const std::string &Name,
     std::shared_ptr<
         SignalStateDetector<float, float, float, HistoryPolicy::FIFO>>
         SigSD) {
 
   using Input = std::pair<DeluxeTuple<float>, bool>;
 
   using Result = Optional<SignalStateTuple>;
   using Handler = std::function<Result(Input)>;
 
   return C->createAgent(
       Name, Handler([&Name, &SigSD](Input I) -> Result {
         LOG_INFO_STREAM << "\n******\n"
                         << Name << " " << (I.second ? "<New>" : "<Old>")
                         << " value: " << std::get<0>(I.first) << "\n******\n";
         auto StateInfo = SigSD->detectSignalState(std::get<0>(I.first));
 
         if (I.second) {
           SignalStateTuple Res = {
               std::get<0>(I.first),
               StateInfo.SignalStateID,
               StateInfo.SignalProperty,
               StateInfo.SignalStateConfidence,
               StateInfo.SignalStateCondition,
               StateInfo.NumberOfInsertedSamplesAfterEntrance,
               StateInfo.SignalStateIsValid,
               StateInfo.SignalStateJustGotValid,
               StateInfo.SignalStateIsValidAfterReentrance};
           return Result(Res);
         }
         return Result();
       }));
 }
 
 // System State
 
 using SystemStateTuple = DeluxeTuple<std::string, uint32_t, float, uint8_t,
                                      uint32_t, bool, bool, bool, bool>;
 
 template <std::size_t size, typename ret, typename functype, typename... A>
 struct Handler_helper;
 
 template <typename B, typename func, typename A, typename... As>
 struct function_helper {
   static_assert(std::conjunction_v<std::is_same<A, As>...>,
                 "All types need to be identical");
 
   static B function(A valA, As... valAs) {
     std::vector<A> ar({valA, valAs...});
     return func()(ar);
   }
 };
 
 template <typename ret, typename typeA, typename functype, typename... B>
 struct Handler_helper<0, ret, functype, typeA, B...> {
   using handler = function_helper<ret, functype, B...>;
 };
 
 template <std::size_t size, typename ret, typename typeA, typename functype,
           typename... B>
 struct Handler_helper<size, ret, functype, typeA, B...> {
   using handler =
       typename Handler_helper<size - 1, ret, functype, typeA,
                               std::pair<typeA, bool>, B...>::handler;
 };
 
 template <std::size_t size, typename ret, typename functype, typename typeA>
 using Handler = typename Handler_helper<size, ret, functype, typeA>::handler;
 
 // todo: state-detector durschleifen
 template <typename ret, typename A> struct function {
   ret operator()(A a) {
     // std::vector<SystemStateInformation> out;
     for (auto tmp1 : a) {
       // convert tuple to info struct out.push_back({});
       (void)tmp1;
       LOG_INFO_STREAM << "new SignalStateTuple!\n";
     }
     // feed state detector
     // return result
     return ret();
   }
 };
 
 using arr = std::vector<std::pair<SignalStateTuple, bool>>;
 
 auto HandlerFunction = Handler<4, Optional<SystemStateTuple>,
                                function<Optional<SystemStateTuple>, arr>,
                                SignalStateTuple>::function;
 
 template <size_t NumOfSlaves>
 AgentHandle createSystemStateDetectorAgent(
     std::unique_ptr<DeluxeContext> &C, const std::string &Name,
     std::shared_ptr<PartialFunction<float, float>> BrokenDelayFunction,
     std::shared_ptr<PartialFunction<float, float>> OkDelayFunction) {
-  (void)BrokenDelayFunction;
-  (void)OkDelayFunction;
+  LOG_TRACE("Creating fixed SystemStateDetectorAgent");
   using Input = SignalStateTuple;
   using Result = Optional<SystemStateTuple>;
 
   auto HandlerFunction =
       Handler<NumOfSlaves, Result, function<Optional<SystemStateTuple>, arr>,
               Input>::function;
-
   std::shared_ptr<SystemStateDetector<float, float, float, HistoryPolicy::FIFO>>
   SysSD(new SystemStateDetector<float, float, float, HistoryPolicy::FIFO>(
       std::numeric_limits<uint32_t>::max(), BrokenDelayFunction,
       OkDelayFunction));
+
   return C->createAgent(Name, std::function(HandlerFunction));
 }
 
 AgentHandle createSystemStateDetectorAgent(
     std::unique_ptr<DeluxeContext> &C, const std::string &Name,
     uint8_t NumOfSlaves,
     std::shared_ptr<PartialFunction<float, float>> BrokenDelayFunction,
     std::shared_ptr<PartialFunction<float, float>> OkDelayFunction) {
+  LOG_TRACE("Creating dynamic SystemStateDetectorAgent");
   switch (NumOfSlaves) {
     // clang-format off
   case  2: return createSystemStateDetectorAgent< 2>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case  3: return createSystemStateDetectorAgent< 3>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case  4: return createSystemStateDetectorAgent< 4>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case  5: return createSystemStateDetectorAgent< 5>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case  6: return createSystemStateDetectorAgent< 6>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case  7: return createSystemStateDetectorAgent< 7>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case  8: return createSystemStateDetectorAgent< 8>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case  9: return createSystemStateDetectorAgent< 9>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 10: return createSystemStateDetectorAgent<10>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 11: return createSystemStateDetectorAgent<11>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 12: return createSystemStateDetectorAgent<12>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 13: return createSystemStateDetectorAgent<13>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 14: return createSystemStateDetectorAgent<14>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 15: return createSystemStateDetectorAgent<15>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 16: return createSystemStateDetectorAgent<16>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 17: return createSystemStateDetectorAgent<17>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 18: return createSystemStateDetectorAgent<18>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 19: return createSystemStateDetectorAgent<19>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 20: return createSystemStateDetectorAgent<20>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 21: return createSystemStateDetectorAgent<21>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 22: return createSystemStateDetectorAgent<22>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 23: return createSystemStateDetectorAgent<23>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 24: return createSystemStateDetectorAgent<24>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 25: return createSystemStateDetectorAgent<25>(C, Name, BrokenDelayFunction, OkDelayFunction);
   case 1:
   default: return createSystemStateDetectorAgent<1>(C, Name, BrokenDelayFunction, OkDelayFunction);
     // clang-format on
   }
 }
 #endif // STATEHANDLERUTILS_H
diff --git a/include/rosa/agent/History.hpp b/include/rosa/agent/History.hpp
index 139d3f8..97a7605 100644
--- a/include/rosa/agent/History.hpp
+++ b/include/rosa/agent/History.hpp
@@ -1,582 +1,580 @@
 //===-- rosa/agent/History.hpp ----------------------------------*- C++ -*-===//
 //
 //                                 The RoSA Framework
 //
 //===----------------------------------------------------------------------===//
 ///
 /// \file rosa/agent/History.hpp
 ///
 /// \author David Juhasz (david.juhasz@tuwien.ac.at)
 ///
 /// \date 2017
 ///
 /// \brief Definition of *history* *functionality*.
 ///
 //===----------------------------------------------------------------------===//
 
 #ifndef ROSA_AGENT_HISTORY_HPP
 #define ROSA_AGENT_HISTORY_HPP
 
 #include "rosa/agent/Functionality.h"
 
 #include "rosa/config/config.h"
 
 #include "rosa/support/debug.hpp"
 #include "rosa/support/type_helper.hpp"
 
 #include <algorithm>
 #include <array>
 #include <limits>
 #include <vector>
 
 namespace rosa {
 namespace agent {
 
 // @benedikt: todo: assert in history, which checks if push_back worked
 
 /// Retention policies defining what a \c rosa::agent::History instance should
 /// do when the number of recorded entries reached its capacity.
 enum class HistoryPolicy {
   SRWF, ///< Stop Recording When Full -- no new entry is recorded when full
   FIFO, ///< First In First Out -- overwrite the earliest entry with a new one
   LIFO  ///< Last In First Out -- overwrite the latest entry with a new one
 };
 
 template <typename T, HistoryPolicy P> class History : public Functionality {
 
 public:
   History(void) noexcept {}
 
   /// Destroys \p this object.
   virtual ~History(void) = default;
 
   /// Tells the retention policy applied to \p this object.
   ///
   /// \return \c rosa::agent::History::P
   static constexpr HistoryPolicy policy(void) noexcept { return P; }
 
   /// Tells how many entries may be recorded by \c this object.
   ///
   /// \note The number of entries that are actually recorded may be smaller.
   ///
   /// \return The max number of entries that may be recorded
   virtual size_t maxLength(void) const noexcept = 0;
 
   /// Tells how many entries are currently recorded by \p this object.
   ///
   /// \return number of entries currently recorded by \p this object.
   ///
   /// \post The returned value cannot be larger than the capacity of \p this
   /// object:\code
   /// 0 <= numberOfEntries() && numberOfEntries <= lengthOfHistory()
   /// \endcode
   virtual size_t numberOfEntries(void) const noexcept = 0;
 
   /// Tells if \p this object has not recorded anything yet.
   ///
   /// \return if \p this object has no entries recorded
   bool empty(void) const noexcept { return numberOfEntries() == 0; }
 
   /// Tells if the history reached it's maximum length
   ///
   /// \return if the history reached it's maximum length.
   bool full(void) const noexcept { return numberOfEntries() == maxLength(); }
 
   /// Gives a constant lvalue reference to an entry stored in \p this object.
   ///
   /// \note The recorded entries are indexed starting from the latest one.
   ///
   /// \param I the index at which the stored entry to take from
   ///
   /// \pre \p I is a valid index:\code
   /// 0 <= I && I < numberOfEntries()
   /// \endcode
   virtual const T &entry(const size_t I = 0) const noexcept = 0;
 
   /// Removes all entries recorded in \p this object.
   virtual void clear() noexcept = 0;
 
 private:
   /// Pushes a new entry into the history.
   ///
   /// \note The earliest entry gets overwritten if the history is full.
   ///
   /// \param V value to push into the history
   virtual void pushBack(const T &V) noexcept = 0;
 
   /// Replaces the most recent entry in the history.
   ///
   /// \param V value to replace the most current value with
   virtual void replaceFront(const T &V) noexcept = 0;
 
 public:
   /// Adds a new entry to \p this object and tells if the operation was
   /// successful.
   ///
   /// \note Success of the operation depends on the actual policy.
   ///
   /// \param V value to store
   ///
   /// \return if \p V was successfully stored
   bool addEntry(const T &V) noexcept {
     switch (P) {
     default:
       ROSA_CRITICAL("unkown HistoryPolicy");
     case HistoryPolicy::LIFO:
       if (full()) {
         replaceFront(V);
         return true;
       }
     case HistoryPolicy::SRWF:
       if (full()) {
         return false;
       }
     // \note Fall through to FIFO which unconditionally pushes the new entry.
     case HistoryPolicy::FIFO:
       // FIFO and SRWF not full.
       pushBack(V);
       return true;
     }
   }
 
   /// Tells the trend set by the entries recorded by \p this object.
   ///
   /// The number of steps to go back when calculating the trend is defined as
   /// argument to the function.
   ///
   /// \note The number of steps that can be made is limited by the number of
   /// entries recorded by \p this object.
   ///
   /// \note The function is made a template only to be able to use
   /// \c std::enable_if.
   ///
   /// \tparam X always use the default!
   ///
   /// \param D number of steps to go back in *history*
   ///
   /// \return trend set by analyzed entries
   ///
   /// \pre Statically, \p this object stores signed arithmetic values:\code
   /// std::is_arithmetic<T>::value && std::is_signed<T>::value
   /// \endcode Dynamically, \p D is a valid number of steps to take:\code
   /// 0 <= D && D < lengthOfHistory()
   /// \endcode
   template <typename X = T>
   typename std::enable_if<
       std::is_arithmetic<X>::value && std::is_signed<X>::value, X>::type
   trend(const size_t D) const noexcept {
     STATIC_ASSERT((std::is_same<X, T>::value), "not default template arg");
     ASSERT(0 <= D && D < maxLength()); // Boundary check.
     if (numberOfEntries() < 2 || D < 1) {
       // No entries for computing trend.
       return {}; // Zero element of \p T
     } else {
       // Here at least two entries.
       // \c S is the number of steps that can be done.
       const size_t S = std::min(numberOfEntries() - 1, D);
       size_t I = S;
 
       // Compute trend with linear regression.
       size_t SumIndices = 0;
       T SumEntries = {};
       T SumSquareEntries = {};
       T SumProduct = {};
       while (I > 0) {
         // \note Indexing for the regression starts in the past.
         const size_t Index = S - I;
         const T Entry = entry(--I);
         SumIndices += Index;
         SumEntries += Entry;
         SumSquareEntries += Entry * Entry;
         SumProduct += Entry * Index;
       }
 
       return (SumProduct * S - SumEntries * SumIndices) /
              (SumSquareEntries * S - SumEntries * SumEntries);
     }
   }
 
   /// Tells the average absolute difference between consecutive entries recorded
   /// by \p this object
   /// The number of steps to go back when calculating the average is defined as
   /// argument to the function.
   ///
   /// \note The number of steps that can be made is limited by the number of
   /// entries recorded by \p this object.
   ///
   /// \note The function is made a template only to be able to use
   /// \c std::enable_if.
   ///
   /// \tparam X always use the default!
   ///
   /// \param D number of steps to go back in *history*
   ///
   /// \pre Statically, \p this object stores arithmetic values:\code
   /// std::is_arithmetic<T>::value
   /// \endcode Dynamically, \p D is a valid number of steps to take:\code
   /// 0 <= D && D < lengthOfHistory()
   /// \endcode
   template <typename X = T>
   typename std::enable_if<std::is_arithmetic<X>::value, size_t>::type
   averageAbsDiff(const size_t D) const noexcept {
     STATIC_ASSERT((std::is_same<X, T>::value), "not default template arg");
     ASSERT(0 <= D && D < maxLength()); // Boundary check.
     if (numberOfEntries() < 2 || D < 1) {
       // No difference to average.
       return {}; // Zero element of \p T
     } else {
       // Here at least two entries.
       // \c S is the number of steps that can be done.
       const size_t S = std::min(numberOfEntries() - 1, D);
 
       // Sum up differences as non-negative values only, hence using an
       // unsigned variable for that.
       size_t Diffs = {}; // Init to zero.
       // Count down entry indices and sum up all the absolute differences.
       size_t I = S;
       T Last = entry(I);
       while (I > 0) {
         T Next = entry(--I);
         Diffs += Last < Next ? Next - Last : Last - Next;
         Last = Next;
       }
       // Return the average of the summed differences.
       return Diffs / S;
     }
   }
 
   /// Tells the average of all entries recorded by \p this object
   ///
   /// \tparam R type of the result
   template <typename R> R average() const noexcept {
     R Average = 0;
     for (size_t I = 0; I < numberOfEntries(); I++) {
       Average += entry(I);
     }
     Average /= numberOfEntries();
     return Average;
   }
 };
 
 /// Implements *history* by recording and storing values.
 /// The length of the underlying std::array is static and must be set at
 /// compile-time
 ///
 /// \note Not thread-safe implementation, which should not be a problem as any
 /// instance of \c rosa::agent::Functionality is an internal component of a
 /// \c rosa::Agent, which is the basic unit of concurrency.
 ///
 /// \tparam T type of values to store
 /// \tparam N number of values to store at most
 /// \tparam P retention policy to follow when capacity is reached
 ///
 /// \invariant The size of the underlying \c std::array is `N + 1`:\code
 /// max_size() == N + 1 && N == max_size() - 1
 /// \endcode
 template <typename T, size_t N, HistoryPolicy P>
 class StaticLengthHistory : public History<T, P>, private std::array<T, N + 1> {
 
   // Bring into scope inherited functions that are used.
   using std::array<T, N + 1>::max_size;
   using std::array<T, N + 1>::operator[];
 
   /// The index of the first data element in the circular buffer.
   size_t Data;
 
   /// The index of the first empty slot in the circular buffer.
   size_t Space;
 
 public:
   using History<T, P>::policy;
   using History<T, P>::empty;
   using History<T, P>::full;
   using History<T, P>::addEntry;
   using History<T, P>::trend;
   using History<T, P>::averageAbsDiff;
 
   /// Creates an instances by initializing the indices for the circular buffer.
   StaticLengthHistory(void) noexcept : Data(0), Space(0) {}
 
   /// Destroys \p this object.
   ~StaticLengthHistory(void) override = default;
 
   /// Tells how many entries may be recorded by \c this object.
   ///
   /// \note The number of entries that are actually recorded may be smaller.
   ///
   /// \return \c rosa::agent::History::N
   size_t maxLength(void) const noexcept override { return N; }
 
   /// Tells how many entries are currently recorded by \p this object.
   ///
   /// \return number of entries currently recorded by \p this object.
   ///
   /// \post The returned value cannot be larger than the capacity of \p this
   /// object:\code
   /// 0 <= numberOfEntries() && numberOfEntries <= lengthOfHistory()
   /// \endcode
   size_t numberOfEntries(void) const noexcept override {
     return Data <= Space ? Space - Data : max_size() - Data + Space;
   }
 
   /// Gives a constant lvalue reference to an entry stored in \p this object.
   ///
   /// \note The recorded entries are indexed starting from the latest one.
   ///
   /// \param I the index at which the stored entry to take from
   ///
   /// \pre \p I is a valid index:\code
   /// 0 <= I && I < numberOfEntries()
   /// \endcode
   const T &entry(const size_t I = 0) const noexcept override {
     ASSERT(0 <= I && I < numberOfEntries()); // Boundary check.
     // Position counted back from the last recorded entry.
     typename std::make_signed<const size_t>::type Pos = Space - (1 + I);
     // Actual index wrapped around to the end of the buffer if negative.
     return (*this)[Pos >= 0 ? Pos : max_size() + Pos];
   }
 
   /// Removes all entries recorded in \p this object.
   void clear() noexcept override {
     Data = 0;
     Space = 0;
   }
 
 private:
   /// Pushes a new entry into the circular buffer.
   ///
   /// \note The earliest entry gets overwritten if the buffer is full.
   ///
   /// \param V value to push into the buffer
   void pushBack(const T &V) noexcept override {
     // Store value to the first empty slot and step Space index.
     (*this)[Space] = V;
     Space = (Space + 1) % max_size();
     if (Data == Space) {
       // Buffer was full, step Data index.
       Data = (Data + 1) % max_size();
     }
   }
 
   /// Replaces the most recent entry in the history.
   ///
   /// \param V value to replace the most current value with
   void replaceFront(const T &V) noexcept override {
     (*this)[(Space - 1) % max_size()] = V;
   }
 };
 
 /// Adds a new entry to a \c rosa::agent::History instance.
 ///
 /// \note The result of \c rosa::agent::History::addEntry is ignored.
 ///
 /// \tparam T type of values stored in \p H
 /// \tparam N number of values \p H is able to store
 /// \tparam P retention policy followed by \p H when capacity is reached
 ///
 /// \param H to add a new entry to
 /// \param V value to add to \p H
 ///
 /// \return \p H after adding \p V to it
 template <typename T, size_t N, HistoryPolicy P>
 StaticLengthHistory<T, N, P> &operator<<(StaticLengthHistory<T, N, P> &H,
                                          const T &V) noexcept {
   H.addEntry(V);
   return H;
 }
 
 /// Implements *DynamicLengthHistory* by recording and storing values.
 ///
 /// \note Not thread-safe implementation, which should not be a problem as any
 /// instance of \c rosa::agent::Functionality is an internal component of a
 /// \c rosa::Agent, which is the basic unit of concurrency.
 ///
 /// \tparam T type of values to store
 /// \tparam P retention policy to follow when capacity is reached
 template <typename T, HistoryPolicy P>
 class DynamicLengthHistory : public History<T, P>, private std::vector<T> {
 
 private:
   // Bring into scope inherited functions that are used.
   using std::vector<T>::size;
   using std::vector<T>::resize;
   using std::vector<T>::push_back;
   using std::vector<T>::pop_back;
   using std::vector<T>::max_size;
   /// The current length of the DynamicLengthHistory.
   size_t Length;
 
 public:
   // Bring into scope inherited functions that are used.
   using std::vector<T>::erase;
   using std::vector<T>::begin;
   using std::vector<T>::end;
   using std::vector<T>::rbegin;
   using std::vector<T>::rend;
   using std::vector<T>::operator[];
 
   // Bring into scope inherited functions that are used.
   using History<T, P>::policy;
   using History<T, P>::empty;
   using History<T, P>::full;
   using History<T, P>::addEntry;
   using History<T, P>::trend;
   using History<T, P>::averageAbsDiff;
 
   /// Creates an instances by setting an initial length
-  DynamicLengthHistory(size_t Length) noexcept : Length(Length) {
-    this->resize(Length);
-  }
+  DynamicLengthHistory(size_t Length) noexcept : Length(Length) {}
 
   /// Destroys \p this object.
   ~DynamicLengthHistory(void) override = default;
 
   /// Tells how many entries may be recorded by \c this object.
   ///
   /// \note The number of entries that are actually recorded may be smaller.
   ///
   /// \return \c rosa::agent::DynamicLengthHistory::N
   size_t maxLength(void) const noexcept override { return Length; }
 
   /// Tells how many entries are currently recorded by \p this object.
   ///
   /// \return number of entries currently recorded by \p this object.
   ///
   /// \post The returned value cannot be larger than the capacity of \p this
   /// object:\code
   /// 0 <= numberOfEntries() && numberOfEntries <=
   /// lengthOfHistory() \endcode
   size_t numberOfEntries(void) const noexcept override { return size(); }
 
   /// Gives a constant lvalue reference to an entry stored in \p this object.
   ///
   /// \note The recorded entries are indexed starting from the latest one.
   ///
   /// \param I the index at which the stored entry to take from
   ///
   /// \pre \p I is a valid index:\code
   /// 0 <= I && I < numberOfEntries()
   /// \endcode
   const T &entry(const size_t I = 0) const noexcept override {
     ASSERT(0 <= I && I < numberOfEntries()); // Boundary check.
     return this->operator[](size() - I - 1);
   }
 
   /// Removes all entries recorded in \p this object.
   void clear() noexcept override { erase(begin(), end()); }
 
   /// Sort all entries in ascending order.
   void sortAscending(void) noexcept { std::sort(begin(), end()); }
 
   /// Sort all entries in descending order.
   void sortDescending(void) noexcept { std::sort(rbegin(), rend()); }
 
   /// Delets one element of the history.
   ///
   /// \param V the element which shall be deleted.
   void deleteEntry(T &V) {
     auto it = std::find(begin(), end(), V);
 
     if (it != end()) {
       erase(it);
     }
   }
 
   /// Gives back the lowest entry of the history.
   ///
   /// \return the lowest entry. In case of an empty history, the maximum value
   /// of the chosen data type is returned.
   T lowestEntry() {
     auto it = std::min_element(begin(), end());
 
     if (it == end()) {
       return std::numeric_limits<T>::max();
     } else {
       return *it;
     }
   }
 
   /// Gives back the highest entry of the history.
   ///
   /// \return the highest entry. In case of an empty history, the minimum value
   /// of the chosen data type is returned.
   T highestEntry() {
     auto it = std::max_element(begin(), end());
 
     if (it == end()) {
       return std::numeric_limits<T>::min();
     } else {
       return *it;
     }
   }
 
 private:
   /// Pushes a new entry into the circular buffer.
   ///
   /// \note The earliest entry gets overwritten if the buffer is full.
   ///
   /// \param V value to push into the buffer
   void pushBack(const T &V) noexcept override {
     if (full()) {
       erase(begin());
     }
     push_back(V);
   }
 
   /// Replaces the most recent entry in the history.
   ///
   /// \param V value to replace the most current value with
   void replaceFront(const T &V) noexcept override {
     (void)pop_back();
     push_back(V);
   }
 
 public:
   /// Resizes the History length. If the new length is smaller than the number
   /// of currently stored values, values are deleted according to the
   /// HistoryPolicy.
   ///
   /// @param NewLength The new Length of the History.
   void setLength(size_t NewLength) noexcept {
     Length = NewLength;
     if (NewLength < numberOfEntries()) {
       switch (P) {
       default:
         ROSA_CRITICAL("unkown HistoryPolicy");
       case HistoryPolicy::LIFO:
       case HistoryPolicy::SRWF:
         // Delete last numberOfEntries() - NewLength items from the back
         erase(begin() + NewLength, end());
         break;
       case HistoryPolicy::FIFO:
         // Delete last numberOfEntries() - NewLength items from the front
         erase(begin(), begin() + (numberOfEntries() - NewLength));
         break;
       }
     }
     this->resize(Length);
   }
 };
 
 /// Adds a new entry to a \c rosa::agent::DynamicLengthHistory instance.
 ///
 /// \note The result of \c rosa::agent::DynamicLengthHistory::addEntry is
 /// ignored.
 ///
 /// \tparam T type of values stored in \p H
 /// \tparam P retention policy followed by \p H when capacity is reached
 ///
 /// \param H to add a new entry to
 /// \param V value to add to \p H
 ///
 /// \return \p H after adding \p V to it
 template <typename T, HistoryPolicy P>
 DynamicLengthHistory<T, P> &operator<<(DynamicLengthHistory<T, P> &H,
                                        const T &V) noexcept {
   H.addEntry(V);
   return H;
 }
 } // End namespace agent
 } // End namespace rosa
 
 #endif // ROSA_AGENT_HISTORY_HPP