diff --git a/building_manager.py b/building_manager.py
index 4b4b0e0a69681040b3b51abe74a46b773313c80a..40d318db28c10c93788587bddea3b9270fbfa0d5 100755
--- a/building_manager.py
+++ b/building_manager.py
@@ -594,6 +594,65 @@ def create_or_replace_config_file(base_dir, config_path, content, json=False):
             json.dump(content, file, indent=2)
         else:
             file.write(content)
+
+
+# Functions to modify existing files
+def add_user_to_traefik_file(base_dir, username, password):
+    """Adds or modifies user in traefik file
+
+    :base_dir: path that contains custom config folder
+    :username: username to use
+    :password: password that will be used
+    """
+    # generate line and save it into a file
+    users = get_traefik_users(base_dir)
+    # ensure to delete old entry if user exists
+    users = [u for u in users if u['username'] is not username]
+    # collect existing users lines
+    user_lines = []
+    for u in users:
+        user_lines.append(f"{u['username']}:{u['password']}")
+    # add new/modified user
+    user_lines.append(generate_traefik_user_line(username, password))
+    # generate content
+    file_content = "\n".join(user_lines)
+    create_or_replace_config_file(base_dir, EDIT_FILES['traefik_users'],
+                                  file_content)
+
+
+# Functions to get content from files
+def get_users_from_files(base_dir):
+    """Gets a list of users in files
+
+    :base_dir: dir to find files in
+    :returns: list of users
+    """
+    users = []
+
+    # add treafik users
+    users.extend([u['username'] for u in get_traefik_users(base_dir)])
+
+    return users
+
+
+def get_traefik_users(base_dir):
+    """Gets a list of dicts containing users and password hashes
+
+    :base_dir: dir to find files in
+    :returns: list of users / password dicts
+    """
+    users = []
+
+    # get treafik users
+    traefik_file = f"{base_dir}/{CUSTOM_DIR}/{EDIT_FILES['traefik_users']}"
+    with open(traefik_file, 'r') as file:
+        lines = file.read().splitlines()
+        for line in lines:
+            # username in traefik file is first entry unitl colon
+            username = line.split(':')[0]
+            password = line.split(':')[1]
+            users.append({"username": username, "password": password})
+    return users
 # >>>
 
 
@@ -1045,12 +1104,50 @@ def user_menu(args):
 
     :args: Passed commandline arguments
     """
+    # Base directory for configs
+    base_dir = args.base_dir
+
+    if base_dir is None:
+        base_dir = os.getcwd()
+
+    # Ask for action
     choice = qust.select("What do you want to do?", choices=[
                          'Add a new user', 'Remove existing user'],
                          style=st).ask()
+    if "Add" in choice:
+        new_user_menu(base_dir)
     print(choice)
 
 
+def new_user_menu(base_dir):
+    """Menu entry for new users
+
+    :base_dir: Directory of config files
+    """
+    current_users = get_users_from_files(base_dir)
+    new_user = False
+    while not new_user:
+        username = qust.text("Choose a new username:", style=st).ask()
+        if username not in current_users:
+            new_user = True
+        else:
+            print(f"User with name {username} already exists, try again")
+
+    # Ensure passwords match
+    password_match = False
+    while not password_match:
+        password = qust.password(
+            f'Choose a password for the user {username}:', style=st).ask()
+        confirm = qust.password(
+            f'Repeat password for the user {username}:', style=st).ask()
+        if password == confirm:
+            password_match = True
+        else:
+            print("Passwords did not match, try again")
+
+    add_user_to_traefik_file(base_dir, username, password)
+
+
 # *** Menu Helper Functions ***
 def generate_cb_choices(list, checked=False):
     """Generates checkbox entries for lists of strings