diff --git a/tc/obsw_tc_service3.py b/tc/obsw_tc_service3.py
index 40b30ed48cf54d97d54d4043e774f89e12678f3a..3f85dc1b1cc4a08fec8d6667183f19bdfb07527d 100644
--- a/tc/obsw_tc_service3.py
+++ b/tc/obsw_tc_service3.py
@@ -30,10 +30,9 @@ sid_internal_err_rprtr = make_sid(g.INTERNAL_ERROR_REPORTER_ID, 0)
 def pack_service3_test_into(tc_queue: Deque) -> Deque:
     tc_queue.appendleft(("print", "Testing Service 3"))
     # Predefined packet testing
-    pack_test_device_test(tc_queue)
-    pack_custom_tests(tc_queue)
+    # pack_test_device_test(tc_queue)
+    # pack_custom_tests(tc_queue)
     pack_internal_error_reporter_tests(tc_queue)
-
     tc_queue.appendleft(("export", "log/tmtc_log_service3.txt"))
     return tc_queue
 
@@ -71,16 +70,18 @@ def pack_custom_tests(tc_queue: Deque):
 
 
 def pack_internal_error_reporter_tests(tc_queue: Deque):
-    new_interval = 1.2
-    interval_app_data = sid_thermalsensor + make_interval(new_interval)
-    tc_queue.appendleft(("print", "Setting interval to 3.0 second: "))
-    command = PusTelecommand(service=3, subservice=32, ssc=3102, app_data=interval_app_data)
+    new_interval = 3.0
+    interval_app_data = sid_internal_err_rprtr + make_interval(new_interval)
+    tc_queue.appendleft(("print", "Setting internal error reporter interval to 3.0 second: "))
+    command = PusTelecommand(service=3, subservice=32, ssc=3105, app_data=interval_app_data)
     tc_queue.appendleft(command.pack_command_tuple())
 
-    tc_queue.appendleft(("print", "Enabling periodic thermal sensor packet generation: "))
-    command = PusTelecommand(service=3, subservice=6, ssc=3101, app_data=sid_thermalsensor)
+    tc_queue.appendleft(("print", "Enabling internal error reporter generation: "))
+    command = PusTelecommand(service=3, subservice=7, ssc=3106, app_data=sid_internal_err_rprtr)
     tc_queue.appendleft(command.pack_command_tuple())
 
+    tc_queue.appendleft(("wait", 3))
+
 
 
 
diff --git a/tm/obsw_tm_service_3.py b/tm/obsw_tm_service_3.py
index e6690277cc6ea21d8386ebbd0aa19084090be575..96be1223fc42fdfb94298ffabd993dfdc1434ede 100644
--- a/tm/obsw_tm_service_3.py
+++ b/tm/obsw_tm_service_3.py
@@ -21,6 +21,7 @@ class Service3TM(PusTelemetry):
     """
     # Minimal packet contains SID, which consists of object ID(4) and set ID(4)
     MINIMAL_PACKET_SIZE = 8
+    HK_START_IDX = MINIMAL_PACKET_SIZE
     # Minimal structure report contains SID (8), reporting status(1), validity flag (1),
     # collection interval as float (4) and number of parameters(1)
     STRUCTURE_REPORT_FIXED_HEADER_SIZE = MINIMAL_PACKET_SIZE + 7
@@ -33,17 +34,17 @@ class Service3TM(PusTelemetry):
             LOGGER.warning(warning)
             return
 
-        self.objectId = struct.unpack('!I', self._tm_data[0:4])[0]
-        self.objectIdRaw = self._tm_data[0:4]
-        self.setId = struct.unpack('!I', self._tm_data[4:8])[0]
-        self.hkHeader = []
-        self.hkContent = []
-        self.hkDefinitionHeader = []
-        self.hkDefinition = []
-        self.numberOfParameters = 0
+        self.object_id = struct.unpack('!I', self._tm_data[0:4])[0]
+        self.object_id_raw = self._tm_data[0:4]
+        self.set_id = struct.unpack('!I', self._tm_data[4:8])[0]
+        self.hk_header = []
+        self.hk_content = []
+        self.hk_definition_header = []
+        self.hk_definition = []
+        self.number_of_parameters = 0
         self.validity_buffer = []
         self.specify_packet_info("Housekeeping Packet")
-        self.paramLength = 0
+        self.param_length = 0
         if self.get_subservice() == 10 or self.get_subservice() == 12:
             self.handle_filling_definition_arrays()
         if self.get_subservice() == 25 or self.get_subservice() == 26:
@@ -51,9 +52,9 @@ class Service3TM(PusTelemetry):
 
     def append_telemetry_content(self, array):
         super().append_telemetry_content(array)
-        array.append(hex(self.objectId))
-        array.append(hex(self.setId))
-        array.append(int(self.paramLength))
+        array.append(hex(self.object_id))
+        array.append(hex(self.set_id))
+        array.append(int(self.param_length))
 
     def append_telemetry_column_headers(self, array):
         super().append_telemetry_column_headers(array)
@@ -62,22 +63,21 @@ class Service3TM(PusTelemetry):
         array.append("HK Data Size")
 
     def handle_filling_definition_arrays(self):
-        self.print_source_data()
         if len(self._tm_data) < self.STRUCTURE_REPORT_FIXED_HEADER_SIZE:
             warning = "Service3TM: handle_filling_definition_arrays: Invalid structure report " \
-                      "from " + str(hex(self.objectId)) + ", is shorter than" + \
+                      "from " + str(hex(self.object_id)) + ", is shorter than" + \
                       str(self.STRUCTURE_REPORT_FIXED_HEADER_SIZE) + "."
             LOGGER.warning(warning)
             return
-        self.hkHeader = ["Object ID", "Set ID", "Report Status", "Is valid",
-                         "Collection Interval (s)", "Number Of IDs"]
+        self.hk_header = ["Object ID", "Set ID", "Report Status", "Is valid",
+                          "Collection Interval (s)", "Number Of IDs"]
         reporting_enabled = self._tm_data[8]
         set_valid = self._tm_data[9]
         collection_interval_seconds = struct.unpack('>f', self._tm_data[10:14])[0] / 1000.0
         num_params = self._tm_data[14]
         if len(self._tm_data) < self.STRUCTURE_REPORT_FIXED_HEADER_SIZE + num_params * 4:
             warning = "Service3TM: handle_filling_definition_arrays: Invalid structure report " \
-                      "from " + str(hex(self.objectId)) + ", is shorter than " + \
+                      "from " + str(hex(self.object_id)) + ", is shorter than " + \
                       str(self.STRUCTURE_REPORT_FIXED_HEADER_SIZE + num_params * 4) + "."
             LOGGER.warning(warning)
             return
@@ -87,7 +87,7 @@ class Service3TM(PusTelemetry):
         for array_index in range(self.STRUCTURE_REPORT_FIXED_HEADER_SIZE,
                                  self.STRUCTURE_REPORT_FIXED_HEADER_SIZE + 4 * num_params, 4):
             parameter = struct.unpack('>I', self._tm_data[array_index:array_index + 4])[0]
-            self.hkHeader.append("Pool ID " + str(counter))
+            self.hk_header.append("Pool ID " + str(counter))
             parameters.append(str(hex(parameter)))
             counter = counter + 1
         if reporting_enabled == 1:
@@ -98,28 +98,30 @@ class Service3TM(PusTelemetry):
             valid_string = "Yes"
         else:
             valid_string = "No"
-        self.hkContent = [hex(self.objectId), self.setId, status_string, valid_string,
-                          collection_interval_seconds, num_params]
-        self.hkContent.extend(parameters)
+        self.hk_content = [hex(self.object_id), self.set_id, status_string, valid_string,
+                           collection_interval_seconds, num_params]
+        self.hk_content.extend(parameters)
 
     def handle_filling_hk_arrays(self):
-        self.paramLength = len(self._tm_data) - 8
+        self.param_length = len(self._tm_data) - 8
         # TODO: This can be automated by using the MIB parser pool names and pool datatypes
-        if self.objectIdRaw == g.THERMAL_SENSOR_DEVICE_ID:
+        if self.object_id_raw == g.THERMAL_SENSOR_DEVICE_ID:
             self.handle_thermal_sensor_hk_data()
-        elif self.objectIdRaw == g.GYRO_DEVICE_ID:
+        elif self.object_id_raw == g.GYRO_DEVICE_ID:
             self.handle_gyro_hk_data()
-        elif self.objectIdRaw == g.GPS0_DEVICE_ID or self.objectId == g.GPS1_DEVICE_ID:
+        elif self.object_id_raw == g.GPS0_DEVICE_ID or self.object_id == g.GPS1_DEVICE_ID:
             self.handle_gps_hk_data()
-        elif self.objectIdRaw == g.TEST_TASK_ID:
+        elif self.object_id_raw == g.TEST_TASK_ID:
             self.handle_test_hk_data()
+        elif self.object_id_raw == g.INTERNAL_ERROR_REPORTER_ID:
+            self.handle_int_err_rprt_data()
         else:
             LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.")
 
     def handle_gps_hk_data(self):
         # TODO: size check. sth not right with gps 0 test
-        self.numberOfParameters = 9
-        self.hkHeader = ["Fix Mode", "SV in Fix", "GNSS Week", "Time of Week", "Latitude",
+        self.number_of_parameters = 9
+        self.hk_header = ["Fix Mode", "SV in Fix", "GNSS Week", "Time of Week", "Latitude",
                          "Longitude", "Mean Sea Altitude", "Position X", "Position Y", "Position Z",
                          "Velocity X", "Velocity Y", "Velocity Z"]
         fix_mode = self._tm_data[4]
@@ -135,8 +137,8 @@ class Service3TM(PusTelemetry):
         vx = struct.unpack('>d', self._tm_data[48:56])[0]
         vy = struct.unpack('>d', self._tm_data[56:64])[0]
         vz = struct.unpack('>d', self._tm_data[64:72])[0]
-        self.hkContent = [fix_mode, sv_in_fix, gnss_week, time_of_week, latitude, longitude, msa,
-                          position_x, position_y, position_z, vx, vy, vz]
+        self.hk_content = [fix_mode, sv_in_fix, gnss_week, time_of_week, latitude, longitude, msa,
+                           position_x, position_y, position_z, vx, vy, vz]
         self.validity_buffer = self._tm_data[72:]
         # print(self.validityBuffer)
         # print(str(format(self.validityBuffer[0], '#010b')))
@@ -144,45 +146,59 @@ class Service3TM(PusTelemetry):
         # print("Validity Buffer Length: " + str(len(self.validityBuffer)))
 
     def handle_test_hk_data(self):
-        self.numberOfParameters = 6
-        self.hkHeader = ["Bool", "UINT8", "UINT16", "UINT32", "FLOAT1", "FLOAT2"]
+        self.number_of_parameters = 6
+        self.hk_header = ["Bool", "UINT8", "UINT16", "UINT32", "FLOAT1", "FLOAT2"]
         test_bool = self._tm_data[4]
         test_uint8 = self._tm_data[5]
         test_uint16 = (self._tm_data[6] << 8) | self._tm_data[7]
         test_uint32 = struct.unpack('>I', self._tm_data[8:12])[0]
         float_vector1 = struct.unpack('>f', self._tm_data[12:16])[0]
         float_vector2 = struct.unpack('>f', self._tm_data[16:20])[0]
-        self.hkContent = [test_bool, test_uint8, test_uint16,
-                          test_uint32, float_vector1, float_vector2]
+        self.hk_content = [test_bool, test_uint8, test_uint16,
+                           test_uint32, float_vector1, float_vector2]
         self.validity_buffer = self._tm_data[20:]
         # print(self.validityBuffer)
         # print(str(format(self.validityBuffer[0], '#010b')))
         # print("Validity Buffer Length: " + str(len(self.validityBuffer)))
 
     def handle_thermal_sensor_hk_data(self):
-        self.numberOfParameters = 2
+        self.number_of_parameters = 2
         if len(self._tm_data) < 13:
             LOGGER.error("Format of thermal sensor HK data might be invalid!")
             return
 
-        self.hkHeader = ["Temperature", "Error Byte"]
+        self.hk_header = ["Temperature", "Error Byte"]
         temperature_celcius = struct.unpack('!f', self._tm_data[8:12])[0]
         error_byte = self._tm_data[12]
-        self.hkContent = [temperature_celcius, error_byte]
+        self.hk_content = [temperature_celcius, error_byte]
         self.validity_buffer = self._tm_data[13:]
 
     def handle_gyro_hk_data(self):
-        self.numberOfParameters = 3
+        self.number_of_parameters = 3
         if len(self._tm_data) < 21:
             LOGGER.error("Format of thermal sensor HK data might be invalid!")
             return
 
-        self.hkHeader = ["AngVel X", "Ang Vel Y", "AngVel Z"]
+        self.hk_header = ["AngVel X", "Ang Vel Y", "AngVel Z"]
         angular_velocity_x = struct.unpack('!f', self._tm_data[8:12])[0]
         angular_velocity_y = struct.unpack('!f', self._tm_data[12:16])[0]
         angular_velocity_z = struct.unpack('!f', self._tm_data[16:20])[0]
-        self.hkContent = [angular_velocity_x, angular_velocity_y, angular_velocity_z]
+        self.hk_content = [angular_velocity_x, angular_velocity_y, angular_velocity_z]
         self.validity_buffer = self._tm_data[20:]
 
+    def handle_int_err_rprt_data(self):
+        self.number_of_parameters = 3
+        if len(self._tm_data) < 12:
+            LOGGER.error("Format of thermal sensor HK data might be invalid!")
+            return
+        self.hk_header = ["TM Hits", "Queue Hits", "Store Hits"]
+        tm_hits = struct.unpack('!I', self._tm_data[self.HK_START_IDX:self.HK_START_IDX + 4])[0]
+        queue_hits = struct.unpack(
+            '!I', self._tm_data[self.HK_START_IDX + 4:self.HK_START_IDX + 8])[0]
+        store_hits = struct.unpack(
+            '!I', self._tm_data[self.HK_START_IDX + 8:self.HK_START_IDX + 12])[0]
+        self.hk_content = [tm_hits, queue_hits, store_hits]
+        self.validity_buffer = self._tm_data[self.HK_START_IDX + 12:]
+
 
 Service3TM: Type[PusTelemetry]
diff --git a/tmtc_core b/tmtc_core
index 8e94033ebe1fb1d859c051f356624b297832b237..ee47db2511157bf050177ae1c755f3ab1f2eea77 160000
--- a/tmtc_core
+++ b/tmtc_core
@@ -1 +1 @@
-Subproject commit 8e94033ebe1fb1d859c051f356624b297832b237
+Subproject commit ee47db2511157bf050177ae1c755f3ab1f2eea77