diff --git a/main.py b/main.py
index a0fd2d09a453081416456924759e635c90ac68f3..d0adabfca47f96804add418bf2b6a7b49626b7c8 100644
--- a/main.py
+++ b/main.py
@@ -1,6 +1,6 @@
 import socket
 from joblib import load
-from utils import process_mllp_message, parse_hl7_message, create_acknowledgement
+from utils import process_mllp_message, parse_hl7_message, create_acknowledgement, parse_system_message
 
 from constants import DT_MODEL_PATH, REVERSE_LABELS_MAP
 
@@ -28,9 +28,11 @@ def start_server(host="0.0.0.0", port=8440):
             if hl7_data:
                 message = parse_hl7_message(hl7_data)
                 print("Parsed HL7 Message:")
-                print(message)
-                print(type(message))
-
+                # print(message)
+                # print(type(message))
+                category,mrn,data = parse_system_message(message) #category is type of system message and data consists of age sex if PAS admit or date of blood test and creatanine result
+                
+                print(category,mrn,data,'\n')
                 # Create and send ACK message
                 ack_message = create_acknowledgement(message)
                 sock.sendall(ack_message)
diff --git a/dt_model.joblib b/model/dt_model.joblib
similarity index 100%
rename from dt_model.joblib
rename to model/dt_model.joblib
diff --git a/utils.py b/utils.py
index 8dd74c2e8db0838601c1f47403469aa630bae082..8fa741e77508cc636d6e525fdf2fd7950cd2d9d7 100644
--- a/utils.py
+++ b/utils.py
@@ -20,11 +20,12 @@ def parse_hl7_message(hl7_data):
     """
     Parses the HL7 message and returns the parsed message object.
     """
-    message = hl7.parse(hl7_data.decode("utf-8"))
+    hl7_string = hl7_data.decode("utf-8").replace('\r', '\n')
+    message = hl7.parse(hl7_string)
     return message
 
 
-def create_acknowledgement():
+def create_acknowledgement(hl7_msg):
     """
     Creates an HL7 ACK message for the received message.
     """
@@ -84,3 +85,49 @@ def populate_test_results_table(db, path):
                 date = row[j]
                 result = float(row[j+1])
                 db.insert_test_result(mrn, date, result)
+
+
+def parse_system_message(message):
+    """
+    Parses the HL7 message and returns components of respective message type: PAS, LIMS
+    Args:
+        - HL7 message object
+    Returns the category of message, MRN, [AGE, SEX] if PAS category or [DATE_BLOOD_TEST, CREATININE_VALUE] if LIMS
+    """
+    mrn = 0
+    category = ''
+    data = ['']*2
+    segments = str(message).split('\n')
+    if len(segments) < 4:
+        parsed_seg = segments[1].split('|')
+        if len(parsed_seg) > 4:
+            mrn = parsed_seg[3]
+            category = 'PAS-admit'
+            date_of_birth = parsed_seg[7]
+            data[0] = calculate_age(date_of_birth)
+            data[1] = parsed_seg[8][0]
+        else:
+            mrn = parsed_seg[3].replace('\r','')
+            category = 'PAS-discharge'
+    else:
+        mrn = segments[1].split('|')[3]
+        category = 'LIMS'
+        data[0] = segments[2].split('|')[7] #date of blood test
+        data[1] = float(segments[3].split('|')[5])
+
+    return category,mrn,data
+            
+def calculate_age(date_of_birth):
+    """
+    Calculate age based on the date of birth provided in the format YYYYMMDD.
+    """
+    # Parse the date of birth string into a datetime object
+    dob = datetime.datetime.strptime(date_of_birth, "%Y%m%d")
+    
+    # Get the current date
+    current_date = datetime.datetime.now()
+    
+    # Calculate the difference between the current date and the date of birth
+    age = current_date.year - dob.year - ((current_date.month, current_date.day) < (dob.month, dob.day))
+    
+    return age
\ No newline at end of file
diff --git a/utils_test.py b/utils_test.py
index c84c747a983e3ef3a2cd402e521b96b037f296f9..cc7c59a084660295019f5a255739c8d5974daffd 100644
--- a/utils_test.py
+++ b/utils_test.py
@@ -4,6 +4,8 @@ from utils import (
     parse_hl7_message,
     create_acknowledgement,
     populate_test_results_table,
+    calculate_age,
+    parse_system_message
 )
 from memory_db import InMemoryDatabase
 import hl7
@@ -53,6 +55,37 @@ class TestUtilsClient(unittest.TestCase):
         # close the db
         db.close()
         self.assertEqual(result, expected_result)
+    
+    def test_pas_admit_message(self):
+        # Mock a PAS admit HL7 message
+        message = "MSH|^~\&|SIMULATION|SOUTH RIVERSIDE|||20240924102800||ADT^A01|||2.5\nPID|1||722269||SAFFRON CURTIS||19891008|F"
+        expected_age = calculate_age("19891008")  # Assuming current date is fixed or calculate_age is mocked
+        category, mrn, data = parse_system_message(message)
+        self.assertEqual(category, "PAS-admit")
+        self.assertEqual(mrn, "722269")
+        self.assertEqual(data, [expected_age, "F"])
+
+    def test_pas_discharge_message(self):
+        # Mock a PAS discharge HL7 message
+        message = "MSH|^~\&|SIMULATION|SOUTH RIVERSIDE|||20240924153400||ADT^A03|||2.5\nPID|1||853518"
+        category, mrn, data = parse_system_message(message)
+        self.assertEqual(category, "PAS-discharge")
+        self.assertEqual(mrn, "853518")
+        self.assertEqual(data, ['', ''])
+
+    def test_lims_message(self):
+        # Mock a LIMS HL7 message
+        message = "MSH|^~\&|SIMULATION|SOUTH RIVERSIDE|||20240924153600||ORU^R01|||2.5\nPID|1||54229\nOBR|1||||||20240924153600\nOBX|1|SN|CREATININE||103.56923163550283"
+        category, mrn, data = parse_system_message(message)
+        self.assertEqual(category, "LIMS")
+        self.assertEqual(mrn, "54229")
+        self.assertTrue(isinstance(data[1], float))  # Ensure that the creatinine value is a float
+
+    def test_incomplete_message(self):
+        # Mock an incomplete HL7 message
+        message = "MSH|...|..."
+        with self.assertRaises(IndexError):  # Assuming your function raises IndexError for incomplete messages
+            parse_system_message(message)
 
 
 if __name__ == "__main__":