diff --git a/README.md b/README.md
index f6e788b738ce00ed7ace66976c86cc0470c4c5b5..3a9ed9de600d6943288fb5f2c2fff12079233afe 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,13 @@
+
 # Practical Work Manager (pwm)
 
+# WIP REFACTOR STATUS
+
+- [ ] Create group repo
+- [ ] Clone repo
+- [x] List groups
+- [x] List projects
+
 Programme python pour gérer les travaux pratiques des étudiants avec la contrainte d'utiliser le gitlab d'HEPIA.
 Ce script permet d'automatiser de nombreuses tâches, notamment la création de nombreuses repositories d'un coup, ou encore cloner toutes les repositories contenues dans un groupe, etc.
 
diff --git a/pwm/pwm.py b/pwm/pwm.py
index da6e5b0c9f6f214d99a88bb8289d10d519feb08f..248efca8c5aa1537845d72fb9ff5c3438e60095f 100755
--- a/pwm/pwm.py
+++ b/pwm/pwm.py
@@ -8,7 +8,7 @@ Steven Liatti, Florent Gluck, Adrien Lescourt
 
 from dataclasses import dataclass
 from requests.models import Response
-from typing import Any, Dict, List, Optional
+from typing import Any
 import argparse
 import json
 import os
@@ -23,21 +23,18 @@ TOKEN_URL: str = BASE_URL + "/-/user_settings/personal_access_tokens"
 
 @dataclass
 class User:
-    def __init__(self, user_id: str) -> None:
-        self.id = user_id
+    id: str
 
 
 @dataclass
 class Group:
-    def __init__(self, name: str, user_ids: List[User]) -> None:
-        self.name = name
-        self.user_ids = user_ids
+    name: str
+    user_ids: list[User]
 
 
 @dataclass
 class DataSource:
-    def __init__(self, groups: List[Group]) -> None:
-        self.groups = groups
+    groups: list[Group]
 
     @classmethod
     def from_yaml(cls, yaml_file_path: str) -> "DataSource":
@@ -45,19 +42,20 @@ class DataSource:
             print("Syntax error in YAML file.\nAborted.")
             exit(1)
         groups = []
-        repos = yaml.full_load(yaml_file_path)
-        for repo in repos:
-            if "name" in repo:
-                name = repo["name"]
-            else:
-                name = repo["users_login_aai"]
-            groups.append(Group(name, repo["users"]))
-        return cls(groups)
+        with open(yaml_file_path) as f:
+            repos = yaml.load(f, Loader=yaml.FullLoader)
+            for repo in repos:
+                if "name" in repo:
+                    name = repo["name"]
+                else:
+                    name = repo["users_login_aai"]
+                groups.append(Group(name, [User(u) for u in repo["users_login_aai"]]))
+            return cls(groups)
 
     @staticmethod
     def _validate_yaml(yaml_file_path) -> bool:
         with open(yaml_file_path) as f:
-            repos = yaml.full_load(f)
+            repos = yaml.load(f, Loader=yaml.FullLoader)
             for repo in repos:
                 if "name" in repo:
                     pass
@@ -72,30 +70,23 @@ class Gitlab:
     def __init__(self, token: str):
         self.token = token
 
-    def create_group(self, group: Group, visibility: str = "private") -> str:
+    def create_group(self, name: str, visibility: str = "private") -> str:
         """Create gitlab group, Returns group_id created."""
 
-        params = {"path": group.name, "name": group.name, "visibility": visibility}
+        params = {"path": name, "name": name, "visibility": visibility}
         headers = {"PRIVATE-TOKEN": self.token}
-        group_res = requests.post(
-            BASE_API_URL + "/group_ress", params=params, headers=headers
-        ).json()
-        if "message" in group_res:
-            print("Error in creating group_res: %s" % group_res)
+        request_res = requests.post(
+            BASE_API_URL + "/groups", params=params, headers=headers
+        )
+
+        if request_res.status_code != 201:
+            print(f"Error: {request_res.status_code}")
+            print(request_res.text)
             exit(1)
 
-        print(
-            "group_res '"
-            + group_res["name"]
-            + "' with id '"
-            + str(group_res["id"])
-            + "' and visibility '"
-            + group_res["visibility"]
-            + "' available at '"
-            + group_res["web_url"]
-            + "'"
-        )
-        return str(group_res["id"])
+        res = request_res.json()
+        print(f"Group created: name: {res['name']}, id: {res['id']}")
+        return str(res["id"])
 
     def delete_group(self, group_id: str):
         """Delete a group and all subprojects."""
@@ -113,10 +104,10 @@ class Gitlab:
     def create_repository(
         self,
         group_id: str,
-        users: List[User],
+        users: list[User],
         name: str,
-        import_url: Optional[str],
-        expires_at: Optional[str],
+        import_url: str | None,
+        expires_at: str | None,
     ):
         """
         Create repository in group_id, with members from user_ids, a name, and
@@ -153,6 +144,7 @@ class Gitlab:
 
         # Add each student as maintainer (level 40)
         for user in users:
+            print(user)
             params = {"user_id": user.id, "access_level": access_level}
             if expires_at:
                 params["expires_at"] = expires_at
@@ -180,8 +172,8 @@ class Gitlab:
 
     @staticmethod
     def _paginate_responses(
-        url: str, headers: Dict[str, str], params: Dict[str, Any]
-    ) -> List[Response]:
+        url: str, headers: dict[str, str], params: dict[str, Any]
+    ) -> list[Response]:
         """
         Manage gitlab pagination, max 100 results by request
         """
@@ -203,7 +195,7 @@ class Gitlab:
 
         return responses
 
-    def get_users_in_repository(self, id: str) -> List:
+    def get_users_in_repository(self, id: str) -> list:
         """
         Return members list from given id
         """
@@ -219,7 +211,7 @@ class Gitlab:
             members += r.json()
         return members
 
-    def get_projects_in_group(self, id: str) -> List:
+    def get_projects_in_group(self, id: str) -> list:
         """
         Return projects list from given group id
         """
@@ -233,7 +225,7 @@ class Gitlab:
             projects += r.json()
         return projects
 
-    def clone_all(self, id: str, directory: str, until_date: Optional[str]):
+    def clone_all(self, id: str, directory: str, until_date: str | None):
         """
         Clone all repositories from a group id in directory (created in function).
         """
@@ -325,7 +317,7 @@ def command_create_group_repos(args):
             args.import_url,
             args.expires_at,
         )
-        print(f"created repo: {group.name} with the users: {group.user_ids}")
+        print(f"Created repo: {group.name} with the users: {group.user_ids}")
         print()