diff --git a/gemeinsamforschen/README.md b/gemeinsamforschen/README.md
index 284556cdb9189584d471f938099cc7a57e3cbf28..8489d771e9d9a268d13930323750b5571cd75118 100644
--- a/gemeinsamforschen/README.md
+++ b/gemeinsamforschen/README.md
@@ -11,4 +11,18 @@ Go to `Administration -> Allgemeines -> REST API -> Enable Personal Access Token
 ### Manual Personal Access Token
 1. Click on your profile picture -> `Mein Konto` -> `Personal Access Token`
 1. add a new personal access token
-1. add it to configuration class `GFRocketChatConfig`
\ No newline at end of file
+1. add it to configuration class `GFRocketChatConfig`
+
+### Enable iframe integration
+Dont mix up with General/Allegemeines->IFRAME INTEGRATION
+
+Accounts/Konten->IFRAME:
+
+1. click on enable
+
+1. FOR API URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/sso
+localhost:8080/gemeinsamforschen/rest/chat/sso
+
+1. FOR IFRAME URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/login
+localhost:8080/gemeinsamforschen/rest/chat/login
+
diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml
index 5b2bd52a6a6a796f086ffb07f3dfdb57a86ebab2..16571efab215f165250dd42fc56e9d39530b4517 100644
--- a/gemeinsamforschen/pom.xml
+++ b/gemeinsamforschen/pom.xml
@@ -69,6 +69,13 @@
             <version>5.1.6</version>
         </dependency>
 
+        <!-- converting html to java pojo -->
+       <!-- <dependency>
+            <groupId>fr.whimtrip</groupId>
+            <artifactId>whimtrip-ext-htmltopojo</artifactId>
+            <version>1.0.2</version>
+        </dependency>-->
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java
index c0093db06fbecd872a7933ec2be34e3af03fd7aa..8fd0ea098cf755ec609feaa4f76069bf4f8bcddd 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java
@@ -1,17 +1,26 @@
 package unipotsdam.gf.config;
 
 
+import unipotsdam.gf.modules.communication.model.RocketChatUser;
 import unipotsdam.gf.modules.user.User;
 
+/**
+ * ROCKET CHAT NEEDS TO KNOW THE ENDPOINT FOR THE SSO CONFIGURE LIKE IN README
+ *
+ * 1. FOR API URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/sso
+ * localhost:8080/gemeinsamforschen/rest/chat/sso
+ *
+ * 1. FOR IFRAME URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/login
+ * localhost:8080/gemeinsamforschen/rest/chat/login
+ */
 public class GFRocketChatConfig {
 
     //private static final String ROCKET_CHAT_LINK = "http://rocketchat.westeurope.cloudapp.azure.com/";
+    // public static final String ROCKET_CHAT_LINK_0 = "https://rocket.farm-test.rz.uni-potsdam.de";
+    // public static final String ROCKET_CHAT_LINK = "https://rocket.farm-test.rz.uni-potsdam.de/";
 
-    public static final String ROCKET_CHAT_LINK_0 = "https://rocket.farm-test.rz.uni-potsdam.de";
-    public static final String ROCKET_CHAT_LINK = "https://rocket.farm-test.rz.uni-potsdam.de/";
-
-    // or https://rocket.farm.uni-potsdam.de/
-    // https://rocket.farm-test.rz.uni-potsdam.de/home
+    public static final String ROCKET_CHAT_LINK_0 = "http://fleckenroller.cs.uni-potsdam.de:3000";
+    public static final String ROCKET_CHAT_LINK = "http://fleckenroller.cs.uni-potsdam.de:3000/";
 
     /**
      * username: fltrailadmin pw: GEbCM1Rso6TUGGMKtGmg6c5EydMQEu61K9zdD10F
@@ -21,14 +30,14 @@ public class GFRocketChatConfig {
 
     public static final String ROCKET_CHAT_API_LINK = ROCKET_CHAT_LINK + "api/v1/";
 
-   public static final User TEST_USER = new User("student1", "egal",
+   public static final RocketChatUser TEST_USER = new RocketChatUser("student1", "egal",
             "student1@yolo.com", "student1", "",
             "", "6ofqfp8J9ynfvspBJ", false);
 
     /* public static final User ADMIN_USER = new User("admin nachname", "passwort",
               "email", "rocketChatUsername", "rocketChatAuthToken",
               "rocketChatPersonalAccessToken", "rocketChatUserId", false);*/
-    public static final User ADMIN_USER = new User("fltrailadmin", "GEbCM1Rso6TUGGMKtGmg6c5EydMQEu61K9zdD10F",
+    public static final RocketChatUser ADMIN_USER = new RocketChatUser("fltrailadmin", "GEbCM1Rso6TUGGMKtGmg6c5EydMQEu61K9zdD10F",
             "julian.dehne@uni-potsdam.de",  "rocketChatUsername", "rocketChatAuthToken",
             "rocketChatPersonalAccessToken", "SuFbpF3P9aYEo634W", false);
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/MysqlDownException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/MysqlDownException.java
new file mode 100644
index 0000000000000000000000000000000000000000..647f39f6954cdad03233c8af372089ad7816d65a
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/MysqlDownException.java
@@ -0,0 +1,4 @@
+package unipotsdam.gf.exceptions;
+
+public class MysqlDownException {
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/RocketChatDownException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/RocketChatDownException.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b9bdb421f2ff7fa7ba214ebe78c6b7aff1c7398
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/RocketChatDownException.java
@@ -0,0 +1,4 @@
+package unipotsdam.gf.exceptions;
+
+public class RocketChatDownException extends Exception {
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInMysqlException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInMysqlException.java
new file mode 100644
index 0000000000000000000000000000000000000000..5231c47a4ce7f4b3764a223a3730964dabc75e5e
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInMysqlException.java
@@ -0,0 +1,4 @@
+package unipotsdam.gf.exceptions;
+
+public class UserDoesNotExistInMysqlException extends Exception {
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInRocketChatException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInRocketChatException.java
new file mode 100644
index 0000000000000000000000000000000000000000..a877a7f2ec4b0c6fed06392bcc6c40a53cab4372
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInRocketChatException.java
@@ -0,0 +1,4 @@
+package unipotsdam.gf.exceptions;
+
+public class UserDoesNotExistInRocketChatException extends Exception {
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInMysqlException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInMysqlException.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9982f918896a8397294fdbf7bc18ad8b8fb0f1d
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInMysqlException.java
@@ -0,0 +1,9 @@
+package unipotsdam.gf.exceptions;
+
+public class UserExistsInMysqlException extends Exception {
+
+    @Override
+    public String getMessage() {
+        return "Tried to create User but exists in mysql";
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInRocketChatException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInRocketChatException.java
new file mode 100644
index 0000000000000000000000000000000000000000..8160dadf6cc03059fe1bb5d20ff447902a613b65
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInRocketChatException.java
@@ -0,0 +1,8 @@
+package unipotsdam.gf.exceptions;
+
+public class UserExistsInRocketChatException extends Exception {
+    @Override
+    public String getMessage() {
+        return "Tried to create User but exists in RocketChat";
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
index b5c9b6e75fd1b6d22eeef3c389101979c8402dba..2215e62abcbda96922e33b0ff9cab8cd3c962690 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
@@ -1,8 +1,12 @@
 package unipotsdam.gf.interfaces;
 
 
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
+import unipotsdam.gf.exceptions.UserExistsInRocketChatException;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.communication.model.EMailMessage;
+import unipotsdam.gf.modules.communication.model.RocketChatUser;
 import unipotsdam.gf.modules.communication.model.chat.ChatMessage;
 import unipotsdam.gf.modules.group.Group;
 import unipotsdam.gf.modules.project.Project;
@@ -37,7 +41,8 @@ public interface ICommunication {
      * @param name chat room name
      * @return chat room id
      */
-    String createChatRoom(String name, boolean readOnly, List<User> users);
+    String createChatRoom(String name, boolean readOnly, List<User> users)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
     /**
      * creates chatRoom with name "group.projectId - group.id" and set chatRoomId for group
@@ -45,11 +50,17 @@ public interface ICommunication {
      * @param group Object for information
      * @return true if chatRoom was created, otherwise false
      */
-    boolean createChatRoom(Group group, boolean readOnly);
+    boolean createChatRoom(Group group, boolean readOnly)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
-    String createEmptyChatRoom(String name, boolean readOnly);
+    String createEmptyChatRoom(String name, boolean readOnly)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
-    boolean deleteChatRoom(String roomId);
+    void deleteChatRoom(Group group) throws RocketChatDownException, UserDoesNotExistInRocketChatException;
+
+    void deleteChatRoom(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException;
+
+    boolean deleteChatRoom(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
     /**
      * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/invite/
@@ -58,9 +69,11 @@ public interface ICommunication {
      * @param user   information about user
      * @return if user was added successfully
      */
-    boolean addUserToChatRoom(User user, String roomId);
+    boolean addUserToChatRoom(User user, String roomId)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
-    boolean removeUserFromChatRoom(User user, String roomId);
+    boolean removeUserFromChatRoom(User user, String roomId)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
     /**
      * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/settopic/
@@ -80,9 +93,9 @@ public interface ICommunication {
      * @param roomId chat room id
      * @return chat room information
      */
-    String getChatRoomName(String roomId);
+    String getChatRoomName(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
-    boolean exists(String roomId);
+    boolean exists(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
     /**
      * api: https://rocket.chat/docs/developer-guides/rest-api/authentication/login/
@@ -90,7 +103,8 @@ public interface ICommunication {
      * @param user username and password
      * @return information about user, especially authtoken for later use of endpoints
      */
-    User loginUser(User user);
+    RocketChatUser loginUser(User user)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
     /**
      * api 1: https://rocket.chat/docs/developer-guides/rest-api/users/register/
@@ -102,9 +116,11 @@ public interface ICommunication {
      * @param user registers user to rocket.chat
      * @return user id
      */
-    boolean registerUser(User user);
+    boolean registerUser(User user)
+            throws RocketChatDownException, UserExistsInRocketChatException;
 
-    String getChatRoomLink(String userToken, String projectId);
+    String getChatRoomLink(String userToken, String projectId)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 
     String getProjectChatRoomLink(String projectName);
 
@@ -115,4 +131,6 @@ public interface ICommunication {
     boolean informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project);
 
     boolean sendMessageToUsers(Project project, EMailMessage eMailMessage);
+
+    public void delete(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException;
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java
index 2b1ee6f6aa1590c5d597afafcd4b1b258fdf8474..4708281160f29938c3ff4c1ee19052d21b0f0dcf 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java
@@ -7,6 +7,7 @@ import unipotsdam.gf.modules.group.GroupFormationMechanism;
 import unipotsdam.gf.modules.group.GroupfindingCriteria;
 
 import java.util.ArrayList;
+import java.util.List;
 
 public interface IGroupFinding {
 
@@ -45,4 +46,6 @@ public interface IGroupFinding {
     ArrayList<String> getStudentsInSameGroup(StudentIdentifier student);
 
     int getMinNumberOfStudentsNeeded(Project project);
+
+    List<Group> createRandomGroups(Project project);
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/LoginToken.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/LoginToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..67b37b22728e42f4cce4fdb67a3c412e1f2f6933
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/LoginToken.java
@@ -0,0 +1,21 @@
+package unipotsdam.gf.modules.communication.model;
+
+public class LoginToken {
+    private String loginToken;
+
+
+    public LoginToken(String loginToken) {
+        this.loginToken = loginToken;
+    }
+
+    public LoginToken( ) {
+    }
+
+    public String getLoginToken() {
+        return loginToken;
+    }
+
+    public void setLoginToken(String loginToken) {
+        this.loginToken = loginToken;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/RocketChatUser.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/RocketChatUser.java
new file mode 100644
index 0000000000000000000000000000000000000000..131f285cc8ceb00e2338eaca9207499f78cf1991
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/RocketChatUser.java
@@ -0,0 +1,50 @@
+package unipotsdam.gf.modules.communication.model;
+
+import unipotsdam.gf.modules.user.User;
+
+public class RocketChatUser extends User {
+    private String rocketChatAuthToken;
+    // not in this version
+    private String rocketChatPersonalAccessToken;
+    // the actual id that oculd be used instead of the email with the queries
+    private String rocketChatUserId;
+
+    public RocketChatUser(String name, String password, String email, String rocketChatUsername,
+                String rocketChatAuthToken, String rocketChatPersonalAccessToken, String rocketChatUserId,
+                Boolean isStudent) {
+        super(name, password,email,rocketChatUsername, isStudent);
+        this.rocketChatAuthToken = rocketChatAuthToken;
+        this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken;
+        this.rocketChatUserId = rocketChatUserId;
+
+    }
+
+    public RocketChatUser() {
+
+    }
+
+
+    public String getRocketChatUserId() {
+        return rocketChatUserId;
+    }
+
+    public void setRocketChatUserId(String rocketChatUserId) {
+        this.rocketChatUserId = rocketChatUserId;
+    }
+
+    public String getRocketChatAuthToken() {
+        return rocketChatAuthToken;
+    }
+
+    public void setRocketChatAuthToken(String rocketChatAuthToken) {
+        this.rocketChatAuthToken = rocketChatAuthToken;
+    }
+
+    public String getRocketChatPersonalAccessToken() {
+        return rocketChatPersonalAccessToken;
+    }
+
+    public void setRocketChatPersonalAccessToken(String rocketChatPersonalAccessToken) {
+        this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatSuccessResponse.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatSuccessResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..8fa718f0eb8cbc88b8d18141618dd217a43e763c
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatSuccessResponse.java
@@ -0,0 +1,19 @@
+package unipotsdam.gf.modules.communication.model.rocketChat;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RocketChatSuccessResponse {
+    private String success;
+
+    public RocketChatSuccessResponse() {
+    }
+
+    public String getSuccess() {
+        return success;
+    }
+
+    public void setSuccess(String success) {
+        this.success = success;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java
index d9f6579d7bcb1db66785e629520beac0d21fd71b..2b8f949a142ecae91c0d0a03a05f39a9cea2e52a 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java
@@ -7,12 +7,17 @@ import org.apache.logging.log4j.util.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import unipotsdam.gf.config.GFRocketChatConfig;
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
+import unipotsdam.gf.exceptions.UserExistsInRocketChatException;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.communication.model.EMailMessage;
+import unipotsdam.gf.modules.communication.model.RocketChatUser;
 import unipotsdam.gf.modules.communication.model.chat.ChatMessage;
 import unipotsdam.gf.modules.communication.model.rocketChat.RocketChatLoginResponse;
 import unipotsdam.gf.modules.communication.model.rocketChat.RocketChatRegisterResponse;
+import unipotsdam.gf.modules.communication.model.rocketChat.RocketChatSuccessResponse;
 import unipotsdam.gf.modules.communication.util.RocketChatHeaderMapBuilder;
 import unipotsdam.gf.modules.group.Group;
 import unipotsdam.gf.modules.group.GroupDAO;
@@ -69,7 +74,7 @@ public class CommunicationService implements ICommunication {
 
     }
 
-    private static Boolean isUpdated;
+/*    private static Boolean isUpdated;
 
     private static synchronized Boolean setAdminToken() {
         if (isUpdated == null) {
@@ -87,7 +92,7 @@ public class CommunicationService implements ICommunication {
             isUpdated = false;
         }
         return null;
-    }
+    }*/
 
     @Override
     public List<ChatMessage> getChatHistory(String roomId) {
@@ -102,15 +107,17 @@ public class CommunicationService implements ICommunication {
     }
 
     @Override
-    public String createEmptyChatRoom(String name, boolean readOnly) {
+    public String createEmptyChatRoom(String name, boolean readOnly)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         return createChatRoom(name, readOnly, new ArrayList<>());
     }
 
     @Override
-    public String createChatRoom(String name, boolean readOnly, List<User> member) {
-        loginUser(ADMIN_USER);
+    public String createChatRoom(String name, boolean readOnly, List<User> member)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        //loginUser(ADMIN_USER);
 
-        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build();
+        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build();
 
         List<String> usernameList = member.stream().map(User::getRocketChatUsername).collect(Collectors.toList());
         HashMap<String, Object> bodyMap = new HashMap<>();
@@ -141,11 +148,12 @@ public class CommunicationService implements ICommunication {
     }
 
     @Override
-    public boolean createChatRoom(Group group, boolean readOnly) {
-        loginUser(ADMIN_USER);
+    public boolean createChatRoom(Group group, boolean readOnly)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        //loginUser(ADMIN_USER);
 
         // chatRoom name: projectId - GroupId
-        String chatRoomName = String.join("-", group.getProjectName(), String.valueOf(group.getId()));
+        String chatRoomName = getChatRoomName(group);
         if (exists(chatRoomName)) {
             return true;
         }
@@ -159,11 +167,25 @@ public class CommunicationService implements ICommunication {
     }
 
     @Override
-    public boolean deleteChatRoom(String roomId) {
+    public void deleteChatRoom(Group group) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        deleteChatRoom(getChatRoomName(group));
+    }
+
+    @Override
+    public void deleteChatRoom(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        deleteChatRoom(project.getName());
+    }
+
+    private String getChatRoomName(Group group) {
+        return String.join("-", group.getProjectName(), String.valueOf(group.getId()));
+    }
+
+    @Override
+    public boolean deleteChatRoom(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         // TODO: maybe add lock for getChatRoomName, so synchronized access doesn't create errors while deleting
-        loginUser(ADMIN_USER);
+        //loginUser(ADMIN_USER);
 
-        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build();
+        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build();
         HashMap<String, String> bodyMap = new HashMap<>();
         bodyMap.put("roomId", roomId);
 
@@ -184,25 +206,29 @@ public class CommunicationService implements ICommunication {
     }
 
     @Override
-    public boolean addUserToChatRoom(User user, String roomId) {
+    public boolean addUserToChatRoom(User user, String roomId)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         return modifyChatRoom(user, roomId, true);
     }
 
     @Override
-    public boolean removeUserFromChatRoom(User user, String roomId) {
+    public boolean removeUserFromChatRoom(User user, String roomId)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         return modifyChatRoom(user, roomId, false);
     }
 
-    private boolean modifyChatRoom(User user, String roomId, boolean addUser) {
-        loginUser(ADMIN_USER);
+    private boolean modifyChatRoom(User user, String roomId, boolean addUser)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        //loginUser(ADMIN_USER);
+        RocketChatUser student = loginUser(user);
 
-        if (hasEmptyParameter(user.getRocketChatUserId(), roomId)) {
+        if (hasEmptyParameter(user.getRocketChatUsername(), roomId)) {
             return false;
         }
-        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build();
+        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build();
         Map<String, String> bodyMap = new HashMap<>();
         bodyMap.put("roomId", roomId);
-        bodyMap.put("userId", user.getRocketChatUserId());
+        bodyMap.put("userId", student.getRocketChatUserId());
 
         String groupUrl = addUser ? "groups.invite" : "groups.kick";
 
@@ -225,11 +251,11 @@ public class CommunicationService implements ICommunication {
     }
 
     @Override
-    public String getChatRoomName(String roomId) {
+    public String getChatRoomName(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
 
-        loginUser(ADMIN_USER);
+        //loginUser(ADMIN_USER);
 
-        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build();
+        Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build();
 
         HttpResponse<Map> response = unirestService.get(ROCKET_CHAT_API_LINK + "groups.info").headers(headerMap)
                 .queryString("roomId", roomId).asObject(Map.class);
@@ -248,7 +274,7 @@ public class CommunicationService implements ICommunication {
     }
 
     @Override
-    public User loginUser(User user) {
+    public RocketChatUser loginUser(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
 
         if (hasEmptyParameter(user.getEmail(), user.getPassword())) {
             return null;
@@ -258,36 +284,43 @@ public class CommunicationService implements ICommunication {
         HashMap<String, String> rocketChatAuth = new HashMap<>();
         rocketChatAuth.put("user", user.getEmail());
         rocketChatAuth.put("password", user.getPassword());
-/*
+
         HttpResponse<RocketChatLoginResponse> response =
                 unirestService.post(ROCKET_CHAT_API_LINK + "login").body(rocketChatAuth)
                         .asObject(RocketChatLoginResponse.class);
 
         if (isBadRequest(response)) {
-            return null;
+            throw new UserDoesNotExistInRocketChatException();
         } else {
-            if (ADMIN_USER.equals(user)) {
+            /*if (ADMIN_USER.equals(user)) {
                 setAdminToken();
-            }
+            }*/
         }
 
         RocketChatLoginResponse rocketChatLoginResponse = response.getBody();
-        user.setRocketChatUserId(rocketChatLoginResponse.getUserId());
-        user.setRocketChatAuthToken(rocketChatLoginResponse.getAuthToken());
-*/
-        return user;
+
+        RocketChatUser rocketChatUser = new RocketChatUser();
+        rocketChatUser.setEmail(user.getEmail());
+        rocketChatUser.setPassword(user.getPassword());
+        rocketChatUser.setRocketChatUserId(rocketChatLoginResponse.getUserId());
+        rocketChatUser.setRocketChatAuthToken(rocketChatLoginResponse.getAuthToken());
+
+        return rocketChatUser;
     }
 
     @Override
-    public boolean registerUser(User user) {
+    public boolean registerUser(User user) throws RocketChatDownException, UserExistsInRocketChatException {
 
         if (hasEmptyParameter(user.getEmail(), user.getName(), user.getPassword())) {
             return false;
         }
 
         HashMap<String, String> rocketChatRegister = new HashMap<>();
-        String rocketChatUsername = createRocketChatUsername(user);
-        rocketChatRegister.put("username", rocketChatUsername);
+        if (user.getRocketChatUsername() == null) {
+            String rocketChatUsername = createRocketChatUsername(user);
+            user.setRocketChatUsername(rocketChatUsername);
+        }
+        rocketChatRegister.put("username", user.getRocketChatUsername());
         rocketChatRegister.put("email", user.getEmail());
         rocketChatRegister.put("pass", user.getPassword());
         rocketChatRegister.put("name", user.getName());
@@ -296,19 +329,20 @@ public class CommunicationService implements ICommunication {
                 unirestService.post(ROCKET_CHAT_API_LINK + "users.register").body(rocketChatRegister)
                         .asObject(RocketChatRegisterResponse.class);
 
-        if (isBadRequest(response)) {
-            return false;
+        Boolean badRequest = isBadRequest(response);
+        if (badRequest) {
+            throw new UserExistsInRocketChatException();
         }
 
         RocketChatRegisterResponse registerResponse = response.getBody();
+
+        // not sure we need this test
         if (!registerResponse.isSuccessful()) {
             return false;
         }
 
-        user.setRocketChatUsername(rocketChatUsername);
-        user.setRocketChatUserId(registerResponse.getUserId());
-
-
+        // updateRocketChatUserName user with rocket chat data
+        userDAO.updateRocketChatUserName(user);
         /**
          * TODO with higher rocket chat version a personal access tokens exist and this function can be used
          */
@@ -316,9 +350,10 @@ public class CommunicationService implements ICommunication {
         return true;
     }
 
-    public String getChatRoomLink(String userEmail, String projectName) {
+    public String getChatRoomLink(String userEmail, String projectName)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
 
-        loginUser(ADMIN_USER);
+        //loginUser(ADMIN_USER);
 
         String chatRoomId = groupDAO.getGroupChatRoomId(new User(userEmail), new Project(projectName));
         if (chatRoomId.isEmpty()) {
@@ -338,6 +373,7 @@ public class CommunicationService implements ICommunication {
         return ROCKET_CHAT_ROOM_LINK + projectName + "?layout=embedded";
     }
 
+
     // TODO: Think about splitting email and chat communication into different
     @Override
     public boolean sendSingleMessage(EMailMessage eMailMessage, User user) {
@@ -445,18 +481,57 @@ public class CommunicationService implements ICommunication {
         user.setRocketChatPersonalAccessToken(responseBody.get("token").toString());
         return true;
     }*/
-    private boolean isBadRequest(HttpResponse response) {
+    private Boolean isBadRequest(HttpResponse response) throws RocketChatDownException {
         int status = response.getStatus();
+        if (Response.Status.OK.getStatusCode() == status) {
+            return false;
+        }
         if (Response.Status.UNAUTHORIZED.getStatusCode() == status) {
-            unsetAdminToken();
+            //unsetAdminToken();
+            return true;
+        }
+        if (Response.Status.NOT_FOUND.getStatusCode() == status) {
+            //unsetAdminToken();
+            throw new RocketChatDownException();
+        } else {
+            return true;
         }
-        return status == Response.Status.BAD_REQUEST.getStatusCode() || status == Response.Status.UNAUTHORIZED
-                .getStatusCode();
     }
 
 
     @Override
-    public boolean exists(String roomId) {
+    public boolean exists(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         return !getChatRoomName(roomId).isEmpty();
     }
+
+    public void delete(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        //loginUser(ADMIN_USER);
+        // we need the rocketchatid
+        if (!(user instanceof RocketChatUser)) {
+            // we need the password to delete the user
+            if (user.getPassword() == null) {
+                user = userDAO.getUserByEmail(user.getEmail());
+            }
+            // fetchign the rocketchat id
+            try {
+                RocketChatUser rocketLeagueUser = loginUser(user);
+                // the actual delete
+                Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build();
+                Map<String, String> bodyMap = new HashMap<>();
+                bodyMap.put("userId", rocketLeagueUser.getRocketChatUserId());
+
+                HttpResponse<RocketChatSuccessResponse> response =
+                        unirestService.post(ROCKET_CHAT_API_LINK + "users.delete").headers(headerMap).body(bodyMap).asObject(RocketChatSuccessResponse.class);
+
+                Boolean badRequest = isBadRequest(response);
+                if (badRequest) {
+                    //throw new UserDoesNotExistInRocketChatException();
+                }
+            } catch (UserDoesNotExistInRocketChatException e) {
+                // wenn der Nutzer nicht existiert, brauchen wir ihn auch nicht löschen
+            }
+        }
+
+
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java
index 449c533b39bcddf45737e8a164d247fc79377eab..8def9d716f836665c67762a09823c73d137b9044 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java
@@ -1,5 +1,10 @@
 package unipotsdam.gf.modules.communication.util;
 
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
+import unipotsdam.gf.modules.communication.model.RocketChatUser;
+import unipotsdam.gf.modules.communication.service.CommunicationService;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -23,10 +28,14 @@ public class RocketChatHeaderMapBuilder {
         return this;
     }
 
-    public RocketChatHeaderMapBuilder withRocketChatAdminAuth() {
+    public RocketChatHeaderMapBuilder withRocketChatAdminAuth(CommunicationService communicationService)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         // with new version of rocketChat: RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(ADMIN_USER.getRocketChatPersonalAccessToken());
-        RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(ADMIN_USER.getRocketChatAuthToken());
-        return rocketChatHeaderMapBuilder.withRocketChatUserId(ADMIN_USER.getRocketChatUserId());
+
+        RocketChatUser admin = communicationService.loginUser(ADMIN_USER);
+
+        RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(admin.getRocketChatAuthToken());
+        return rocketChatHeaderMapBuilder.withRocketChatUserId(admin.getRocketChatUserId());
     }
 
     public Map<String, String> build() {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java
index d1178369f086dab8ef56177949db28aad8dc9c62..d1e34cb5a31875c9770d44247aa88bcaeadee665 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java
@@ -2,11 +2,18 @@ package unipotsdam.gf.modules.communication.view;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import unipotsdam.gf.config.GFRocketChatConfig;
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
+import unipotsdam.gf.modules.communication.model.LoginToken;
+import unipotsdam.gf.modules.communication.model.RocketChatUser;
 import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.session.GFContexts;
 
 import javax.annotation.ManagedBean;
 import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -14,6 +21,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.util.List;
@@ -32,7 +40,8 @@ public class CommunicationView {
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/info/{roomId}")
-    public Response getChatRoomInformation(@PathParam("roomId") String roomId) {
+    public Response getChatRoomInformation(@PathParam("roomId") String roomId)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String chatRoomName = communicationService.getChatRoomName(roomId);
         if (chatRoomName.isEmpty()) {
             log.error("chatRoom not found for roomId: {}", roomId);
@@ -46,7 +55,8 @@ public class CommunicationView {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/addUser/{roomId}")
-    public Response addUserToChatRoom(@PathParam("roomId") String roomId, User user) {
+    public Response addUserToChatRoom(@PathParam("roomId") String roomId, User user)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         if (isNull(user)) {
             log.trace("addUser user object was null");
             return Response.status(Response.Status.BAD_REQUEST).entity("must provide user").build();
@@ -62,7 +72,9 @@ public class CommunicationView {
             response = Response.ok(wasAdded).build();
         } else {
             log.error("error while adding user to chat room");
-            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom").build();
+            response =
+                    Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom")
+                            .build();
         }
         return response;
     }
@@ -72,7 +84,8 @@ public class CommunicationView {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/removeUser/{roomId}")
-    public Response removeUserFromChatRoom(User user, @PathParam("roomId") String roomId) {
+    public Response removeUserFromChatRoom(User user, @PathParam("roomId") String roomId)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         if (isNull(user)) {
             log.trace("removeUser user object was null");
             return Response.status(Response.Status.BAD_REQUEST).entity("must provide user").build();
@@ -88,7 +101,9 @@ public class CommunicationView {
             response = Response.ok(wasRemoved).build();
         } else {
             log.error("error while adding user to chat room");
-            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom").build();
+            response =
+                    Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom")
+                            .build();
         }
         return response;
     }
@@ -97,7 +112,9 @@ public class CommunicationView {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/room/create/{name}")
-    public Response createChatRoom(@PathParam("name") String name, List<User> users, @QueryParam("readOnly") boolean readOnly) {
+    public Response createChatRoom(
+            @PathParam("name") String name, List<User> users, @QueryParam("readOnly") boolean readOnly)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         if (isNull(name)) {
             return Response.status(Response.Status.BAD_REQUEST).entity("must provide name as queryParam").build();
         }
@@ -109,4 +126,31 @@ public class CommunicationView {
         log.trace("response for createChatRoom: {}", chatId);
         return Response.status(Response.Status.CREATED).entity(chatId).build();
     }
+
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/sso")
+    public LoginToken provideLoginToken(@Context HttpServletRequest req, Object payload)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        if (req.getSession().getAttribute(GFContexts.ROCKETCHATAUTHTOKEN) != null) {
+            String token = getAuthToken(req);
+            return new LoginToken(token);
+        } else {
+            RocketChatUser user = communicationService.loginUser(GFRocketChatConfig.ADMIN_USER);
+            return new LoginToken(user.getRocketChatAuthToken());
+        }
+    }
+
+    private String getAuthToken(@Context HttpServletRequest req) {
+        return req.getSession().getAttribute(GFContexts.ROCKETCHATAUTHTOKEN).toString();
+    }
+
+    @GET
+    @Produces(MediaType.TEXT_HTML)
+    @Path("/login")
+    public String provideLoginHTML(@Context HttpServletRequest req) {
+        String rocketChatIntegration = "<script> window.parent.postMessage({event: 'login-with-token',loginToken:" +
+                " '"+getAuthToken(req)+"'}, '"+GFRocketChatConfig.ROCKET_CHAT_LINK_0 +"');</script>";
+        return rocketChatIntegration;
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java
index 0453ce6b9c817164a797f6b4f1834173a4e0f582..f7b551f5fa017eed2ec82e5036251313d9cdb619 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java
@@ -11,6 +11,7 @@ public class Group {
     private List<User> members;
     private String projectName;
     private String chatRoomId;
+    private String name;
 
     public Group() {
         members = new ArrayList<>();
@@ -68,8 +69,6 @@ public class Group {
         members.add(user);
     }
 
-
-
     public int getId() {
         return id;
     }
@@ -88,4 +87,12 @@ public class Group {
     public int hashCode() {
         return getId();
     }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java
index ebe009fa95ae7578f60b494a3b9815293027ce64..e6ae168f67c0e0bf262b3e39cfaaf57b2d621a44 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java
@@ -176,10 +176,17 @@ public class GroupDAO {
 
     public void clearChatRoomIdOfGroup(String chatRoomId) {
         connect.connect();
-        String mysqlRequest = "update groups SET chatRoomId = ? where chatRoomId = ?";
+        String mysqlRequest = "updateRocketChatUserName groups SET chatRoomId = ? where chatRoomId = ?";
         connect.issueUpdateStatement(mysqlRequest, "", chatRoomId);
         connect.close();
     }
+
+    public void deleteGroups(Project project) {
+        String query = "DELETE from groups where projectName = ?";
+        connect.connect();
+        connect.issueInsertOrDeleteStatement(query, project.getName());
+        connect.close();
+    }
 }
 
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupData.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupData.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc78582ee0ab378776f969384f5179a0c2ed9ba4
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupData.java
@@ -0,0 +1,23 @@
+package unipotsdam.gf.modules.group;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GroupData {
+    List<Group> groups;
+
+    public GroupData() {
+    }
+
+    public GroupData(List<Group> groups) {
+        this.groups = groups;
+    }
+
+    public List<Group> getGroups() {
+        return groups;
+    }
+
+    public void setGroups(ArrayList<Group> groups) {
+        this.groups = groups;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java
index 359a4f442263aba16aa86d3f83c4ae2642019aee..e064017dcf01ba82585f1a8f814766f911bfcea0 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java
@@ -27,10 +27,20 @@ public class GroupView {
     private Management iManagement;
 
     @Inject
-    ProjectDAO projectDAO;
+    private ProjectDAO projectDAO;
 
     @Inject
-    GroupFormationProcess groupFormationProcess;
+    private GroupFormationProcess groupFormationProcess;
+
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/all/projects/{projectName}")
+    public GroupData getOrInitializeGroups(@PathParam("projectName") String projectName) {
+        GroupData data = groupFormationProcess.getOrInitializeGroups(new Project(projectName));
+        return  data;
+    }
+
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
@@ -83,7 +93,6 @@ public class GroupView {
             throw new WebApplicationException(
                     "the groupfindingmechanism needs to be one of " + GroupFormationMechanism.values().toString());
         }
-
     }
 
 
@@ -97,6 +106,12 @@ public class GroupView {
 
 
 
+    /**
+     * find out if this is used by learning goal
+     * @param projectName
+     * @param groups
+     */
+    @Deprecated
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
     @Path("/projects/{projectName}")
@@ -107,4 +122,21 @@ public class GroupView {
         groupfinding.persistGroups(Arrays.asList(groups), project);
     }
 
+    @PUT
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Path("/projects/{projectName}/groups")
+    public void persistGroups(@PathParam("projectName") String  projectName, GroupData data) {
+        Project project = new Project(projectName);
+
+        groupfinding.persistGroups(data.getGroups(), project);
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Path("/projects/{projectName}/groups/finalize")
+    public void finalizeGroups(@PathParam("projectName") String  projectName) {
+        Project project = new Project(projectName);
+        groupFormationProcess.finalize(project);
+    }
+
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java
index 24374f5e7c960d49199a6e0369b64294ff3adfd1..04ea415eaa08f0cd170b35d8515acc37d400166f 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java
@@ -3,9 +3,12 @@ package unipotsdam.gf.modules.group;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.interfaces.IGroupFinding;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
+import unipotsdam.gf.modules.user.User;
+import unipotsdam.gf.modules.user.UserDAO;
 
 import javax.inject.Inject;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public class GroupfindingImpl implements IGroupFinding {
@@ -13,6 +16,9 @@ public class GroupfindingImpl implements IGroupFinding {
     @Inject
     private GroupDAO groupDAO;
 
+    @Inject
+    private UserDAO userDAO;
+
     @Inject
     public GroupfindingImpl(GroupDAO groupDAO) {
         this.groupDAO = groupDAO;
@@ -60,4 +66,57 @@ public class GroupfindingImpl implements IGroupFinding {
 
         return participantsNeeded;
     }
+
+    @Override
+    public List<Group> createRandomGroups(Project project) {
+        ArrayList<Group> result = new ArrayList<>();
+        groupDAO.deleteGroups(project);
+        List<User> usersByProjectName = userDAO.getUsersByProjectName(project.getName());
+        int numberOfUsers = usersByProjectName.size();
+        if (usersByProjectName.size()<6){
+            Group group = new Group();
+            group.getMembers().addAll(usersByProjectName);
+            result.add(group);
+        } else {
+            int numberOf3Groups = getNumberOf3Groups(numberOfUsers);
+            //int numberOf4Groups = getNumberOf4Groups(numberOfUsers);
+
+            Group group = new Group();
+            int i = 1;
+            group.setName(i + "");
+            for (User user : usersByProjectName) {
+                if (numberOf3Groups > 0) {
+                    numberOf3Groups--;
+                    // TODO insert formula here for the correct groups
+                    if (group.getMembers().size() == 3) {
+                        result.add(group);
+                        group = new Group();
+                        i++;
+                        group.setName(i + "");
+                    }
+                } else {
+                    if (group.getMembers().size() == 4) {
+                        result.add(group);
+                        group = new Group();
+                        i++;
+                        group.setName(i + "");
+                    }
+                }
+                group.addMember(user);
+                // set group name 1 more
+            }
+            result.add(group);
+        }
+        return result;
+    }
+    // (number % 3) + (Math.floor(number/3)-(number%3)) = n für alle Zahlen größer als 5
+    public int getNumberOf4Groups(Integer number) {
+        return  (number % 3);
+    }
+
+
+    // every number can be divided in factors 4 and 3 as long it is greater then 5
+    public int getNumberOf3Groups(Integer number) {
+        return (number / 3) - (number % 3);
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupfinding/service/GroupDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupfinding/service/GroupDAO.java
deleted file mode 100644
index ad14b1f6d9f4323985b643677521d98c455dc101..0000000000000000000000000000000000000000
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupfinding/service/GroupDAO.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
-package unipotsdam.gf.modules.groupfinding.service;
-
-import org.apache.logging.log4j.util.Strings;
-import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
-import unipotsdam.gf.modules.group.Group;
-import unipotsdam.gf.mysql.MysqlConnect;
-import unipotsdam.gf.mysql.VereinfachtesResultSet;
-import unipotsdam.gf.util.ResultSetUtil;
-
-import javax.annotation.ManagedBean;
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.util.*;
-
-@ManagedBean
-@Resource
-@Singleton
-public class GroupDAO {
-
-    private MysqlConnect connect;
-
-    @Inject
-    public GroupDAO(MysqlConnect connect) {
-        this.connect = connect;
-    }
-
-    public ArrayList<String> getStudentsInSameGroupAs(StudentIdentifier student) {
-        connect.connect();
-        ArrayList<String> result = new ArrayList<>();
-        Integer groupId;
-        String mysqlRequest1 = "SELECT groupId FROM `groupuser` WHERE `projectId`=? AND `studentId`=?";
-        VereinfachtesResultSet vereinfachtesResultSet1 =
-                connect.issueSelectStatement(mysqlRequest1, student.getProjectName(), student.getUserEmail());
-        vereinfachtesResultSet1.next();
-        groupId = vereinfachtesResultSet1.getInt("groupId");
-        String mysqlRequest2 = "SELECT * FROM `groupuser` WHERE `groupId`=?";
-        VereinfachtesResultSet vereinfachtesResultSet2 =
-                connect.issueSelectStatement(mysqlRequest2, groupId);
-        boolean next2 = vereinfachtesResultSet2.next();
-        while (next2) {
-            String peer = vereinfachtesResultSet2.getString("studentId");
-            if (!peer.equals(student.getUserEmail()))
-                result.add(peer);
-            next2 = vereinfachtesResultSet2.next();
-        }
-        connect.close();
-        return result;
-    }
-
-    public void persist(Group group) {
-        connect.connect();
-        List<Group> existingGroups = getExistingEntriesOfGroups(group.get());
-        if (Objects.isNull(group.getChatRoomId())) {
-            group.setChatRoomId("");
-        }
-        String mysqlRequestGroup = "INSERT INTO groups (`projectId`,`chatRoomId`) values (?,?)";
-        connect.issueInsertOrDeleteStatement(mysqlRequestGroup, group.getProjectId(), group.getChatRoomId());
-
-        List<Group> existingGroupsWithNewEntry = getExistingEntriesOfGroups(group.getProjectId());
-        existingGroupsWithNewEntry.removeAll(existingGroups);
-        group.setId(existingGroupsWithNewEntry.get(0).getId());
-        for (User groupMember : group.getMembers()) {
-            String mysqlRequest2 = "INSERT INTO groupuser (`studentId`, `projectId`, `groupId`) values (?,?,?)";
-            connect.issueInsertOrDeleteStatement(mysqlRequest2, groupMember.getEmail(), group.getProjectId(), group.getId());
-        }
-        connect.close();
-
-    }
-
-    public void update(Group group) {
-        connect.connect();
-        String mysqlRequest = "UPDATE groups SET projectId = ?, chatRoomId = ? where id = ?";
-        connect.issueUpdateStatement(mysqlRequest, group.getProjectId(), group.getChatRoomId(), group.getId());
-        connect.close();
-        // TODO: implement update of groupuser if needed later (if member list need to be updated)
-    }
-
-    public void clearChatRoomIdOfGroup(String chatRoomId) {
-        connect.connect();
-        String mysqlRequest = "update groups SET chatRoomId = ? where chatRoomId = ?";
-        connect.issueUpdateStatement(mysqlRequest, "", chatRoomId);
-        connect.close();
-    }
-
-    public Boolean exists(Group group) {
-        List<Group> existingGroups = getGroupsByProjectId(group.getProjectId());
-        return existingGroups.contains(group);
-    }
-
-    public void addGroupMember(User groupMember, int groupId) {
-        // TODO: implement
-    }
-
-    public void deleteGroupMember(User groupMember, int groupId) {
-        // TODO: implement
-    }
-
-    public List<Group> getGroupsByProjectId(String projectId) {
-        connect.connect();
-        String mysqlRequest = "SELECT * FROM groups g " +
-                "JOIN groupuser gu ON g.id=gu.groupId " + "JOIN users u ON gu.studentId=u.email " +
-                "where g.projectId = ?";
-        VereinfachtesResultSet vereinfachtesResultSet =
-                connect.issueSelectStatement(mysqlRequest, projectId);
-        if (Objects.isNull(vereinfachtesResultSet)) {
-            connect.close();
-            return Collections.emptyList();
-        }
-        HashMap<Integer, Group> groupHashMap = new HashMap<>();
-        while (vereinfachtesResultSet.next()) {
-            fillGroupFromResultSet(vereinfachtesResultSet, groupHashMap);
-        }
-        ArrayList<Group> groups = new ArrayList<>();
-        groupHashMap.forEach((key, group) -> groups.add(group));
-        connect.close();
-        return groups;
-    }
-
-
-
-    private void fillGroupFromResultSet(VereinfachtesResultSet vereinfachtesResultSet, HashMap<Integer, Group> existingGroups) {
-        int id = vereinfachtesResultSet.getInt("id");
-        if (existingGroups.containsKey(id)) {
-            existingGroups.get(id).addMember(ResultSetUtil.getUserFromResultSet(vereinfachtesResultSet));
-        } else {
-            String projectId = vereinfachtesResultSet.getString("projectId");
-            User user = ResultSetUtil.getUserFromResultSet(vereinfachtesResultSet);
-            String chatRoomId = vereinfachtesResultSet.getString("chatRoomId");
-            ArrayList<User> userList = new ArrayList<>(Collections.singletonList(user));
-            Group group = new Group(id, userList, projectId, chatRoomId);
-            existingGroups.put(id, group);
-        }
-    }
-
-    private List<Group> getExistingEntriesOfGroups(String projectId) {
-        String mysqlExistingGroup = "SELECT * FROM groups WHERE projectId = ?";
-        VereinfachtesResultSet resultSet = connect.issueSelectStatement(mysqlExistingGroup, projectId);
-        ArrayList<Group> existingGroups = new ArrayList<>();
-        while (resultSet.next()) {
-            int id = resultSet.getInt("id");
-            Group existingGroup = new Group(id, projectId);
-            existingGroups.add(existingGroup);
-        }
-        return existingGroups;
-    }
-
-}
-*/
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java
index 03327bb3d4ce66bf062a21286c823c9af9ccf71d..6a95ea4cf55da3e767efa2d65ecc0f34fe0259d1 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java
@@ -73,7 +73,7 @@ public class ManagementImpl implements Management {
 
     @Override
     public void update(User user) {
-        userDAO.update(user);
+        userDAO.updateRocketChatUserName(user);
     }
 
     @Override
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java
index ab8525d346360372a68f0e3ef601f96bd5327f8a..645934de781333b828f07d1b0934e082e638f94b 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java
@@ -1,8 +1,9 @@
 package unipotsdam.gf.modules.project;
 
-import unipotsdam.gf.process.ProjectCreationProcess;
-import unipotsdam.gf.process.tasks.TaskDAO;
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
 import unipotsdam.gf.modules.user.User;
+import unipotsdam.gf.process.ProjectCreationProcess;
 import unipotsdam.gf.session.GFContexts;
 
 import javax.annotation.ManagedBean;
@@ -36,7 +37,8 @@ public class ProjectView {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.TEXT_PLAIN)
     @Path("/create")
-    public void createProject(@Context HttpServletRequest req, Project project) throws URISyntaxException, IOException {
+    public void createProject(@Context HttpServletRequest req, Project project)
+            throws IOException, RocketChatDownException, UserDoesNotExistInRocketChatException {
         String userEmail = gfContexts.getUserEmail(req);
         User user = iManagement.getUserByEmail(userEmail);
         assert user != null;
@@ -68,15 +70,16 @@ public class ProjectView {
     @Consumes(MediaType.TEXT_PLAIN)
     @Produces(MediaType.TEXT_PLAIN)
     @Path("/login/{projectName}")
-    public String register(@Context HttpServletRequest req, @PathParam("projectName") String projectName,
-                           @QueryParam("password") String
-            password) throws IOException {
+    public String register(
+            @Context HttpServletRequest req, @PathParam("projectName") String projectName,
+            @QueryParam("password") String password)
+            throws IOException, RocketChatDownException, UserDoesNotExistInRocketChatException {
         User user = gfContexts.getUserFromSession(req);
         Project project = projectDAO.getProjectByName(projectName);
-        if (project == null){
+        if (project == null) {
             return "project missing";
         }
-        if (!project.getPassword().equals(password) ) {
+        if (!project.getPassword().equals(password)) {
             return "wrong password";
         }
 
@@ -97,5 +100,4 @@ public class ProjectView {
     }
 
 
-
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
index b5aeb64848d9b4dda47e5c6ba8e3c79b50bfb708..2c80bf36625049933262c265ba0369ea77c7a905 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
@@ -576,7 +576,7 @@ public class SubmissionController implements ISubmission, HasProgress {
      */
     public void markAsFinal(FullSubmission fullSubmission) {
         connection.connect();
-        String query = "update fullsubmissions set finalized = ? where id = ?";
+        String query = "updateRocketChatUserName fullsubmissions set finalized = ? where id = ?";
         connection.issueUpdateStatement(query, 1, fullSubmission.getId());
         connection.close();
     }
@@ -591,7 +591,7 @@ public class SubmissionController implements ISubmission, HasProgress {
      */
     public void updateFullSubmission(User submissionOwner, User feedbackGiver) {
         connection.connect();
-        String query = "update fullsubmissions set feedbackUser = ? where user = ?";
+        String query = "updateRocketChatUserName fullsubmissions set feedbackUser = ? where user = ?";
         connection.issueUpdateStatement(query, feedbackGiver.getEmail(), submissionOwner.getEmail());
         connection.close();
         // TODO implement linking submission with group
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java
index 7824b33ceff00e14e9e4ac4b234ca9b63604130c..2a877f7d7e042e7f0465c1d0acde24daa7c80e9f 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java
@@ -14,11 +14,9 @@ public class User {
     private String name;
     private String password;
     private String email;
+    // the speaking name must unique in rocket chat
     private String rocketChatUsername;
-    private String rocketChatAuthToken;
-    // not in this version
-    private String rocketChatPersonalAccessToken;
-    private String rocketChatUserId;
+
     private Boolean isStudent;
 
     public User() {
@@ -26,28 +24,15 @@ public class User {
 
 
 
-    public User(String name, String password, String email, String rocketChatUsername, String rocketChatPersonalAccessToken, String rocketChatUserId) {
+    public User(String name, String password, String email, String rocketChatUsername, Boolean isStudent) {
         this.name = name;
         this.password = password;
         this.email = email;
         this.rocketChatUsername = rocketChatUsername;
-        this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken;
-        this.rocketChatUserId = rocketChatUserId;
-
+        this.setStudent(isStudent);
     }
 
-    public User(String name, String password, String email, String rocketChatUsername,
-                String rocketChatAuthToken, String rocketChatPersonalAccessToken, String rocketChatUserId,
-                Boolean isStudent) {
-        this.name = name;
-        this.password = password;
-        this.email = email;
-        this.rocketChatUsername = rocketChatUsername;
-        this.rocketChatAuthToken = rocketChatAuthToken;
-        this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken;
-        this.rocketChatUserId = rocketChatUserId;
-        this.isStudent = isStudent;
-    }
+
 
     public User(String authorEmail) {
         this.email = authorEmail;
@@ -94,22 +79,7 @@ public class User {
         isStudent = student;
     }
 
-    public String getRocketChatUserId() {
-        return rocketChatUserId;
-    }
-
-    public void setRocketChatUserId(String rocketChatUserId) {
-        this.rocketChatUserId = rocketChatUserId;
-    }
 
-    @JsonIgnore
-    public String getRocketChatAuthToken() {
-        return rocketChatAuthToken;
-    }
-
-    public void setRocketChatAuthToken(String rocketChatAuthToken) {
-        this.rocketChatAuthToken = rocketChatAuthToken;
-    }
 
     public String getRocketChatUsername() {
         return rocketChatUsername;
@@ -119,13 +89,7 @@ public class User {
         this.rocketChatUsername = rocketChatUsername;
     }
 
-    public String getRocketChatPersonalAccessToken() {
-        return rocketChatPersonalAccessToken;
-    }
 
-    public void setRocketChatPersonalAccessToken(String rocketChatPersonalAccessToken) {
-        this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken;
-    }
 
     @Override
     public String toString() {
@@ -134,9 +98,6 @@ public class User {
                 ", password='" + password + '\'' +
                 ", email='" + email + '\'' +
                 ", rocketChatUsername='" + rocketChatUsername + '\'' +
-                ", rocketChatAuthToken='" + rocketChatAuthToken + '\'' +
-                ", rocketChatPersonalAccessToken='" + rocketChatPersonalAccessToken + '\'' +
-                ", rocketChatUserId='" + rocketChatUserId + '\'' +
                 ", isStudent=" + isStudent +
                 '}';
     }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java
index 5412add8f2a3764501b3f556be0d9a2c1fa215b5..5deba403998a2624d07f08ebdd349f52779cdec3 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java
@@ -29,11 +29,10 @@ public class UserDAO {
     public void persist(User user, UserProfile profile) {
         connect.connect();
         String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `isStudent`," +
-                "`rocketChatUserId`,`rocketChatUsername`,`rocketChatAuthToken`,`rocketChatPersonalAccessToken`) " +
-                "values (?,?,?,?,?,?,?,?)";
+                "`rocketChatUsername`) " +
+                "values (?,?,?,?,?)";
         connect.issueInsertOrDeleteStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
-                user.getStudent(), user.getRocketChatUserId(), user.getRocketChatUsername(), user.getRocketChatAuthToken(),
-                user.getRocketChatPersonalAccessToken());
+                user.getStudent(),user.getRocketChatUsername());
         connect.close();
         // TODO implmement UserProfile @Mar
     }
@@ -45,14 +44,11 @@ public class UserDAO {
         connect.close();
     }
 
-    public void update(User user) {
-        String mysqlRequest = "UPDATE `users` SET `name`=?,`password`=?,`email`=?,`isStudent`=?," +
-                "`rocketChatId`=?,`rocketChatAuthToken`=? WHERE email=? LIMIT 1";
-        //TODO: maybe add handling if a line is actually updated
-        //TODO: if user is updated, it also must update all other tables which includes some information about the user, for example project user
+    public void updateRocketChatUserName(User user) {
+        String mysqlRequest = "UPDATE `users` SET" +
+                "`rocketChatUsername`=? WHERE email=? LIMIT 1";
         connect.connect();
-        connect.issueUpdateStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
-                user.getStudent(), user.getRocketChatUserId(), user.getRocketChatAuthToken(), user.getEmail());
+        connect.issueUpdateStatement(mysqlRequest, user.getRocketChatUsername(), user.getEmail());
         connect.close();
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java
index bb7a1f504edfa7e1232547c93b477eb3d36f3348..4faadc71b8cc3e6a5169dcf4f27aa582a6ab6388 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java
@@ -1,6 +1,8 @@
 package unipotsdam.gf.modules.user;
 
+import unipotsdam.gf.exceptions.*;
 import unipotsdam.gf.modules.project.Management;
+import unipotsdam.gf.process.ProjectCreationProcess;
 import unipotsdam.gf.session.GFContexts;
 import unipotsdam.gf.interfaces.ICommunication;
 
@@ -33,6 +35,9 @@ public class UserView {
     @Inject
     private Management management;
 
+    @Inject
+    private ProjectCreationProcess projectCreationProcess;
+
     @Inject
     public UserView(ICommunication communicationService, UserDAO userDAO, Management management) {
         this.communicationService = communicationService;
@@ -59,10 +64,35 @@ public class UserView {
             @FormParam("email") String email, @FormParam("isStudent") String isStudent) throws URISyntaxException {
 
         User user = new User(name, password, email, isStudent == null);
-        return register(req, true, user);
+        try {
+            projectCreationProcess.createUser(user);
+        } catch (UserExistsInRocketChatException e) {
+            return registrationError();
+        } catch (UserExistsInMysqlException e) {
+            String existsUrl = "../register.jsp?userExists=true";
+            return forwardToLocation(existsUrl);
+        } catch (RocketChatDownException e) {
+            e.printStackTrace();
+            return registrationError();
+        }
+
+        try {
+            projectCreationProcess.authenticateUser(user, req);
+        } catch (UserDoesNotExistInRocketChatException e) {
+            loginError();
+        } catch (RocketChatDownException e) {
+            e.printStackTrace();
+            return registrationError();
+        }
+        return redirectToProjectPage(user);
 
     }
 
+    private Response redirectToUserExists() throws URISyntaxException {
+        String existsUrl = "../index.jsp?userExists=false";
+        return forwardToLocation(existsUrl);
+    }
+
     /**
      * checks if a user exists in order to log him in
      *
@@ -76,20 +106,25 @@ public class UserView {
     @POST
     @Produces(MediaType.TEXT_HTML)
     @Path("/exists")
-    public Response loginUser(
+    public Response authenticate(
             @Context HttpServletRequest req, @FormParam("name") String name, @FormParam("password") String password,
             @FormParam("email") String email) throws URISyntaxException {
 
         User user = new User(name, password, email, null);
-        // TODO fix this
-        User isLoggedIn = communicationService.loginUser(user);
-        if (isLoggedIn != null) {
-            req.getSession().setAttribute(GFContexts.ROCKETCHATAUTHTOKEN, isLoggedIn.getRocketChatAuthToken());
-            req.getSession().setAttribute(GFContexts.ROCKETCHATID, isLoggedIn.getRocketChatUserId());
-            return register(req, false, user);
-        } else {
+        try {
+            Boolean exists = projectCreationProcess.authenticateUser(user, req);
+            if (exists) {
+                user = fillUserFields(user);
+                return redirectToProjectPage(user);
+            } else {
+                return loginError();
+            }
+        } catch (UserDoesNotExistInRocketChatException e) {
+            return loginError();
+        } catch (RocketChatDownException e) {
             return loginError();
         }
+
     }
 
     @POST
@@ -106,40 +141,6 @@ public class UserView {
 
     }
 
-    /**
-     * if create User is true, the user is created and logged in if he does not exist
-     *
-     * @param createUser
-     * @param user
-     * @return
-     * @throws URISyntaxException
-     */
-    public Response register(HttpServletRequest req, boolean createUser, User user) throws URISyntaxException {
-
-        if (management.exists(user)) {
-            if (!createUser) {
-                user = fillUserFields(user);
-                return redirectToProjectPage(req, user);
-            }
-            String existsUrl = "../register.jsp?userExists=true";
-            return forwardToLocation(existsUrl);
-        } else {
-            if (createUser) {
-                boolean isRegisteredAndLoggedIn = communicationService.registerUser(user);
-                if (!isRegisteredAndLoggedIn) {
-                    return registrationError();
-                }
-                management.create(user, null);
-                user = fillUserFields(user);
-                return redirectToProjectPage(req, user);
-            } else {
-                String existsUrl = "../index.jsp?userExists=false";
-                return forwardToLocation(existsUrl);
-            }
-
-        }
-    }
-
     private User fillUserFields(User user) {
         user = userDAO.getUserByEmail(user.getEmail());
         return user;
@@ -162,7 +163,7 @@ public class UserView {
      * @return
      * @throws URISyntaxException
      */
-    private Response redirectToProjectPage(HttpServletRequest req, User user) throws URISyntaxException {
+    private Response redirectToProjectPage(User user) throws URISyntaxException {
         String successUrl;
 
         if (user.getStudent() != null && user.getStudent()) {
@@ -170,7 +171,6 @@ public class UserView {
         } else {
             successUrl = "../project/overview-docent.jsp";
         }
-        req.getSession().setAttribute(GFContexts.USEREMAIL, user.getEmail());
         Response result = forwardToLocation(successUrl);
         return result;
     }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java
index d0aecb4b7b4d8026a6b18327406833dc17a1cb8a..789cdb9a2f3766c625c3e9a5a7f2ed15129a4919 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java
@@ -137,6 +137,7 @@ public class MysqlConnectImpl implements MysqlConnect {
     }
 
     private void printErrorMessage(String statement, SQLException ex) {
+        ex.printStackTrace();
         String message = ex.toString() + " for statement \n" + statement;
         log.error(message);
         System.out.println(message);
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java
index b2cbfb34fc03a378c231746fdd9726c05c9899c8..2cd418eaaded38648d2ed7086339a1bf27f7c9e4 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java
@@ -3,6 +3,7 @@ package unipotsdam.gf.process;
 import unipotsdam.gf.interfaces.IGroupFinding;
 import unipotsdam.gf.interfaces.IPhases;
 import unipotsdam.gf.modules.group.Group;
+import unipotsdam.gf.modules.group.GroupData;
 import unipotsdam.gf.modules.group.GroupFormationMechanism;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.modules.project.ProjectDAO;
@@ -16,6 +17,7 @@ import unipotsdam.gf.process.tasks.TaskName;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import java.util.Arrays;
+import java.util.List;
 
 @Singleton
 public class GroupFormationProcess {
@@ -26,8 +28,6 @@ public class GroupFormationProcess {
     @Inject
     TaskDAO taskDAO;
 
-
-
     @Inject
     private DossierCreationProcess dossierCreationProcess;
 
@@ -38,9 +38,7 @@ public class GroupFormationProcess {
             projectDAO.setGroupFormationMechanism(groupFormationMechanism, project);
     }
 
-
     // taskDAO.persistTeacherTask(project, TaskName.FORM_GROUPS_MANUALLY, Phase.GroupFormation);
-
     /**
      * this method can only be called to change the group formation to manual groups or single
      * @param groupFormationMechanism
@@ -55,9 +53,8 @@ public class GroupFormationProcess {
      * and if there groups are not handled manually
      * this method finalizes the groups
      * @param project
-     * @param groups
      */
-    public void finish(Project project, Group ... groups) {
+    public void finalize(Project project) {
         taskDAO.persistTeacherTask(project, TaskName.CLOSE_GROUP_FINDING_PHASE, Phase.GroupFormation);
         /**
          * Gruppenphase wird beendet
@@ -74,4 +71,12 @@ public class GroupFormationProcess {
     }
 
 
+    public GroupData getOrInitializeGroups(Project project) {
+        List<Group> groups = groupfinding.getGroups(project);
+        if (groups.isEmpty()) {
+            groups = groupfinding.createRandomGroups(project);
+        }
+        return new GroupData(groups);
+
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java
index addead6777066cbb4ff38f6fa3b801e0a6d3f4e5..c6bd697ebf74ea8c11b611d7e0ad9f2f9ca6ae58 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java
@@ -1,7 +1,9 @@
 package unipotsdam.gf.process;
 
+import unipotsdam.gf.exceptions.*;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.interfaces.IPhases;
+import unipotsdam.gf.modules.communication.model.RocketChatUser;
 import unipotsdam.gf.modules.group.GroupDAO;
 import unipotsdam.gf.modules.group.GroupFormationMechanism;
 import unipotsdam.gf.modules.project.Management;
@@ -13,9 +15,11 @@ import unipotsdam.gf.process.tasks.Progress;
 import unipotsdam.gf.process.tasks.Task;
 import unipotsdam.gf.process.tasks.TaskDAO;
 import unipotsdam.gf.process.tasks.TaskName;
+import unipotsdam.gf.session.GFContexts;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.WebApplicationException;
 import java.io.IOException;
 
@@ -39,6 +43,9 @@ public class ProjectCreationProcess {
     @Inject
     private ICommunication iCommunication;
 
+    @Inject
+    private GFContexts gfContexts;
+
     /**
      * STEP 1
      *
@@ -46,7 +53,8 @@ public class ProjectCreationProcess {
      * @param author
      * @throws IOException
      */
-    public void createProject(Project project, User author) throws IOException {
+    public void createProject(Project project, User author)
+            throws IOException, RocketChatDownException, UserDoesNotExistInRocketChatException {
         project.setAuthorEmail(author.getEmail());
         try {
             iManagement.create(project);
@@ -66,7 +74,8 @@ public class ProjectCreationProcess {
      * @param project
      * @param user
      */
-    public void studentEntersProject(Project project, User user) {
+    public void studentEntersProject(Project project, User user)
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         // student enters project
         iManagement.register(user, project, null);
 
@@ -90,4 +99,37 @@ public class ProjectCreationProcess {
         }
         iCommunication.addUserToChatRoom(user, project.getName());
     }
+
+    public void createUser(User user)
+            throws UserExistsInMysqlException, RocketChatDownException, UserExistsInRocketChatException {
+        if(iManagement.exists(user)) {
+            throw new UserExistsInMysqlException();
+        }
+        // create user in rocket chat
+        iCommunication.registerUser(user);
+        // create user in mysql
+        iManagement.create(user, null);
+
+    }
+
+    public Boolean authenticateUser(User user, HttpServletRequest req)
+            throws UserDoesNotExistInRocketChatException, RocketChatDownException {
+        // todo implement
+
+        RocketChatUser isLoggedIn = iCommunication.loginUser(user);
+        gfContexts.updateUserSessionWithRocketChat(req, isLoggedIn);
+        gfContexts.updateUserWithEmail(req, isLoggedIn);
+        return iManagement.exists(user);
+    }
+
+    public void deleteUser(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        iManagement.delete(user);
+        iCommunication.delete(user);
+    }
+
+    public void deleteProject(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
+        // TODO implement
+        iManagement.delete(project);
+        iCommunication.deleteChatRoom(project);
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java
index 973fbee8f0fda35105cbe99c6604b6379248e6fd..506694558376f6a314e89fd0fc3bf502f0371f85 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java
@@ -79,7 +79,7 @@ public class PhasesImpl implements IPhases {
                 // inform users about the formed groups, optionally giving them a hint on what happens next
                 iCommunication.sendMessageToUsers(project, Messages.GroupFormation(project));
                 saveState(project, changeToPhase);
-                groupFormationProcess.finish(project);
+                groupFormationProcess.finalize(project);
                 dossierCreationProcess.start(project);
                 break;
             case DossierFeedback:
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java
index f2a2232824f9c0620d136794e11fee138dc2e6b3..ed4bd984dcbaa7a211fb869306f5057a4fdbae0d 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java
@@ -275,7 +275,7 @@ public class TaskDAO {
     }
 
     /*
-     * if this takes long rewrite it as batch update
+     * if this takes long rewrite it as batch updateRocketChatUserName
      */
     public void finishMemberTask(Project project, TaskName taskName) {
         java.util.List<User> members = userDAO.getUsersByProjectName(project.getName());
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java
index aba9535de20cd3e022882d4eef83fdf68070fb96..7ec5417a9279235333ccc1b9cf98815e29ba111b 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java
@@ -1,5 +1,6 @@
 package unipotsdam.gf.session;
 
+import unipotsdam.gf.modules.communication.model.RocketChatUser;
 import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.modules.user.UserDAO;
 
@@ -31,4 +32,13 @@ public class GFContexts {
         String userEmail = getUserEmail(req);
         return userDAO.getUserByEmail(userEmail);
     }
+
+    public void updateUserSessionWithRocketChat(HttpServletRequest req, RocketChatUser user) {
+        req.getSession().setAttribute(GFContexts.ROCKETCHATAUTHTOKEN, user.getRocketChatAuthToken());
+        req.getSession().setAttribute(GFContexts.ROCKETCHATID, user.getRocketChatUserId());
+    }
+
+    public void updateUserWithEmail(HttpServletRequest req, User user) {
+        req.getSession().setAttribute(GFContexts.USEREMAIL, user.getEmail());
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java
index b39db08204876758ece73d4b7155853a9c71713c..3abb7d26db347ba827ff37a384b2bed9dfad37c8 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java
@@ -6,6 +6,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import unipotsdam.gf.config.GFApplicationBinder;
 import unipotsdam.gf.config.GFRocketChatConfig;
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.service.CommunicationService;
 import unipotsdam.gf.session.GFContext;
@@ -44,8 +46,15 @@ public class ChatWindow extends SimpleTagSupport {
             writeIframe(request, chatRoomLink);
         } else {
             // scope is group
-            String chatRoomLink = communicationService
-                    .getChatRoomLink(request.getSession().getAttribute(GFContexts.USEREMAIL).toString(), projectName);
+            String chatRoomLink = null;
+            try {
+                chatRoomLink = communicationService
+                        .getChatRoomLink(request.getSession().getAttribute(GFContexts.USEREMAIL).toString(), projectName);
+            } catch (RocketChatDownException e) {
+                e.printStackTrace();
+            } catch (UserDoesNotExistInRocketChatException e) {
+                e.printStackTrace();
+            }
             writeIframe(request, chatRoomLink);
         }
 
@@ -58,10 +67,6 @@ public class ChatWindow extends SimpleTagSupport {
         log.debug("ChatRoomLink for ChatWindow: {}", chatRoomLink);
         JspWriter out = getJspContext().getOut();
         out.println("<iframe height=\"400px\" src=\"" + chatRoomLink + "\">");
-        String rocketChatIntegration = "<script> window.parent.postMessage({event: 'login-with-token',loginToken:" +
-                " '"+getAuthToken+"'}, '"+GFRocketChatConfig.ROCKET_CHAT_LINK_0 +"');</script>";
-        out.println(rocketChatIntegration);
-
         out.println("</iframe>");
 
     }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java
index aeee3a2a09e2e9ba748cd12a3022e9bb6dac400d..ec7d9e929cae335f0f00040014a2897f7bd27ed2 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java
@@ -9,12 +9,8 @@ public class ResultSetUtil {
         String name = vereinfachtesResultSet.getString("name");
         String password = vereinfachtesResultSet.getString("password");
         String email = vereinfachtesResultSet.getString("email");
-        String rocketChatId = vereinfachtesResultSet.getString("rocketChatUserId");
-        String rocketChatAuthToken = vereinfachtesResultSet.getString("rocketChatAuthToken");
-        String rocketChatPersonalAccessToken = vereinfachtesResultSet.getString("rocketChatPersonalAccessToken");
-        String rocketChatUserId = vereinfachtesResultSet.getString("rocketChatUserId");
+        String rocketChatUserName = vereinfachtesResultSet.getString("rocketChatUserName");
         Boolean isStudent = vereinfachtesResultSet.getBoolean("isStudent");
-        return new User(name, password, email, rocketChatId, rocketChatAuthToken,
-                rocketChatPersonalAccessToken, rocketChatUserId, isStudent);
+        return new User(name, password, email, rocketChatUserName, isStudent);
     }
 }
diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp b/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp
index 674145cd5ce3d0f22f728673b41e59f798885837..84dc20c81818387c51243ebba2f26afc900e1a27 100644
--- a/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp
+++ b/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp
@@ -10,8 +10,6 @@
 <head>
     <title>Gruppenfindung basierend auf psychometrischen Merkmalen wurde noch nicht implementiert. Klicken sie
         auf zurück im browser</title>
-    <span>@Mirjam: Hier kämen deine Einstellungen für den Dozierenden bezüglich der Gruppenfindung basierend auf
-        Merkmalen</span>
 </head>
 <body>
 
diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/css/edit-groups.css b/gemeinsamforschen/src/main/webapp/groupfinding/css/edit-groups.css
new file mode 100644
index 0000000000000000000000000000000000000000..6729fb50b96d4f3be747404896995f7d0c80f867
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/groupfinding/css/edit-groups.css
@@ -0,0 +1,23 @@
+.sortableGroup {
+    list-style-type: none;
+    margin: 0;
+    float: left;
+    margin-right: 10px;
+    background: #eee;
+    padding: 5px;
+    min-width: 143px;
+    max-width: 243px;
+    margin-bottom: 20px;
+}
+
+.sortableGroup li {
+    margin: 5px;
+    padding: 5px;
+    font-size: 1.2em;
+    min-width: 120px;
+}
+
+th, td {
+    padding: 15px;
+    text-align: left;
+}
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/edit-groups.jsp b/gemeinsamforschen/src/main/webapp/groupfinding/edit-groups.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..9cef5fc006c29d1df811668ab74177fa3ef75342
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/groupfinding/edit-groups.jsp
@@ -0,0 +1,54 @@
+<%@ taglib uri="../taglibs/gemeinsamForschen.tld" prefix="omniDependencies" %>
+<%--
+  Created by IntelliJ IDEA.
+  User: dehne
+  Date: 05.11.2018
+  Time: 13:23
+  To change this template use File | Settings | File Templates.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<html>
+<head>
+    <title>Title</title>
+    <omniDependencies:omniDependencies hierarchy="1"/>
+    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
+    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
+    <%--<link rel="stylesheet" href="/resources/demos/style.css">--%>
+    <link rel="stylesheet" href="css/edit-groups.css">
+    <script src="js/edit-groups.js"></script>
+
+</head>
+<body>
+
+<%--TODO das mit %3 oder %4 auf mehrere Zeilen verteilen--%>
+<script id="groupTemplate" type="text/x-jQuery-tmpl">
+        {{each(prop,group) bla}}
+            <div class="container-fluid">
+                <h3>Gruppe ${group.id}</h3>
+                <ul id="group_${group.id}" class="droptrue sortableGroup">
+                {{each(prop2, val) group.members }}
+                    <li class="ui-state-default">
+                    <table>
+                        <tr>
+                            <td> ${val.name}  </td>
+                            <td> ${val.email} </td>
+                        </tr>
+                    </table>
+                    </li>
+                {{/each}}
+                </ul>
+            </div>
+        {{/each}}
+        <div class="container-fluid">
+        <h3>Gruppe ${lastGroupId}</h3>
+        <ul id="group_${lastGroupId}" class="droptrue sortableGroup"></ul>
+        </div>
+
+
+</script>
+<div id="editable_groups"></div>
+<button id="persistNewGroups">Gruppen speichern</button>
+<button id="finalizeNewGroups">Gruppen finalisieren</button>
+
+</body>
+</html>
diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js b/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js
index 65bebd7fc61d7672eecef571d7fa1cde9502d754..3cc75aa64ece11f7480d5ba7eb673d38ab89720f 100644
--- a/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js
+++ b/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js
@@ -23,14 +23,14 @@ $(document).ready(function () {
 
 function getAllGroups(callback) {
     $.ajax({
-        url: "../rest/group/get/projects/" + $('#projectName').html().trim(),
+        url: "../rest/group/all/projects/" + $('#projectName').html().trim(),
         headers: {
             "Content-Type": "application/json",
             "Cache-Control": "no-cache"
         },
         type: 'GET',
         success: function (response) {
-            callback(response);
+            callback(response.groups);
         },
         error: function (a) {
         }
diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/js/edit-groups.js b/gemeinsamforschen/src/main/webapp/groupfinding/js/edit-groups.js
new file mode 100644
index 0000000000000000000000000000000000000000..94c7aa757ca1bc1b79cdd642b5b9999b061e3241
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/groupfinding/js/edit-groups.js
@@ -0,0 +1,63 @@
+var projectName = getProjectName();
+
+$(function () {
+
+    serverSide({
+        hierarchyLevel:1,
+        modulePath:"/group",
+        methodPath: "/projects/?/groups",
+        pathParams: [projectName],
+        queryParams: []
+    },"GET", printGroups);
+
+    $(".sortableGroup").disableSelection();
+
+    $("#persistNewGroups").click(function () {
+
+        serverSide({
+            hierarchyLevel: 1,
+            modulePath: "/group",
+            methodPath: "/projects/?/groups",
+            pathParams: [projectName],
+            queryParams: [],
+            entity: getGroupDataFromHtml()
+        }, "PUT", function (a,b,c) {
+            console.log(a);
+        })
+    });
+    $("#finalizeNewGroups").click(function () {
+        // TODO get firstgroup
+    });
+
+    function getGroupDataFromHtml() {
+        var i = 1;
+        //$("#group_1 > li > table > tbody > tr > td:nth-child(2)")
+    }
+
+    function printGroups(a,b,c) {
+        var firstgroup =
+            groups = {
+                bla: [
+                    {
+                        id: "1",
+                        members: [{name:"me", email:"egal@stuff.com"}, {name:"him", email:"egal@stuff.com"}, {name:"her", email:"egal@stuff.com"}]
+                    },
+                    {
+                        id: "2",
+                        members: [{name:"me2", email:"egal@stuff.com"}, {name:"him2", email:"egal@stuff.com"}, {name:"her2", email:"egal@stuff.com"}]
+                    }
+                ],
+                lastGroupId: "44"
+            };
+
+        // create a group
+        $("#groupTemplate")
+            .tmpl(firstgroup)
+            .appendTo("#editable_groups");
+
+        $("ul.droptrue").sortable({
+            connectWith: "ul"
+        });
+
+    }
+});
diff --git a/gemeinsamforschen/src/main/webapp/project/overview-student.jsp b/gemeinsamforschen/src/main/webapp/project/overview-student.jsp
index b2457201073c9d1d971ac0c7701e42804ebf8c40..814215abd79e49b193726360694548128e536eb9 100644
--- a/gemeinsamforschen/src/main/webapp/project/overview-student.jsp
+++ b/gemeinsamforschen/src/main/webapp/project/overview-student.jsp
@@ -57,6 +57,8 @@
         </div>
         <button class="btn btn-default" type="button" style="margin-left:250px;" id="enrollProject">Projekt beitreten
         </button>
+    <%--    <iframe height="600px" id="rocketChat" src="http://fleckenroller.cs.uni-potsdam.de:3000">
+        </iframe>--%>
     </div>
 </div>
 
diff --git a/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp b/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp
index 8c40df687e33d099529ad25e56337497a7a6484a..817d5e2614fea3c9b869448b6f30159dbe507325 100644
--- a/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp
+++ b/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp
@@ -50,6 +50,8 @@
     {{/if}}
 </script>
 </div>
+<%--<chat:chatWindow orientation="right" scope="project"></chat:chatWindow>--%>
+
 <footer:footer/>
 </body>
 </html>
diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js
index 7a174d902942ed373983f14fc0334e2bcb99b97d..c5f382243d4a3e8286ef233a40e531221a78bb7d 100644
--- a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js
+++ b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js
@@ -101,13 +101,18 @@ function RequestObj(hierachyLevel, modulePath, methodPath, pathParams, queryPara
 }
 
 
+function serverSide(requestObj, method, callback) {
+    serverSideWithType(requestObj, method, callback, 'application/json');
+}
+
 /**
  * send a request to the server
  * @param requestObj the data specific to the reqeuest
  * @param method GET, POST, DELETE or PUT
  * @param callback
+ * @param contentType typically 'application/json'
  */
-function serverSide(requestObj, method, callback) {
+function serverSideWithType(requestObj, method, callback, contentType) {
     let relativPath = calculateHierachy(requestObj.hierarchyLevel)
     let methodPath = requestObj.methodPath
     requestObj.pathParams.forEach(function (e) {
@@ -120,10 +125,11 @@ function serverSide(requestObj, method, callback) {
         localurl = localurl + requestObj.queryParams;
     }
 
+
     if (method == "PUT") {
         $.ajax({
             url: localurl,
-            contentType: 'application/json',
+            contentType: contentType,
             type: 'PUT',
             data: JSON.stringify(requestObj.entity),
             success: function (response) {
@@ -139,7 +145,7 @@ function serverSide(requestObj, method, callback) {
     if (method == "POST" ||  method == "DELETE") {
         $.ajax({
             url: localurl,
-            contentType: 'application/json',
+            contentType: contentType,
             type: method,
             data: requestObj.entity == null ? {} : JSON.stringify(requestObj.entity),
             success: function (response) {
diff --git a/gemeinsamforschen/src/main/webapp/test.html b/gemeinsamforschen/src/main/webapp/test.html
deleted file mode 100644
index 80fc3415e61e58694edb94895f7a5ef3d2a14b7b..0000000000000000000000000000000000000000
--- a/gemeinsamforschen/src/main/webapp/test.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<html>
-<head>
-    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
-    <script type="application/javascript">
-        $(document).on("load", function () {
-            document.getElementById('rocketChat').Meteor.loginWithToken('kv3mHoraygndPiwH7wrOK1QGA6NAeCwrJqt7LIkKq7z');
-        });
-    </script>
-</head>
-<body>
-<iframe height="600px" id="rocketChat" src="https://rocket.farm-test.rz.uni-potsdam.de/group/Pokemon?layout=embedded">
-</iframe>
-</body>
-</html>
\ No newline at end of file
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java
index 47c98e52f0e5bcfca2f304adaa9b49051b2a3fde..91d41f32e66cd4f53bd24482c5507a99db814547 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java
@@ -90,7 +90,7 @@ public class UserDAOTest {
         assertTrue(userDAO.exists(user));
 
         user.setStudent(false);
-        userDAO.update(user);
+        userDAO.updateRocketChatUserName(user);
         assertTrue(userDAO.exists(user));
         User managementUser = userDAO.getUserByEmail(user.getEmail());
         assertEquals(user.getStudent(), managementUser.getStudent());
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java
index 17c9b042e8badd6122a1f6ac07fb8eeddcad5eeb..2485150f96f9b225170ec9aa4cd2a1074993c9f9 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java
@@ -32,7 +32,7 @@ public class UpdateDB {
         System.out.println(new java.io.File( "." ).getCanonicalPath());
         updateDB.runScript(new FileReader("src/test/resources/database/db.sql"));
         updateDB.runScript(new FileReader("src/test/resources/database/fltrail.sql"));
-        updateDB.runScript(new FileReader("src/test/resources/database/testuser.sql"));
+        //updateDB.runScript(new FileReader("src/test/resources/database/testuser.sql"));
     }
 
     public static void updateTestDB() throws SQLException, ManagedProcessException, IOException {
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java
index a0e2266200d2f030ec9b22cc149b930c7c6e0652..73e2b7c1db641c471305858d1f7fa18656523148 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java
@@ -9,6 +9,9 @@ import uk.co.jemos.podam.api.PodamFactoryImpl;
 import unipotsdam.gf.config.GFApplicationBinder;
 import unipotsdam.gf.core.database.TestGFApplicationBinder;
 import unipotsdam.gf.core.database.UpdateDB;
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
+import unipotsdam.gf.exceptions.UserExistsInRocketChatException;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.communication.model.EMailMessage;
@@ -83,14 +86,22 @@ public class CommunicationServiceTest {
 
     @After
     public void tearDown() {
-        createdChatRooms.forEach(createdChatRoom -> iCommunication.deleteChatRoom(createdChatRoom));
+        createdChatRooms.forEach(createdChatRoom -> {
+            try {
+                iCommunication.deleteChatRoom(createdChatRoom);
+            } catch (RocketChatDownException e) {
+                e.printStackTrace();
+            } catch (UserDoesNotExistInRocketChatException e) {
+                e.printStackTrace();
+            }
+        });
         createdChatRooms.clear();
 
 
     }
 
     @Test
-    public void loginUser() {
+    public void loginUser() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         assertNotNull(iCommunication.loginUser(TEST_USER));
         assertTrue(!TEST_USER.getRocketChatAuthToken().isEmpty());
         assertTrue(!TEST_USER.getRocketChatUserId().isEmpty());
@@ -102,19 +113,15 @@ public class CommunicationServiceTest {
 
     @Ignore
     @Test
-    public void registerUser() {
+    public void registerUser() throws RocketChatDownException, UserExistsInRocketChatException {
         // TODO Side effect is not optimal because you need to know that before persisting the user
         boolean userCreated = iCommunication.registerUser(user);
         //userDAO.persist(user, null);
         assertTrue(userCreated);
-        assertNotNull(user.getRocketChatUserId());
-        assertNotNull(user.getRocketChatAuthToken());
-        assertNotNull(user.getRocketChatPersonalAccessToken());
-
     }
 
     @Test
-    public void createEmptyChatRoom() {
+    public void createEmptyChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String chatRoom = iCommunication.createEmptyChatRoom("Test", false);
         assertNotNull(chatRoom);
         assertFalse(chatRoom.isEmpty());
@@ -130,7 +137,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void createChatRoomWithUser() {
+    public void createChatRoomWithUser() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         List<User> userList = Arrays.asList(ADMIN_USER, TEST_USER);
         String chatRoom = iCommunication.createChatRoom("ChatWithUser", false, userList);
 
@@ -142,7 +149,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void createChatRoomWithGroup() {
+    public void createChatRoomWithGroup() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         Group group = new Group();
         group.setMembers(Collections.singletonList(ADMIN_USER));
         group.setProjectName("chatWithGroup");
@@ -152,7 +159,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void getChatRoomName() {
+    public void getChatRoomName() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String expectedChatRoomName = "ChatRoomName";
         String chatRoomId = iCommunication.createEmptyChatRoom(expectedChatRoomName, false);
         assertNotNull(chatRoomId);
@@ -168,7 +175,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void getChatRoomLink() {
+    public void getChatRoomLink() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String projectId = "Projekt";
         Project project = new Project(projectId, user.getEmail());
         projectDAO.persist(project);
@@ -192,7 +199,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void exists() {
+    public void exists() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String expectedChatRoomName = "ChatRoomName";
         String chatRoomId = iCommunication.createEmptyChatRoom(expectedChatRoomName, false);
         assertNotNull(chatRoomId);
@@ -205,7 +212,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void addUserToChatRoom() {
+    public void addUserToChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String chatRoomId = iCommunication.createEmptyChatRoom("addUser", false);
         assertNotNull(chatRoomId);
         assertFalse(chatRoomId.isEmpty());
@@ -216,7 +223,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void removeUserFromChatRoom() {
+    public void removeUserFromChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String chatRoomId = iCommunication.createEmptyChatRoom("removeUser", false);
         assertNotNull(chatRoomId);
         assertFalse(chatRoomId.isEmpty());
@@ -229,7 +236,7 @@ public class CommunicationServiceTest {
     }
 
     @Test
-    public void deleteChatRoom() {
+    public void deleteChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         String chatRoomId = iCommunication.createEmptyChatRoom("deleteChatRoom", false);
         assertNotNull(chatRoomId);
         assertFalse(chatRoomId.isEmpty());
@@ -271,7 +278,7 @@ public class CommunicationServiceTest {
 
     @Test
     @Ignore
-    public void createTestData() {
+    public void createTestData() throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         User user = new User();
         user.setName("Martin Nachname");
         user.setPassword("test1234");
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java
index 27ee1232b5686784b645b6d07d0017d4058c59ba..af8fbb9c08de24e86c5e5d8da3df1e23d6143abc 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java
@@ -1,14 +1,24 @@
 package unipotsdam.gf.process.tasks;
 
+import ch.vorburger.exec.ManagedProcessException;
 import org.glassfish.hk2.api.ServiceLocator;
 import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import uk.co.jemos.podam.api.PodamFactory;
 import uk.co.jemos.podam.api.PodamFactoryImpl;
+import unipotsdam.gf.config.GFApplicationBinder;
 import unipotsdam.gf.core.database.TestGFApplicationBinder;
+import unipotsdam.gf.core.database.UpdateDB;
+import unipotsdam.gf.exceptions.RocketChatDownException;
+import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException;
+import unipotsdam.gf.exceptions.UserExistsInMysqlException;
+import unipotsdam.gf.exceptions.UserExistsInRocketChatException;
+import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.interfaces.IGroupFinding;
 import unipotsdam.gf.modules.group.Group;
+import unipotsdam.gf.modules.group.GroupData;
 import unipotsdam.gf.modules.group.GroupFormationMechanism;
 import unipotsdam.gf.modules.project.Management;
 import unipotsdam.gf.modules.project.Project;
@@ -18,8 +28,11 @@ import unipotsdam.gf.process.ProjectCreationProcess;
 
 import javax.inject.Inject;
 
+import java.io.IOException;
+import java.sql.SQLException;
 import java.util.ArrayList;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 public class GroupPhaseTaskTest {
@@ -40,61 +53,82 @@ public class GroupPhaseTaskTest {
     @Inject
     private GroupFormationProcess groupFormationProcess;
 
+    @Inject
+    private ICommunication communication;
+
 
     private PodamFactory factory = new PodamFactoryImpl();
 
-    private User teacher;
+
 
     @Before
-    public void setUp() {
-        /*final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder());*/
-        final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestGFApplicationBinder());
+    public void setUp() throws IOException, SQLException, ManagedProcessException {
+        UpdateDB.main(new String[0]);
+
+        final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder());
+        //final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestGFApplicationBinder());
         locator.inject(this);
 
     }
 
+    @Ignore
     @Test
-    public void createCourse() {
-
-        this.teacher = factory.manufacturePojo(User.class);
+    public void createUser()
+            throws RocketChatDownException, UserExistsInRocketChatException, UserExistsInMysqlException, UserDoesNotExistInRocketChatException {
+        User teacher = factory.manufacturePojo(User.class);
+        teacher.setEmail("vodka@yolo.com");
+        teacher.setPassword("egal");
         teacher.setStudent(false);
-        management.create(teacher, null);
 
-        // add Titel
-        Project project = factory.manufacturePojo(Project.class);
-        project.setAuthorEmail(teacher.getEmail());
-        management.create(project);
-        management.register(teacher, project, null);
+        projectCreationProcess.deleteUser(teacher);
+        projectCreationProcess.createUser(teacher);
+        projectCreationProcess.deleteUser(teacher);
+    }
 
-        /*ProjectConfiguration projectConfiguration = factory.manufacturePojo(ProjectConfiguration.class);
-        management.create(projectConfiguration, project);
+    @Test
+    public void createCourse()
+            throws RocketChatDownException, UserDoesNotExistInRocketChatException, UserExistsInMysqlException, UserExistsInRocketChatException, IOException {
 
-        GroupfindingCriteria groupfindingCriteria = factory.manufacturePojo(GroupfindingCriteria.class);
-        groupFinding.selectGroupfindingCriteria(groupfindingCriteria, project);*/
+        // create teacher
+        User teacher = factory.manufacturePojo(User.class);
+        teacher.setEmail("vodka@yolo.com");
+        teacher.setPassword("egal");
+        teacher.setStudent(false);
+        projectCreationProcess.deleteUser(teacher);
+        projectCreationProcess.createUser(teacher);
 
-        taskDAO.createTaskWaitForParticipants(project, teacher);
-        ArrayList<Task> tasks = taskDAO.getTasks(teacher, project);
-        assertTrue(tasks != null && tasks.size() > 0);
+        Project project = factory.manufacturePojo(Project.class);
+        project.setName("TEST");
+        projectCreationProcess.deleteProject(project);
+        projectCreationProcess.createProject(project, teacher);
 
+        groupFormationProcess.setGroupFormationMechanism(GroupFormationMechanism.Manual, project);
         ArrayList<User> students = new ArrayList<>();
-        for (int i = 0; i<5;i++) {
+        for (int i = 0; i < 30; i++) {
             User user = factory.manufacturePojo(User.class);
             user.setStudent(true);
-            students.add(user);
-
-            management.create(user, null);
+            user.setRocketChatUsername("student" + i);
+            user.setEmail("student" + i + "@stuff.com");
+            user.setPassword("egal");
+            projectCreationProcess.deleteUser(user);
+            projectCreationProcess.createUser(user);
             projectCreationProcess.studentEntersProject(project, user);
+            students.add(user);
         }
 
+        //groupFormationProcess.changeGroupFormationMechanism(GroupFormationMechanism.Manual, project);
+        GroupData orInitializeGroups = groupFormationProcess.getOrInitializeGroups(project);
+        assertFalse(orInitializeGroups.getGroups().isEmpty());
 
+       /* groupFormationProcess.finalize(project);*/
 
-        groupFormationProcess.changeGroupFormationMechanism(GroupFormationMechanism.Manual, project);
-        Group group = new Group();
-        for (User student : students) {
-            group.addMember(student);
-        }
-        groupFormationProcess.finish(project, group);
+        /*ArrayList<Task> tasks = taskDAO.getTasks(teacher, project);
+        assertTrue(tasks != null && tasks.size() > 0);*/
 
+    /*    for (User student : students) {
+            projectCreationProcess.deleteUser(student);
+            projectCreationProcess.deleteProject(project);
+        }*/
 
     }
 
diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql
index a1d352a9667c1e8238f4df80e751d9f626e1cf5b..786426caf61e0f07bff402d909ee7dde5de088a4 100644
--- a/gemeinsamforschen/src/test/resources/database/fltrail.sql
+++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql
@@ -1,7 +1,7 @@
 CREATE TABLE `annotations` (
   `id` varchar(120) NOT NULL,
   `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  `userEmail` varchar(120) DEFAULT NULL,
+  `userEmail` varchar(255) DEFAULT NULL,
   `targetId` varchar(120) DEFAULT NULL,
   `targetCategory` varchar(30) NOT NULL,
   `title` varchar(120) DEFAULT NULL,
@@ -60,7 +60,8 @@ CREATE TABLE `groupfindingmechanismselected` (
 CREATE TABLE `groups` (
   `id`          int(11) NOT NULL,
   `projectName` varchar(400) NOT NULL,
-  `chatRoomId`  varchar(400)
+  `chatRoomId`  varchar(400),
+  `name`        varchar(255) NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 CREATE TABLE `groupuser` (
@@ -85,7 +86,7 @@ CREATE TABLE `projects` (
 
 CREATE TABLE `projectuser` (
   `projectName` varchar(100) NOT NULL,
-  `userEmail` varchar(100) NOT NULL
+  `userEmail` varchar(255) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 CREATE TABLE `quiz` (
@@ -106,7 +107,7 @@ CREATE TABLE `submissionpartbodyelements` (
 
 CREATE TABLE `submissionparts` (
   `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  `userEmail` varchar(120) NOT NULL,
+  `userEmail` varchar(255) NOT NULL,
   `fullSubmissionId` varchar(120) NOT NULL,
   `category` varchar(30) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -117,7 +118,7 @@ CREATE TABLE `tags` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 CREATE TABLE `tasks` (
-  `userEmail` varchar(100) NOT NULL,
+  `userEmail` varchar(255) NOT NULL,
   `projectName` varchar(200) NOT NULL,
   `taskName` varchar(100) DEFAULT NULL,
   `groupTask` tinyint(4) DEFAULT NULL,
@@ -135,10 +136,7 @@ CREATE TABLE `users` (
   `name`                          varchar(100) NOT NULL,
   `password`                      varchar(200) NOT NULL,
   `email`                         varchar(255) NOT NULL,
-  `rocketChatUserId`              varchar(400),
-  `rocketChatPersonalAccessToken` varchar(400),
-  `rocketChatUsername`            varchar(400),
-  `rocketChatAuthToken`           varchar(800),
+  `rocketChatUserName`            varchar(400),
   `isStudent`                     tinyint(1) DEFAULT '1'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
@@ -196,15 +194,15 @@ ALTER TABLE `groups`
 
 
 ALTER TABLE `groupuser`
-  ADD CONSTRAINT `groupuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`),
-  ADD CONSTRAINT `groupuser_ibfk_2` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`);
+  ADD CONSTRAINT `groupuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`) ON DELETE CASCADE,
+  ADD CONSTRAINT `groupuser_ibfk_2` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE;
 
 ALTER TABLE `projects`
   ADD CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`author`) REFERENCES `users` (`email`);
 
 ALTER TABLE `projectuser`
-  ADD CONSTRAINT `projectuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`),
-  ADD CONSTRAINT `projectuser_ibfk_2` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`);
+  ADD CONSTRAINT `projectuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`) ON DELETE CASCADE,
+  ADD CONSTRAINT `projectuser_ibfk_2` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE;
 COMMIT;
 
 CREATE UNIQUE INDEX fullsubmissions_user_projectName_uindex ON fullsubmissions (user, projectName);
@@ -212,3 +210,7 @@ CREATE UNIQUE INDEX fullsubmissions_user_projectName_uindex ON fullsubmissions (
 CREATE UNIQUE INDEX tasks_userEmail_projectName_taskName_uindex ON tasks (userEmail, projectName, taskName);
 
 
+
+
+
+