diff --git a/chat_server.py b/chat_server.py
deleted file mode 100644
index eddec0f774180e3b4f21eac1fdf9dfb390abfd0b..0000000000000000000000000000000000000000
--- a/chat_server.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from server import Server
-import time
-import socket
-import re
-
-if __name__ == '__main__':
-    # Create an instance of the Server class
-    server_instance = Server(client_address="", server_id="", server_port=0, server_cache=dict(), clients_cache=dict(), leader=False)
-    
-    # Get the broadcast address from the existing server_instance
-    broadcast_address = server_instance.get_broadcast_address()
-    
-    if broadcast_address is None:
-        print("Failed to obtain broadcast address. Exiting.")
-        exit(1)
-    
-    print(broadcast_address)
-
-    os = Server.get_os_type()
-    client_address = ""
-    server_id = ""
-    server_port = 0
-    server_cache = dict()
-    clients_cache = dict()
-
-    BROADCAST_PORT = 49154
-    #BROADCAST_PORT_LISTEN = 49154
-
-    print("I'm alive")
-    MSG = bytes("HI MAIN SERVER", 'utf-8')
-
-    broadcast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
-    broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
-    # Create a separate socket for receiving broadcast messages
-    # receive_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    # receive_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-    # receive_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
-
-    
-    if os == "macOS":
-        broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
-        broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT))
-        
-        # receive_socket.bind((broadcast_address, BROADCAST_PORT_LISTEN))
-    else:
-        broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT))
-    print("Successfully sent message")
-
-    message, server = broadcast_socket.recvfrom(1024)
-    print("test")
-    match = re.search(r'\b([A-Za-z])\b$', message.decode('utf-8'))
-    server_id = match.group(1)
-    
-    print('Received message from server: ', message.decode('utf-8'))
-
-    
-    print("ServerID: ", server_id)
-    server_instance.server_id = server_id
-    print("Assigned ServerID: ", server_instance.server_id)
-    
-    # You can use the existing server_instance here, no need to create another one
-    server_instance.start()  # Start the server process
-    
-    time.sleep(20)
\ No newline at end of file
diff --git a/main_server.py b/main_server.py
deleted file mode 100644
index 74803e0ac33d61436372ba435856f1ebaf3b6e53..0000000000000000000000000000000000000000
--- a/main_server.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from server import Server
-import time
-
-if __name__ == '__main__':
-    client_address = ""
-    server_id = "MAIN"
-    server_port = 1000
-    server_cache = dict()
-    clients_cache = dict()
-
-    # Create the Server process
-    server = Server(client_address, server_id, server_port, server_cache, clients_cache, leader=True)
-
-    # Start the Server process
-    server.start()
-
-    # Wait indefinitely until the server process completes its execution
-    server.join()
diff --git a/server.py b/server.py
index 32e3e8aee1256e7a768f4c539ec080763d7e88ef..b8e772464de00656df06b77b3a4e002dfbccb85e 100644
--- a/server.py
+++ b/server.py
@@ -7,6 +7,7 @@ import ipaddress
 import netifaces as ni
 import platform
 import uuid
+import re
 
 client_broadcast_listener_port = 49153
 server_broadcast_listener_port = 49154
@@ -32,7 +33,7 @@ class Server(multiprocessing.Process):
     local_clients_cache = dict()
     local_group_cache = dict()
 
-    def __init__(self, client_address, server_id, server_port, server_cache, clients_cache, leader):
+    def __init__(self):
         super(Server, self).__init__()
         self.os = self.get_os_type()
         print(self.os)
@@ -40,12 +41,6 @@ class Server(multiprocessing.Process):
         self.server_address = self.get_local_ip_address()
         self.subnet_mask = self.get_subnet_mask(self.active_interface)
         print(self.active_interface)
-        self.leader = leader
-        self.client_address = client_address
-        self.server_id = server_id
-        self.server_port = server_port
-        self.local_servers_cache = server_cache
-        self.local_clients_cache = clients_cache
         self.last_heartbeat_timestamp = last_heartbeat_timestamp
         self.ring_socket = ring_socket
         if self.os == "macOS":
@@ -127,8 +122,62 @@ class Server(multiprocessing.Process):
     @staticmethod
     def generate_server_uuid():
         return str(uuid.uuid4())
-
+    
     def run(self):
+        print("I'm alive")
+
+        # Get the broadcast address from the existing server_instance
+        broadcast_address = self.get_broadcast_address()     
+        if broadcast_address is None:
+            print("Failed to obtain broadcast address. Exiting.")
+            exit(1)
+
+        # determine the os type
+        os = self.get_os_type()
+
+        BROADCAST_PORT = 49154     
+        MSG = bytes("HI MAIN SERVER", 'utf-8')
+
+        broadcast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+        broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+        broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        broadcast_socket.settimeout(2)
+
+        received_response = False
+
+        # try 5 times to find the MAIN server, otherwise declares as new MAIN
+        for i in range(0,5):
+            print("Trying to find other servers...")
+        
+            if os == "macOS":
+                broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
+                broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT))
+            else:
+                broadcast_socket.sendto(MSG, (broadcast_address, BROADCAST_PORT))
+
+            try:             
+                message, server = broadcast_socket.recvfrom(1024)
+                server_response = message.decode('utf-8')
+            except socket.timeout:
+                #print("No answer from MAIN server")
+                pass
+            else:
+                if server_response:
+                    match = re.search(r'\b([A-Za-z])\b$', message.decode('utf-8'))
+                    self.server_id = match.group(1)
+                    print('Received message from server: ', message.decode('utf-8'))
+                    received_response = True
+                    self.run_funcs()
+                    break
+        
+        broadcast_socket.close()
+        # no response from MAIN server? declare as new MAIN server
+        if not received_response:
+            print("No other server was found, declare as MAIN server.")
+            self.server_id = "MAIN"
+            self.run_funcs()
+
+    def run_funcs(self):
         print(self.server_id+": "+"Up and running")
         if self.server_id == "MAIN":
             client_listener_thread = threading.Thread(target=self.listen_for_clients)
@@ -312,6 +361,9 @@ class Server(multiprocessing.Process):
         else:
             # ascii value before A
             return 64
+        
+    def register_server(self):
+        return
 
     # listen for servers if they want to join the DS
     def listen_for_servers(self):
@@ -354,42 +406,20 @@ class Server(multiprocessing.Process):
                     update_cache_thread.run()
                 else:
                     update_cache_thread.start()
-
-    # def register_server(self, addr, server_id):
-    #     BROADCAST_ADDRESS = self.get_broadcast_address()
-    #     message = 'Hi ' + addr[0] + ' this is your chat-group ID: ' + str(server_id)
-    #     server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    #     if self.os == "macOS":
-    #         server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
-    #         server_socket.connect((BROADCAST_ADDRESS, 49154))
-
-    #         print(self.server_port)
-    #     else:
-    #         server_socket.connect(('<broadcast>', self.server_port))
-            
-    #     server_socket.sendto(str.encode(message), addr)
-    #     server_socket.close()
                     
     def register_server(self, addr, server_id):
         message = 'Hi ' + addr[0] + ' this is your chat-group ID: ' + str(server_id)
         server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-        #server_socket.connect((self.server_address, self.server_port))
         server_socket.connect((addr[0], addr[1]))
         server_socket.sendto(str.encode(message), addr)
         print(server_socket)
         server_socket.close()
 
-        
-
     def listen_for_clients(self):
         
         BROADCAST_PORT = 49153
         BROADCAST_ADDRESS = self.get_broadcast_address()
 
-        # Local host information
-        #MY_HOST = socket.gethostname()
-        #MY_IP = socket.gethostbyname(MY_HOST)
-
         # Create a UDP socket
         listen_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         # Set the socket to broadcast and enable reusing addresses
@@ -452,9 +482,10 @@ class Server(multiprocessing.Process):
         return addr
     
     def send_reply_to_client(self, server_addr, client_addr):
+        PORT = 1000
         message = 'Hi ' + client_addr[0] + ' this is your groupchat server: ' + server_addr
         server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-        server_socket.connect((self.server_address, self.server_port))
+        server_socket.connect((self.server_address, PORT))
         server_socket.sendto(str.encode(message), client_addr)
         server_socket.close()
 
@@ -481,17 +512,6 @@ class Server(multiprocessing.Process):
             if value == addr[0]:
                 group = key[0]
                 return group
-        
-    # Create and run new server 
-    def create_server(self, server_id, client_address):
-        
-        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()
-
-        return self.server_port
     
 
     # send updated group view/servers cache to all server
@@ -758,7 +778,7 @@ class Server(multiprocessing.Process):
         # reassign the groupchats of the old MAIN server to the new MAIN server
         self.reassign_chat_groups(self.server_id)
         self.stop_threads()
-        self.run()
+        self.run_funcs()
 
     def stop_threads(self):
         self.keep_running_nonLeader = False
diff --git a/start_server.py b/start_server.py
new file mode 100644
index 0000000000000000000000000000000000000000..cdede872c7a41ce7a05e5c60319f0c6b051e2261
--- /dev/null
+++ b/start_server.py
@@ -0,0 +1,13 @@
+from server import Server
+import time
+
+if __name__ == '__main__':
+
+    # Create the Server instance
+    server = Server()
+
+    # Start the Server process
+    server.start()
+
+    # Wait indefinitely until the server process completes its execution
+    server.join()