diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1be913a658697eb33f7285d291d8cea22ac23714..d56b1c4e859d1de9b54dd2558ff170eb8584363b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,6 +14,12 @@ add_custom_target(check
         COMMAND ./cppcheck-misra.sh
         WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/ci")
 
+# Allow the user to set the ECSS Configuration directory using the -DECSS_CONFIGURATION=... command line argument
+set(ECSS_CONFIGURATION "${PROJECT_SOURCE_DIR}/inc/Platform/x86" CACHE PATH
+        "The include directory for the platform-specific ECSS configuration headers"
+        )
+include_directories(${ECSS_CONFIGURATION})
+
 # Specify the .cpp files common across all targets
 add_library(common OBJECT
         src/Service.cpp
@@ -43,8 +49,6 @@ add_executable(ecss_services
         $<TARGET_OBJECTS:common>
         ${x86_main_SRC}
         )
-set_target_properties(ecss_services
-        PROPERTIES COMPILE_DEFINITIONS LOGLEVEL_TRACE)
 
 IF (EXISTS "${PROJECT_SOURCE_DIR}/lib/Catch2/CMakeLists.txt")
     # Gather all the .cpp files corresponding to tests
diff --git a/ci/clang-tidy.sh b/ci/clang-tidy.sh
index bf45a2eb46252b15df6fd7474720622429c86cc1..3ac4810e6a55343c491976dff0e11eac2a146689 100755
--- a/ci/clang-tidy.sh
+++ b/ci/clang-tidy.sh
@@ -13,7 +13,7 @@ cd "$(dirname "$0")"
 GCCVERSION=`g++ -dumpversion`
 
 clang-tidy `find ../src/ -type f -regextype posix-egrep -regex '.*\.(cpp|hpp|c|h)'` \
-    -extra-arg=-fcolor-diagnostics -- -std=c++17 -I../inc -I../lib/etl/include \
+    -extra-arg=-fcolor-diagnostics -- -std=c++17 -I../inc -I../lib/etl/include -I../inc/Platform/x86 \
     -I/usr/include/c++/$GCCVERSION -I/usr/include/x86_64-linux-gnu/c++/$GCCVERSION \
     -I/usr/include/c++/$GCCVERSION/$MACHTYPE
 
diff --git a/ci/cppcheck.sh b/ci/cppcheck.sh
index 2179a051c88e90de9c07d7f9898422c4c38beb6f..d0be486ccf6049895d93a76f070687dcb5c2e775 100755
--- a/ci/cppcheck.sh
+++ b/ci/cppcheck.sh
@@ -13,4 +13,4 @@ echo -e "\u001b[34;1mRunning cppcheck with default checklist...\u001b[0m"
 
 cd "$(dirname "$0")/.."
 cppcheck --enable=all --suppress=unusedFunction --suppress=noExplicitConstructor \
-    --inline-suppr --error-exitcode=1 -I inc src test
+    --force --inline-suppr --error-exitcode=1 -I inc src test
diff --git a/inc/Logger.hpp b/inc/Logger.hpp
index 96c2101f84aeefb375400cfa0dbd54bc34f6b7e0..b5e4b7f21546360ce2d71194b6fc2c7eae4a7cd3 100644
--- a/inc/Logger.hpp
+++ b/inc/Logger.hpp
@@ -4,6 +4,7 @@
 #include <cstdint>
 #include <etl/String.hpp>
 #include <etl/to_string.h>
+#include "ECSS_Configuration.hpp"
 #include "ECSS_Definitions.hpp"
 
 #if defined LOGLEVEL_TRACE
diff --git a/inc/Platform/x86/ECSS_Configuration.hpp b/inc/Platform/x86/ECSS_Configuration.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..a627d61ae8dcb1790d5c6db133c18096a1d6f7f4
--- /dev/null
+++ b/inc/Platform/x86/ECSS_Configuration.hpp
@@ -0,0 +1,40 @@
+#ifndef ECSS_SERVICES_ECSS_CONFIGURATION_HPP
+#define ECSS_SERVICES_ECSS_CONFIGURATION_HPP
+
+/**
+ * @file
+ * The configuration file for this ECSS Services platform.
+ *
+ * @see GlobalLogLevels Define the minimum level for logged messages
+ * @see ServiceDefinitions Define the service types that will be compiled
+ */
+
+// Log all levels of messages
+#define LOGLEVEL_TRACE
+
+/**
+ * @defgroup ServiceDefinitions Service compilation switches
+ * These preprocessor defines control whether the compilation of each ECSS service is enabled. By not defining one of
+ * those, the service will not be compiled, and no RAM or ROM will be spent storing it.
+ *
+ * Define these in the `ECSS_Configuration.hpp` file of your platform.
+ * @{
+ */
+
+#define SERVICE_ALL ///< Enables compilation of all the ECSS services
+
+#ifdef 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
+#define SERVICE_LARGEPACKET         ///<  Compile ST[13] large packet transfer
+#define SERVICE_MEMORY              ///<  Compile ST[06] memory management
+#define SERVICE_PARAMETER           ///<  Compile ST[20] parameter management
+#define SERVICE_REQUESTVERIFICATION ///<  Compile ST[01] request verification
+#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/ServicePool.hpp b/inc/ServicePool.hpp
index f6a7ea23ecc2e1d865c9ff3f454249e0b0520f94..51c1fa201b856c3f1b0225113c1e60860f36ff1a 100644
--- a/inc/ServicePool.hpp
+++ b/inc/ServicePool.hpp
@@ -1,7 +1,8 @@
 #ifndef ECSS_SERVICES_SERVICEPOOL_HPP
 #define ECSS_SERVICES_SERVICEPOOL_HPP
 
-#include <Services/TimeBasedSchedulingService.hpp>
+#include "ECSS_Configuration.hpp"
+#include "Services/TimeBasedSchedulingService.hpp"
 #include "Services/LargePacketTransferService.hpp"
 #include "Services/RequestVerificationService.hpp"
 #include "Services/TimeManagementService.hpp"
@@ -16,8 +17,6 @@
  * Defines a class that contains instances of all Services.
  *
  * All Services should be stored here and should not be instantiated in a different way.
- *
- * @todo Find a way to disable services which are not used
  */
 class ServicePool {
 	/**
@@ -34,16 +33,45 @@ class ServicePool {
 	 */
 	uint16_t packetSequenceCounter = 0;
 public:
-	RequestVerificationService requestVerification;
+#ifdef SERVICE_EVENTACTION
+	EventActionService eventAction;
+#endif
+
+#ifdef SERVICE_EVENTREPORT
 	EventReportService eventReport;
+#endif
+
+#ifdef SERVICE_FUNCTION
+	FunctionManagementService functionManagement;
+#endif
+
+#ifdef SERVICE_LARGEPACKET
+	LargePacketTransferService largePacketTransferService;
+#endif
+
+#ifdef SERVICE_MEMORY
 	MemoryManagementService memoryManagement;
-	TimeManagementService timeManagement;
-	EventActionService eventAction;
-	TestService testService;
+#endif
+
+#ifdef SERVICE_PARAMETER
 	ParameterService parameterManagement;
-	LargePacketTransferService largePacketTransferService;
-	FunctionManagementService functionManagement;
+#endif
+
+#ifdef SERVICE_REQUESTVERIFICATION
+	RequestVerificationService requestVerification;
+#endif
+
+#ifdef SERVICE_TEST
+	TestService testService;
+#endif
+
+#ifdef SERVICE_TIME
+	TimeManagementService timeManagement;
+#endif
+
+#ifdef SERVICE_TIMESCHEDULING
 	TimeBasedSchedulingService timeBasedScheduling;
+#endif
 
 	/**
 	 * The default ServicePool constructor
diff --git a/inc/Services/EventReportService.hpp b/inc/Services/EventReportService.hpp
index 69b80e80b504457b3e7f2ddb1cf76f16fb7ad174..376b35d4a5194cf56397c02dd1c606c6f7a96c15 100644
--- a/inc/Services/EventReportService.hpp
+++ b/inc/Services/EventReportService.hpp
@@ -13,8 +13,6 @@
  * Note: enum IDs are these just for test purposes
  *
  */
-#define CSS_EVENTS_MAX_COUNT 16
-#define ECSS_EVENTS_BITS 16
 
 class EventReportService : public Service {
 private:
diff --git a/src/ErrorHandler.cpp b/src/ErrorHandler.cpp
index 1cba15ca835dca1022adb68c032bb6912592dd8f..be57cb6023a3c847b47e02f71b15f0d19202b2f3 100644
--- a/src/ErrorHandler.cpp
+++ b/src/ErrorHandler.cpp
@@ -6,34 +6,44 @@
 
 template <>
 void ErrorHandler::reportError(const Message& message, AcceptanceErrorType errorCode) {
+#ifdef SERVICE_REQUESTVERIFICATION
 	Services.requestVerification.failAcceptanceVerification(message, errorCode);
+#endif
 
 	logError(message, errorCode);
 }
 
 template <>
 void ErrorHandler::reportError(const Message& message, ExecutionStartErrorType errorCode) {
+#ifdef SERVICE_REQUESTVERIFICATION
 	Services.requestVerification.failStartExecutionVerification(message, errorCode);
+#endif
 
 	logError(message, errorCode);
 }
 
 void ErrorHandler::reportProgressError(const Message& message, ExecutionProgressErrorType errorCode, uint8_t stepID) {
+#ifdef SERVICE_REQUESTVERIFICATION
 	Services.requestVerification.failProgressExecutionVerification(message, errorCode, stepID);
+#endif
 
 	logError(message, errorCode);
 }
 
 template <>
 void ErrorHandler::reportError(const Message& message, ExecutionCompletionErrorType errorCode) {
+#ifdef SERVICE_REQUESTVERIFICATION
 	Services.requestVerification.failCompletionExecutionVerification(message, errorCode);
+#endif
 
 	logError(message, errorCode);
 }
 
 template <>
 void ErrorHandler::reportError(const Message& message, RoutingErrorType errorCode) {
+#ifdef SERVICE_REQUESTVERIFICATION
 	Services.requestVerification.failRoutingVerification(message, errorCode);
+#endif
 
 	logError(message, errorCode);
 }
diff --git a/src/MessageParser.cpp b/src/MessageParser.cpp
index a9dc0a4266d10c04d1d0e71b9a66e5921e0b5a61..b4eb3953d2e6ecba5f4115759ba0ac062fb2847e 100644
--- a/src/MessageParser.cpp
+++ b/src/MessageParser.cpp
@@ -8,30 +8,54 @@
 
 void MessageParser::execute(Message& message) {
 	switch (message.serviceType) {
+#ifdef SERVICE_EVENTREPORT
 		case 5:
 			Services.eventReport.execute(message); // ST[05]
 			break;
+#endif
+
+#ifdef SERVICE_MEMORY
 		case 6:
 			Services.memoryManagement.execute(message); // ST[06]
 			break;
+#endif
+
+#ifdef SERVICE_FUNCTION
 		case 8:
 			Services.functionManagement.execute(message); // ST[08]
 			break;
+#endif
+
+#ifdef SERVICE_TIME
 		case 9:
 			Services.timeManagement.execute(message); // ST[09]
 			break;
+#endif
+
+#ifdef SERVICE_TIMESCHEDULING
 		case 11:
 			Services.timeBasedScheduling.execute(message); // ST[11]
 			break;
+#endif
+
+#ifdef SERVICE_TEST
 		case 17:
 			Services.testService.execute(message); // ST[17]
 			break;
+#endif
+
+#ifdef SERVICE_EVENTACTION
 		case 19:
 			Services.eventAction.execute(message); // ST[19]
 			break;
+#endif
+
+#ifdef SERVICE_PARAMETER
 		case 20:
 			Services.parameterManagement.execute(message); // ST[20]
 			break;
+#endif
+
 		default:
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
 	}
diff --git a/src/Services/EventActionService.cpp b/src/Services/EventActionService.cpp
index bd06114d32b917eab4f894c077a1331474c2dc43..f42079794019ef1d4fca34b4ed176e7d40e5c18c 100644
--- a/src/Services/EventActionService.cpp
+++ b/src/Services/EventActionService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_EVENTACTION
+
 #include "Services/EventActionService.hpp"
 #include "Message.hpp"
 #include "MessageParser.hpp"
@@ -217,3 +220,5 @@ void EventActionService::execute(Message& message) {
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
 	}
 }
+
+#endif
\ No newline at end of file
diff --git a/src/Services/EventReportService.cpp b/src/Services/EventReportService.cpp
index c805a5fcdfdbb5784ffe7af5e5745f75a706ec55..ce97f874a51aa795556b313e901448237c68c13b 100644
--- a/src/Services/EventReportService.cpp
+++ b/src/Services/EventReportService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_EVENTREPORT
+
 #include <Services/EventReportService.hpp>
 #include <Services/EventActionService.hpp>
 #include "Message.hpp"
@@ -144,3 +147,5 @@ void EventReportService::execute(Message& message) {
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
 	}
 }
+
+#endif
diff --git a/src/Services/FunctionManagementService.cpp b/src/Services/FunctionManagementService.cpp
index cefd97023eb0bc2c2e35162c0f5f740858ff3a95..4cee2c0c7f77749b1ff34f1bd4aa87c0809d8fb5 100644
--- a/src/Services/FunctionManagementService.cpp
+++ b/src/Services/FunctionManagementService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_FUNCTION
+
 #include "Services/FunctionManagementService.hpp"
 
 void FunctionManagementService::call(Message& msg) {
@@ -57,3 +60,5 @@ void FunctionManagementService::execute(Message& message) {
 			break;
 	}
 }
+
+#endif
diff --git a/src/Services/LargePacketTransferService.cpp b/src/Services/LargePacketTransferService.cpp
index 95b3cafafd1e89b51999563dd8473bd2c989275c..38a0a666b533eb7f7123389a4ad08a7c67a903c9 100644
--- a/src/Services/LargePacketTransferService.cpp
+++ b/src/Services/LargePacketTransferService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_LARGEPACKET
+
 #include <Services/LargePacketTransferService.hpp>
 #include "Message.hpp"
 #include <etl/String.hpp>
@@ -88,3 +91,5 @@ void LargePacketTransferService::split(Message& message, uint16_t largeMessageTr
 	stringPart = dataPart;
 	lastDownlinkPartReport(largeMessageTransactionIdentifier, (parts - 1U), stringPart);
 }
+
+#endif
diff --git a/src/Services/MemoryManagementService.cpp b/src/Services/MemoryManagementService.cpp
index d592da573bbc7de0b99d86abcc02241b228afb84..7bee194156e2858671a33bd70febec9b18fdf843 100644
--- a/src/Services/MemoryManagementService.cpp
+++ b/src/Services/MemoryManagementService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_MEMORY
+
 #include "Services/MemoryManagementService.hpp"
 #include <iostream>
 #include <cerrno>
@@ -236,3 +239,5 @@ void MemoryManagementService::execute(Message& message) {
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
 	}
 }
+
+#endif
diff --git a/src/Services/ParameterService.cpp b/src/Services/ParameterService.cpp
index 018de09f2a197bc8f87a66b518d5618e5b16ee26..aee2de5da27401a6a523f041cda172e112504281 100644
--- a/src/Services/ParameterService.cpp
+++ b/src/Services/ParameterService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_PARAMETER
+
 #include "Services/ParameterService.hpp"
 
 #define DEMOMODE
@@ -131,3 +134,5 @@ void ParameterService::execute(Message& message) {
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
 	}
 }
+
+#endif
diff --git a/src/Services/RequestVerificationService.cpp b/src/Services/RequestVerificationService.cpp
index e298a18276441c4a2792afcbb313ad89034026ac..56bcdf07e3d72f9334f9f82c6cb81c98e7f546e0 100644
--- a/src/Services/RequestVerificationService.cpp
+++ b/src/Services/RequestVerificationService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_REQUESTVERIFICATION
+
 #include "Services/RequestVerificationService.hpp"
 
 void RequestVerificationService::successAcceptanceVerification(const Message& request) {
@@ -147,3 +150,5 @@ void RequestVerificationService::failRoutingVerification(const Message& request,
 
 	storeMessage(report);
 }
+
+#endif
diff --git a/src/Services/TestService.cpp b/src/Services/TestService.cpp
index 001726da6eee06412b6fff685f9114610c05aaa8..53a42b10a2ee0644be2c610ac09ba05a0e5ae110 100644
--- a/src/Services/TestService.cpp
+++ b/src/Services/TestService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_TEST
+
 #include "Services/TestService.hpp"
 
 void TestService::areYouAlive(Message& request) {
@@ -30,3 +33,5 @@ void TestService::execute(Message& message) {
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
 	}
 }
+
+#endif
diff --git a/src/Services/TimeBasedSchedulingService.cpp b/src/Services/TimeBasedSchedulingService.cpp
index d381318e8adb84d14eeea958713104d5d712ef74..b88e04ec06ee58b32a282269b6d7ac610a0d3d9c 100644
--- a/src/Services/TimeBasedSchedulingService.cpp
+++ b/src/Services/TimeBasedSchedulingService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_TIMESCHEDULING
+
 #include "Services/TimeBasedSchedulingService.hpp"
 
 TimeBasedSchedulingService::TimeBasedSchedulingService() {
@@ -293,3 +296,5 @@ void TimeBasedSchedulingService::execute(Message& message) {
 			ErrorHandler::reportInternalError(ErrorHandler::OtherMessageType);
 	}
 }
+
+#endif
diff --git a/src/Services/TimeManagementService.cpp b/src/Services/TimeManagementService.cpp
index 9e281450768a3978df10b857c7d763fcd21cbd78..d12061958917c080c0bda02b9aae15f839b4fec7 100644
--- a/src/Services/TimeManagementService.cpp
+++ b/src/Services/TimeManagementService.cpp
@@ -1,3 +1,6 @@
+#include "ECSS_Configuration.hpp"
+#ifdef SERVICE_TIME
+
 #include "Services/TimeManagementService.hpp"
 
 void TimeManagementService::cdsTimeReport(TimeAndDate& TimeInfo) {
@@ -35,3 +38,5 @@ void TimeManagementService::execute(Message& message) {
 			break;
 	}
 }
+
+#endif