diff --git a/controllers/group.go b/controllers/group.go
index a162a5c..cd3c757 100644
--- a/controllers/group.go
+++ b/controllers/group.go
@@ -81,7 +81,22 @@ func CreateGroup(c *fiber.Ctx) error {
 // @Failure 404
 // @Router /groups/join [put]
 func JoinGroup(c *fiber.Ctx) error {
-	return nil
+	token := checkCookie(c)
+	if token == "" {
+		return c.SendStatus(fiber.StatusForbidden)
+	} else {
+		id := c.Params("id")
+		err := dao.AddMemberInGroup(token, id)
+		if err == mongo.ErrNoDocuments {
+			return c.SendStatus(fiber.StatusNotFound)
+		} else if err != nil {
+			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
+				"error": fmt.Sprint(err),
+			})
+		} else {
+			return c.SendStatus(fiber.StatusOK)
+		}
+	}
 }
 
 // @Summary Quitte un groupe
@@ -93,7 +108,22 @@ func JoinGroup(c *fiber.Ctx) error {
 // @Failure 404
 // @Router /groups/leave [put]
 func LeaveGroupe(c *fiber.Ctx) error {
-	return nil
+	token := checkCookie(c)
+	if token == "" {
+		return c.SendStatus(fiber.StatusForbidden)
+	} else {
+		id := c.Params("id")
+		err := dao.RemoveMemberFromGroup(token, id)
+		if err == mongo.ErrNoDocuments {
+			return c.SendStatus(fiber.StatusNotFound)
+		} else if err != nil {
+			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
+				"error": fmt.Sprint(err),
+			})
+		} else {
+			return c.SendStatus(fiber.StatusOK)
+		}
+	}
 }
 
 // @Summary Change le chef d'un groupe
diff --git a/dao/group.go b/dao/group.go
index ccd3b96..be36924 100644
--- a/dao/group.go
+++ b/dao/group.go
@@ -86,3 +86,39 @@ func CheckMemberInGroup(idUser string, idGroup string) (ret bool, err error) {
 		return true, nil
 	}
 }
+
+func AddMemberInGroup(idUser string, idGroup string) error {
+	db, _ := get()
+	user, err := primitive.ObjectIDFromHex(idUser)
+	group, err := primitive.ObjectIDFromHex(idGroup)
+	defer disconnect(db.Client())
+	coll := db.Collection("groups")
+
+	update := bson.D{{"$push", bson.D{{"members", user}}}}
+
+	err = coll.FindOneAndUpdate(
+		context.TODO(),
+		bson.D{{"_id", group}},
+		update,
+	).Err()
+
+	return err
+}
+
+func RemoveMemberFromGroup(idUser string, idGroup string) error {
+	db, _ := get()
+	user, err := primitive.ObjectIDFromHex(idUser)
+	group, err := primitive.ObjectIDFromHex(idGroup)
+	defer disconnect(db.Client())
+	coll := db.Collection("groups")
+
+	update := bson.D{{"$pull", bson.D{{"members", user}}}}
+
+	err = coll.FindOneAndUpdate(
+		context.TODO(),
+		bson.D{{"_id", group}},
+		update,
+	).Err()
+
+	return err
+}
diff --git a/routes/accounts.go b/routes/accounts.go
index 26c3ba4..f528f82 100644
--- a/routes/accounts.go
+++ b/routes/accounts.go
@@ -10,4 +10,5 @@ func UserRoute(route fiber.Router) {
 	route.Get("/current", controllers.GetCurrentUser)
 	route.Get("/:id", controllers.GetUser)
 	route.Get("/:id/groups", controllers.GetGroupsUser)
+	route.Get("/:id/not/groups", controllers.GetNotGroupsUser)
 }
diff --git a/routes/groupe.go b/routes/groupe.go
index f2cac2b..950f18a 100644
--- a/routes/groupe.go
+++ b/routes/groupe.go
@@ -10,8 +10,8 @@ func GroupRoute(route fiber.Router) {
 	route.Get("/:id", controllers.GetInfos)
 	route.Get("/:id/events", controllers.GetEvents)
 	route.Put("/create", controllers.CreateGroup)
-	route.Put("/join", controllers.JoinGroup)
-	route.Put("/leave", controllers.LeaveGroupe)
+	route.Put("/:id/join", controllers.JoinGroup)
+	route.Put("/:id/leave", controllers.LeaveGroupe)
 	route.Put("/switch", controllers.ChangeLeader)
 	route.Put("/events/plan", controllers.CreateEvent)
 	route.Put("/events/change", controllers.ChangeEvent)