diff --git a/CMakeLists.txt b/CMakeLists.txt
index d0257ae73a208b2c81db0d1278da390ce42fccfc..24ae6a8fd012616ff86b4a546faef0c52dd084a2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -47,6 +47,7 @@ add_library(common OBJECT
         src/Helpers/Statistic.cpp
         src/Services/RealTimeForwardingControlService.cpp
         src/Helpers/PMONBase.cpp
+        src/Helpers/AllMessageTypes.cpp
         )
 
 # Specify the .cpp files for the executables
diff --git a/inc/ECSS_Definitions.hpp b/inc/ECSS_Definitions.hpp
index 52f182444ff7ce613f3c412b2c4600c3fa80b804..79eb5bd7b14d153b5230a8359e314eed492a4cc9 100644
--- a/inc/ECSS_Definitions.hpp
+++ b/inc/ECSS_Definitions.hpp
@@ -185,6 +185,9 @@ inline const uint8_t ECSSMaxHousekeepingStructures = 10;
 
 /**
 <<<<<<< HEAD
+<<<<<<< HEAD
+=======
+>>>>>>> master
  * The max number of controlled application processes
  * @see RealTimeForwardingControlService
  */
@@ -194,6 +197,7 @@ inline const uint8_t ECSSMaxControlledApplicationProcesses = 5;
  * The max number of report type blocking definitions per service type definition in the application process
  * configuration
  * @see RealTimeForwardingControlService
+ * todo: must change when a service with more report types is implemented.
  */
 inline const uint8_t ECSSMaxReportTypeDefinitions = 20;
 
@@ -201,15 +205,16 @@ inline const uint8_t ECSSMaxReportTypeDefinitions = 20;
  * The max number of service type definitions per application process type definition in the application process
  * configuration
  * @see RealTimeForwardingControlService
+ * todo: must change when all 15 services are implemented.
  */
-inline const uint8_t ECSSMaxServiceTypeDefinitions = 15;
+inline const uint8_t ECSSMaxServiceTypeDefinitions = 10;
 
 /**
- * The max number of housekeeping structure IDs per housekeeping parameter report type definition in the housekeeping
- * parameter report configuration
- * @see RealTimeForwardingControlService
+ * The number of possible combinations between application processes and service types, i.e. the number of all
+ * possible (applicationID, serviceType) pairs.
  */
-inline const uint8_t ECSSMaxHousekeepingStructureIDs = 10;
+inline const uint8_t ECSSMaxApplicationsServicesCombinations = ECSSMaxControlledApplicationProcesses *
+                                                               ECSSMaxServiceTypeDefinitions;
 
 /**
  * The max number of event definition IDs per event report blocking type definition in the event report blocking
@@ -231,6 +236,5 @@ inline struct {
  */
 inline const uint8_t ECSSMaxMonitoringDefinitions = 4;
 
-
 /** @} */
 #endif // ECSS_SERVICES_ECSS_DEFINITIONS_H
diff --git a/inc/ErrorHandler.hpp b/inc/ErrorHandler.hpp
index cf996ca0cfb613576537c105a4868074c46a2bfc..216c9b1bce25a21d9903973c7f1a4dcf543b033e 100644
--- a/inc/ErrorHandler.hpp
+++ b/inc/ErrorHandler.hpp
@@ -334,16 +334,19 @@ public:
 		 * Application Process configuration (ST[14])
 		 */
 		AllServiceTypesAlreadyAllowed = 48,
+
 		/**
 		 * Attempt to add a new report type, when the max number of reports types allowed per service type
 		 * definition in the Application Process configuration is already reached (ST[14])
 		 */
 		MaxReportTypesReached = 49,
+
 		/**
 		 * Attempt to add a new service type, when the max number of service types allowed per application process
 		 * definition in the Application Process configuration is already reached (ST[14])
 		 */
 		MaxServiceTypesReached = 50,
+
 		/**
 		 * Attempt to add a report/event definition/housekeeping report type, when the specified application process
 		 * ID is not controlled by the Service (ST[14])
diff --git a/inc/Helpers/AllMessageTypes.hpp b/inc/Helpers/AllMessageTypes.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..fb5c2c488647f0b54fa783dd09c72eff28801092
--- /dev/null
+++ b/inc/Helpers/AllMessageTypes.hpp
@@ -0,0 +1,20 @@
+#ifndef ECSS_SERVICES_ALLMESSAGETYPES_HPP
+#define ECSS_SERVICES_ALLMESSAGETYPES_HPP
+
+#include "ECSS_Definitions.hpp"
+#include <etl/map.h>
+#include <etl/vector.h>
+
+/**
+ * Namespace containing all the message types for every service type.
+ */
+namespace AllMessageTypes {
+	/**
+	 * Map containing all the message types, per service. The key is the ServiceType and the value,
+	 * an etl vector containing the message types.
+	 */
+	extern etl::map<uint8_t, etl::vector<uint8_t, ECSSMaxReportTypeDefinitions>, ECSSMaxServiceTypeDefinitions> messagesOfService;
+
+} // namespace AllMessageTypes
+
+#endif
diff --git a/inc/Helpers/ForwardControlConfiguration.hpp b/inc/Helpers/ForwardControlConfiguration.hpp
index 7a72e17674f712b357327f01608b9ebd24e88cb7..da573dd1ff4979caaa4ed8953fb88874ee3a1e35 100644
--- a/inc/Helpers/ForwardControlConfiguration.hpp
+++ b/inc/Helpers/ForwardControlConfiguration.hpp
@@ -7,17 +7,10 @@
 #include "etl/map.h"
 #include "etl/vector.h"
 
-/**
- * Implements the Real Time Forward Control configuration, which includes three separate configurations, Application
- * Process configuration, Housekeeping configuration and Event Report configuration. These configurations contain
- * definitions, which indicate whether a telemetry message should be forwarded to the ground station.
- *
- * @author Konstantinos Petridis <petridkon@gmail.com>
- */
-
 /**
  * The Application Process configuration. It's basically a map, storing a vector of report type definitions for each
- * pair of (applicationID, serviceType).
+ * pair of (applicationID, serviceType). It contains definitions, which indicate whether a telemetry message, produced
+ * by a service, inside an application process (subsystem), should be forwarded to the ground station.
  */
 class ApplicationProcessConfiguration {
 public:
@@ -25,13 +18,13 @@ public:
 	 * Vector containing the Report Type definitions. Each definition has its unique name of type uint8. For
 	 * example, a Report Type definition could be 'ReportHousekeepingStructures'.
 	 */
-	typedef etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> reportTypeDefinitions;
+	typedef etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> ReportTypeDefinitions;
 
 	/**
 	 * This is the key for the application process configuration map. It contains a pair with the applicationID and
 	 * the serviceType.
 	 */
-	typedef std::pair<uint8_t, uint8_t> appServiceKey;
+	typedef std::pair<uint8_t, uint8_t> AppServiceKey;
 
 	/**
 	 * Map containing the report type definitions. Each application process has its own ID. The combination of the
@@ -46,9 +39,7 @@ public:
 	 * already exist in the map, and the requested report type is located in the vector of report types, which corresponds
 	 * to the appID and service type.
 	 */
-	etl::map<appServiceKey, reportTypeDefinitions,
-	         ECSSMaxControlledApplicationProcesses * ECSSMaxServiceTypeDefinitions>
-	    definitions;
+	etl::map<AppServiceKey, ReportTypeDefinitions, ECSSMaxApplicationsServicesCombinations> definitions;
 
 	ApplicationProcessConfiguration() = default;
 };
diff --git a/inc/Platform/x86/ECSS_Configuration.hpp b/inc/Platform/x86/ECSS_Configuration.hpp
index f67bd19f6fe3785264bbeaabd5c3dc7302e1d3d0..bd4e0163632d1b4b4b2bae10a6f96c24c1ff3872 100644
--- a/inc/Platform/x86/ECSS_Configuration.hpp
+++ b/inc/Platform/x86/ECSS_Configuration.hpp
@@ -18,9 +18,7 @@
  * @{
  */
 
-#define SERVICE_ALL ///< Enables compilation of all the ECSS services
-
-#ifdef SERVICE_ALL
+#define SERVICE_ALL
 #define SERVICE_EVENTACTION               ///<  Compile ST[19] event-action
 #define SERVICE_EVENTREPORT               ///<  Compile ST[05] event reporting
 #define SERVICE_FUNCTION                  ///<  Compile ST[08] function management
@@ -36,7 +34,5 @@
 #define SERVICE_TEST                      ///<  Compile ST[17] test
 #define SERVICE_TIME                      ///<  Compile ST[09] time management
 #define SERVICE_TIMESCHEDULING            ///<  Compile ST[11] time-based scheduling
-#endif
-/** @} */
 
 #endif // ECSS_SERVICES_ECSS_CONFIGURATION_HPP
diff --git a/inc/Services/RealTimeForwardingControlService.hpp b/inc/Services/RealTimeForwardingControlService.hpp
index 1f4ec8fc5de204a812552bc25a7f70d261f380fa..580c5e61776b83aaf2766a40382a47d341c04e76 100644
--- a/inc/Services/RealTimeForwardingControlService.hpp
+++ b/inc/Services/RealTimeForwardingControlService.hpp
@@ -3,6 +3,7 @@
 
 #include "ECSS_Definitions.hpp"
 #include "ErrorHandler.hpp"
+#include "Helpers/AllMessageTypes.hpp"
 #include "Helpers/ForwardControlConfiguration.hpp"
 #include "Service.hpp"
 #include "etl/vector.h"
@@ -10,8 +11,7 @@
 /**
  * Implementation of the ST[14] 'Real Time Forwarding Control Service' as defined in ECSS-E-ST-70-41C.
  *
- * @brief
- * The purpose of this Service is to control the forwarding of the stores' telemetry to the ground station. It includes
+ * The purpose of this Service is to control the forwarding of the telemetry to the ground station. It includes
  * conditions for all the application processes that are controlled by the Service, which determine whether a message
  * should be forwarded to the ground station, through the corresponding virtual channel.
  *
@@ -22,6 +22,7 @@ public:
 	inline static const uint8_t ServiceType = 14;
 
 	enum MessageType : uint8_t {
+		AddReportTypesToAppProcessConfiguration = 1,
 		DeleteReportTypesFromAppProcessConfiguration = 2,
 		EventReportConfigurationContentReport = 16,
 	};
@@ -40,6 +41,77 @@ public:
 	ApplicationProcessConfiguration applicationProcessConfiguration;
 
 private:
+	/**
+	 * Adds all report types of the specified application process definition, to the application process configuration.
+	 */
+	void addAllReportsOfApplication(uint8_t applicationID);
+
+	/**
+	 * Adds all report types of the specified service type, to the application process configuration.
+	 */
+	void addAllReportsOfService(uint8_t applicationID, uint8_t serviceType);
+
+	/**
+	 * Counts the number of service types, stored for the specified application process.
+	 */
+	uint8_t countServicesOfApplication(uint8_t applicationID);
+
+	/**
+	 * Counts the number of report types, stored for the specified service type.
+	 */
+	uint8_t countReportsOfService(uint8_t applicationID, uint8_t serviceType);
+
+	/**
+	 * Checks whether the specified message type already exists in the specified application process and service
+	 * type definition.
+	 */
+	bool reportExistsInAppProcessConfiguration(uint8_t applicationID, uint8_t serviceType, uint8_t messageType);
+
+	/**
+	 * Performs the necessary error checking/logging for a specific application process ID. Also, skips the necessary
+	 * bytes from the request message, in case of an invalid request.
+	 *
+	 * @return True: if the application is valid and passes all the necessary error checking.
+	 */
+	bool checkApplicationOfAppProcessConfig(Message& request, uint8_t applicationID, uint8_t numOfServices);
+
+	/**
+	 * Checks if the specified application process is controlled by the Service and returns true if it does.
+	 */
+	bool checkAppControlled(Message& request, uint8_t applicationId);
+
+	/**
+	 * Checks if all service types are allowed already, i.e. if the application process contains no service type
+	 * definitions.
+	 */
+	bool allServiceTypesAllowed(Message& request, uint8_t applicationID);
+
+	/**
+	 * Checks if the maximum number of service type definitions per application process is reached.
+	 */
+	bool maxServiceTypesReached(Message& request, uint8_t applicationID);
+
+	/**
+	 * Performs the necessary error checking/logging for a specific service type. Also, skips the necessary bytes
+	 * from the request message, in case of an invalid request.
+	 *
+	 * @return True: if the service type is valid and passes all the necessary error checking.
+	 */
+	bool checkService(Message& request, uint8_t applicationID, uint8_t numOfMessages);
+
+	/**
+	 * Checks if the maximum number of report type definitions per service type definition is reached.
+	 */
+	bool maxReportTypesReached(Message& request, uint8_t applicationID, uint8_t serviceType);
+
+	/**
+	 * Checks if the maximum number of message types that can be contained inside a service type definition, is
+	 * already reached.
+	 *
+	 * @return True: if the message type is valid and passes all the necessary error checking.
+	 */
+	bool checkMessage(Message& request, uint8_t applicationID, uint8_t serviceType, uint8_t messageType);
+
 	/**
 	 * Returns true, if the defined application exists in the application process configuration map.
 	 */
@@ -90,6 +162,11 @@ private:
 	void deleteReportRecursive(uint8_t applicationID, uint8_t serviceType, uint8_t messageType);
 
 public:
+	/**
+	 * TC[14,1] 'Add report types to the application process forward control configuration'.
+	 */
+	void addReportTypesToAppProcessConfiguration(Message& request);
+
 	/**
 	 * TC[14,2] 'Delete report types from the application process forward control configuration'.
 	 */
@@ -100,7 +177,7 @@ public:
 	 * is the ground station.
 	 *
 	 * @note This function is called from the main execute() that is defined in the file MessageParser.hpp
-	 * @param message Contains the necessary parameters to call the suitable subservice
+	 * @param message Contains the necessary parameters to call the suitable subservice.
 	 */
 	void execute(Message& message);
 };
diff --git a/src/Helpers/AllMessageTypes.cpp b/src/Helpers/AllMessageTypes.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c67e09b31d3ebf98fd7a477d051b23beb7949a62
--- /dev/null
+++ b/src/Helpers/AllMessageTypes.cpp
@@ -0,0 +1,72 @@
+#include "Helpers/AllMessageTypes.hpp"
+#include "Services/EventActionService.hpp"
+#include "Services/EventReportService.hpp"
+#include "Services/HousekeepingService.hpp"
+#include "Services/LargePacketTransferService.hpp"
+#include "Services/MemoryManagementService.hpp"
+#include "Services/ParameterService.hpp"
+#include "Services/ParameterStatisticsService.hpp"
+#include "Services/RealTimeForwardingControlService.hpp"
+#include "Services/RequestVerificationService.hpp"
+#include "Services/TestService.hpp"
+#include "Services/TimeBasedSchedulingService.hpp"
+
+namespace AllMessageTypes {
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st01Messages = {RequestVerificationService::MessageType::FailedAcceptanceReport,
+	                                                                   RequestVerificationService::MessageType::FailedCompletionOfExecution,
+	                                                                   RequestVerificationService::MessageType::FailedProgressOfExecution,
+	                                                                   RequestVerificationService::MessageType::FailedRoutingReport,
+	                                                                   RequestVerificationService::MessageType::FailedStartOfExecution,
+	                                                                   RequestVerificationService::MessageType::SuccessfulAcceptanceReport,
+	                                                                   RequestVerificationService::MessageType::SuccessfulCompletionOfExecution,
+	                                                                   RequestVerificationService::MessageType::SuccessfulProgressOfExecution,
+	                                                                   RequestVerificationService::MessageType::SuccessfulStartOfExecution};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st03Messages = {
+	    HousekeepingService::MessageType::DisablePeriodicHousekeepingParametersReport,
+	    HousekeepingService::MessageType::EnablePeriodicHousekeepingParametersReport,
+	    HousekeepingService::MessageType::GenerateOneShotHousekeepingReport,
+	    HousekeepingService::MessageType::HousekeepingParametersReport,
+	    HousekeepingService::MessageType::HousekeepingPeriodicPropertiesReport,
+	    HousekeepingService::MessageType::HousekeepingStructuresReport};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st04Messages = {
+	    ParameterStatisticsService::MessageType::ParameterStatisticsDefinitionsReport,
+	    ParameterStatisticsService::MessageType::ParameterStatisticsReport,
+	};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st05Messages = {EventReportService::MessageType::HighSeverityAnomalyReport,
+	                                                                   EventReportService::MessageType::DisabledListEventReport,
+	                                                                   EventReportService::MessageType::InformativeEventReport,
+	                                                                   EventReportService::MessageType::LowSeverityAnomalyReport,
+	                                                                   EventReportService::MessageType::MediumSeverityAnomalyReport};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st06Messages = {MemoryManagementService::MessageType::CheckRawMemoryDataReport,
+	                                                                   MemoryManagementService::MessageType::DumpRawMemoryDataReport};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st11Messages = {TimeBasedSchedulingService::MessageType::TimeBasedScheduledSummaryReport};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st13Messages = {LargePacketTransferService::MessageType::FirstDownlinkPartReport,
+	                                                                   LargePacketTransferService::MessageType::InternalDownlinkPartReport,
+	                                                                   LargePacketTransferService::MessageType::LastDownlinkPartReport};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st17Messages = {TestService::MessageType::AreYouAliveTestReport,
+	                                                                   TestService::MessageType::OnBoardConnectionTestReport};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st19Messages = {EventActionService::MessageType::EventActionStatusReport};
+
+	etl::vector<uint8_t, ECSSMaxReportTypeDefinitions> st20Messages = {ParameterService::MessageType::ParameterValuesReport};
+
+	etl::map<uint8_t, etl::vector<uint8_t, ECSSMaxReportTypeDefinitions>, ECSSMaxServiceTypeDefinitions> messagesOfService = {
+	    {RequestVerificationService::ServiceType, st01Messages},
+	    {HousekeepingService::ServiceType, st03Messages},
+	    {ParameterStatisticsService::ServiceType, st04Messages},
+	    {EventReportService::ServiceType, st05Messages},
+	    {MemoryManagementService::ServiceType, st06Messages},
+	    {TimeBasedSchedulingService::ServiceType, st11Messages},
+	    {LargePacketTransferService::ServiceType, st13Messages},
+	    {TestService::ServiceType, st17Messages},
+	    {EventActionService::ServiceType, st19Messages},
+	    {ParameterService::ServiceType, st20Messages}};
+
+} // namespace AllMessageTypes
diff --git a/src/Services/RealTimeForwardingControlService.cpp b/src/Services/RealTimeForwardingControlService.cpp
index 1cdc38465a6f6eaf20a1060a70767445a596b605..2ca94a03289880696d9663881d71ae22a43fa067 100644
--- a/src/Services/RealTimeForwardingControlService.cpp
+++ b/src/Services/RealTimeForwardingControlService.cpp
@@ -1,6 +1,151 @@
 #include "Services/RealTimeForwardingControlService.hpp"
 #include <iostream>
 
+void RealTimeForwardingControlService::addAllReportsOfApplication(uint8_t applicationID) {
+	for (auto& service: AllMessageTypes::messagesOfService) {
+		uint8_t serviceType = service.first;
+		addAllReportsOfService(applicationID, serviceType);
+	}
+}
+
+void RealTimeForwardingControlService::addAllReportsOfService(uint8_t applicationID, uint8_t serviceType) {
+	for (auto& messageType: AllMessageTypes::messagesOfService[serviceType]) {
+		auto appServicePair = std::make_pair(applicationID, serviceType);
+		applicationProcessConfiguration.definitions[appServicePair].push_back(messageType);
+	}
+}
+
+uint8_t RealTimeForwardingControlService::countServicesOfApplication(uint8_t applicationID) {
+	uint8_t serviceCounter = 0;
+	for (auto& definition: applicationProcessConfiguration.definitions) {
+		auto& pair = definition.first;
+		if (pair.first == applicationID) {
+			serviceCounter++;
+		}
+	}
+	return serviceCounter;
+}
+
+uint8_t RealTimeForwardingControlService::countReportsOfService(uint8_t applicationID, uint8_t serviceType) {
+	auto appServicePair = std::make_pair(applicationID, serviceType);
+	return applicationProcessConfiguration.definitions[appServicePair].size();
+}
+
+bool RealTimeForwardingControlService::checkAppControlled(Message& request, uint8_t applicationId) {
+	if (std::find(controlledApplications.begin(), controlledApplications.end(), applicationId) ==
+	    controlledApplications.end()) {
+		ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::NotControlledApplication);
+		return false;
+	}
+	return true;
+}
+
+bool RealTimeForwardingControlService::checkApplicationOfAppProcessConfig(Message& request, uint8_t applicationID,
+                                                                          uint8_t numOfServices) {
+	if (not checkAppControlled(request, applicationID) or allServiceTypesAllowed(request, applicationID)) {
+		for (uint8_t i = 0; i < numOfServices; i++) {
+			request.skipBytes(1);
+			uint8_t numOfMessages = request.readUint8();
+			request.skipBytes(numOfMessages);
+		}
+		return false;
+	}
+	return true;
+}
+
+bool RealTimeForwardingControlService::allServiceTypesAllowed(Message& request, uint8_t applicationID) {
+	if (countServicesOfApplication(applicationID) >= ECSSMaxServiceTypeDefinitions) {
+		ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::AllServiceTypesAlreadyAllowed);
+		return true;
+	}
+	return false;
+}
+
+bool RealTimeForwardingControlService::maxServiceTypesReached(Message& request, uint8_t applicationID) {
+	if (countServicesOfApplication(applicationID) >= ECSSMaxServiceTypeDefinitions) {
+		ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached);
+		return true;
+	}
+	return false;
+}
+
+bool RealTimeForwardingControlService::checkService(Message& request, uint8_t applicationID, uint8_t numOfMessages) {
+	if (maxServiceTypesReached(request, applicationID)) {
+		request.skipBytes(numOfMessages);
+		return false;
+	}
+	return true;
+}
+
+bool RealTimeForwardingControlService::maxReportTypesReached(Message& request, uint8_t applicationID,
+                                                             uint8_t serviceType) {
+	if (countReportsOfService(applicationID, serviceType) >= AllMessageTypes::messagesOfService[serviceType].size()) {
+		ErrorHandler::reportError(request, ErrorHandler::ExecutionStartErrorType::MaxReportTypesReached);
+		return true;
+	}
+	return false;
+}
+
+bool RealTimeForwardingControlService::checkMessage(Message& request, uint8_t applicationID, uint8_t serviceType,
+                                                    uint8_t messageType) {
+	if (maxReportTypesReached(request, applicationID, serviceType) or
+	    reportExistsInAppProcessConfiguration(applicationID, serviceType, messageType)) {
+		return false;
+	}
+	return true;
+}
+
+bool RealTimeForwardingControlService::reportExistsInAppProcessConfiguration(uint8_t applicationID, uint8_t serviceType,
+                                                                             uint8_t messageType) {
+	auto key = std::make_pair(applicationID, serviceType);
+	auto& messages = applicationProcessConfiguration.definitions[key];
+	return std::find(messages.begin(), messages.end(), messageType) != messages.end();
+}
+
+void RealTimeForwardingControlService::addReportTypesToAppProcessConfiguration(Message& request) {
+	request.assertTC(ServiceType, MessageType::AddReportTypesToAppProcessConfiguration);
+	uint8_t numOfApplications = request.readUint8();
+
+	for (uint8_t i = 0; i < numOfApplications; i++) {
+		uint8_t applicationID = request.readUint8();
+		uint8_t numOfServices = request.readUint8();
+
+		if (not checkApplicationOfAppProcessConfig(request, applicationID, numOfServices)) {
+			continue;
+		}
+
+		if (numOfServices == 0) {
+			addAllReportsOfApplication(applicationID);
+			continue;
+		}
+
+		for (uint8_t j = 0; j < numOfServices; j++) {
+			uint8_t serviceType = request.readUint8();
+			uint8_t numOfMessages = request.readUint8();
+
+			if (not checkService(request, applicationID, numOfMessages)) {
+				continue;
+			}
+
+			if (numOfMessages == 0) {
+				addAllReportsOfService(applicationID, serviceType);
+				continue;
+			}
+
+			for (uint8_t k = 0; k < numOfMessages; k++) {
+				uint8_t messageType = request.readUint8();
+
+				if (not checkMessage(request, applicationID, serviceType, messageType)) {
+					continue;
+				}
+				auto key = std::make_pair(applicationID, serviceType);
+				applicationProcessConfiguration.definitions[key].push_back(
+				    messageType);
+			}
+		}
+	}
+}
+
 bool RealTimeForwardingControlService::findApplication(uint8_t targetAppID) {
 	auto& definitions = applicationProcessConfiguration.definitions;
 	return std::any_of(std::begin(definitions), std::end(definitions), [targetAppID](auto& definition) { return targetAppID == definition.first.first; });
@@ -126,11 +271,14 @@ void RealTimeForwardingControlService::deleteReportTypesFromAppProcessConfigurat
 
 void RealTimeForwardingControlService::execute(Message& message) {
 	switch (message.messageType) {
+		case AddReportTypesToAppProcessConfiguration:
+			addReportTypesToAppProcessConfiguration(message);
+			break;
 		case DeleteReportTypesFromAppProcessConfiguration:
 			deleteReportTypesFromAppProcessConfiguration(message);
 			break;
+
 		default:
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
-			break;
 	}
 }
diff --git a/test/Services/RealTimeForwardingControl.cpp b/test/Services/RealTimeForwardingControl.cpp
index bb9cc5eb4c029a490d70fa94d6a6b258e82cae89..dd1a3351766df0e610fb046a60d9eded54635edc 100644
--- a/test/Services/RealTimeForwardingControl.cpp
+++ b/test/Services/RealTimeForwardingControl.cpp
@@ -9,14 +9,559 @@ RealTimeForwardingControlService& realTimeForwarding = Services.realTimeForwardi
 
 uint8_t applications[] = {1};
 uint8_t services[] = {3, 5};
-uint8_t allServices[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-uint8_t redundantServices[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
+uint8_t allServices[] = {1, 3, 4, 5, 6, 11, 13, 17, 19, 20};
+uint8_t redundantServices[] = {1, 3, 4, 5, 6, 11, 13, 17, 19, 20, 1, 3};
 uint8_t messages1[] = {HousekeepingService::MessageType::HousekeepingPeriodicPropertiesReport,
                        HousekeepingService::MessageType::DisablePeriodicHousekeepingParametersReport};
 
 uint8_t messages2[] = {EventReportService::MessageType::InformativeEventReport,
                        EventReportService::MessageType::DisabledListEventReport};
 
+void validReportTypes(Message& request) {
+	uint8_t numOfApplications = 1;
+	uint8_t numOfServicesPerApp = 2;
+	uint8_t numOfMessagesPerService = 2;
+
+	request.appendUint8(numOfApplications);
+
+	for (auto appID: applications) {
+		request.appendUint8(appID);
+		request.appendUint8(numOfServicesPerApp);
+
+		for (uint8_t j = 0; j < numOfServicesPerApp; j++) {
+			uint8_t serviceType = services[j];
+			request.appendUint8(serviceType);
+			request.appendUint8(numOfMessagesPerService);
+			uint8_t* messages = (j == 0) ? messages1 : messages2;
+
+			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
+				request.appendUint8(messages[k]);
+			}
+		}
+	}
+}
+
+void duplicateReportTypes(Message& request) {
+	uint8_t numOfApplications = 1;
+	uint8_t numOfServicesPerApp = 2;
+	uint8_t numOfMessagesPerService = 2;
+
+	request.appendUint8(numOfApplications);
+
+	for (auto appID: applications) {
+		request.appendUint8(appID);
+		request.appendUint8(numOfServicesPerApp);
+
+		for (uint8_t j = 0; j < numOfServicesPerApp; j++) {
+			uint8_t serviceType = services[j];
+			request.appendUint8(serviceType);
+			request.appendUint8(numOfMessagesPerService);
+
+			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
+				request.appendUint8(messages1[0]);
+			}
+		}
+	}
+}
+
+void validInvalidReportTypes(Message& request) {
+	uint8_t numOfApplications = 3;
+	uint8_t numOfMessagesPerService = 2;
+
+	uint8_t applications2[] = {1, 2, 3};
+	request.appendUint8(numOfApplications);
+
+	for (uint8_t i = 0; i < numOfApplications; i++) {
+		request.appendUint8(applications2[i]);
+		uint8_t numOfServicesPerApp = (i == 0) ? 12 : 2;
+		uint8_t* servicesToPick = (i == 0) ? redundantServices : services;
+		request.appendUint8(numOfServicesPerApp);
+
+		for (uint8_t j = 0; j < numOfServicesPerApp; j++) {
+			uint8_t serviceType = servicesToPick[j];
+			request.appendUint8(serviceType);
+			request.appendUint8(numOfMessagesPerService);
+			uint8_t* messages = (j == 0) ? messages1 : messages2;
+
+			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
+				request.appendUint8(messages[k]);
+			}
+		}
+	}
+}
+
+void validAllReportsOfService(Message& request) {
+	uint8_t numOfApplications = 1;
+	uint8_t numOfServicesPerApp = 2;
+	uint8_t numOfMessagesPerService = 0;
+
+	request.appendUint8(numOfApplications);
+
+	for (auto appID: applications) {
+		request.appendUint8(appID);
+		request.appendUint8(numOfServicesPerApp);
+
+		for (uint8_t j = 0; j < numOfServicesPerApp; j++) {
+			uint8_t serviceType = services[j];
+			request.appendUint8(serviceType);
+			request.appendUint8(numOfMessagesPerService);
+		}
+	}
+}
+
+void validInvalidAllReportsOfService(Message& request) {
+	uint8_t numOfApplications = 3;
+	uint8_t numOfMessagesPerService = 2;
+
+	uint8_t applications2[] = {1, 2, 3};
+	request.appendUint8(numOfApplications);
+
+	for (uint8_t i = 0; i < numOfApplications; i++) {
+		request.appendUint8(applications2[i]);
+		uint8_t numOfServicesPerApp = (i == 0) ? 12 : 2;
+		uint8_t* servicesToPick = (i == 0) ? redundantServices : services;
+		request.appendUint8(numOfServicesPerApp);
+
+		for (uint8_t j = 0; j < numOfServicesPerApp; j++) {
+			uint8_t serviceType = servicesToPick[j];
+			request.appendUint8(serviceType);
+			uint8_t numOfMessages = (i < 2) ? 0 : numOfMessagesPerService;
+			request.appendUint8(numOfMessages);
+			if (i >= 2) {
+				uint8_t* messages = (j == 0) ? messages1 : messages2;
+
+				for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
+					request.appendUint8(messages[k]);
+				}
+			}
+		}
+	}
+}
+
+void validAllReportsOfApp(Message& request) {
+	uint8_t numOfApplications = 1;
+	uint8_t numOfServicesPerApp = 0;
+
+	request.appendUint8(numOfApplications);
+
+	for (auto appID: applications) {
+		request.appendUint8(appID);
+		request.appendUint8(numOfServicesPerApp);
+	}
+}
+
+void validInvalidAllReportsOfApp(Message& request) {
+	uint8_t numOfApplications = 3;
+	uint8_t numOfMessagesPerService = 2;
+
+	uint8_t applications2[] = {1, 2, 3};
+	request.appendUint8(numOfApplications);
+
+	for (uint8_t i = 0; i < numOfApplications; i++) {
+		request.appendUint8(applications2[i]);
+		uint8_t numOfServicesPerApp = (i == 0 or i == 1) ? 0 : 2;
+		uint8_t* servicesToPick = (i == 0) ? redundantServices : services;
+		request.appendUint8(numOfServicesPerApp);
+
+		if (i >= 2) {
+			for (uint8_t j = 0; j < numOfServicesPerApp; j++) {
+				uint8_t serviceType = servicesToPick[j];
+				request.appendUint8(serviceType);
+				uint8_t numOfMessages = (i == 0 or i == 1) ? 0 : numOfMessagesPerService;
+				request.appendUint8(numOfMessages);
+
+				uint8_t* messages = (j == 0) ? messages1 : messages2;
+
+				for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
+					request.appendUint8(messages[k]);
+				}
+			}
+		}
+	}
+}
+
+void resetAppProcessConfiguration() {
+	realTimeForwarding.applicationProcessConfiguration.definitions.clear();
+	REQUIRE(realTimeForwarding.applicationProcessConfiguration.definitions.empty());
+}
+
+TEST_CASE("Add report types to the Application Process Configuration") {
+	SECTION("Successful addition of report types to the Application Process Configuration") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+
+		uint8_t applicationID = 1;
+		realTimeForwarding.controlledApplications.push_back(applicationID);
+		validReportTypes(request);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 0);
+		auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions;
+		REQUIRE(applicationProcesses.size() == 2);
+
+		for (auto appID: applications) {
+			for (uint8_t j = 0; j < 2; j++) {
+				uint8_t serviceType = services[j];
+				auto appServicePair = std::make_pair(appID, serviceType);
+				REQUIRE(applicationProcesses.find(appServicePair) != applicationProcesses.end());
+				REQUIRE(applicationProcesses[appServicePair].size() == 2);
+				uint8_t* messages = (j == 0) ? messages1 : messages2;
+
+				for (uint8_t k = 0; k < 2; k++) {
+					REQUIRE(std::find(applicationProcesses[appServicePair].begin(),
+					                  applicationProcesses[appServicePair].end(),
+					                  messages[k]) != applicationProcesses[appServicePair].end());
+				}
+			}
+		}
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Requested Application Process is not controlled by the service") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+
+		uint8_t applicationID = 1;
+		validReportTypes(request);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 1);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == 1);
+		REQUIRE(realTimeForwarding.applicationProcessConfiguration.definitions.empty());
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("All service types already allowed") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+
+		uint8_t applicationID = 1;
+		realTimeForwarding.controlledApplications.push_back(applicationID);
+		validReportTypes(request);
+
+		for (uint8_t i = 1; i < ECSSMaxServiceTypeDefinitions + 1; i++) {
+			realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID, i)];
+		}
+		CHECK(realTimeForwarding.applicationProcessConfiguration.definitions.size() == ECSSMaxServiceTypeDefinitions);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 1);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::AllServiceTypesAlreadyAllowed) ==
+		      1);
+		REQUIRE(realTimeForwarding.applicationProcessConfiguration.definitions.size() == ECSSMaxServiceTypeDefinitions);
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Max service types already reached") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+
+		uint8_t applicationID = 1;
+		uint8_t serviceType1 = services[0]; // st03
+		uint8_t serviceType2 = services[1]; // st05
+
+		realTimeForwarding.controlledApplications.push_back(applicationID);
+		validReportTypes(request);
+
+		auto& applicationProcessConfig = realTimeForwarding.applicationProcessConfiguration.definitions;
+
+		for (uint8_t i = 100; i < ECSSMaxServiceTypeDefinitions + 99; i++) {
+			applicationProcessConfig[std::make_pair(applicationID, i)];
+		}
+		CHECK(applicationProcessConfig.size() == ECSSMaxServiceTypeDefinitions - 1);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 1);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 1);
+		REQUIRE(applicationProcessConfig.size() == ECSSMaxServiceTypeDefinitions);
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("All report types already allowed") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+
+		uint8_t applicationID = 1;
+		uint8_t serviceType = services[0]; // st03
+		realTimeForwarding.controlledApplications.push_back(applicationID);
+		validReportTypes(request);
+
+		for (auto message: AllMessageTypes::messagesOfService[serviceType]) {
+			realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)]
+			    .push_back(message);
+		}
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 2);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxReportTypesReached) ==
+		      2);
+		REQUIRE(
+		    realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID, serviceType)]
+		        .size() == AllMessageTypes::messagesOfService[serviceType].size());
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Max report types already reached") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+
+		uint8_t applicationID = 1;
+		uint8_t serviceType1 = services[0]; // st03
+		uint8_t serviceType2 = services[1]; // st05
+
+		realTimeForwarding.controlledApplications.push_back(applicationID);
+		validReportTypes(request);
+
+		auto& applicationProcessConfig = realTimeForwarding.applicationProcessConfiguration;
+
+		auto appServicePair1 = std::make_pair(applicationID, serviceType1);
+		auto appServicePair2 = std::make_pair(applicationID, serviceType2);
+		REQUIRE(applicationProcessConfig.definitions[appServicePair1].empty());
+		REQUIRE(applicationProcessConfig.definitions[appServicePair2].empty());
+
+		auto numOfMessages1 = AllMessageTypes::messagesOfService[serviceType1].size();
+		auto numOfMessages2 = AllMessageTypes::messagesOfService[serviceType2].size();
+
+		for (uint8_t i = 0; i < numOfMessages1 - 1; i++) {
+			applicationProcessConfig.definitions[appServicePair1].push_back(i);
+		}
+		for (uint8_t i = 16; i < numOfMessages2 + 15; i++) {
+			applicationProcessConfig.definitions[appServicePair2].push_back(i);
+		}
+		REQUIRE(applicationProcessConfig.definitions[appServicePair1].size() == numOfMessages1 - 1);
+		REQUIRE(applicationProcessConfig.definitions[appServicePair2].size() == numOfMessages2 - 1);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 2);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxReportTypesReached) == 2);
+		REQUIRE(applicationProcessConfig.definitions.size() == 2);
+		REQUIRE(applicationProcessConfig.definitions[appServicePair1].size() == numOfMessages1);
+		REQUIRE(applicationProcessConfig.definitions[appServicePair2].size() == numOfMessages2);
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Requested addition of duplicate report type definitions") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+
+		uint8_t applicationID = 1;
+		realTimeForwarding.controlledApplications.push_back(applicationID);
+		duplicateReportTypes(request);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 0);
+		auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions;
+		REQUIRE(applicationProcesses.size() == 2);
+
+		for (auto appID: applications) {
+			for (auto& serviceType: services) {
+				auto appServicePair = std::make_pair(appID, serviceType);
+				REQUIRE(applicationProcesses.find(appServicePair) != applicationProcesses.end());
+				REQUIRE(applicationProcesses[appServicePair].size() == 1);
+				REQUIRE(std::find(applicationProcesses[appServicePair].begin(),
+				                  applicationProcesses[appServicePair].end(),
+				                  messages1[0]) != applicationProcesses[appServicePair].end());
+			}
+		}
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Valid and invalid application-related requests combined") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+		uint8_t applicationID1 = 1;
+		uint8_t applicationID2 = 2;
+		uint8_t applicationID3 = 3;
+		realTimeForwarding.controlledApplications.push_back(applicationID1);
+		realTimeForwarding.controlledApplications.push_back(applicationID3);
+		validInvalidReportTypes(request);
+
+		for (uint8_t i = 100; i < ECSSMaxServiceTypeDefinitions + 99; i++) {
+			realTimeForwarding.applicationProcessConfiguration.definitions[std::make_pair(applicationID3, i)];
+		}
+		CHECK(realTimeForwarding.applicationProcessConfiguration.definitions.size() ==
+		      ECSSMaxServiceTypeDefinitions - 1);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 7);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == 1);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 3);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxReportTypesReached) == 3);
+
+		auto& definitions = realTimeForwarding.applicationProcessConfiguration.definitions;
+		REQUIRE(definitions.size() == 20);
+		for (auto serviceType: allServices) {
+			REQUIRE(definitions.find(std::make_pair(applicationID1, serviceType)) != definitions.end());
+		}
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Valid addition of all report types of a specified service type") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+		uint8_t applicationID1 = 1;
+		realTimeForwarding.controlledApplications.push_back(applicationID1);
+		validAllReportsOfService(request);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 0);
+		auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions;
+		for (auto serviceType: services) {
+			REQUIRE(applicationProcesses[std::make_pair(applicationID1, serviceType)].size() ==
+			        AllMessageTypes::messagesOfService[serviceType].size());
+		}
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Addition of all report types of a service type, combined with invalid requests") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+		uint8_t applicationID1 = 1;
+		uint8_t applicationID2 = 2;
+		realTimeForwarding.controlledApplications.push_back(applicationID1);
+		realTimeForwarding.controlledApplications.push_back(applicationID2);
+		validInvalidAllReportsOfService(request);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 3);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == 1);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::MaxServiceTypesReached) == 2);
+
+		auto& definitions = realTimeForwarding.applicationProcessConfiguration.definitions;
+		REQUIRE(definitions.size() == 12);
+
+		int cnt1 = 0;
+		int cnt2 = 0;
+		for (auto& pair: definitions) {
+			if (pair.first.first == applicationID1) {
+				cnt1++;
+			} else if (pair.first.first == applicationID2) {
+				cnt2++;
+			}
+		}
+		REQUIRE(cnt1 == 10);
+		REQUIRE(cnt2 == 2);
+
+		for (auto& serviceType: allServices) {
+			REQUIRE(definitions[std::make_pair(applicationID1, serviceType)].size() ==
+			        AllMessageTypes::messagesOfService[serviceType].size());
+		}
+		for (auto& serviceType: services) {
+			REQUIRE(definitions[std::make_pair(applicationID2, serviceType)].size() ==
+			        AllMessageTypes::messagesOfService[serviceType].size());
+		}
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Valid addition of all report types of an application process") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+		uint8_t applicationID1 = 1;
+		realTimeForwarding.controlledApplications.push_back(applicationID1);
+		validAllReportsOfApp(request);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 0);
+		auto& definitions = realTimeForwarding.applicationProcessConfiguration.definitions;
+		REQUIRE(definitions.size() == ECSSMaxServiceTypeDefinitions);
+
+		for (auto serviceType: allServices) {
+			REQUIRE(std::equal(definitions[std::make_pair(applicationID1, serviceType)].begin(),
+			                   definitions[std::make_pair(applicationID1, serviceType)].end(),
+			                   AllMessageTypes::messagesOfService[serviceType].begin()));
+		}
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+
+	SECTION("Addition of all report types of an application process, combined with invalid request") {
+		Message request(RealTimeForwardingControlService::ServiceType,
+		                RealTimeForwardingControlService::MessageType::AddReportTypesToAppProcessConfiguration,
+		                Message::TC, 1);
+		uint8_t applicationID1 = 1;
+		uint8_t applicationID2 = 2;
+		realTimeForwarding.controlledApplications.push_back(applicationID1);
+		realTimeForwarding.controlledApplications.push_back(applicationID2);
+		validInvalidAllReportsOfApp(request);
+
+		MessageParser::execute(request);
+
+		CHECK(ServiceTests::count() == 1);
+		CHECK(ServiceTests::countThrownErrors(ErrorHandler::ExecutionStartErrorType::NotControlledApplication) == 1);
+		auto& definitions = realTimeForwarding.applicationProcessConfiguration.definitions;
+
+		REQUIRE(definitions.size() == 2 * ECSSMaxServiceTypeDefinitions);
+
+		resetAppProcessConfiguration();
+		ServiceTests::reset();
+		Services.reset();
+	}
+}
+
+uint8_t applications_[] = {1};
+uint8_t services_[] = {3, 5};
+uint8_t allServices_[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+uint8_t redundantServices_[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
+uint8_t messages1_[] = {HousekeepingService::MessageType::HousekeepingPeriodicPropertiesReport,
+                        HousekeepingService::MessageType::DisablePeriodicHousekeepingParametersReport};
+
+uint8_t messages2_[] = {EventReportService::MessageType::InformativeEventReport,
+                        EventReportService::MessageType::DisabledListEventReport};
+
 bool findApplication(uint8_t targetAppID) {
 	auto& definitions = realTimeForwarding.applicationProcessConfiguration.definitions;
 	return std::any_of(std::begin(definitions), std::end(definitions), [targetAppID](auto definition) { return targetAppID == definition.first.first; });
@@ -31,7 +576,7 @@ void checkAppProcessConfig() {
 	auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions;
 
 	// Check if configuration is initialized properly
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		REQUIRE(findApplication(appID));
 
 		for (auto serviceType: services) {
@@ -39,7 +584,7 @@ void checkAppProcessConfig() {
 			REQUIRE(findServiceType(appID, serviceType));
 			REQUIRE(applicationProcesses[appServicePair].size() == 2);
 
-			for (auto messageType: messages1) {
+			for (auto messageType: messages1_) {
 				REQUIRE(std::find(applicationProcesses[appServicePair].begin(),
 				                  applicationProcesses[appServicePair].end(),
 				                  messageType) != applicationProcesses[appServicePair].end());
@@ -53,10 +598,10 @@ void initializeAppProcessConfig() {
 	//	uint8_t numOfServicesPerApp = 2;
 	//	uint8_t numOfMessagesPerService = 2;
 
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		for (auto serviceType: services) {
 			auto appServicePair = std::make_pair(appID, serviceType);
-			for (auto messageType: messages1) {
+			for (auto messageType: messages1_) {
 				realTimeForwarding.applicationProcessConfiguration.definitions[appServicePair].push_back(
 				    messageType);
 			}
@@ -78,11 +623,11 @@ void checkAppProcessConfig2() {
 		REQUIRE(findApplication(appID));
 
 		uint8_t numOfServices = (i == 2) ? 15 : 2;
-		uint8_t* serviceTypes = (i == 2) ? allServices : services;
+		uint8_t* serviceTypes = (i == 2) ? allServices_ : services_;
 
 		for (uint8_t j = 0; j < numOfServices; j++) {
 			uint8_t serviceType = serviceTypes[j];
-			uint8_t* messages = (i == 2) ? messages2 : messages1;
+			uint8_t* messages = (i == 2) ? messages2_ : messages1_;
 
 			REQUIRE(findServiceType(appID, serviceType));
 			auto appServicePair = std::make_pair(appID, serviceType);
@@ -107,11 +652,11 @@ void initializeAppProcessConfig2() {
 	for (uint8_t i = 0; i < numOfApplications; i++) {
 		uint8_t appID = applications2[i];
 		uint8_t numOfServices = (i == 2) ? 15 : 2;
-		uint8_t* serviceTypes = (i == 2) ? allServices : services;
+		uint8_t* serviceTypes = (i == 2) ? allServices_ : services_;
 
 		for (uint8_t j = 0; j < numOfServices; j++) {
 			uint8_t serviceType = serviceTypes[j];
-			uint8_t* messages = (i == 2) ? messages2 : messages1;
+			uint8_t* messages = (i == 2) ? messages2_ : messages1_;
 
 			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
 				uint8_t messageType = messages[k];
@@ -130,7 +675,7 @@ void serviceNotInApplication(Message& request) {
 
 	request.appendUint8(numOfApplications);
 
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		request.appendUint8(appID);
 		request.appendUint8(numOfServicesPerApp);
 
@@ -138,7 +683,7 @@ void serviceNotInApplication(Message& request) {
 			uint8_t nonExistingService = 13; // add arbitrary, non-existing service type
 			request.appendUint8(nonExistingService);
 			request.appendUint8(numOfMessagesPerService);
-			uint8_t* messages = (j == 0) ? messages1 : messages2;
+			uint8_t* messages = (j == 0) ? messages1_ : messages2_;
 
 			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
 				request.appendUint8(messages[k]);
@@ -154,7 +699,7 @@ void messageNotInApplication(Message& request) {
 
 	request.appendUint8(numOfApplications);
 
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		request.appendUint8(appID);
 		request.appendUint8(numOfServicesPerApp);
 
@@ -179,7 +724,7 @@ void deleteValidReportTypes(Message& request) {
 
 	request.appendUint8(numOfApplications);
 
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		request.appendUint8(appID);
 		request.appendUint8(numOfServicesPerApp);
 
@@ -189,7 +734,7 @@ void deleteValidReportTypes(Message& request) {
 			request.appendUint8(numOfMessagesPerService);
 
 			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
-				request.appendUint8(messages1[k]);
+				request.appendUint8(messages1_[k]);
 			}
 		}
 	}
@@ -202,7 +747,7 @@ void deleteReportEmptyService(Message& request) {
 
 	request.appendUint8(numOfApplications);
 
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		request.appendUint8(appID);
 		request.appendUint8(numOfServicesPerApp);
 
@@ -212,7 +757,7 @@ void deleteReportEmptyService(Message& request) {
 			request.appendUint8(numOfMessagesPerService);
 
 			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
-				request.appendUint8(messages1[k]);
+				request.appendUint8(messages1_[k]);
 			}
 		}
 	}
@@ -225,17 +770,17 @@ void deleteReportEmptyApplication(Message& request) {
 
 	request.appendUint8(numOfApplications);
 
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		request.appendUint8(appID);
 		request.appendUint8(numOfServicesPerApp);
 
 		for (uint8_t j = 0; j < numOfServicesPerApp; j++) {
-			uint8_t serviceType = services[j];
+			uint8_t serviceType = services_[j];
 			request.appendUint8(serviceType);
 			request.appendUint8(numOfMessagesPerService);
 
 			for (uint8_t k = 0; k < numOfMessagesPerService; k++) {
-				request.appendUint8(messages1[k]);
+				request.appendUint8(messages1_[k]);
 			}
 		}
 	}
@@ -246,7 +791,7 @@ void deleteApplicationProcess(Message& request) {
 	uint8_t numOfServicesPerApp = 0;
 
 	request.appendUint8(numOfApplications);
-	request.appendUint8(applications[0]);
+	request.appendUint8(applications_[0]);
 	request.appendUint8(numOfServicesPerApp);
 }
 
@@ -256,7 +801,7 @@ void deleteService(Message& request) {
 	uint8_t numOfMessagesPerService = 0;
 
 	request.appendUint8(numOfApplications);
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		request.appendUint8(appID);
 		request.appendUint8(numOfServicesPerApp);
 
@@ -274,7 +819,7 @@ void deleteServiceEmptyApplication(Message& request) {
 	uint8_t numOfMessagesPerService = 0;
 
 	request.appendUint8(numOfApplications);
-	for (auto appID: applications) {
+	for (auto appID: applications_) {
 		request.appendUint8(appID);
 		request.appendUint8(numOfServicesPerApp);
 
@@ -304,7 +849,7 @@ void deleteValidInvalidReportTypes(Message& request) {
 
 		for (uint8_t j = 0; j < numOfServices; j++) {
 			uint8_t serviceType = validInvalidServices[i][j];
-			uint8_t* messages = (i == 2) ? validInvalidMessages : messages1;
+			uint8_t* messages = (i == 2) ? validInvalidMessages : messages1_;
 
 			request.appendUint8(serviceType);
 			request.appendUint8(numOfMessages);
@@ -317,11 +862,6 @@ void deleteValidInvalidReportTypes(Message& request) {
 	}
 }
 
-void resetAppProcessConfiguration() {
-	realTimeForwarding.applicationProcessConfiguration.definitions.clear();
-	REQUIRE(realTimeForwarding.applicationProcessConfiguration.definitions.empty());
-}
-
 TEST_CASE("Delete report types from the Application Process Configuration") {
 	SECTION("Empty the application process configuration") {
 		Message request(RealTimeForwardingControlService::ServiceType,
@@ -414,8 +954,8 @@ TEST_CASE("Delete report types from the Application Process Configuration") {
 		auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions;
 
 		REQUIRE(applicationProcesses.size() == 2);
-		REQUIRE(applicationProcesses[std::make_pair(applicationID, services[0])].size() == 1);
-		REQUIRE(applicationProcesses[std::make_pair(applicationID, services[1])].size() == 1);
+		REQUIRE(applicationProcesses[std::make_pair(applicationID, services_[0])].size() == 1);
+		REQUIRE(applicationProcesses[std::make_pair(applicationID, services_[1])].size() == 1);
 
 		resetAppProcessConfiguration();
 		ServiceTests::reset();
@@ -437,7 +977,7 @@ TEST_CASE("Delete report types from the Application Process Configuration") {
 
 		CHECK(ServiceTests::count() == 0);
 		REQUIRE(applicationProcesses.size() == 1);
-		REQUIRE(findServiceType(applicationID, services[1]));
+		REQUIRE(findServiceType(applicationID, services_[1]));
 
 		resetAppProcessConfiguration();
 		ServiceTests::reset();
@@ -497,7 +1037,7 @@ TEST_CASE("Delete report types from the Application Process Configuration") {
 		auto& applicationProcesses = realTimeForwarding.applicationProcessConfiguration.definitions;
 
 		REQUIRE(applicationProcesses.size() == 1);
-		REQUIRE(not findServiceType(applicationID, services[0]));
+		REQUIRE(not findServiceType(applicationID, services_[0]));
 
 		resetAppProcessConfiguration();
 		ServiceTests::reset();
@@ -517,7 +1057,6 @@ TEST_CASE("Delete report types from the Application Process Configuration") {
 		MessageParser::execute(request);
 
 		CHECK(ServiceTests::count() == 0);
-
 		REQUIRE(applicationProcesses.empty());
 
 		resetAppProcessConfiguration();
@@ -555,11 +1094,11 @@ TEST_CASE("Delete report types from the Application Process Configuration") {
 		// Check for appID = 1
 		uint8_t appID1 = remainingApps[0];
 		REQUIRE(std::count_if(std::begin(definitions), std::end(definitions), [appID1](auto& definition) { return appID1 == definition.first.first; }) == 1);
-		REQUIRE(not findServiceType(appID1, services[0]));
-		auto appServicePair = std::make_pair(appID1, services[1]);
+		REQUIRE(not findServiceType(appID1, services_[0]));
+		auto appServicePair = std::make_pair(appID1, services_[1]);
 		REQUIRE(definitions[appServicePair].size() == 2);
 
-		for (auto& message: messages1) {
+		for (auto& message: messages1_) {
 			REQUIRE(std::find(definitions[appServicePair].begin(),
 			                  definitions[appServicePair].end(),
 			                  message) != definitions[appServicePair].end());
@@ -575,8 +1114,8 @@ TEST_CASE("Delete report types from the Application Process Configuration") {
 
 		for (uint8_t i = 0; i < 15; i++) {
 			uint8_t numOfMessages = (i == 0 or i == 7) ? 1 : 2; // we only deleted one report from services 1 and 8
-			uint8_t* messages = (i == 0 or i == 7) ? remainingMessage : messages2;
-			auto appServicePair1 = std::make_pair(appID3, allServices[i]);
+			uint8_t* messages = (i == 0 or i == 7) ? remainingMessage : messages2_;
+			auto appServicePair1 = std::make_pair(appID3, allServices_[i]);
 
 			REQUIRE(definitions[appServicePair1].size() == numOfMessages);
 			for (uint8_t j = 0; j < numOfMessages; j++) {