diff --git a/pwm b/pwm
index fd1e8d3b362553722ffbc39260d014482548e3b7..73ed9e902f1c2b6cc09dc020ea8de1d321b37a7f 100644
--- a/pwm
+++ b/pwm
@@ -2,8 +2,8 @@
 
 """
 Practical Work Manager (pwm)
-Steven Liatti
-2020
+Steven Liatti, Florent Gluck
+2020-2022
 """
 
 from argparse import Namespace
@@ -16,8 +16,9 @@ from requests.models import Response
 import yaml
 import json
 
-BASE_URL: str = 'https://gitedu.hesge.ch/api/v4'
-
+BASE_URL: str = 'https://gitedu.hesge.ch'
+BASE_API_URL: str = BASE_URL + '/api/v4'
+TOKEN_URL: str = BASE_URL + '/profile/personal_access_tokens'
 
 def create_group(token: str, name: str, visibility: str = 'private') -> str:
     """
@@ -27,7 +28,7 @@ def create_group(token: str, name: str, visibility: str = 'private') -> str:
     params = {'path': name, 'name': name, 'visibility': visibility}
     headers = {'PRIVATE-TOKEN': token}
 
-    group = requests.post(BASE_URL + '/groups',
+    group = requests.post(BASE_API_URL + '/groups',
                           params=params, headers=headers).json()
     if 'message' in group:
         print('Error in creating group: %s' % group)
@@ -44,7 +45,7 @@ def delete_group(token: str, group_id: str):
     """
     headers = {'PRIVATE-TOKEN': token}
     deleted_group = requests.delete(
-        BASE_URL + '/groups/' + group_id, headers=headers).json()
+        BASE_API_URL + '/groups/' + group_id, headers=headers).json()
     if 'message' in deleted_group:
         if deleted_group['message'] != '202 Accepted':
             print('Error in deleting group: %s' % deleted_group)
@@ -60,7 +61,7 @@ def emails_to_ids(emails: List[str], headers: Dict[str, str]) -> List[int]:
     user_ids = []
     for email in emails:
         user_requested = requests.get(
-            BASE_URL + '/users', params={'search': email}, headers=headers).json()
+            BASE_API_URL + '/users', params={'search': email}, headers=headers).json()
         if len(user_requested) == 0:
             print('No user %s found, operation aborted' % email)
             exit(1)
@@ -79,7 +80,7 @@ def create_repository(token: str, group_id: str, emails: List[str], name: str, i
     params = {'name': name, 'namespace_id': group_id, 'visibility': 'private'}
     if import_url:
         params['import_url'] = import_url
-    project = requests.post(BASE_URL + '/projects',
+    project = requests.post(BASE_API_URL + '/projects',
                             params=params, headers=headers).json()
     if 'message' in project:
         print('Error in creating project: %s' % project)
@@ -91,7 +92,7 @@ def create_repository(token: str, group_id: str, emails: List[str], name: str, i
     access_level = 30
     params = {'name': 'master', 'push_access_level': str(
         access_level), 'merge_access_level': str(access_level)}
-    requests.post(BASE_URL + '/projects/' +
+    requests.post(BASE_API_URL + '/projects/' +
                   str(project['id']) + '/protected_branches', params=params, headers=headers).json()
 
     # Get students ids from their emails
@@ -102,7 +103,7 @@ def create_repository(token: str, group_id: str, emails: List[str], name: str, i
         params = {'user_id': user_id, 'access_level': access_level}
         if expires_at:
             params['expires_at'] = expires_at
-        new_user = requests.post(BASE_URL + '/projects/' + str(
+        new_user = requests.post(BASE_API_URL + '/projects/' + str(
             project['id']) + '/members', params=params, headers=headers).json()
         if 'message' in new_user:
             print('Error in adding user: %s' % new_user)
@@ -134,7 +135,7 @@ def get_members(token: str, id: str) -> List:
     """
     Return members list from given id
     """
-    url = BASE_URL + '/projects/' + id + '/members'
+    url = BASE_API_URL + '/projects/' + id + '/members'
 
     headers = {'PRIVATE-TOKEN': token}
     params = {'simple': 'true', 'order_by': 'name',
@@ -152,9 +153,9 @@ def get_projects(token: str, id: str, source: str = 'group') -> List:
     Return projects list from given id and source ('group' or 'forks')
     """
     if source == 'forks':
-        url = BASE_URL + '/projects/' + id + '/forks'
+        url = BASE_API_URL + '/projects/' + id + '/forks'
     else:
-        url = BASE_URL + '/groups/' + id + '/projects'
+        url = BASE_API_URL + '/groups/' + id + '/projects'
 
     headers = {'PRIVATE-TOKEN': token}
     params = {'simple': 'true', 'order_by': 'name',
@@ -182,7 +183,7 @@ def clone_all(token: str, id: str, directory: str, until_date: Optional[str], so
     repositories = get_projects(token, id, source)
 
     for repo in repositories:
-        repo_url = BASE_URL + '/projects/' + str(repo['id']) + '/members'
+        repo_url = BASE_API_URL + '/projects/' + str(repo['id']) + '/members'
         members = requests.get(repo_url, headers=headers).json()
         if 'message' in members:
             print('Error retrieving members: ' + members['message'])
@@ -351,7 +352,7 @@ if __name__ == '__main__':
         Manage students PW - Create group, projects or clone repositories')
     parser.set_defaults(func=lambda _: parser.print_help())
     parser.add_argument("-t", "--token", metavar="TOKEN",
-                        help="Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens")
+                        help="Create a token here: " + TOKEN_URL)
     subparsers = parser.add_subparsers(
         metavar='(group_repos | group | repo | clone | list)')
 
@@ -441,7 +442,7 @@ if __name__ == '__main__':
         elif os.environ.get('GITEDU_TOKEN'):
             args.token = os.environ.get('GITEDU_TOKEN')
         else:
-            print('Error: you must give a valid api token. Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens')
+            print('Error: you must give a valid api token. Create a token here: ' + TOKEN_URL)
             exit(1)
 
     args.func(args)