diff --git a/.gitignore b/.gitignore
index d66d90c0bfd70f829b3fc63b5e9055659c86d7ab..2c0bec3c9dca32efe6064b2203aeefe09c340116 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,5 +19,5 @@
 **/.classpath
 /.idea/vcs.xml
 /.idea/workspace.xml
-/.idea/workspace.xml
-/.idea/workspace.xml
+
+**/.idea
\ No newline at end of file
diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml
index 206f64bd250928d980c302291829b24d7d4f70a0..5fa0d0f8e5b50917e71d3cd24259770441115c28 100644
--- a/gemeinsamforschen/pom.xml
+++ b/gemeinsamforschen/pom.xml
@@ -146,6 +146,17 @@
             <version>3.0.1</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-inmemory</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework</groupId>
+            <artifactId>jersey-test-framework-util</artifactId>
+            <version>2.27</version>
+            <scope>test</scope>
+        </dependency>
 
         <!-- dropwizard - Need this for '@PATCH' annotation -->
         <dependency>
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..125862780cbc50f02a1a8978b49f87eaacdeef3c
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java
@@ -0,0 +1,6 @@
+package unipotsdam.gf.config;
+
+public interface Constants {
+
+    String ROCKET_CHAT_URL = "http://rocketchat.westeurope.cloudapp.azure.com";
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
new file mode 100644
index 0000000000000000000000000000000000000000..554cf0504b8783acc9589f00deaa64eb8356a581
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
@@ -0,0 +1,15 @@
+package unipotsdam.gf.config;
+
+import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import unipotsdam.gf.core.management.Management;
+import unipotsdam.gf.core.management.ManagementImpl;
+import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+
+public class GFApplicationBinder extends AbstractBinder {
+    @Override
+    protected void configure() {
+        bind(CommunicationDummyService.class).to(ICommunication.class);
+        bind(ManagementImpl.class).to(Management.class);
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/GFDatabaseConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java
similarity index 92%
rename from gemeinsamforschen/src/main/java/unipotsdam/gf/GFDatabaseConfig.java
rename to gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java
index 60776e4510da20091cb98c522dcc2661dcd115e0..252905102d2472eaa125f06499bbdfe1663ea254 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/GFDatabaseConfig.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java
@@ -1,4 +1,4 @@
-package unipotsdam.gf;
+package unipotsdam.gf.config;
 
 /**
  * Created by dehne on 31.05.2018.
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFResourceConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFResourceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..4cef8bbc5dce4f8fdb74373b18d949ea7d093ba1
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFResourceConfig.java
@@ -0,0 +1,11 @@
+package unipotsdam.gf.config;
+
+import org.glassfish.jersey.server.ResourceConfig;
+
+public class GFResourceConfig extends ResourceConfig {
+
+    public GFResourceConfig() {
+        register(new GFApplicationBinder());
+        packages("unipotsdam.gf");
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java
index 002c4bbd3b1eaf5fed52afd74769d11ee74b6746..80ed128cf20fc34528390e98806b166a9495fde7 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java
@@ -1,6 +1,6 @@
 package unipotsdam.gf.core.database.mysql;
 
-import unipotsdam.gf.GFDatabaseConfig;
+import unipotsdam.gf.config.GFDatabaseConfig;
 
 import java.sql.*;
 import java.util.Date;
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java
index e997c2bd1e1eb277171c7257530476f943817818..ff270f7b46d23457b3742b15596a296d9a99179e 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java
@@ -1,6 +1,10 @@
 package unipotsdam.gf.core.database.mysql;
 
-import java.sql.*;
+import java.sql.Date;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Timestamp;
 
 
 public class VereinfachtesResultSet {
@@ -71,6 +75,15 @@ public class VereinfachtesResultSet {
 		throw new Error("error in VereinfachtesResultSet");
 	}
 
+    public Timestamp getTimestamp(String columnLabel) {
+        try {
+            return resultSet.getTimestamp(columnLabel);
+        } catch (SQLException ex) {
+            System.err.println(ex.getMessage());
+        }
+        throw new Error("error in VereinfachtesResultSet");
+    }
+
 
 	public String getString(String columnLabel) {
 		try {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java
index 1b00ee2a5441dd19c674ca7f851a8ec84c67938b..73c0b1e608c2ea6dc3821ad703904162908d9577 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java
@@ -1,11 +1,14 @@
 package unipotsdam.gf.core.management;
 
+import unipotsdam.gf.core.management.group.Group;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.core.management.user.UserInterests;
 import unipotsdam.gf.core.management.user.UserProfile;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 
+import java.util.List;
+
 /**
  * Created by dehne on 31.05.2018.
  * TODO in DAOs refaktorisieren, sobald es mehr wird
@@ -13,12 +16,14 @@ import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 public interface Management {
     /**
      * delete a User in the database
+     *
      * @param identifier
      */
     void delete(StudentIdentifier identifier);
 
     /**
      * create a User in the database
+     *
      * @param user
      * @param profile
      */
@@ -26,18 +31,28 @@ public interface Management {
 
     /**
      * create a Project in the database
+     *
      * @param project
      */
     void create(Project project);
 
     /**
      * Delete a Project in the database
+     *
      * @param project
      */
     void delete(Project project);
 
+    /**
+     * Update a User in the database
+     *
+     * @param user
+     */
+    void update(User user);
+
     /**
      * Add an entry in the M:N table linking users and projects
+     *
      * @param user
      * @param project
      * @param interests
@@ -46,20 +61,29 @@ public interface Management {
 
     /**
      * Check if a user exists in the DB
+     *
      * @param user
      * @return
      */
     Boolean exists(User user);
 
+    /**
+     * Check if a project exists in the DB
+     */
+
+    Boolean exists(Project project);
+
     /**
      * Get all the users linked to a project
+     *
      * @param project
      * @return
      */
-    java.util.List<User> getUsers(Project project);
+    List<User> getUsers(Project project);
 
     /**
      * get the token for the user
+     *
      * @param user
      * @return
      */
@@ -67,9 +91,34 @@ public interface Management {
 
     /**
      * get the user given his http token
+     *
      * @param token
      * @return
      */
-    User getUser(String token);
+    User getUserByToken(String token);
+
+    /**
+     * get user by its email address
+     *
+     * @param email
+     * @return
+     */
+    User getUserByEmail(String email);
+
+    /**
+     * get project by its id
+     *
+     * @param id
+     * @return
+     */
+    Project getProjectById(String id);
+
+    void createGroup(Group group, String projectId);
+
+    void addGroupMember(User groupMember, int groupId);
+
+    void deleteGroupMember(User groupMember, int groupId);
+
+    List<Group> getGroupsByProjectId(String projectId);
 }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
index edb82a05fa7f3ba6ea6665712efc2d70d45f910d..1cecac2de82d93e049cbc159843b7f91334fb6ec 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
@@ -2,12 +2,17 @@ package unipotsdam.gf.core.management;
 
 import unipotsdam.gf.core.database.mysql.MysqlConnect;
 import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet;
+import unipotsdam.gf.core.management.group.Group;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.core.management.user.UserInterests;
 import unipotsdam.gf.core.management.user.UserProfile;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 
+import javax.annotation.ManagedBean;
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -15,6 +20,9 @@ import java.util.UUID;
 /**
  * Created by dehne on 31.05.2018.
  */
+@ManagedBean
+@Resource
+@Singleton
 public class ManagementImpl implements Management {
     @Override
     public void delete(StudentIdentifier identifier) {
@@ -32,14 +40,16 @@ public class ManagementImpl implements Management {
 
         MysqlConnect connect = new MysqlConnect();
         connect.connect();
-        String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `token`,`isStudent`) values (?,?,?,?,?)";
+        String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `token`,`isStudent`," +
+                "`rocketChatId`,`rocketChatAuthToken`) values (?,?,?,?,?,?,?)";
         connect.issueInsertOrDeleteStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
-                token, user.getStudent());
+                token, user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken());
         connect.close();
 
         // TODO implmement UserProfile @Mar
     }
 
+    // TODO: naming convention discussion? all is named create, but group is named createGroup
     @Override
     public void create(Project project) {
         UUID uuid = UUID.randomUUID();
@@ -48,9 +58,10 @@ public class ManagementImpl implements Management {
         MysqlConnect connect = new MysqlConnect();
         connect.connect();
         String mysqlRequest =
-                "INSERT INTO projects (`id`, `password`, `activ`, `timecreated`, `author`, " + "`adminpassword`, `token`) values (?,?,?,?,?,?,?)";
-        connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), project.getPassword(), project.getActiv(),
-                project.getTimecreated(), project.getAuthor(), project.getAdminpassword(), token);
+                "INSERT INTO projects (`id`, `password`, `active`, `timecreated`, `author`, "
+                        + "`adminPassword`, `token`) values (?,?,?,?,?,?,?)";
+        connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), project.getPassword(), project.isActive(),
+                project.getTimecreated(), project.getAuthor(), project.getAdminPassword(), token);
         connect.close();
     }
 
@@ -72,9 +83,20 @@ public class ManagementImpl implements Management {
         connect.close();
     }
 
+    @Override
+    public void update(User user) {
+        MysqlConnect connect = new MysqlConnect();
+        connect.connect();
+        String mysqlRequest = "UPDATE `users` SET `name`=?,`password`=?,`email`=?,`token`=?,`isStudent`=?, `rocketChatId`=?,`rocketChatAuthToken`=? WHERE email=? LIMIT 1";
+        //TODO: maybe add handling if a line is actually updated
+        connect.issueUpdateStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
+                user.getToken(), user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken(), user.getEmail());
+        connect.close();
+    }
+
     @Override
     public Boolean exists(User user) {
-        Boolean result = false;
+        Boolean result;
         MysqlConnect connect = new MysqlConnect();
         connect.connect();
         String mysqlRequest = "SELECT * FROM users where email = ? and password = ?";
@@ -82,18 +104,31 @@ public class ManagementImpl implements Management {
                 connect.issueSelectStatement(mysqlRequest, user.getEmail(), user.getPassword());
         result = vereinfachtesResultSet.next();
         connect.close();
-        if (result == null) {
-            return false;
-        }
+        return result;
+    }
+
+    @Override
+    public Boolean exists(Project project) {
+        Boolean result;
+        MysqlConnect connect = new MysqlConnect();
+        connect.connect();
+        String mysqlRequest = "SELECT * FROM projects where id = ? and adminPassword = ?";
+        VereinfachtesResultSet vereinfachtesResultSet =
+                connect.issueSelectStatement(mysqlRequest, project.getId(), project.getAdminPassword());
+        result = vereinfachtesResultSet.next();
+        connect.close();
         return result;
     }
 
     @Override
     public List<User> getUsers(Project project) {
         String query =
-                "SELECT * FROM users u " + " JOIN projectuser pu ON u.email=pu.userId" + " JOIN projects p ON pu.projectId = p.id" + " WHERE pu.projectId = ?";
+                "SELECT * FROM users u "
+                        + " JOIN projectuser pu ON u.email=pu.userId"
+                        + " JOIN projects p ON pu.projectId = p.id"
+                        + " WHERE pu.projectId = ?";
 
-        ArrayList<User> result = new ArrayList<User>();
+        ArrayList<User> result = new ArrayList<>();
         MysqlConnect connect = new MysqlConnect();
         connect.connect();
         VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query, project.getId());
@@ -112,12 +147,31 @@ public class ManagementImpl implements Management {
         String name = vereinfachtesResultSet.getString("name");
         String password = vereinfachtesResultSet.getString("password");
         String email = vereinfachtesResultSet.getString("email");
-        String rocketChatId = vereinfachtesResultSet.getString("rocketchatid");
+        String rocketChatId = vereinfachtesResultSet.getString("rocketChatId");
+        String rocketChatAuthToken = vereinfachtesResultSet.getString("rocketChatAuthToken");
         Boolean isStudent = vereinfachtesResultSet.getBoolean("isStudent");
+        return new User(name, password, email, rocketChatId, rocketChatAuthToken, isStudent);
+    }
 
-        return new User(name, password, email, rocketChatId, isStudent);
+    private Project getProjectFromResultSet(VereinfachtesResultSet vereinfachtesResultSet) {
+        String id = vereinfachtesResultSet.getString("id");
+        String password = vereinfachtesResultSet.getString("password");
+        boolean active = vereinfachtesResultSet.getBoolean("active");
+        Timestamp timestamp = vereinfachtesResultSet.getTimestamp("timecreated");
+        String author = vereinfachtesResultSet.getString("author");
+        String adminPassword = vereinfachtesResultSet.getString("adminpassword");
+        String token = vereinfachtesResultSet.getString("token");
+
+        return new Project(id, password, active, timestamp, author, adminPassword, token);
     }
 
+    private Group getGroupFromResultSet(VereinfachtesResultSet vereinfachtesResultSet) {
+        int id = vereinfachtesResultSet.getInt("id");
+        String projectId = vereinfachtesResultSet.getString("projectId");
+        String chatRoomId = vereinfachtesResultSet.getString("chatRoomId");
+        // TODO: determine how to get all User
+        return new Group(id, new ArrayList<>(), projectId, chatRoomId);
+    }
     @Override
     public String getUserToken(User user) {
         MysqlConnect connect = new MysqlConnect();
@@ -136,12 +190,21 @@ public class ManagementImpl implements Management {
     }
 
     @Override
-    public User getUser(String token) {
+    public User getUserByToken(String token) {
+        return getUserByField("token", token);
+    }
+
+    @Override
+    public User getUserByEmail(String email) {
+        return getUserByField("email", email);
+    }
+
+    private User getUserByField(String field, String value) {
         MysqlConnect connect = new MysqlConnect();
         connect.connect();
-        String mysqlRequest = "SELECT * FROM users where token = ?";
+        String mysqlRequest = "SELECT * FROM users where " + field + " = ?";
         VereinfachtesResultSet vereinfachtesResultSet =
-                connect.issueSelectStatement(mysqlRequest, token);
+                connect.issueSelectStatement(mysqlRequest, value);
         boolean next = vereinfachtesResultSet.next();
         if (next) {
             User user = getUserFromResultSet(vereinfachtesResultSet);
@@ -152,4 +215,68 @@ public class ManagementImpl implements Management {
             return null;
         }
     }
+
+    @Override
+    public Project getProjectById(String id) {
+        MysqlConnect connect = new MysqlConnect();
+        connect.connect();
+        String mysqlRequest = "SELECT * FROM projects where id = ?";
+        VereinfachtesResultSet vereinfachtesResultSet =
+                connect.issueSelectStatement(mysqlRequest, id);
+        boolean next = vereinfachtesResultSet.next();
+        if (next) {
+            Project project = getProjectFromResultSet(vereinfachtesResultSet);
+            connect.close();
+            return project;
+        } else {
+            connect.close();
+            return null;
+        }
+    }
+
+
+    @Override
+    public void createGroup(Group group, String projectId) {
+        MysqlConnect connect = new MysqlConnect();
+        connect.connect();
+
+        Project project = getProjectById(projectId);
+
+        for (User groupMember : group.getMembers()) {
+            String mysqlRequest2 = "INSERT INTO groupuser (`userEmail`, `groupId`) values (?,?)";
+            connect.issueInsertOrDeleteStatement(mysqlRequest2, groupMember.getEmail(), project.getId());
+        }
+        connect.close();
+    }
+
+    @Override
+    public void addGroupMember(User groupMember, int groupId) {
+
+    }
+
+    @Override
+    public void deleteGroupMember(User groupMember, int groupId) {
+
+    }
+
+    @Override
+    public List<Group> getGroupsByProjectId(String projectId) {
+        MysqlConnect connect = new MysqlConnect();
+        connect.connect();
+        // TODO: implement correct join and finish implementation
+        String mysqlRequest = "SELECT * FROM groups g " +
+                "JOIN groupuser gu u ON g.id=gu.groupId " + "JOIN users u ON gu.userEmail=u.email" +
+                "where g.projectId = ?";
+        VereinfachtesResultSet vereinfachtesResultSet =
+                connect.issueSelectStatement(mysqlRequest, projectId);
+        ArrayList<Group> groups = new ArrayList<>();
+        while (vereinfachtesResultSet.next()) {
+            //groups.add()
+        }
+        if (groups.isEmpty()) {
+            return null;
+        } else {
+            return groups;
+        }
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/Group.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/Group.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea56b43196cd93b3c87518dfa55ab58e2840c8b9
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/Group.java
@@ -0,0 +1,67 @@
+package unipotsdam.gf.core.management.group;
+
+import unipotsdam.gf.core.management.user.User;
+
+import java.util.List;
+
+public class Group {
+
+    private int id; // do not set yourself, autoincrement
+    private List<User> members;
+    private String projectId;
+    private String chatRoomId;
+
+    public Group() {
+    }
+
+    public Group(List<User> members, String projectId) {
+        this.members = members;
+        this.projectId = projectId;
+        this.chatRoomId = "";
+    }
+
+    public Group(List<User> members, String projectId, String chatRoomId) {
+        this.members = members;
+        this.projectId = projectId;
+        this.chatRoomId = chatRoomId;
+    }
+
+    public Group(int id, List<User> members, String projectId, String chatRoomId) {
+        this.id = id;
+        this.members = members;
+        this.projectId = projectId;
+        this.chatRoomId = chatRoomId;
+    }
+
+    public List<User> getMembers() {
+        return members;
+    }
+
+    public void setMembers(List<User> members) {
+        this.members = members;
+    }
+
+    public String getChatRoomId() {
+        return chatRoomId;
+    }
+
+    public void setChatRoomId(String chatRoomId) {
+        this.chatRoomId = chatRoomId;
+    }
+
+    public void addMember(User user) {
+        members.add(user);
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public int getId() {
+        return id;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java
index de780722652eb40ea1f6f6e2f1518fa0e752bcb3..682b5c40b13472a4bc3369eb7970ddb9bce428fd 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java
@@ -1,7 +1,5 @@
 package unipotsdam.gf.core.management.project;
 
-import org.glassfish.grizzly.http.util.TimeStamp;
-
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -13,25 +11,45 @@ public class Project {
 
     private String id;
     private String password;
-    private String activ;
+    private Boolean active;
     private Timestamp timecreated;
     private String author;
-    private String adminpassword;
+    private String adminPassword;
     private String token;
 
     public Project() {
     }
 
-    public Project(
-            String id, String password, String activ, String author, String adminpassword) {
+    public Project(String id, String password, Boolean active, String author, String adminPassword) {
+        this.id = id;
+        this.password = password;
+        this.active = active;
+        this.author = author;
+        this.adminPassword = adminPassword;
+
+        this.timecreated = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
+    }
+
+    public Project(String id, String password, Boolean active, String author, String adminPassword, String token) {
         this.id = id;
         this.password = password;
-        this.activ = activ;
+        this.active = active;
         this.author = author;
-        this.adminpassword = adminpassword;
+        this.adminPassword = adminPassword;
+        this.token = token;
+
+        this.timecreated = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
+    }
 
-        Timestamp ts = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
-        this.timecreated = ts;
+    public Project(String id, String password, Boolean active, Timestamp timecreated, String author,
+                   String adminPassword, String token) {
+        this.id = id;
+        this.password = password;
+        this.active = active;
+        this.timecreated = timecreated;
+        this.author = author;
+        this.adminPassword = adminPassword;
+        this.token = token;
     }
 
     public String getId() {
@@ -50,12 +68,12 @@ public class Project {
         this.password = password;
     }
 
-    public String getActiv() {
-        return activ;
+    public Boolean isActive() {
+        return active;
     }
 
-    public void setActiv(String activ) {
-        this.activ = activ;
+    public void setActive(Boolean active) {
+        this.active = active;
     }
 
     public String getAuthor() {
@@ -66,12 +84,12 @@ public class Project {
         this.author = author;
     }
 
-    public String getAdminpassword() {
-        return adminpassword;
+    public String getAdminPassword() {
+        return adminPassword;
     }
 
-    public void setAdminpassword(String adminpassword) {
-        this.adminpassword = adminpassword;
+    public void setAdminPassword(String adminPassword) {
+        this.adminPassword = adminPassword;
     }
 
     public String getToken() {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java
index 57b6326cc78caca6e9673a9dab8ce31f0118113e..3b3800696c9a44662e03285220d62fe5e8a6822f 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java
@@ -1,24 +1,24 @@
 package unipotsdam.gf.core.management.user;
 
 import unipotsdam.gf.core.management.ManagementImpl;
-import unipotsdam.gf.core.management.user.User;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.tagext.*;
-import javax.servlet.jsp.*;
-import java.io.*;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+import java.io.IOException;
 
 /**
  * implemented while porting the login page. It might be useful to have a hidden user field on the page in order to
  * manipulate the user data with jquery
  */
 public class HiddenUserTag extends SimpleTagSupport {
-    public void doTag() throws JspException, IOException {
+    public void doTag() throws IOException {
         PageContext pageContext = (PageContext) getJspContext();
         HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
         String token = request.getParameter("token");
         ManagementImpl management = new ManagementImpl();
-        User user = management.getUser(token);
+        User user = management.getUserByToken(token);
         JspWriter out = getJspContext().getOut();
         out.println("<p id=\"user\" hidden>"+user.getName()+"</p>");
     }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java
index 8fd6c0f6d2ae28b8f457ad12922d3698990ece10..3a3a695d7e870ddca681c05918a9a5c4acafddfd 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java
@@ -4,7 +4,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import unipotsdam.gf.core.management.ManagementImpl;
 
-import javax.servlet.*;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
@@ -14,18 +19,18 @@ import java.io.IOException;
  */
 public class SessionValidator implements Filter {
 
-    Logger log = LoggerFactory.getLogger(SessionValidator.class);
+    private final static Logger log = LoggerFactory.getLogger(SessionValidator.class);
 
     private void redirectToLogin(ServletRequest request, ServletResponse response) {
         log.debug("redirecting user to login because token does not exist");
         String loginJSP = "../../index.jsp";
         ((HttpServletResponse) response).setHeader("Location", loginJSP);
-        ((HttpServletResponse) response).setContentType("text/html");
+        response.setContentType("text/html");
         ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_FOUND); // SC_FOUND = 302
     }
 
     @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
+    public void init(FilterConfig filterConfig) {
 
     }
 
@@ -37,7 +42,7 @@ public class SessionValidator implements Filter {
             redirectToLogin(request, response);
         }
         ManagementImpl management = new ManagementImpl();
-        User user = management.getUser(token);
+        User user = management.getUserByToken(token);
         if (user == null) {
             redirectToLogin(request, response);
         }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/User.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/User.java
index 22f6157174ee5a3d8dbbb81e44e5fb1e8adaf068..ef9531d231c70944f627ee6afbaeb26ee1eb5ac5 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/User.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/User.java
@@ -1,14 +1,13 @@
 package unipotsdam.gf.core.management.user;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
 /**
  * Created by dehne on 31.05.2018.
  */
+@JsonIgnoreProperties(ignoreUnknown = true)
 public class User {
 
-    // the email is the id!
-    public String getId() {
-        return this.email;
-    }
     private String name;
     private String password;
     private String email;
@@ -25,16 +24,24 @@ public class User {
         this.password = password;
         this.email = email;
         this.isStudent = isStudent;
+        this.rocketChatAuthToken = "";
+        this.rocketChatId = "";
     }
 
-    public User(String name, String password, String email, String rocketChatId, Boolean isStudent) {
+    public User(String name, String password, String email, String rocketChatId, String rocketChatAuthToken, Boolean isStudent) {
         this.name = name;
         this.password = password;
         this.email = email;
         this.rocketChatId = rocketChatId;
+        this.rocketChatAuthToken = rocketChatAuthToken;
         this.isStudent = isStudent;
     }
 
+    // the email is the id!
+    public String getId() {
+        return this.email;
+    }
+
     public String getName() {
         return name;
     }
@@ -68,7 +75,6 @@ public class User {
     }
 
 
-
     public Boolean getStudent() {
         return isStudent;
     }
@@ -92,4 +98,17 @@ public class User {
     public void setRocketChatAuthToken(String rocketChatAuthToken) {
         this.rocketChatAuthToken = rocketChatAuthToken;
     }
+
+    @Override
+    public String toString() {
+        return "User{" +
+                "name='" + name + '\'' +
+                ", password='" + password + '\'' +
+                ", email='" + email + '\'' +
+                ", token='" + token + '\'' +
+                ", rocketChatAuthToken='" + rocketChatAuthToken + '\'' +
+                ", rocketChatId='" + rocketChatId + '\'' +
+                ", isStudent=" + isStudent +
+                '}';
+    }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
index 9de798e4f59741e4818c1c056efe69bd487a728d..d5c0515c1ea29368e7a6322484994eb767e2d2c4 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
@@ -4,6 +4,8 @@ import unipotsdam.gf.core.management.ManagementImpl;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
 
+import javax.annotation.ManagedBean;
+import javax.inject.Inject;
 import javax.ws.rs.FormParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -14,8 +16,12 @@ import java.net.URI;
 import java.net.URISyntaxException;
 
 @Path("/user")
+@ManagedBean
 public class UserService {
 
+    @Inject
+    private ICommunication communicationService;
+
     /**
      * creates a user with given credentials
      *
@@ -36,13 +42,8 @@ public class UserService {
 
         ManagementImpl management = new ManagementImpl();
         User user = new User(name, password, email, isStudent == null);
-        ICommunication iCommunication = new CommunicationDummyService();
-        boolean chatUserCreated = iCommunication.registerUser(user);
-        if (chatUserCreated) {
-            return login(true, user);
-        } else {
-            return registrationError();
-        }
+        return login(true, user);
+
     }
 
     /**
@@ -90,12 +91,18 @@ public class UserService {
                 ManagementImpl m = new ManagementImpl();
                 String token = m.getUserToken(user);
                 user = m.getUser(token);
+                    return loginError();
+                }
                 return redirectToProjectPage(user, management);
             }
             String existsUrl = "../register.jsp?userExists=true";
             return forwardToLocation(existsUrl);
         } else {
             if (createUser) {
+                boolean isRegisteredAndLoggedIn = communicationService.registerAndLoginUser(user);
+                if (!isRegisteredAndLoggedIn) {
+                    return registrationError();
+                }
                 management.create(user, null);
             } else {
                 String existsUrl = "../index.jsp?userExists=false";
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig
new file mode 100644
index 0000000000000000000000000000000000000000..73d84e8fa40445fffec6c0a31a5523f9fb5e318f
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig
@@ -0,0 +1,163 @@
+package unipotsdam.gf.core.management.user;
+
+import unipotsdam.gf.core.management.ManagementImpl;
+import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+
+import javax.annotation.ManagedBean;
+import javax.inject.Inject;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+@Path("/user")
+@ManagedBean
+public class UserService {
+
+    @Inject
+    private ICommunication communicationService;
+
+    /**
+     * creates a user with given credentials
+     *
+     * @param name
+     * @param password
+     * @param email
+     * @param isStudent
+     * @return
+     * @throws URISyntaxException
+     */
+    // This method is called if HTML is request
+    @POST
+    @Produces(MediaType.TEXT_HTML)
+    @Path("/create")
+    public Response createUser(@FormParam("name") String name, @FormParam("password") String password,
+                               @FormParam("email") String email, @FormParam("isStudent") String isStudent)
+            throws URISyntaxException {
+
+        ManagementImpl management = new ManagementImpl();
+        User user = new User(name, password, email, isStudent == null);
+        return login(true, user);
+
+    }
+
+    /**
+     * checks if a user exists in order to log him in
+     *
+     * @param name
+     * @param password
+     * @param email
+     * @return
+     * @throws URISyntaxException
+     */
+    // This method is called if HTML is request
+    @POST
+    @Produces(MediaType.TEXT_HTML)
+    @Path("/exists")
+    public Response existsUser(@FormParam("name") String name, @FormParam("password") String password,
+                               @FormParam("email") String email)
+            throws URISyntaxException {
+
+        ManagementImpl management = new ManagementImpl();
+        User user = new User(name, password, email, null);
+        ICommunication iCommunication = new CommunicationDummyService();
+        boolean isLoggedIn = iCommunication.loginUser(user);
+        if (isLoggedIn) {
+            return login(false, user);
+        } else {
+            return loginError();
+        }
+
+
+    }
+
+    /**
+     * if create User is true, the user is created and logged in if he does not exist
+     *
+     * @param createUser
+     * @param user
+     * @return
+     * @throws URISyntaxException
+     */
+    protected Response login(boolean createUser, User user) throws URISyntaxException {
+        ManagementImpl management = new ManagementImpl();
+        if (management.exists(user)) {
+            if (!createUser) {
+<<<<<<< HEAD
+                ManagementImpl m = new ManagementImpl();
+                String token = m.getUserToken(user);
+                user = m.getUser(token);
+=======
+                boolean successfulLogin = communicationService.loginUser(user);
+                management.update(user);
+                if (!successfulLogin) {
+                    return loginError();
+                }
+>>>>>>> 9bbae0ff75b2597ab35479a24d47c12e7a4cc0fd
+                return redirectToProjectPage(user, management);
+            }
+            String existsUrl = "../register.jsp?userExists=true";
+            return forwardToLocation(existsUrl);
+        } else {
+            if (createUser) {
+                boolean isRegisteredAndLoggedIn = communicationService.registerAndLoginUser(user);
+                if (!isRegisteredAndLoggedIn) {
+                    return registrationError();
+                }
+                management.create(user, null);
+            } else {
+                String existsUrl = "../index.jsp?userExists=false";
+                return forwardToLocation(existsUrl);
+            }
+            ManagementImpl m = new ManagementImpl();
+            String token = m.getUserToken(user);
+            user = m.getUser(token); //todo: write query to get user isStudent
+            return redirectToProjectPage(user, management);
+        }
+    }
+
+    private Response registrationError() throws URISyntaxException {
+        String existsUrl = "../register.jsp?registrationError=true";
+        return forwardToLocation(existsUrl);
+    }
+
+    private Response loginError() throws URISyntaxException {
+        String existsUrl = "../index.jsp?loginError=true";
+        return forwardToLocation(existsUrl);
+    }
+
+    /**
+     * helper function for redirecting to the right project page
+     *
+     * @param user
+     * @param management
+     * @return
+     * @throws URISyntaxException
+     */
+    private Response redirectToProjectPage(User user, ManagementImpl management) throws URISyntaxException {
+        String successUrl;
+        if (user.getStudent() != null && user.getStudent()) {
+            successUrl = "../pages/overview-student.html?token=";
+        } else {
+            successUrl = "../pages/overview-docent.html?token=";
+        }
+        successUrl += management.getUserToken(user);
+        return forwardToLocation(successUrl);
+    }
+
+    /**
+     * * helper function for redirecting to a new page
+     *
+     * @param existsUrl
+     * @return
+     * @throws URISyntaxException
+     */
+    private Response forwardToLocation(String existsUrl) throws URISyntaxException {
+        return Response.seeOther(new URI(existsUrl)).build();
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
index 8a07add14391adf6779942e0225e1c38e30e9b2f..12d3d71183ae34966d1e88a04596095c22eadd42 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
@@ -22,7 +22,7 @@ public interface ICommunication {
     List<ChatMessage> getChatHistory(String roomId);
 
 
-    boolean sendMessageToChat(Message message);
+    boolean sendMessageToChat(Message message, String roomId);
 
     /**
      * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/create/
@@ -44,6 +44,8 @@ public interface ICommunication {
      */
     boolean addUserToChatRoom(String roomId, User user);
 
+    boolean removeUserFromChatRoom(User user, String roomId);
+
     /**
      * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/settopic/
      *
@@ -79,4 +81,8 @@ public interface ICommunication {
      */
     boolean registerUser(User user);
 
+    boolean registerAndLoginUser(User user);
+
+    String getChatRoomLink(String userToken, String projectToken, String groupToken);
+
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
new file mode 100644
index 0000000000000000000000000000000000000000..9fa51312f3f086cdacfd1dd25bc21612dccffbc8
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
@@ -0,0 +1,40 @@
+package unipotsdam.gf.modules.communication;
+
+import unipotsdam.gf.core.management.ManagementImpl;
+import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+import java.io.IOException;
+
+public class ChatWindow extends SimpleTagSupport {
+
+    private String orientation;
+
+    public void doTag() throws IOException {
+        PageContext pageContext = (PageContext) getJspContext();
+        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
+        String token = request.getParameter("token");
+        ManagementImpl management = new ManagementImpl();
+        //User user = management.getUserByToken(token);
+        String groupToken = request.getParameter("groupToken");
+        String projectToken = request.getParameter("projectToken");
+        //get ProjetbyToken
+        ICommunication communicationService = new CommunicationDummyService();
+        String chatRoomLink = communicationService.getChatRoomLink(token,projectToken,groupToken);
+
+        JspWriter out = getJspContext().getOut();
+        out.println("<iframe width=\"30%\" height=\"100%\" src=\""+chatRoomLink+"\"/>");
+    }
+
+    public void setOrientation(String orientation) {
+        this.orientation = orientation;
+    }
+
+    public String getOrientation() {
+        return orientation;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
index f659a3620b974c75bbf237c2453b4b30c92d1356..3d989429228f1c213263794b0df7c741f87507cb 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
@@ -1,46 +1,68 @@
 package unipotsdam.gf.modules.communication.service;
 
+import unipotsdam.gf.config.Constants;
+import unipotsdam.gf.core.management.Management;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.model.Message;
 import unipotsdam.gf.modules.communication.model.chat.ChatMessage;
 import unipotsdam.gf.modules.communication.model.chat.ChatRoom;
 
+import javax.annotation.ManagedBean;
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
+@Resource
+@ManagedBean
+@Singleton
 public class CommunicationDummyService implements ICommunication {
 
+    @Inject
+    Management managementService;
+
     @Override
     public List<ChatMessage> getChatHistory(String roomId) {
         ArrayList<ChatMessage> chatMessages = new ArrayList<>();
         int maxValue = 6;
-        for (int i = 1;i <= maxValue;i++) {
-            chatMessages.add(new ChatMessage(String.valueOf(i+1), "Dies ist ein Test" + i + " .",
-                    Instant.now().minusSeconds(maxValue * 10 - i * 10),"testUser" + i));
+        for (int i = 1; i <= maxValue; i++) {
+            chatMessages.add(new ChatMessage(String.valueOf(i), "Dies ist ein Test " + i + ".",
+                    Instant.now().minusSeconds(maxValue * 10 - i * 10), "testUser" + i));
         }
         return chatMessages;
     }
 
     @Override
-    public boolean sendMessageToChat(Message message) {
-        throw new RuntimeException("Do not call this method without implementation");
+    public boolean sendMessageToChat(Message message, String roomId) {
+        return true;
     }
 
     @Override
     public String createChatRoom(String name, List<User> users) {
+        if (Objects.isNull(users)) {
+            return "2";
+        }
+
         return "1";
     }
 
     @Override
     public boolean addUserToChatRoom(String roomId, User user) {
-        throw new RuntimeException("Do not call this method without implementation");
+        return true;
+    }
+
+    @Override
+    public boolean removeUserFromChatRoom(User user, String roomId) {
+        return true;
     }
 
     @Override
     public boolean setChatRoomTopic(String roomId, String topic) {
-        throw new RuntimeException("Do not call this method without implementation");
+        return true;
     }
 
     @Override
@@ -50,7 +72,6 @@ public class CommunicationDummyService implements ICommunication {
 
     @Override
     public boolean loginUser(User user) {
-        user.setRocketChatId("1");
         user.setRocketChatAuthToken("abc");
         return true;
     }
@@ -60,4 +81,28 @@ public class CommunicationDummyService implements ICommunication {
         user.setRocketChatId("1");
         return true;
     }
+
+    @Override
+    public boolean registerAndLoginUser(User user) {
+        // TODO: try to login user first --> if it fails there is no user, register afterwards or add exists function
+        if (!registerUser(user)) {
+            return false;
+        }
+        return loginUser(user);
+
+    }
+
+    public String getChatRoomLink(String userToken, String projectToken, String groupToken) {
+        //User user = managementService.getUserByToken(userToken);
+        // TODO: Implement getProjectbyToken and getGroupByToken
+        //Project project = managementService.getProject(projectToken
+        String channelName = "general";
+        return Constants.ROCKET_CHAT_URL + "/channel/" + channelName + "?layout=embedded";
+    }
+
+    // TODO: remove after done implementing
+    // just for postman testing
+    public User getUser() {
+        return new User("Martin Stähr", "test", "test@test.com", true);
+    }
 }
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
new file mode 100644
index 0000000000000000000000000000000000000000..bc2c6ff9fa0638e8a8feb9c12b902f545c19dfe4
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java
@@ -0,0 +1,186 @@
+package unipotsdam.gf.modules.communication.view;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.modules.communication.model.Message;
+import unipotsdam.gf.modules.communication.model.chat.ChatMessage;
+import unipotsdam.gf.modules.communication.model.chat.ChatRoom;
+import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+
+import javax.annotation.ManagedBean;
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+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.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+import static java.util.Objects.isNull;
+
+@Path("/chat")
+@ManagedBean
+public class CommunicationView {
+
+    private static final Logger log = LoggerFactory.getLogger(CommunicationView.class);
+
+    @Inject
+    private ICommunication communicationService;
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/info/{roomId}")
+    public Response getChatRoomInformation(@PathParam("roomId") String roomId) {
+        ChatRoom chatRoom = communicationService.getChatRoomInfo(roomId);
+        if (isNull(chatRoom)) {
+            log.error("chatRoom not found for roomId: {}", roomId);
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+        log.trace("getChatRoomInformationResponse: {}", chatRoom);
+        return Response.ok(chatRoom).build();
+    }
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/history/{roomId}")
+    public Response getChatHistory(@PathParam("roomId") String roomId) {
+        List<ChatMessage> chatMessages = communicationService.getChatHistory(roomId);
+        if (isNull(chatMessages)) {
+            log.error("getChatHistory: chatRoom not found for roomId: {}", roomId);
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+        log.trace("response for getChatHistory: {}", chatMessages);
+        return Response.ok(chatMessages).build();
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/send/{roomId}")
+    public Response sendMessage(Message message, @PathParam("roomId") String roomId) {
+        if (isNull(message)) {
+            log.trace("sendMessage message object was null");
+            return Response.status(Response.Status.BAD_REQUEST).entity("must provide message").build();
+        }
+        boolean wasSend = communicationService.sendMessageToChat(message, roomId);
+        Response response;
+        if (wasSend) {
+            log.trace("response for sendMessage: {}", wasSend);
+            response = Response.ok(wasSend).build();
+        } else {
+            log.error("error while sending message for message: {}", message);
+            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while sending message").build();
+        }
+        return response;
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/addUser/{roomId}")
+    public Response addUserToChatRoom(@PathParam("roomId") String roomId, User user) {
+        if (isNull(user)) {
+            log.trace("addUser user object was null");
+            return Response.status(Response.Status.BAD_REQUEST).entity("must provide user").build();
+        }
+        boolean wasAdded = communicationService.addUserToChatRoom(roomId, user);
+        if (isNull(wasAdded)) {
+            log.error("addUserToChatRoom: chatRoom not found for roomId: {}, user: {}", roomId, user);
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+        Response response;
+        if (wasAdded) {
+            log.trace("response for addUser: {}", wasAdded);
+            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();
+        }
+        return response;
+    }
+
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/removeUser/{roomId}")
+    public Response removeUserFromChatRoom(User user, @PathParam("roomId") String roomId) {
+        if (isNull(user)) {
+            log.trace("removeUser user object was null");
+            return Response.status(Response.Status.BAD_REQUEST).entity("must provide user").build();
+        }
+        boolean wasRemoved = communicationService.removeUserFromChatRoom(user, roomId);
+        if (isNull(wasRemoved)) {
+            log.error("removeUserToChatRoom: chatRoom not found for roomId: {}, user: {}", roomId, user);
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+        Response response;
+        if (wasRemoved) {
+            log.trace("response for removeUser: {}", wasRemoved);
+            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();
+        }
+        return response;
+    }
+
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/setTopic/{roomId}")
+    public Response setChatRoomTopic(@PathParam("roomId") String roomId, @QueryParam("topic") String topic) {
+        if (isNull(topic)) {
+            log.trace("setTopic param not given");
+            return Response.status(Response.Status.BAD_REQUEST).entity("topic must be not empty").build();
+        }
+        boolean wasSet = communicationService.setChatRoomTopic(roomId, topic);
+        if (isNull(wasSet)) {
+            log.error("addChatRoomTopic: chatRoom not found for roomId: {}, topic: {}", roomId, topic);
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+        Response response;
+        if (wasSet) {
+            log.trace("response for setTopic: {}", wasSet);
+            response = Response.ok(wasSet).build();
+        } else {
+            log.error("error while setting topic to chat room");
+            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while setting topic to chat room").build();
+        }
+        return response;
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/create")
+    public Response createChatRoom(@QueryParam("name") String name, List<User> users) {
+        if (isNull(name)) {
+            return Response.status(Response.Status.BAD_REQUEST).entity("must provide name as queryParam").build();
+        }
+        String chatId = communicationService.createChatRoom(name, users);
+        if (isNull(chatId)) {
+            log.error("error while creating chatRoom for: name: {}, users: {}", name, users);
+            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+        }
+        log.trace("response for createChatRoom: {}", chatId);
+        return Response.status(Response.Status.CREATED).entity(chatId).build();
+    }
+
+    // Temp: just get user as json
+    // TODO: remove after done implementing
+    @GET
+    @Path("/user")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getUser() {
+        User user = ((CommunicationDummyService) communicationService).getUser();
+        return Response.ok(user).build();
+    }
+
+
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupCreation/service/GroupCreationService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupCreation/service/GroupCreationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..23127b12dc29e93f9d76e299c81619229fab16e4
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupCreation/service/GroupCreationService.java
@@ -0,0 +1,97 @@
+package unipotsdam.gf.modules.groupCreation.service;
+
+import unipotsdam.gf.core.management.Management;
+import unipotsdam.gf.core.management.group.Group;
+import unipotsdam.gf.core.management.project.Project;
+import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.management.user.UserProfile;
+import unipotsdam.gf.interfaces.ICommunication;
+
+import javax.annotation.ManagedBean;
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@ManagedBean
+@Resource
+@Singleton
+public class GroupCreationService {
+
+    @Inject
+    private ICommunication communicationService;
+
+    @Inject
+    private Management management;
+
+    public boolean createExampleProject() {
+
+        User docentUser = getDocentUser();
+        Project project = new Project("1", "", true, docentUser.getEmail(), "admin");
+
+        List<Group> groups = createDummyGroups(project.getId());
+
+        if (!management.exists(project)) {
+            management.create(project);
+        }
+
+        groups.forEach(group -> management.createGroup(group, project.getId()));
+
+        // TODO: read List<Group> of database to get Id for chatRoomName (Should be ProjectName - GroupId)
+        // TODO: add projectName as DatabaseEntry
+        // TODO: implement sql service injection for, so connection is only done once in app
+
+
+        List<Group> nonEmptyGroups = groups.stream().filter(group -> group.getMembers().isEmpty())
+                .collect(Collectors.toList());
+        if (nonEmptyGroups.isEmpty()) {
+            return false;
+        }
+
+
+        return true;
+    }
+
+    private List<Group> createDummyGroups(String projectId) {
+        Group group1 = new Group(new ArrayList<>(), projectId);
+        Group group2 = new Group(new ArrayList<>(), projectId);
+        Group group3 = new Group(new ArrayList<>(), projectId);
+        Group group4 = new Group(new ArrayList<>(), projectId);
+        List<Group> groups = Arrays.asList(group1, group2, group3, group4);
+
+        String baseUserName = "Name ";
+        String password = "test123";
+        String baseEMailFront = "test";
+        String baseEMailDomain = "@example.com";
+        boolean isStudentValue = true;
+        for (int userNumber = 0; userNumber < groups.size() * 5; userNumber++) {
+            String userName = baseUserName + (userNumber + 1);
+            String email = baseEMailFront + (userNumber + 1) + baseEMailDomain;
+            User user = new User(userName, password, email, isStudentValue);
+            if (!management.exists(user)) {
+                saveUserToDatabase(user);
+                int groupPosition = userNumber % groups.size();
+                groups.get(groupPosition).addMember(user);
+            }
+        }
+        return groups;
+    }
+
+    private User getDocentUser() {
+        User docent = new User("Julian", "docent", "docent@docent.com", false);
+        if (!management.exists(docent)) {
+            saveUserToDatabase(docent);
+        } else {
+            docent = management.getUserByEmail(docent.getEmail());
+        }
+        return docent;
+    }
+
+    private void saveUserToDatabase(User user) {
+        communicationService.registerAndLoginUser(user);
+        management.create(user, new UserProfile());
+    }
+}
diff --git a/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml b/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml
index 3511089f59e16b12495bd35e537aab326cf9edb2..929b4ad51850624802f6c16eed5d88b77f59b274 100644
--- a/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml
+++ b/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml
@@ -26,6 +26,10 @@
             <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
             <param-value>true</param-value>
         </init-param>
+        <init-param>
+            <param-name>javax.ws.rs.Application</param-name>
+            <param-value>unipotsdam.gf.config.GFResourceConfig</param-value>
+        </init-param>
         <!--       <init-param>
                    <param-name>com.sun.jersey.config.feature.DisableWADL</param-name>
                    <param-value>true</param-value>
diff --git a/gemeinsamforschen/src/main/webapp/communication/chatWindow.tld b/gemeinsamforschen/src/main/webapp/communication/chatWindow.tld
new file mode 100644
index 0000000000000000000000000000000000000000..e98a7ae49e0b8eba380ac79f2efd35b0840c63cc
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/communication/chatWindow.tld
@@ -0,0 +1,16 @@
+<taglib>
+    <tlib-version>1.0</tlib-version>
+    <jsp-version>2.0</jsp-version>
+    <short-name>chatWindow</short-name>
+
+    <tag>
+        <name>chatWindow</name>
+        <tag-class>unipotsdam.gf.modules.communication.ChatWindow</tag-class>
+        <body-content>empty</body-content>
+        <attribute>
+            <name>orientation</name>
+            <required>yes</required>
+            <rtexprvalue>no</rtexprvalue>
+        </attribute>
+    </tag>
+</taglib>
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-docent.html b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html
index 10bf48506b71a4cd652ae743fc3c04399c1df6e8..cc9f504b65cee81c9b30aefdae2a72555178b49f 100644
--- a/gemeinsamforschen/src/main/webapp/pages/overview-docent.html
+++ b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html
@@ -51,7 +51,7 @@
         </tr>
         <tr style="cursor:pointer" role="button">
             <td>
-                <a href="project-docent.html">
+                <a href="project-docent.jsp">
                     <h1>dummy Projekt2</h1>
                 </a>
             </td>
diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-docent.html.orig b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html.orig
new file mode 100644
index 0000000000000000000000000000000000000000..621176b5de895049ff300d1782269135a296493e
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html.orig
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>fltrail</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
+    <link rel="stylesheet" href="../assets/css/styles.css">
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
+</head>
+
+<body>
+<h1>Übersicht für Dozent1</h1>
+<a href="#"><span class="glyphicon glyphicon-envelope"
+                  style="font-size:27px;margin-top:-17px;margin-left:600px;"></span></a>
+<a href="#"><span class="glyphicon glyphicon-cog" style="font-size:29px;margin-left:5px;margin-top:-25px;"></span></a>
+<div>
+    <table id="projects">  <!-- getElementById('projects').append um neue Projekte anzufügen -->
+        <tr style="cursor:pointer" role="button">
+            <td>
+<<<<<<< HEAD
+                <a id="project1Link">
+=======
+                <a href="project-docent.jsp">
+>>>>>>> 9bbae0ff75b2597ab35479a24d47c12e7a4cc0fd
+                    <h1>dummy Projekt1</h1>
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <div style="width:100px;"></div>
+                <div style="width:741px;">
+                    <div class="panel panel-default">
+                        <div class="panel-heading">
+                            <h3 class="panel-title">Newsfeed </h3>
+                        </div>
+                        <div class="panel-body">
+                            <ul class="list-group">
+                                <li class="list-group-item">
+                                    <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span>
+                                </li>
+                                <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li>
+                                <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </td>
+        </tr>
+        <tr>
+            <td></td>
+        </tr>
+        <tr style="cursor:pointer" role="button">
+            <td>
+                <a href="project-docent.jsp">
+                    <h1>dummy Projekt2</h1>
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <div style="width:100px;"></div>
+                <div style="width:741px;">
+                    <div class="panel panel-default">
+                        <div class="panel-heading">
+                            <h3 class="panel-title">Newsfeed </h3>
+                        </div>
+                        <div class="panel-body">
+                            <ul class="list-group">
+                                <li class="list-group-item">
+                                    <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span>
+                                </li>
+                                <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li>
+                                <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </td>
+        </tr>
+    </table>
+</div>
+<button class="btn btn-default" type="button" style="margin-left:250px;">Projekt erstellen</button>
+<script src="../assets/js/jquery.min.js"></script>
+<script src="../assets/bootstrap/js/bootstrap.min.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-student.html b/gemeinsamforschen/src/main/webapp/pages/overview-student.html
index f739bfaf6c6f9d9ab53e9b7de53662a90535d684..feb1ce71f4f1eefaae7b6ec8bd35341670fafa1c 100644
--- a/gemeinsamforschen/src/main/webapp/pages/overview-student.html
+++ b/gemeinsamforschen/src/main/webapp/pages/overview-student.html
@@ -54,7 +54,7 @@
         </tr>
         <tr style="cursor:pointer" role="button">
             <td>
-                <a href="project-docent.html">
+                <a href="project-docent.jsp">
                     <h1>dummy Projekt2</h1>
                 </a>
             </td>
diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-student.html.orig b/gemeinsamforschen/src/main/webapp/pages/overview-student.html.orig
new file mode 100644
index 0000000000000000000000000000000000000000..db7445c800029d1c311a2a61f6528428a110ae85
--- /dev/null
+++ b/gemeinsamforschen/src/main/webapp/pages/overview-student.html.orig
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>fltrail</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
+    <link rel="stylesheet" href="../assets/css/styles.css">
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
+    <script src="../assets/js/utility.js"></script>
+    <script src="../assets/js/overview-student.js"></script>
+
+</head>
+
+<body>
+<h1>Übersicht für Student1</h1>
+<a href="#"><span class="glyphicon glyphicon-envelope"
+                  style="font-size:27px;margin-top:-17px;margin-left:600px;"></span></a>
+<a href="#"><span class="glyphicon glyphicon-cog" style="font-size:29px;margin-left:5px;margin-top:-25px;"></span></a>
+<div>
+    <table id="projects">  <!-- getElementById('projects').append um neue Projekte anzufügen -->
+        <tr style="cursor:pointer" role="button">
+            <td>
+<<<<<<< HEAD
+                <a id="project1Link">
+=======
+                <a href="project-docent.jsp">
+>>>>>>> 9bbae0ff75b2597ab35479a24d47c12e7a4cc0fd
+                    <h1>dummy Projekt1</h1>
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <div style="width:100px;"></div>
+                <div style="width:741px;">
+                    <div class="panel panel-default">
+                        <div class="panel-heading">
+                            <h3 class="panel-title">Newsfeed </h3>
+                        </div>
+                        <div class="panel-body">
+                            <ul class="list-group">
+                                <li class="list-group-item">
+                                    <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span>
+                                </li>
+                                <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li>
+                                <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </td>
+        </tr>
+        <tr>
+            <td></td>
+        </tr>
+        <tr style="cursor:pointer" role="button">
+            <td>
+                <a href="project-docent.jsp">
+                    <h1>dummy Projekt2</h1>
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <div style="width:100px;"></div>
+                <div style="width:741px;">
+                    <div class="panel panel-default">
+                        <div class="panel-heading">
+                            <h3 class="panel-title">Newsfeed </h3>
+                        </div>
+                        <div class="panel-body">
+                            <ul class="list-group">
+                                <li class="list-group-item">
+                                    <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span>
+                                </li>
+                                <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li>
+                                <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </td>
+        </tr>
+    </table>
+</div>
+    </div><button class="btn btn-default" type="button" style="margin-left:250px;">Projekt beitreten</button>
+    <script src="../assets/js/jquery.min.js"></script>
+    <script src="../assets/bootstrap/js/bootstrap.min.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/webapp/pages/project-docent.html b/gemeinsamforschen/src/main/webapp/pages/project-docent.jsp
similarity index 98%
rename from gemeinsamforschen/src/main/webapp/pages/project-docent.html
rename to gemeinsamforschen/src/main/webapp/pages/project-docent.jsp
index 5e8890a70d8c22019b3f9ec72b687ec2f8b2608e..a67e761165a9ddf5b5d6879c41d2896b9581a771 100644
--- a/gemeinsamforschen/src/main/webapp/pages/project-docent.html
+++ b/gemeinsamforschen/src/main/webapp/pages/project-docent.jsp
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<%@ taglib prefix = "communication" uri = "/communication/chatWindow.tld"%>
 <html>
 
 <head>
@@ -128,6 +129,7 @@
                 </div>
             </div>
         </div>
+    <communication:chatWindow orientation="right"></communication:chatWindow>
         <script src="../assets/js/jquery.min.js"></script>
         <script src="../assets/bootstrap/js/bootstrap.min.js"></script>
 </body>
diff --git a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
index 7e6e05efc455f0cb85a040550d3271a1d4a64d06..c92c03da44cc2448ac7b5e9d09cb274997e2459d 100644
--- a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
+++ b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
@@ -1,59 +1,67 @@
-SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
-SET time_zone = "+00:00";
+CREATE DATABASE IF NOT EXISTS `fltrail`
+  DEFAULT CHARACTER SET utf8
+  COLLATE utf8_general_ci;
+USE `fltrail`;
 
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8mb4 */;
+CREATE TABLE if not exists `projects` (
+  `id`            varchar(400) NOT NULL,
+  `password`      varchar(400) NOT NULL,
+  `active`        tinyint(1)   NOT NULL,
+  `timecreated`   timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+  ON UPDATE CURRENT_TIMESTAMP,
+  `author`        varchar(400) NOT NULL,
+  `adminPassword` varchar(400) NOT NULL,
+  `token`         varchar(400) NOT NULL
+)
+  ENGINE = InnoDB
+  DEFAULT CHARSET = utf8;
 
-CREATE DATABASE IF NOT EXISTS `fltrail` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-USE `fltrail`;
 
-CREATE TABLE `projects` (
-  `id` varchar(400) NOT NULL,
-  `password` varchar(400) NOT NULL,
-  `activ` tinyint(1) NOT NULL,
-  `timecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  `author` varchar(400) NOT NULL,
-  `adminpassword` varchar(400) NOT NULL,
-  `token` varchar(400) NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
-CREATE TABLE `tags` (
+CREATE TABLE if not exists `groups` (
+  `id`         int          NOT NULL AUTO_INCREMENT,
+  `projectId`  varchar(400) NOT NULL,
+  `chatRoomId` varchar(400) NOT NULL,
+  PRIMARY KEY (id)
+)
+  ENGINE = InnoDB
+  DEFAULT CHARSET = utf8;
+
+CREATE TABLE if not exists groupuser
+(
+  userEmail varchar(400) NOT NULL,
+  groupId   int          NOT NULL
+)
+  ENGINE = InnoDB
+  DEFAULT CHARSET = utf8;
+
+CREATE TABLE if not exists `tags` (
   `projectId` varchar(400) NOT NULL,
-  `tag` varchar(400) NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
-CREATE TABLE `users` (
-  `name` varchar(400) NOT NULL,
-  `password` varchar(200) NOT NULL,
-  `email` varchar(400) NOT NULL,
-  `token` varchar(800) NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
-CREATE TABLE projectuser
-        (
-          projectId varchar(400) NOT NULL,
-          userId varchar(400) NOT NULL
-)  ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
-CREATE TABLE `annotations` (
- `id` varchar(120) NOT NULL,
- `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- `userId` int(11) DEFAULT NULL,
- `targetId` int(11) DEFAULT NULL,
- `body` varchar(280) DEFAULT NULL,
- `startCharacter` int(11) DEFAULT NULL,
- `endCharacter` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+  `tag`       varchar(400) NOT NULL
+)
+  ENGINE = InnoDB
+  DEFAULT CHARSET = utf8;
 
-alter table users
-  add isStudent tinyint(1) default '1' null;
+CREATE TABLE if not exists `users` (
+  `name`                varchar(400) NOT NULL,
+  `password`            varchar(200) NOT NULL,
+  `email`               varchar(255) NOT NULL,
+  `token`               varchar(800) NOT NULL,
+  `rocketChatId`        varchar(400) NOT NULL,
+  `rocketChatAuthToken` varchar(800) NOT NULL,
+  UNIQUE (email)
+)
+  ENGINE = InnoDB
+  DEFAULT CHARSET = utf8;
 
+CREATE TABLE if not exists projectuser
+(
+  projectId varchar(400) NOT NULL,
+  userId    varchar(400) NOT NULL
+)
+  ENGINE = InnoDB
+  DEFAULT CHARSET = utf8;
 
+alter table users
+  add isStudent tinyint(1) default '1' null;
 
 
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java
index 9463acbdaa8eb72ef80b9bd13b4fe856c033eed8..8e71c0dcba017d321a6af5540fb843ea8ff7352c 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java
@@ -6,12 +6,10 @@ import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.core.management.user.UserProfile;
 
-import java.sql.Timestamp;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
 import java.util.List;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Created by dehne on 01.06.2018.
@@ -19,16 +17,15 @@ import static org.junit.Assert.*;
 public class ManagementTest {
 
     @Test
-    public void testDelete() throws Exception {
+    public void testDelete() {
 
     }
 
     /**
      *  CREATE a user in the DB using the
-     * @throws Exception
      */
     @Test
-    public void testExists() throws Exception {
+    public void testExists() {
         ManagementImpl management = new ManagementImpl();
         User user = new User("julian", "1234", "from1123123123@stuff.com", true);
         assert !management.exists(user);
@@ -36,10 +33,9 @@ public class ManagementTest {
 
     /**
      *  CREATE a user in the DB using the
-     * @throws Exception
      */
     @Test
-    public void testCreate() throws Exception {
+    public void testCreate() {
         ManagementImpl management = new ManagementImpl();
         User user = new User("julian", "1234", "from@stuff.com", false);
         management.create(user, new UserProfile());
@@ -48,35 +44,49 @@ public class ManagementTest {
 
     /**
      * Test creating a user in the DB
-     * @throws Exception
      */
     @Test
-    public void testCreate1() throws Exception {
+    public void testCreate1() {
         ManagementImpl management = new ManagementImpl();
-        management.create(new Project("Gemainsam Forschen", "1235", "1", "me", "keins"));
+        management.create(new Project("Gemainsam Forschen", "1235", true, "me", "keins"));
 
     }
 
     @Test
-    public void testRegister() throws Exception {
+    public void testRegister() {
         ManagementImpl management = new ManagementImpl();
         User user = new User("julian", "1234", "from@stuff.com", true);
         management.create(user, new UserProfile());
         assert management.exists(user);
 
-        Project project = new Project("Gemainsam Forschen", "1235", "1", "me", "keins");
+        Project project = new Project("Gemainsam Forschen", "1235", true, "me", "keins");
         management.create(project);
         management.register(user, project, null);
     }
 
     @Test
-    public void testGetUsers() throws Exception {
+    public void testUpdateUser() {
+        ManagementImpl management = new ManagementImpl();
+        User user = new User("julian", "1234", "testUpdateUser@stuff.com", true);
+        user.setToken("abc");
+        management.create(user, new UserProfile());
+        assertTrue(management.exists(user));
+
+        user.setStudent(false);
+        management.update(user);
+        assertTrue(management.exists(user));
+        User managementUser = management.getUserByToken(user.getToken());
+        assertEquals(user.getStudent(), managementUser.getStudent());
+    }
+
+    @Test
+    public void testGetUsers() {
         ManagementImpl management = new ManagementImpl();
         User user = new User("julian", "1234", "from@stuff.com", false);
         management.create(user, new UserProfile());
         assert management.exists(user);
 
-        Project project = new Project("Gemainsam Forschen", "1235", "1", "me", "keins");
+        Project project = new Project("Gemainsam Forschen", "1235", true, "me", "keins");
         management.create(project);
         management.register(user, project, null);
 
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/view/CommunicationViewTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/view/CommunicationViewTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9bbfc17d3e19b4b5d5a737134c5b90c445a13a8
--- /dev/null
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/view/CommunicationViewTest.java
@@ -0,0 +1,128 @@
+package unipotsdam.gf.modules.communication.view;
+
+import org.glassfish.jersey.test.JerseyTest;
+import org.glassfish.jersey.test.util.runner.ConcurrentRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import unipotsdam.gf.config.GFResourceConfig;
+import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.modules.communication.model.Message;
+import unipotsdam.gf.modules.communication.model.chat.ChatRoom;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.Response;
+import java.util.ArrayList;
+import java.util.List;
+
+import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
+import static javax.ws.rs.core.Response.Status.CREATED;
+import static javax.ws.rs.core.Response.Status.NOT_FOUND;
+import static javax.ws.rs.core.Response.Status.OK;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+@RunWith(ConcurrentRunner.class)
+public class CommunicationViewTest extends JerseyTest {
+
+    private final static String ENDPOINT = "chat/";
+
+    @Override
+    protected Application configure() {
+        CommunicationView communicationView = new CommunicationView();
+        GFResourceConfig gfResourceConfig = new GFResourceConfig();
+        gfResourceConfig.register(communicationView);
+        return gfResourceConfig;
+    }
+
+    @Test
+    public void getChatRoomInformation() {
+        String path = ENDPOINT + "info/";
+        Response responseOk = target().path(path + "1").request().get();
+        assertThat(responseOk.getStatus(), is(OK.getStatusCode()));
+        assertNotNull(responseOk.readEntity(ChatRoom.class));
+
+        Response responseNotFound = target().path(path).request().get();
+        assertThat(responseNotFound.getStatus(), is(NOT_FOUND.getStatusCode()));
+    }
+
+    @Test
+    public void getChatHistory() {
+        String path = ENDPOINT + "history/";
+        Response responseOk = target().path(path + "1").request().get();
+        assertThat(responseOk.getStatus(), is(OK.getStatusCode()));
+        assertNotNull(responseOk.readEntity(List.class));
+
+        Response responseNotFound = target().path(path).request().get();
+        assertThat(responseNotFound.getStatus(), is(NOT_FOUND.getStatusCode()));
+    }
+
+    @Test
+    public void createChatRoom() {
+        String path = ENDPOINT + "create";
+        Response responseOk = target().path(path).queryParam("name", "test").request().post(null);
+        assertThat(responseOk.getStatus(), is(CREATED.getStatusCode()));
+        assertNotNull(responseOk.readEntity(String.class));
+
+        ArrayList<User> users = new ArrayList<>();
+        users.add(new User("test", "test", "test", true));
+        Response responseOk2 = target().path(path).queryParam("name", "test").request().post(Entity.json(users));
+        assertThat(responseOk2.getStatus(), is(CREATED.getStatusCode()));
+        assertNotNull(responseOk2.readEntity(String.class));
+
+        Response responseBadRequest = target().path(path).request().post(Entity.json(users));
+        assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode()));
+    }
+
+    @Test
+    public void sendMessage() {
+        String path = ENDPOINT + "send";
+        Message message = new Message();
+        message.setMessage("test");
+        message.setRoomIdOrChannel("1");
+        Response responseOk = target().path(path + "/1").request().post(Entity.json(message));
+        assertThat(responseOk.getStatus(), is(OK.getStatusCode()));
+        assertNotNull(responseOk.readEntity(String.class));
+
+        Response responseBadRequest = target().path(path + "/1").request().post(Entity.json(null));
+        assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode()));
+    }
+
+    @Test
+    public void addUserToChatRoom() {
+        String fullPath = ENDPOINT + "addUser" + "/1";
+
+        User user = new User("test", "test", "test", true);
+        Response responseOk = target().path(fullPath).request().post(Entity.json(user));
+        assertThat(responseOk.getStatus(), is(OK.getStatusCode()));
+        assertNotNull(responseOk.readEntity(String.class));
+
+        Response responseBadRequest = target().path(fullPath).request().post(Entity.json(null));
+        assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode()));
+    }
+
+    @Test
+    public void removeUserFromChatRoom() {
+        String fullPath = ENDPOINT + "removeUser" + "/1";
+
+        User user = new User("test2", "test2", "test", true);
+        Response responseOk = target().path(fullPath).request().post(Entity.json(user));
+        assertThat(responseOk.getStatus(), is(OK.getStatusCode()));
+        assertNotNull(responseOk.readEntity(String.class));
+
+        Response responseBadRequest = target().path(fullPath).request().post(Entity.json(null));
+        assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode()));
+    }
+
+    @Test
+    public void setChatRoomTopic() {
+        String fullPath = ENDPOINT + "setTopic" + "/1";
+        Response responseOk = target().path(fullPath).queryParam("topic", "test").request().post(null);
+        assertThat(responseOk.getStatus(), is(OK.getStatusCode()));
+        assertNotNull(responseOk.readEntity(String.class));
+
+        Response responseBadRequest = target().path(fullPath).request().post(Entity.json(null));
+        assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode()));
+    }
+}