diff --git a/ci/cppcheck-misra.sh b/ci/cppcheck-misra.sh
index 1389882e300451d43b623d1bc6fbad31392dadd7..737eb6f217aeb121635dd5cf225b4d3121f1c7e9 100755
--- a/ci/cppcheck-misra.sh
+++ b/ci/cppcheck-misra.sh
@@ -12,13 +12,8 @@ cd "$(dirname "$0")/.."
 
 echo -e "\u001b[34;1mGetting prerequisites...\u001b[0m"
 # grab the MISRA addon and the cppcheck addon interface from github
-curl https://raw.githubusercontent.com/danmar/cppcheck/f4b5b156d720c712f6ce99f6e01d8c1b3f800d52/addons/misra.py > ci/misra.py
-curl https://raw.githubusercontent.com/danmar/cppcheck/f4b5b156d720c712f6ce99f6e01d8c1b3f800d52/addons/cppcheckdata.py > ci/cppcheckdata.py
-
-# clean up old files
-echo -e "\u001b[34;1mRemoving old files...\u001b[0m"
-echo > ci/report.msr # clear the report file
-find inc/ src/ -type f -name "*.dump" | xargs rm
+curl https://raw.githubusercontent.com/danmar/cppcheck/master/addons/misra.py > ci/misra.py
+curl https://raw.githubusercontent.com/danmar/cppcheck/master/addons/cppcheckdata.py > ci/cppcheckdata.py
 
 # generate dump files (XML representations of AST etc.) for all headers, source files etc.
 echo -e "\u001b[34;1mGenerating dump files...\u001b[0m"
@@ -30,9 +25,13 @@ find inc/ src/ -type f -name "*.dump" | xargs python3 ci/misra.py >> ci/report.m
 
 # pre-process the generated report to remove all useless strings
 echo -e "\u001b[34;1mPre-processing report...\u001b[0m"
-sed -i -r 's/(.*Script.*)|(.*Checking.*)|(.*MISRA.*)//gm; /(^$)/d; s/(\s\(.*\)\s)//gm; s/(\]|\[)//gm; s/(misra-c2012-)//gm' ci/report.msr
+sed -i -r 's/(.*Script.*)|(.*Checking.*)|(.*MISRA.*)|(.*Undefined: .*)|(.* \(-\):.*)//gm; /(^$)/d; s/(\s\(.*\)\s)//gm; s/(\]|\[)//gm; s/(misra-c2012-)/:/gm' ci/report.msr
 
 # run the summarizer for a nice, clean summary of errors
 echo -e "\u001b[34;1mSummarizing results...\u001b[0m"
-python3 ci/summarizer.py --report ci/report.msr --suppress 3.1 5.1 5.2 5.3 12.3 14.4 15.5 16.3 18.8
+python3 ci/summarizer.py --report ci/report.msr --suppress 3.1 5.1 5.2 5.3 12.3 13.4 14.4 15.5 16.3 18.4 18.8
 
+# clean up old files
+echo -e "\u001b[34;1mRemoving dump files...\u001b[0m"
+echo > ci/report.msr # clear the report file
+find inc/ src/ -type f -name "*.dump" | xargs rm -rf
diff --git a/ci/cppcheck.sh b/ci/cppcheck.sh
index 8252d5a24d4d604f4d7acfb8c792021dee4019b0..2179a051c88e90de9c07d7f9898422c4c38beb6f 100755
--- a/ci/cppcheck.sh
+++ b/ci/cppcheck.sh
@@ -12,4 +12,5 @@ echo -e "\u001b[34;1mStarting cppcheck...\u001b[0m"
 echo -e "\u001b[34;1mRunning cppcheck with default checklist...\u001b[0m"
 
 cd "$(dirname "$0")/.."
-cppcheck --enable=all --error-exitcode=1 -I inc src test
+cppcheck --enable=all --suppress=unusedFunction --suppress=noExplicitConstructor \
+    --inline-suppr --error-exitcode=1 -I inc src test
diff --git a/inc/Message.hpp b/inc/Message.hpp
index 011f994a5d313a6200fc721e700883c41ca9b480..b03bbbdc0609800b159a23395183fe8be482c99a 100644
--- a/inc/Message.hpp
+++ b/inc/Message.hpp
@@ -85,7 +85,7 @@ public:
 	// We allocate this data statically, in order to make sure there is predictability in the
 	// handling and storage of messages
 	// TODO: Is it a good idea to not initialise this to 0?
-	uint8_t data[ECSS_MAX_MESSAGE_SIZE] = {'\0'};
+	uint8_t data[ECSS_MAX_MESSAGE_SIZE] = { 0 };
 
 	// private:
 	uint8_t currentBit = 0;
diff --git a/src/Message.cpp b/src/Message.cpp
index a969e6ff432d6063787fc83211c5109d72688fc9..13667390dc5f652e3889c55a0c2e9a7aecd09283 100644
--- a/src/Message.cpp
+++ b/src/Message.cpp
@@ -134,7 +134,7 @@ void Message::readString(char* string, uint8_t size) {
 	ASSERT_REQUEST(size < ECSS_MAX_STRING_SIZE, ErrorHandler::StringTooShort);
 
 	memcpy(string, data + readPosition, size);
-	string[size] = '\0'; // todo: Use that for now to avoid problems. Later to be removed
+	string[size] = 0; // todo: Use that for now to avoid problems. Later to be removed
 
 	readPosition += size;
 }
@@ -144,7 +144,7 @@ void Message::readString(uint8_t* string, uint16_t size) {
 	ASSERT_REQUEST(size < ECSS_MAX_STRING_SIZE, ErrorHandler::StringTooShort);
 
 	memcpy(string, data + readPosition, size);
-	string[size] = '\0'; // todo: Use that for now to avoid problems. Later to be removed
+	string[size] = 0; // todo: Use that for now to avoid problems. Later to be removed
 
 	readPosition += size;
 }
diff --git a/src/Services/FunctionManagementService.cpp b/src/Services/FunctionManagementService.cpp
index 88f1a338ce9ad17c63216de8dd15f4f7851f9f0c..f83354ad355c6e5a6899a06b314f8eac95d64f62 100644
--- a/src/Services/FunctionManagementService.cpp
+++ b/src/Services/FunctionManagementService.cpp
@@ -39,7 +39,7 @@ void FunctionManagementService::call(Message& msg) {
 void FunctionManagementService::include(String<FUNC_NAME_LENGTH> funcName, void (*ptr)(String<MAX_ARG_LENGTH>)) {
 	if (not funcPtrIndex.full()) { // CAUTION: etl::map won't check by itself if it's full
 		// before attempting to insert a key-value pair, causing segmentation faults. Check first!
-		funcName.append(FUNC_NAME_LENGTH - funcName.length(), '\0');
+		funcName.append(FUNC_NAME_LENGTH - funcName.length(), 0);
 		funcPtrIndex.insert(std::make_pair(funcName, ptr));
 	} else {
 		ErrorHandler::reportInternalError(ErrorHandler::InternalErrorType::FunctionMapFull);
diff --git a/src/main.cpp b/src/main.cpp
index 6baca61c05a25e2d305499292e060500d7b1999d..b5afecc46859bb5c874be7b497a1bfd2ad58e3e6 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -71,7 +71,7 @@ int main() {
 	char pStr[4];
 	*pStr = 'T';
 	*(pStr + 1) = 'G';
-	*(pStr + 2) = '\0';
+	*(pStr + 2) = 0;
 
 	MemoryManagementService& memMangService = Services.memoryManagement;
 	Message rcvPack = Message(6, 5, Message::TC, 1);
diff --git a/test/ErrorHandler.cpp b/test/ErrorHandler.cpp
index 0e8a14b616dce2b5f5e44ebeb9f06d0d7c9d8d82..c0dc1393a8a513b024a8a2ea597feda54bcd0b71 100644
--- a/test/ErrorHandler.cpp
+++ b/test/ErrorHandler.cpp
@@ -17,7 +17,7 @@ TEST_CASE("Error: Failed Acceptance", "[errors]") {
 
 	CHECK(report.readBits(3) == CCSDS_PACKET_VERSION);
 	CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC));
-	CHECK(report.readBits(1) == false);
+	CHECK(report.readBits(1) == 0);
 	CHECK(report.readBits(11) == 47);
 	CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS);
 	CHECK(report.readBits(14) == failedMessage.packetSequenceCount);
@@ -39,7 +39,7 @@ TEST_CASE("Error: Failed Execution Start", "[errors]") {
 
 	CHECK(report.readBits(3) == CCSDS_PACKET_VERSION);
 	CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC));
-	CHECK(report.readBits(1) == false);
+	CHECK(report.readBits(1) == 0);
 	CHECK(report.readBits(11) == 56);
 	CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS);
 	CHECK(report.readBits(14) == failedMessage.packetSequenceCount);
@@ -61,7 +61,7 @@ TEST_CASE("Error: Failed Execution Progress", "[errors]") {
 
 	CHECK(report.readBits(3) == CCSDS_PACKET_VERSION);
 	CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC));
-	CHECK(report.readBits(1) == false);
+	CHECK(report.readBits(1) == 0);
 	CHECK(report.readBits(11) == 56);
 	CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS);
 	CHECK(report.readBits(14) == failedMessage.packetSequenceCount);
@@ -84,7 +84,7 @@ TEST_CASE("Error: Failed Execution Completion", "[errors]") {
 
 	CHECK(report.readBits(3) == CCSDS_PACKET_VERSION);
 	CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC));
-	CHECK(report.readBits(1) == false);
+	CHECK(report.readBits(1) == 0);
 	CHECK(report.readBits(11) == 56);
 	CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS);
 	CHECK(report.readBits(14) == failedMessage.packetSequenceCount);
@@ -106,7 +106,7 @@ TEST_CASE("Error: Failed Routing", "[errors]") {
 
 	CHECK(report.readBits(3) == CCSDS_PACKET_VERSION);
 	CHECK(report.readBits(1) == static_cast<uint16_t>(Message::TC));
-	CHECK(report.readBits(1) == false);
+	CHECK(report.readBits(1) == 0);
 	CHECK(report.readBits(11) == 71);
 	CHECK(report.readBits(2) == ECSS_SEQUENCE_FLAGS);
 	CHECK(report.readBits(14) == failedMessage.packetSequenceCount);