diff --git a/OBSW_Config.py b/OBSW_Config.py
index c9712dc2326ea5d1e0614b6396802a8bb6faaaf2..fa099860a4dfc2e053cb8f7c2e748a0afcc7a656 100644
--- a/OBSW_Config.py
+++ b/OBSW_Config.py
@@ -17,6 +17,7 @@ modeId = 0
 service = 17
 displayMode = "long"
 
+
 comIF = 0
 # Time related
 tmTimeout = 10
@@ -30,6 +31,7 @@ sockReceive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
 # Print Settings
 printToFile = False
+printHkData = False
 printRawTmData = False
 
 
diff --git a/OBSW_UdpClient.py b/OBSW_UdpClient.py
index 3f8968552464ab0749c907d6e8be2e360a15fcd9..e0e8592cbd018acea1aa48e4dac59d13b50b46e4 100644
--- a/OBSW_UdpClient.py
+++ b/OBSW_UdpClient.py
@@ -162,6 +162,7 @@ def parseInputArguments():
     argParser.add_argument('-o', '--tcTimeoutFactor', type=float, help='TC Timeout Factor. Default: 2.0', default=2.0)
     argParser.add_argument('-r', '--rawDataPrint', help='Supply -r to print all raw data directly', action='store_true')
     argParser.add_argument('-d', '--shortDisplayMode', help='Supply -d to print short output', action='store_true')
+    argParser.add_argument('-k', '--hk', help='Supply -k or --hk to print HK data', action='store_true')
     if len(sys.argv) == 1:
         print("No Input Arguments specified, setting default values.")
         argParser.print_help()
@@ -199,6 +200,7 @@ def setGlobals(args):
     g.sockReceive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     g.sockSend = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     g.modeId = modeId
+    g.printHkData = args.hk
     g.tmTimeout = args.tmTimeout
     g.printRawTmData = args.rawDataPrint
     g.displayMode = displayMode
diff --git a/tc/OBSW_TcPacker.py b/tc/OBSW_TcPacker.py
index a6625d1f258dc213198417e564b23fc81acb2531..dc99d8dcd036aeb1044c79c45f46c04674baab09 100644
--- a/tc/OBSW_TcPacker.py
+++ b/tc/OBSW_TcPacker.py
@@ -56,6 +56,28 @@ def serviceTestSelect(service, serviceQueue):
 
 def packService3TestInto(tcQueue):
     tcQueue.put(("print", "Testing Service 3"))
+    # adding custom defintion to hk using test pool variables
+    # adding custom definition to diagnostics using test pool variables
+    # enable custom hk definition
+    # enable custom diag definition
+    # disable custom hk definition
+    # disable custom diag definition
+    # report custom hk definition
+    # report custom diag definition
+    # generate one custom hk definition
+    # generate one custom diag definition
+    # modify custom hk definition interval
+    # modify custom diag definition interval
+    # report custom hk definition
+    # report custom diag definition
+    # append parameter to custom hk definiton
+    # append parameter to custom diag definition
+    # report custom hk definition
+    # report custom diag definition
+    # delete custom hk definition
+    # delete custom diag definition
+    # do some basic testing on predefined structs too
+    # e.g. add one variable, change interval, report them....
 
 
 def packService5TestInto(tcQueue):
diff --git a/tm/OBSW_TmPacket.py b/tm/OBSW_TmPacket.py
index b7dbb395fb3fc7dba075b75e0f9b04b0bc96de94..1c82cb088c689667bd4b28b91a8321714be080d5 100644
--- a/tm/OBSW_TmPacket.py
+++ b/tm/OBSW_TmPacket.py
@@ -134,10 +134,41 @@ class Service3TM(PUSTelemetry):
     def __init__(self, byteArray):
         super().__init__(byteArray)
         self.sid = struct.unpack('>I', self.byteArrayData[0:4])[0]
+        self.hkHeader = []
+        self.hkContent = []
         if self.getSubservice() == 25:
             self.paramLength = len(self.byteArrayData) - 4
-        if self.sid == 0x1f00:
-            pass
+        # TODO: This can be automated by using the MIB parser pool names and pool datatypes
+        if self.sid == 0x1f00 or 0x2f00:
+            self.hkHeader = ["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"]
+            self.fixMode = self.byteArrayData[4]
+            self.svInFix = self.byteArrayData[5]
+            self.gnssWeek = struct.unpack('>H', self.byteArrayData[5:7])[0]
+            self.timeOfWeek = struct.unpack('>I', self.byteArrayData[7:11])[0]
+            self.latitude = struct.unpack('>I', self.byteArrayData[11:15])[0]
+            self.longitude = struct.unpack('>I', self.byteArrayData[15:19])[0]
+            self.msa = struct.unpack('>I', self.byteArrayData[19:23])[0]
+            self.positionX = struct.unpack('>d', self.byteArrayData[23:31])[0]
+            self.positionY = struct.unpack('>d', self.byteArrayData[31:39])[0]
+            self.positionZ = struct.unpack('>d', self.byteArrayData[39:47])[0]
+            self.vx = struct.unpack('>d', self.byteArrayData[47:55])[0]
+            self.vy = struct.unpack('>d', self.byteArrayData[55:63])[0]
+            self.vz = struct.unpack('>d', self.byteArrayData[63:71])[0]
+            self.hkContent.append(self.fixMode)
+            self.hkContent.append(self.svInFix)
+            self.hkContent.append(self.gnssWeek)
+            self.hkContent.append(self.timeOfWeek)
+            self.hkContent.append(self.latitude)
+            self.hkContent.append(self.longitude)
+            self.hkContent.append(self.msa)
+            self.hkContent.append(self.positionX)
+            self.hkContent.append(self.positionY)
+            self.hkContent.append(self.positionZ)
+            self.hkContent.append(self.vx)
+            self.hkContent.append(self.vy)
+            self.hkContent.append(self.vz)
 
     def printTelemetryHeader(self, array):
         super().printTelemetryHeader(array)
diff --git a/utility/OBSW_TmTcPrinter.py b/utility/OBSW_TmTcPrinter.py
index 0b97240aba0994943a5a71ab36e00e2c15f811cf..45ec59feaa28f49c0ba6cd7c84763ff284e0a605 100644
--- a/utility/OBSW_TmTcPrinter.py
+++ b/utility/OBSW_TmTcPrinter.py
@@ -28,6 +28,8 @@ class TmtcPrinter:
             self.handleLongPrint(packet)
         self.handleWiretappingPacket(packet)
         self.handleDataReplyPacket(packet)
+        if packet.getService == 3 and packet.getSubservice == 25 or 26:
+            self.handleHkPrint(packet)
         if g.printRawTmData:
             self.printBuffer = "TM Data:" + "\n" + self.returnDataString(packet.data)
             print(self.printBuffer)
@@ -60,6 +62,18 @@ class TmtcPrinter:
         print(self.printBuffer)
         self.addPrintBufferToFileBuffer()
 
+    def handleHkPrint(self, packet):
+        if g.printHkData:
+            self.printBuffer = "HK Data:"
+            print(self.printBuffer)
+            self.addPrintBufferToFileBuffer()
+            self.printBuffer = str(packet.hkHeader)
+            print(self.printBuffer)
+            self.addPrintBufferToFileBuffer()
+            self.printBuffer = str(packet.hkContent)
+            print(self.printBuffer)
+            self.addPrintBufferToFileBuffer()
+
     def handleWiretappingPacket(self, packet):
         if packet.getService() == 2 and (packet.getSubservice() == 131 or packet.getSubservice() == 130):
             self.printBuffer = "Wiretapping Packet or Raw Reply from TM [" + \