diff --git a/tc/obsw_tc_service3.py b/tc/obsw_tc_service3.py
index 7b409a669e7a473269466676c71b9f5f16aa4ba3..70a937c52a9b55c67cca873c81eb807fce04c95b 100644
--- a/tc/obsw_tc_service3.py
+++ b/tc/obsw_tc_service3.py
@@ -42,26 +42,30 @@ def pack_test_device_test(tc_queue: Deque):
 def pack_custom_tests(tc_queue: Deque):
     tc_queue.appendleft(("print", "Testing Service 3: "))
 
-    tc_queue.appendleft(("print", "Generate one thermal sensor packet: "))
-    command = PusTelecommand(service=3, subservice=27, ssc=3100, app_data=sid_thermalsensor)
-    tc_queue.appendleft(command.pack_command_tuple())
-
-    tc_queue.appendleft(("print", "Enabling periodic thermal sensor packet generation: "))
-    command = PusTelecommand(service=3, subservice=5, ssc=3101, app_data=sid_thermalsensor)
-    tc_queue.appendleft(command.pack_command_tuple())
-
-    tc_queue.appendleft(("wait", 6))
-
-    new_interval = 1.2
-    interval_app_data = sid_thermalsensor + make_interval(new_interval)
-    tc_queue.appendleft(("print", "Setting interval to one second: "))
-    command = PusTelecommand(service=3, subservice=31, ssc=3102, app_data=interval_app_data)
-    tc_queue.appendleft(command.pack_command_tuple())
-
-    tc_queue.appendleft(("wait", 3))
-
-    tc_queue.appendleft(("print", "Disabling periodic thermal sensor packet generation: "))
-    command = PusTelecommand(service=3, subservice=6, ssc=3103, app_data=sid_thermalsensor)
+    # tc_queue.appendleft(("print", "Generate one thermal sensor packet: "))
+    # command = PusTelecommand(service=3, subservice=27, ssc=3100, app_data=sid_thermalsensor)
+    # tc_queue.appendleft(command.pack_command_tuple())
+    #
+    # tc_queue.appendleft(("print", "Enabling periodic thermal sensor packet generation: "))
+    # command = PusTelecommand(service=3, subservice=5, ssc=3101, app_data=sid_thermalsensor)
+    # tc_queue.appendleft(command.pack_command_tuple())
+    #
+    # tc_queue.appendleft(("wait", 6))
+    #
+    # new_interval = 1.2
+    # interval_app_data = sid_thermalsensor + make_interval(new_interval)
+    # tc_queue.appendleft(("print", "Setting interval to one second: "))
+    # command = PusTelecommand(service=3, subservice=31, ssc=3102, app_data=interval_app_data)
+    # tc_queue.appendleft(command.pack_command_tuple())
+    #
+    # tc_queue.appendleft(("wait", 3))
+    #
+    # tc_queue.appendleft(("print", "Disabling periodic thermal sensor packet generation: "))
+    # command = PusTelecommand(service=3, subservice=6, ssc=3103, app_data=sid_thermalsensor)
+    # tc_queue.appendleft(command.pack_command_tuple())
+
+    tc_queue.appendleft(("print", "Generating structure  report for thermal sensor packet: "))
+    command = PusTelecommand(service=3, subservice=9, ssc=3104, app_data=sid_thermalsensor)
     tc_queue.appendleft(command.pack_command_tuple())
 
 
diff --git a/tm/obsw_tm_service_3.py b/tm/obsw_tm_service_3.py
index 3fe2014cbde5dd611c8ca9896f41dcdc05bf49e1..59007176ad9a6c202c36b6d19dfca218a3c9d060 100644
--- a/tm/obsw_tm_service_3.py
+++ b/tm/obsw_tm_service_3.py
@@ -16,9 +16,23 @@ LOGGER = get_logger()
 
 
 class Service3TM(PusTelemetry):
+    """
+    @brief  This class encapsulates the format of Service 3 telemetry
+    """
+    # Minimal packet contains SID, which consists of object ID(4) and set ID(4)
+    MINIMAL_PACKET_SIZE = 8
+    # Minimal structure report contains SID (8), reporting status(1), validity flag (1) and
+    # collection interval as float (4)
+    STRUCTURE_REPORT_FIXED_HEADER_SIZE = MINIMAL_PACKET_SIZE + 6
+
     def __init__(self, byte_array: bytearray):
         super().__init__(byte_array)
-        # print("Length of TM data: " + str(len(self._tm_data)))
+        if len(self._tm_data) < 8:
+            warning = "Service3TM: handle_filling_definition_arrays: Invalid Service 3 packet," \
+                      " is too short!"
+            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]
@@ -48,24 +62,48 @@ class Service3TM(PusTelemetry):
         array.append("HK Data Size")
 
     def handle_filling_definition_arrays(self):
-        self.hkHeader = ["Object ID", "Set ID", "Report Status",
+        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" + \
+                      str(self.STRUCTURE_REPORT_FIXED_HEADER_SIZE) + "."
+            LOGGER.warning(warning)
+            return
+        self.hkHeader = ["Object ID", "Set ID", "Report Status", "Set Valid"
                          "Collection Interval", "Number Of IDs"]
-        reporting_enabled = self._tm_data[4]
-        collection_interval = struct.unpack('>f', self._tm_data[5:9])[0]
-        number_of_params = self._tm_data[9]
+        reporting_enabled = self._tm_data[8]
+        print(reporting_enabled)
+        set_valid = self._tm_data[9]
+        print(set_valid)
+        collection_interval = struct.unpack('>f', self._tm_data[10:14])[0]
+        print(collection_interval)
+        num_params = self._tm_data[14]
+        print(num_params)
+        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 " + \
+                      str(self.STRUCTURE_REPORT_FIXED_HEADER_SIZE + num_params * 4) + "."
+            LOGGER.warning(warning)
+            return
+
         parameters = []
-        index2 = 1
-        for index in range(10, (number_of_params * 4) + 10, 4):
-            parameter = struct.unpack('>I', self._tm_data[index:index + 4])[0]
-            self.hkHeader.append("Pool ID " + str(index2))
+        counter = 1
+        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))
             parameters.append(str(hex(parameter)))
-            index2 = index2 + 1
+            counter = counter + 1
         if reporting_enabled == 1:
             status_string = "On"
         else:
             status_string = "Off"
-        self.hkContent = [hex(self.objectId), self.setId, status_string,
-                          collection_interval, number_of_params]
+        if set_valid:
+            valid_string = "On"
+        else:
+            valid_string = "Off"
+        self.hkContent = [hex(self.objectId), self.setId, status_string, valid_string,
+                          collection_interval, num_params]
         self.hkContent.extend(parameters)
 
     def handle_filling_hk_arrays(self):
@@ -118,7 +156,8 @@ class Service3TM(PusTelemetry):
         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.hkContent = [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')))