diff --git a/client.py b/client.py
index 0eb17b38fad58115f6fabc026ca65da6def888b1..6bf73edd3e27d1cc58bcf6d037ccf854e12312d4 100644
--- a/client.py
+++ b/client.py
@@ -1,6 +1,7 @@
 import multiprocessing
 import socket
 import threading
+import re
 
 class Client(multiprocessing.Process):
 
@@ -40,9 +41,17 @@ class Client(multiprocessing.Process):
 
         broadcast_socket.sendto(MSG, ('<broadcast>', PORT))
         data, server = broadcast_socket.recvfrom(1024)
-        print('Received message from server: ', data.decode('utf-8'))   
         
-        self.registered_server = server
+        print('Received message from server: ', data.decode('utf-8'))
+
+        # search for ip_address & port in message from server
+        match = re.search(r'\((\d+\.\d+\.\d+\.\d+):(\d+)\)', data.decode('utf-8'))
+        ip_address = match.group(1)
+        port = match.group(2)
+        self.registered_server = [ip_address, port]
+
+        
+        #self.registered_server = server
         print("My server: ", self.registered_server)
 
         broadcast_socket.close()
@@ -53,9 +62,18 @@ class Client(multiprocessing.Process):
             message = input()
             if message.lower() == 'exit':
                 break
-            print(self.registered_server)
+            
+            client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            client_socket.connect((self.registered_server[0], int(self.registered_server[1])))
+
+            client_socket.sendall(bytes(message, 'utf-8'))
+            
+            data = client_socket.recv(1024)
+            print(f"Received response from server: {data.decode('utf-8')}")
+
+            client_socket.close() 
 
-            client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+            #client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
             #client_socket.connect((self.server_address, self.server_port))
-            client_socket.sendto(str.encode(message), self.registered_server)
-            client_socket.close()
+            #client_socket.sendto(str.encode(message), self.registered_server)
+            #client_socket.close()
diff --git a/server.py b/server.py
index 99932ea2670f65533c4bf77b2b683fdaf2a42c54..81f7ec0dc92ecbcceaee34ccb88debbe2463e6b1 100644
--- a/server.py
+++ b/server.py
@@ -26,14 +26,17 @@ class Server(multiprocessing.Process):
             client_listener_thread.start()
 
         else:
+            self.send_reply_to_client()
+
             cache_update_listener_thread = threading.Thread(target=self.listen_for_cache_update)
-            cache_update_listener_thread.start()
             client_message_listener_thread = threading.Thread(target=self.listen_for_client_messages)
+
+            cache_update_listener_thread.start()
             client_message_listener_thread.start()
 
 
     def send_reply_to_client(self):
-        message = 'Hi ' + self.client_address[0] + ' this is your chat-group server ' + self.server_id + '.'
+        message = 'Hi ' + self.client_address[0] + ' this is your chat-group server ' + self.server_id + '. (' + self.server_address + ':' + str(self.server_port) + ')'
         server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         server_socket.connect((self.server_address, self.server_port))
         server_socket.sendto(str.encode(message), self.client_address)
@@ -88,7 +91,8 @@ class Server(multiprocessing.Process):
     
         else:
             print(self.server_id+": "+"Group "+group+" already exists")
-            self.client_cache_key_offset = self.client_cache_key_offset + 1
+            client_count = self.filter_clients(group)
+            self.client_cache_key_offset = client_count + 1
             client_cache_key = group + str(self.client_cache_key_offset)
             self.local_clients_cache[client_cache_key] = addr
 
@@ -100,16 +104,23 @@ class Server(multiprocessing.Process):
                 group_count = group_count + 1
         
         return group_count
+    
+    def filter_clients(self, group):
+        client_count = 0
+        for key in self.local_clients_cache:
+            if group == key[0]:
+                client_count = client_count + 1
+                
+        return client_count
         
     # Create and run new server 
     def create_server(self, server_id, client_address):
-        # Bind the socket to the port    
         
         self.server_port = self.server_port + 1
 
         new_server = Server(client_address, server_id, self.server_port, self.local_servers_cache, self.local_clients_cache)
 
-        new_server.send_reply_to_client()
+        #new_server.send_reply_to_client()
 
         return self.server_port
 
@@ -155,10 +166,26 @@ class Server(multiprocessing.Process):
                 self.local_servers_cache = server_cache_json
                 self.local_clients_cache = client_cache_json
 
-                print("Group View Server: "+self.local_servers_cache)
-                print("Group View Clients: "+self.local_clients_cache)
+                print(self.local_servers_cache)
+                print(self.local_clients_cache)
+
+    def listen_for_client_messages(self):
+
+        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        server_socket.bind((self.server_address, self.server_port))
+        server_socket.listen()
+
+        print(self.server_id+": "+"Group-chat server is listening for client messages at port: ", self.server_port)
+
+        while True:
+            conn, addr = server_socket.accept()
+            print(f"Connection established with {addr}")
+
+            data = conn.recv(1024)
+            print(f"Received message from client: {data.decode('utf-8')}")
 
-    def listen_for_client_messages():
+            response = "Hello, client! I received your message."
+            conn.sendall(bytes(response, 'utf-8'))
 
-        return
+            conn.close()