diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
index 39435210174dcaa76363ad6c2183c443685b2c19..7fe5fb3333327114603e36d6e3da2611bb723101 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
@@ -11,6 +11,7 @@ import unipotsdam.gf.interfaces.IGroupFinding;
 import unipotsdam.gf.interfaces.IJournal;
 import unipotsdam.gf.interfaces.IPeerAssessment;
 import unipotsdam.gf.interfaces.IPhases;
+import unipotsdam.gf.interfaces.IReflectionService;
 import unipotsdam.gf.modules.annotation.controller.AnnotationController;
 import unipotsdam.gf.modules.annotation.controller.FeedbackImpl;
 import unipotsdam.gf.modules.assessment.controller.service.AssessmentDBCommunication;
@@ -38,6 +39,7 @@ import unipotsdam.gf.modules.project.Management;
 import unipotsdam.gf.modules.project.ManagementImpl;
 import unipotsdam.gf.modules.project.ProjectConfigurationDAO;
 import unipotsdam.gf.modules.project.ProjectDAO;
+import unipotsdam.gf.modules.reflection.service.ReflectionService;
 import unipotsdam.gf.modules.researchreport.DummyResearchReportManagement;
 import unipotsdam.gf.modules.researchreport.ResearchReportManagement;
 import unipotsdam.gf.modules.submission.controller.SubmissionController;
@@ -117,5 +119,6 @@ public class GFApplicationBinder extends AbstractBinder {
         bind(UnirestService.class).to(UnirestService.class);
         bind(ContributionFeedbackService.class).to(IContributionFeedback.class);
         bind(ContributionFeedbackDAO.class).to(ContributionFeedbackDAO.class);
+        bind(ReflectionService.class).to(IReflectionService.class);
     }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IReflectionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IReflectionService.java
new file mode 100644
index 0000000000000000000000000000000000000000..26918a20310908abacd7c08128ed94a3ae4b798c
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IReflectionService.java
@@ -0,0 +1,12 @@
+package unipotsdam.gf.interfaces;
+
+import unipotsdam.gf.modules.group.Group;
+import unipotsdam.gf.modules.project.Project;
+import unipotsdam.gf.process.phases.Phase;
+
+public interface IReflectionService {
+
+    void startOptionalPortfolioTask(Project project, Group group, Phase phase);
+
+    void finishOptionalPortfolioTask(Project project, Group group, Phase phase);
+}
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 f2d568593286eb5c8392ba9f2f7c6a63937e8203..622b4bb7a4fdc12c27f9f4ed8e8d590a3773a707 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
@@ -11,7 +11,6 @@ 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;
@@ -24,35 +23,15 @@ import unipotsdam.gf.modules.group.GroupDAO;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.modules.user.UserDAO;
-import unipotsdam.gf.process.constraints.ConstraintsMessages;
 
 import javax.annotation.ManagedBean;
 import javax.annotation.Resource;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import javax.mail.Authenticator;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.PasswordAuthentication;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
 import javax.ws.rs.core.Response;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
+import java.util.*;
 import java.util.stream.Collectors;
 
-import static unipotsdam.gf.config.GFMailConfig.SMTP_HOST;
-import static unipotsdam.gf.config.GFMailConfig.SMTP_PASSWORD;
-import static unipotsdam.gf.config.GFMailConfig.SMTP_PORT;
-import static unipotsdam.gf.config.GFMailConfig.SMTP_USERNAME;
-import static unipotsdam.gf.config.GFRocketChatConfig.ADMIN_USER;
 import static unipotsdam.gf.config.GFRocketChatConfig.ROCKET_CHAT_API_LINK;
 import static unipotsdam.gf.config.GFRocketChatConfig.ROCKET_CHAT_ROOM_LINK;
 
@@ -118,10 +97,9 @@ public class CommunicationService implements ICommunication {
         //loginUser(ADMIN_USER);
 
         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<>();
-        bodyMap.put("name", name);
+        bodyMap.put("name", specialFreeName(name));
         bodyMap.put("readOnly", readOnly);
         bodyMap.put("members", usernameList);
 
@@ -362,8 +340,7 @@ public class CommunicationService implements ICommunication {
             throws RocketChatDownException, UserDoesNotExistInRocketChatException {
 
         //loginUser(ADMIN_USER);
-
-        String chatRoomId = groupDAO.getGroupChatRoomId(new User(userEmail), new Project(projectName));
+        String chatRoomId = groupDAO.getGroupChatRoomId(new User(userEmail), specialFreeName(projectName));
         if (chatRoomId.isEmpty()) {
             return Strings.EMPTY;
         }
@@ -378,7 +355,7 @@ public class CommunicationService implements ICommunication {
 
     @Override
     public String getProjectChatRoomLink(String projectName) {
-        return ROCKET_CHAT_ROOM_LINK + projectName + "?layout=embedded";
+        return ROCKET_CHAT_ROOM_LINK + specialFreeName(projectName) + "?layout=embedded";
     }
 
 
@@ -485,7 +462,9 @@ public class CommunicationService implements ICommunication {
                 // wenn der Nutzer nicht existiert, brauchen wir ihn auch nicht löschen
             }
         }
+    }
 
-
+    private String specialFreeName(String name) {
+        return String.valueOf(name.hashCode());
     }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java
index 7d26a9a38a1b8052d808a46cab45f72a08994286..689c5241375e3845b3e314939647e86de8adda70 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java
@@ -20,6 +20,7 @@ import org.htmlcleaner.TagNode;
 import org.jsoup.Jsoup;
 import org.jsoup.select.Elements;
 import unipotsdam.gf.modules.project.Project;
+import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
 import unipotsdam.gf.modules.user.User;
 
 import javax.imageio.ImageIO;
@@ -78,15 +79,25 @@ public class FileManagementService {
         fileManagementDAO.writeFileMetaToDB(user, project, fileName, fileRole, fileDetail.getFileName());
     }
 
-    public void saveStringAsPDF(User user, Project project, String fileContent, FormDataContentDisposition fileDetail,
-                                FileRole fileRole, FileType fileType) throws IOException, DocumentException {
-        fileContent = cleanHTML(fileContent);
-        //fileContent = manipulateIndentation(fileContent);
+    private void saveStringAsPDF(User user, Project project, String fileContent, FormDataContentDisposition fileDetail,
+                                 FileRole fileRole, FileType fileType) throws IOException, DocumentException {
+        if (fileType.equals(FileType.HTML)) {
+            fileContent = cleanHTML(fileContent);
+            //fileContent = manipulateIndentation(fileContent);
+        }
         InputStream inputStream = IOUtils.toInputStream(fileContent);
         saveFileAsPDF(user, project, inputStream, fileDetail, fileRole, fileType);
 
     }
 
+    public void saveStringAsPDF(User user, Project project, FullSubmissionPostRequest fullSubmissionPostRequest) throws IOException, DocumentException {
+        String fileName = fullSubmissionPostRequest.getContributionCategory() + "_" + user.getEmail() + ".pdf";
+        String categoryString = fullSubmissionPostRequest.getContributionCategory().toString();
+        FormDataContentDisposition.FormDataContentDispositionBuilder builder = FormDataContentDisposition.name(categoryString).fileName(fileName);
+        // TODO: merge FileRole with ContributionCategory?
+        saveStringAsPDF(user, project, fullSubmissionPostRequest.getHtml(), builder.build(), FileRole.DOSSIER, FileType.HTML);
+    }
+
     private String saveHTMLAsPDF(InputStream inputStream, String filenameWithoutExtension) throws IOException, DocumentException {
         String fileName = filenameWithoutExtension + ".pdf";
         String path = getFullPath(fileName);
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java
index 247a339993e9a27251d9213955c788b577e4eee4..1969b189f75e66bb38cc1d6fd34f0321644c2b32 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java
@@ -1,5 +1,5 @@
 package unipotsdam.gf.modules.fileManagement;
 
 public enum FileRole {
-    DOSSIER, LEARNINGGOALS, EXTRA, PRESENTATION
+    DOSSIER, LEARNINGGOALS, EXTRA, PRESENTATION, PORTFOLIO
 }
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 2519b55139432cdfe772dd983fefb58ed1bc6859..b217d775ef68c2301da5265e655445e2a1bf8342 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java
@@ -80,7 +80,7 @@ public class Group {
 
     @Override
     public boolean equals(Object o) {
-        if (Object.class.equals(Group.class)){
+        if (o instanceof Group) {
             Group group = (Group) o;
             return this.getId() == group.getId();
         }else{
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 b0622aafae480b095e1cdaa5687db17149908c62..71e0913fdf74dcdb2754438c4dc4c459b158a11b 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java
@@ -125,6 +125,30 @@ public class GroupDAO {
         return uniqueGroups;
     }
 
+    public Group getGroupByGroupId(Integer groupId) {
+        connect.connect();
+        String mysqlRequest = "SELECT * FROM groups g " +
+                "JOIN groupuser gu ON g.id=gu.groupId " +
+                "JOIN users u ON " +
+                "gu.userEmail=u.email " +
+                "where g.id= ?";
+        VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(mysqlRequest, groupId);
+        List<User> members = new ArrayList<>();
+        String projectName = "";
+        String rocketChatId = "";
+        String groupName = "";
+        while (vereinfachtesResultSet.next()) {
+            members.add(userDAO.getUserByEmail(vereinfachtesResultSet.getString("userEmail")));
+            projectName = vereinfachtesResultSet.getString("projectName");
+            rocketChatId = vereinfachtesResultSet.getString("chatRoomId");
+            groupName = vereinfachtesResultSet.getString("name");
+        }
+        Group group = new Group(groupId, members, projectName, rocketChatId);
+        group.setName(groupName);
+        connect.close();
+        return group;
+    }
+
     public List<Group> getOriginalGroupsByProjectName(String projectName) {
         connect.connect();
         String mysqlRequest = "SELECT * FROM originalgroups where projectName = ?";
@@ -161,6 +185,10 @@ public class GroupDAO {
         return groupId;
     }
 
+    public Group getMyGroup(User user, Project project) {
+        int groupId = getMyGroupId(user, project);
+        return getGroupByGroupId(groupId);
+    }
 
     private void fillGroupFromResultSet(ArrayList<Group> groups, VereinfachtesResultSet vereinfachtesResultSet,
                                         Boolean withRocketChatId) {
@@ -190,14 +218,14 @@ public class GroupDAO {
         return groupFormationMechanism;
     }
 
-    public String getGroupChatRoomId(User user, Project project) {
+    public String getGroupChatRoomId(User user, String projectName) {
         connect.connect();
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("SELECT g.chatRoomId FROM groups g ");
         stringBuilder.append("join groupuser gu on g.id=gu.groupId ");
         stringBuilder.append("where g.projectName=? and gu.userEmail=?");
 
-        VereinfachtesResultSet resultSet = connect.issueSelectStatement(stringBuilder.toString(), project.getName(),
+        VereinfachtesResultSet resultSet = connect.issueSelectStatement(stringBuilder.toString(), projectName,
                 user.getEmail());
         if (Objects.isNull(resultSet)) {
             connect.close();
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/reflection/service/ReflectionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/reflection/service/ReflectionService.java
new file mode 100644
index 0000000000000000000000000000000000000000..8329a231ca6a121db9b9937aaa01a5cd1b256419
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/reflection/service/ReflectionService.java
@@ -0,0 +1,42 @@
+package unipotsdam.gf.modules.reflection.service;
+
+import unipotsdam.gf.interfaces.IReflectionService;
+import unipotsdam.gf.modules.group.Group;
+import unipotsdam.gf.modules.project.Project;
+import unipotsdam.gf.modules.user.User;
+import unipotsdam.gf.process.phases.Phase;
+import unipotsdam.gf.process.tasks.Importance;
+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 javax.annotation.ManagedBean;
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+@ManagedBean
+@Resource
+public class ReflectionService implements IReflectionService {
+
+    @Inject
+    private TaskDAO taskDAO;
+
+    public void startOptionalPortfolioTask(Project project, Group group, Phase phase) {
+        group.getMembers().forEach(target -> {
+            persistOptionalEntryTask(project, target, Progress.JUSTSTARTED, phase);
+        });
+
+    }
+
+    public void finishOptionalPortfolioTask(Project project, Group group, Phase phase) {
+        group.getMembers().forEach(target -> {
+            persistOptionalEntryTask(project, target, Progress.FINISHED, phase);
+        });
+    }
+
+    private void persistOptionalEntryTask(Project project, User target, Progress progress, Phase phase) {
+        Task task = taskDAO.createUserDefaultWithoutDeadline(project, target, TaskName.OPTIONAL_PORTFOLIO_ENTRY, phase, Importance.LOW, progress);
+        taskDAO.persist(task);
+    }
+}
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 c51c49286901ac4d47fb49b580aa6d32f73af972..3e202baddc1ced7a4d586e7b4b1a0d60ab410861 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
@@ -5,14 +5,20 @@ import org.slf4j.LoggerFactory;
 import unipotsdam.gf.interfaces.ISubmission;
 import unipotsdam.gf.modules.annotation.model.Category;
 import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory;
+import unipotsdam.gf.modules.group.Group;
 import unipotsdam.gf.modules.group.GroupDAO;
 import unipotsdam.gf.modules.group.GroupFormationMechanism;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.modules.project.ProjectDAO;
-import unipotsdam.gf.modules.submission.model.*;
+import unipotsdam.gf.modules.submission.model.FullSubmission;
+import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
+import unipotsdam.gf.modules.submission.model.SubmissionPart;
+import unipotsdam.gf.modules.submission.model.SubmissionPartBodyElement;
+import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest;
+import unipotsdam.gf.modules.submission.model.SubmissionProjectRepresentation;
+import unipotsdam.gf.modules.submission.model.Visibility;
 import unipotsdam.gf.modules.submission.view.SubmissionRenderData;
 import unipotsdam.gf.modules.user.User;
-import unipotsdam.gf.modules.user.UserDAO;
 import unipotsdam.gf.mysql.MysqlConnect;
 import unipotsdam.gf.mysql.VereinfachtesResultSet;
 import unipotsdam.gf.process.progress.HasProgress;
@@ -25,6 +31,7 @@ import unipotsdam.gf.process.tasks.TaskName;
 import javax.inject.Inject;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 /**
@@ -34,12 +41,13 @@ import java.util.UUID;
 public class SubmissionController implements ISubmission, HasProgress {
 
     private static final org.slf4j.Logger log = LoggerFactory.getLogger(SubmissionController.class);
+
     @Inject
     private MysqlConnect connection;
-    @Inject
-    private UserDAO userDAO;
+
     @Inject
     private GroupDAO groupDAO;
+
     @Inject
     private ProjectDAO projectDAO;
 
@@ -52,19 +60,30 @@ public class SubmissionController implements ISubmission, HasProgress {
         while (existsFullSubmissionId(uuid)) {
             uuid = UUID.randomUUID().toString();
         }
+        String requestCommand = "INSERT INTO";
+        if (!(fullSubmissionPostRequest.getContributionCategory() == ContributionCategory.PORTFOLIO)) {
+            Project project = new Project(fullSubmissionPostRequest.getProjectName());
+            FullSubmission fullSubmission = getFullSubmissionBy(fullSubmissionPostRequest.getGroupId(), project,
+                    fullSubmissionPostRequest.getContributionCategory());
+            if (fullSubmission != null) {
+                uuid = fullSubmission.getId();
+            }
+            requestCommand = "REPLACE INTO";
+        }
+
+        String request = String.join(" ", requestCommand.trim(),
+                "fullsubmissions (`id`, `groupId`, `text`, `projectName`, `contributionCategory`, `userEmail`, `visibility`) VALUES (?,?,?,?,?,?,?);");
 
         // build and execute request
-        String request = "REPLACE INTO fullsubmissions (`id`, `groupId`, `text`, `projectName`, `contributionCategory`) VALUES (?,?,?,?,?);";
         connection.issueInsertOrDeleteStatement(request, uuid, fullSubmissionPostRequest.getGroupId(),
-                fullSubmissionPostRequest.getText(), fullSubmissionPostRequest.getProjectName(), fullSubmissionPostRequest.getContributionCategory());
+                fullSubmissionPostRequest.getText(), fullSubmissionPostRequest.getProjectName(),
+                fullSubmissionPostRequest.getContributionCategory(), fullSubmissionPostRequest.getUserEMail(), fullSubmissionPostRequest.getVisibility());
 
         // close connection
         connection.close();
 
         // get the new submission from database
-        FullSubmission fullSubmission = getFullSubmission(uuid);
-
-        return fullSubmission;
+        return getFullSubmission(uuid);
 
     }
 
@@ -91,20 +110,27 @@ public class SubmissionController implements ISubmission, HasProgress {
         return fullSubmission;
     }
 
-    public String getFullSubmissionId(Integer groupId, Project project) {
-        // establish connection
-        String fullSubmissionId = null;
+    public FullSubmission getFullSubmissionBy(int groupId, Project project, ContributionCategory contributionCategory) {
+
+        FullSubmission fullSubmission = null;
         connection.connect();
 
-        // build and execute request
-        String request = "SELECT * FROM fullsubmissions WHERE groupId = ? AND projectName= ?;";
-        VereinfachtesResultSet rs = connection.issueSelectStatement(request, groupId, project.getName());
+        String request = "SELECT * FROM fullsubmissions WHERE groupId = ? AND projectName= ? AND contributionCategory = ?;";
+        VereinfachtesResultSet rs = connection.issueSelectStatement(request, groupId, project.getName(), contributionCategory);
 
         if (rs.next()) {
-            // save submission
-            fullSubmissionId = rs.getString("id");
+            fullSubmission = getFullSubmissionFromResultSet(rs);
         }
         connection.close();
+        return fullSubmission;
+    }
+
+    public String getFullSubmissionId(Integer groupId, Project project, ContributionCategory contributionCategory) {
+        FullSubmission fullSubmission = getFullSubmissionBy(groupId, project, contributionCategory);
+        String fullSubmissionId = null;
+        if (!Objects.isNull(fullSubmission)) {
+            fullSubmissionId = fullSubmission.getId();
+        }
         return fullSubmissionId;
     }
 
@@ -217,10 +243,9 @@ public class SubmissionController implements ISubmission, HasProgress {
         connection.close();
 
         // get the new submission from database
-        SubmissionPart submissionPart = getSubmissionPart(submissionPartPostRequest.getFullSubmissionId(),
-                submissionPartPostRequest.getCategory());
 
-        return submissionPart;
+        return getSubmissionPart(submissionPartPostRequest.getFullSubmissionId(),
+                submissionPartPostRequest.getCategory());
 
     }
 
@@ -345,13 +370,9 @@ public class SubmissionController implements ISubmission, HasProgress {
             int count = rs.getInt("exists");
 
             // return true if we found the id
-            if (count < 1) {
-                return false;
-            } else {
-                return true;
-            }
+            return count >= 1;
         }
-        return null;
+        return false;
     }
 
     /**
@@ -365,11 +386,13 @@ public class SubmissionController implements ISubmission, HasProgress {
         String id = rs.getString("id");
         long timestamp = rs.getTimestamp("timestamp").getTime();
         Integer groupId = rs.getInt("groupId");
+        String userEmail = rs.getString("userEmail");
         String text = rs.getString("text");
         String projectName = rs.getString("projectName");
         ContributionCategory contributionCategory = ContributionCategory.valueOf(rs.getString("contributionCategory"));
+        Visibility visibility = Visibility.valueOf(rs.getString("visibility"));
 
-        return new FullSubmission(id, timestamp, groupId, text, contributionCategory, projectName);
+        return new FullSubmission(id, timestamp, groupId, userEmail, text, contributionCategory, projectName, visibility);
 
     }
 
@@ -674,8 +697,8 @@ public class SubmissionController implements ISubmission, HasProgress {
 
         // the number of dossiers needed relative to the group or user count
         progressData.setNumberNeeded(dossiersNeeded(project));
-        List<User> strugglersWithSubmission = getStrugglersWithSubmission(project);
-        progressData.setUsersMissing(strugglersWithSubmission);
+        List<Group> strugglersWithSubmission = getStrugglersWithSubmission(project);
+        progressData.setGroupsMissing(strugglersWithSubmission);
         progressData
                 .setAlmostComplete((progressData.getNumberOfCompletion() / progressData.getNumberNeeded()) <= (1 / 10));
         return progressData;
@@ -706,55 +729,48 @@ public class SubmissionController implements ISubmission, HasProgress {
     }
 
 
-    public List<User> getStrugglersWithSubmission(Project project) {
-        ArrayList<User> struggles = new ArrayList<>();
-        GroupFormationMechanism groupFormationMechanism = groupDAO.getGroupFormationMechanism(project);
-        switch (groupFormationMechanism) {
-            case SingleUser:
-                List<User> usersInProject = userDAO.getUsersByProjectName(project.getName());
-                List<User> usersHaveGivenFeedback = getAllUsersWithDossierUploaded(project);
-                for (User user : usersInProject) {
-                    if (!usersHaveGivenFeedback.contains(user)) {
-                        struggles.add(user);
-                    }
-                }
-                break;
-            case LearningGoalStrategy:
-            case Manual:
-            case UserProfilStrategy:
+    public List<Group> getStrugglersWithSubmission(Project project) {
+        ArrayList<Group> struggles = new ArrayList<>();
+        List<Group> groupsInProject = groupDAO.getGroupsByProjectName(project.getName());
+        List<Group> groupsHaveGivenFeedback = getAllGroupsWithDossierUploaded(project);
+        for (Group group : groupsInProject) {
+            if (!groupsHaveGivenFeedback.contains(group)) {
+                struggles.add(group);
+            }
         }
         return struggles;
     }
 
-    public List<User> getAllUsersWithDossierUploaded(Project project) {
-        List<User> result = new ArrayList<>();
+    public List<Group> getAllGroupsWithDossierUploaded(Project project) {
+        List<Group> result = new ArrayList<>();
         connection.connect();
         String query = "select * from fullsubmissions where projectName = ?";
         VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query, project.getName());
 
         while (vereinfachtesResultSet.next()) {
-            result.add(userDAO.getUserByEmail(vereinfachtesResultSet.getString("feedbackUser")));
+            result.add(groupDAO.getGroupByGroupId(vereinfachtesResultSet.getInt("feedbackGroup")));
         }
         connection.close();
         return result;
     }
 
-    public List<User> getAllUsersWithFinalizedFeedback(Project project) {
-        List<User> result = new ArrayList<>();
+    public List<Group> getAllGroupsWithFinalizedFeedback(Project project) {
+        List<Group> result = new ArrayList<>();
         connection.connect();
         String query = "select * from tasks where projectName = ? and taskName = ? and progress=?";
         VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query,
                 project.getName(), TaskName.GIVE_FEEDBACK, Progress.FINISHED);
 
         while (vereinfachtesResultSet.next()) {
-            result.add(userDAO.getUserByEmail(vereinfachtesResultSet.getString("userEmail")));
+            Integer groupId = vereinfachtesResultSet.getInt("groupTask");
+            result.add(groupDAO.getGroupByGroupId(groupId));
         }
         connection.close();
         return result;
     }
 
     public int getFeedbackedgroup(Project project, Integer groupId) {
-        int feedbackedGroup =0;
+        int feedbackedGroup = 0;
         connection.connect();
         String query = "select groupId from fullsubmissions where projectName = ? AND feedbackGroup=?";
         VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query,
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
index 6ebfb2f225cb5289aa3c87c8f0ed43ff3ea6ed2d..033416f65819abdd07d75693161813dabc483017 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
@@ -12,17 +12,25 @@ public class FullSubmission {
     private String id;
     private long timestamp;
     private Integer groupId;
+    private String userEmail;
     private String text;
     private ContributionCategory contributionCategory;
     private String projectName;
+    private Visibility visibility;
 
-    public FullSubmission(String id, long timestamp, Integer groupId, String text, ContributionCategory contributionCategory, String projectName) {
+    public FullSubmission(String id, long timestamp, Integer groupId, String text, ContributionCategory contributionCategory, String projectName, Visibility visibility) {
+        this(id, timestamp, groupId, null, text, contributionCategory, projectName, visibility);
+    }
+
+    public FullSubmission(String id, long timestamp, Integer groupId, String userEmail, String text, ContributionCategory contributionCategory, String projectName, Visibility visibility) {
         this.id = id;
         this.timestamp = timestamp;
         this.groupId = groupId;
+        this.userEmail = userEmail;
         this.text = text;
         this.contributionCategory = contributionCategory;
         this.projectName = projectName;
+        this.visibility = visibility;
     }
 
     public FullSubmission(String submissionId) {
@@ -78,6 +86,21 @@ public class FullSubmission {
         this.projectName = projectName;
     }
 
+    public String getUserEmail() {
+        return userEmail;
+    }
+
+    public void setUserEmail(String userEmail) {
+        this.userEmail = userEmail;
+    }
+
+    public Visibility getVisibility() {
+        return visibility;
+    }
+
+    public void setVisibility(Visibility visibility) {
+        this.visibility = visibility;
+    }
 
     @Override
     public String toString() {
@@ -85,9 +108,11 @@ public class FullSubmission {
                 "id='" + id + '\'' +
                 ", timestamp=" + timestamp +
                 ", groupId=" + groupId +
+                ", userEmail='" + userEmail + '\'' +
                 ", text='" + text + '\'' +
                 ", contributionCategory=" + contributionCategory +
                 ", projectName='" + projectName + '\'' +
+                ", visibility=" + visibility +
                 '}';
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
index d3a6d3cd1e9b59a81581bda8579b4f421dd4097e..ee7df00c6f95ee2871004f4659ae729b5a8618c5 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
@@ -1,20 +1,27 @@
 package unipotsdam.gf.modules.submission.model;
 
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
 import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory;
 
 /**
  * @author Sven Kästle
  * skaestle@uni-potsdam.de
  */
+@JsonIgnoreProperties(ignoreUnknown = true)
 public class FullSubmissionPostRequest {
 
     // variables
     private Integer groupId;
+    private boolean personal;
     private String text;
     private String html;
     private String projectName;
     private ContributionCategory contributionCategory;
 
+    // have to be set in backend
+    private String userEMail;
+    private Visibility visibility;
+
     public FullSubmissionPostRequest() {
     }
 
@@ -23,7 +30,7 @@ public class FullSubmissionPostRequest {
         return groupId;
     }
 
-    public void setUser(Integer groupId) {
+    public void setGroupId(Integer groupId) {
         this.groupId = groupId;
     }
 
@@ -59,15 +66,39 @@ public class FullSubmissionPostRequest {
         this.contributionCategory = contributionCategory;
     }
 
+    public boolean isPersonal() {
+        return personal;
+    }
+
+    public void setPersonal(boolean personal) {
+        this.personal = personal;
+    }
+
+    public String getUserEMail() {
+        return userEMail;
+    }
+
+    public void setUserEMail(String userEMail) {
+        this.userEMail = userEMail;
+    }
+
+    public Visibility getVisibility() {
+        return visibility;
+    }
+
+    public void setVisibility(Visibility visibility) {
+        this.visibility = visibility;
+    }
+
     @Override
     public String toString() {
         return "FullSubmissionPostRequest{" +
                 "groupId=" + groupId +
+                ", personal=" + personal +
                 ", text='" + text + '\'' +
                 ", html='" + html + '\'' +
                 ", projectName='" + projectName + '\'' +
-                ", contributionCategory='" + contributionCategory + '\'' +
+                ", contributionCategory=" + contributionCategory +
                 '}';
     }
-
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java
new file mode 100644
index 0000000000000000000000000000000000000000..56a9e9554528bffbe6ab4841d929da8a45b089f9
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java
@@ -0,0 +1,9 @@
+package unipotsdam.gf.modules.submission.model;
+
+public enum Visibility {
+
+    PUBLIC,
+    DOCENT,
+    GROUP,
+    PERSONAL
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
index e7e7996a746934989427667cdf2796643e6ba7c0..620453335c37d16530bf0b33321c9914b4bb2a29 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
@@ -3,9 +3,17 @@ package unipotsdam.gf.modules.submission.view;
 import com.itextpdf.text.DocumentException;
 import unipotsdam.gf.modules.annotation.model.Category;
 import unipotsdam.gf.modules.assessment.controller.model.Categories;
+import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory;
+import unipotsdam.gf.modules.fileManagement.FileManagementService;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.modules.submission.controller.SubmissionController;
-import unipotsdam.gf.modules.submission.model.*;
+import unipotsdam.gf.modules.submission.model.FullSubmission;
+import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
+import unipotsdam.gf.modules.submission.model.SubmissionPart;
+import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest;
+import unipotsdam.gf.modules.submission.model.SubmissionProjectRepresentation;
+import unipotsdam.gf.modules.submission.model.SubmissionResponse;
+import unipotsdam.gf.modules.submission.model.Visibility;
 import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.modules.user.UserDAO;
 import unipotsdam.gf.process.DossierCreationProcess;
@@ -13,13 +21,19 @@ import unipotsdam.gf.session.GFContexts;
 
 import javax.inject.Inject;
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.*;
+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.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @author Sven Kästle
@@ -43,6 +57,9 @@ public class SubmissionService {
     @Inject
     private GFContexts gfContexts;
 
+    @Inject
+    private FileManagementService fileManagementService;
+
 
     @POST
     @Path("/full")
@@ -50,15 +67,32 @@ public class SubmissionService {
                                       FullSubmissionPostRequest fullSubmissionPostRequest) {
         // save full submission request in database and return the new full submission
 
-        final FullSubmission fullSubmission;
         String userEmail = (String) req.getSession().getAttribute(GFContexts.USEREMAIL);
         User user = userDAO.getUserByEmail(userEmail);
-        try {
-            fullSubmission = dossierCreationProcess.addSubmission(fullSubmissionPostRequest, user,
-                    new Project(fullSubmissionPostRequest.getProjectName()));
-        } catch (DocumentException | IOException e) {
-            e.printStackTrace();
-            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+        Project project = new Project(fullSubmissionPostRequest.getProjectName());
+
+
+        if (fullSubmissionPostRequest.isPersonal()) {
+            fullSubmissionPostRequest.setUserEMail(userEmail);
+            fullSubmissionPostRequest.setVisibility(Visibility.PERSONAL);
+        } else {
+            fullSubmissionPostRequest.setVisibility(Visibility.GROUP);
+        }
+
+        final FullSubmission fullSubmission = submissionController.addFullSubmission(fullSubmissionPostRequest);
+
+        switch (fullSubmission.getContributionCategory()) {
+            case DOSSIER:
+                try {
+                    fileManagementService.saveStringAsPDF(user, project, fullSubmissionPostRequest);
+                } catch (DocumentException | IOException e) {
+                    e.printStackTrace();
+                    return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Error while converting to pdf").build();
+                }
+                dossierCreationProcess.notifyAboutSubmission(user, project);
+                break;
+            case PORTFOLIO:
+                break;
         }
         return Response.ok(fullSubmission).build();
     }
@@ -76,23 +110,25 @@ public class SubmissionService {
         } else {
             // declare response
             SubmissionResponse response = new SubmissionResponse();
-            response.setMessage("Submission with the id '" + fullSubmissionId + "' can't be found");
+            String message = String.format("Submission with the id '%s' can't be found", fullSubmissionId);
+            response.setMessage(message);
 
             return Response.status(Response.Status.NOT_FOUND).entity(response).build();
         }
-
     }
 
     @GET
-    @Path("/full/groupId/{groupId}/project/{projectName}")
+    @Path("/full/groupId/{groupId}/project/{projectName}/contributionCategory/{contributionCategory}")
     public Response getFullSubmission(@PathParam("projectName") String projectName,
-                                      @PathParam("groupId") Integer groupId
-    ) throws IOException {
+                                      @PathParam("groupId") Integer groupId,
+                                      @PathParam("contributionCategory") ContributionCategory contributionCategory) {
         Project project = new Project(projectName);
-        String fullSubmissionId = submissionController.getFullSubmissionId(groupId, project);
+        FullSubmission fullSubmission = submissionController.getFullSubmissionBy(groupId, project, contributionCategory);
 
-        // get full submission from database based by id
-        return getFullSubmission(fullSubmissionId);
+        if (Objects.isNull(fullSubmission)) {
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+        return Response.ok(fullSubmission).build();
     }
 
     @POST
@@ -160,8 +196,14 @@ public class SubmissionService {
     public void finalize(@PathParam("submissionId") String submissionId, @PathParam("projectId") String projectId,
                          @Context HttpServletRequest req) {
         String userEmail = (String) req.getSession().getAttribute(GFContexts.USEREMAIL);
-        dossierCreationProcess.finalizeDossier(new FullSubmission(submissionId), new User(userEmail),
-                new Project(projectId));
+        FullSubmission fullSubmission = submissionController.getFullSubmission(submissionId);
+        switch (fullSubmission.getContributionCategory()) {
+            case DOSSIER:
+                dossierCreationProcess.finalizeDossier(fullSubmission, new User(userEmail), new Project(projectId));
+                break;
+            case PORTFOLIO:
+                break;
+        }
     }
 
     @GET
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java
index 361fee79bce80917697bb63d35fafdad053389cd..35945bb5444ea8c860da482225c15897bd791e94 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java
@@ -1,28 +1,24 @@
 package unipotsdam.gf.process;
 
-import com.itextpdf.text.DocumentException;
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition.FormDataContentDispositionBuilder;
 import unipotsdam.gf.interfaces.Feedback;
-import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory;
-import unipotsdam.gf.modules.fileManagement.FileManagementService;
-import unipotsdam.gf.modules.fileManagement.FileRole;
-import unipotsdam.gf.modules.fileManagement.FileType;
+import unipotsdam.gf.interfaces.IReflectionService;
 import unipotsdam.gf.modules.group.Group;
 import unipotsdam.gf.modules.group.GroupDAO;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.modules.submission.controller.SubmissionController;
 import unipotsdam.gf.modules.submission.model.FullSubmission;
-import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
 import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.modules.user.UserDAO;
 import unipotsdam.gf.process.constraints.ConstraintsImpl;
 import unipotsdam.gf.process.phases.Phase;
-import unipotsdam.gf.process.tasks.*;
+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.process.tasks.TaskType;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -46,10 +42,10 @@ public class DossierCreationProcess {
     private Feedback feedback;
 
     @Inject
-    private FileManagementService fileManagementService;
+    private GroupDAO groupDAO;
 
     @Inject
-    private GroupDAO groupDAO;
+    private IReflectionService reflectionService;
 
 
     /**
@@ -69,34 +65,26 @@ public class DossierCreationProcess {
     }
 
     /**
-     * @param fullSubmissionPostRequest Elements needed to build the fullSubmission-class
-     * @param user User who uploaded the Submission for his / her group
-     * @param project the project the submission was written for
+     * @param user                      User who uploaded the Submission for his / her group
+     * @param project                   the project the submission was written for
      * @return the fullSubmission with correct ID
      */
-    public FullSubmission addSubmission(
-            FullSubmissionPostRequest fullSubmissionPostRequest, User user, Project project) throws DocumentException, IOException {
-
-        FormDataContentDispositionBuilder builder = FormDataContentDisposition.name("dossierUpload").fileName(fullSubmissionPostRequest.getContributionCategory() + "_" + user.getEmail() + ".pdf");
-        fileManagementService.saveStringAsPDF(user, project, fullSubmissionPostRequest.getHtml(), builder.build(),
-                FileRole.DOSSIER, FileType.HTML);
+    public void notifyAboutSubmission(User user, Project project) {
+        // this completes the upload task
+        Task task = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(), Progress.INPROGRESS);
+        taskDAO.updateForGroup(task);
 
-        FullSubmission fullSubmission = submissionController.addFullSubmission(fullSubmissionPostRequest);
+        // this triggers the annotate task
+        taskDAO.persistTaskGroup(project, user, TaskName.ANNOTATE_DOSSIER, Phase.DossierFeedback);
 
-        // this completes the upload task
-        if (fullSubmission.getContributionCategory() == ContributionCategory.DOSSIER) {
-            Task task = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(), Progress.INPROGRESS);
-            taskDAO.updateForGroup(task);
+        Group group = groupDAO.getMyGroup(user, project);
+        reflectionService.startOptionalPortfolioTask(project, group, Phase.DossierFeedback);
 
-            // this triggers the annotate task
-            taskDAO.persistTaskGroup(project, user, TaskName.ANNOTATE_DOSSIER, Phase.DossierFeedback);
-        }
-        return fullSubmission;
     }
 
     /**
      * @param fullSubmission created in a groupTask, identified by projectName and groupId. Holds Text
-     * @param user User who finalized the Dossier for whole Group.
+     * @param user           User who finalized the Dossier for whole Group.
      */
     public void finalizeDossier(FullSubmission fullSubmission, User user, Project project) {
         // mark as final in db
@@ -104,20 +92,20 @@ public class DossierCreationProcess {
 
         // mark annotate task as finished in db
         //todo: for iterative work, these two tasks need to be seperated
-        Task task = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(),
+        Task taskUpload = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(),
                 Progress.FINISHED);
-        taskDAO.updateForGroup(task);
-        Task task1 = new Task(TaskName.ANNOTATE_DOSSIER, user.getEmail(), project.getName(),
+        taskDAO.updateForGroup(taskUpload);
+        Task taskAnnotate = new Task(TaskName.ANNOTATE_DOSSIER, user.getEmail(), project.getName(),
                 Progress.FINISHED);
-        taskDAO.updateForGroup(task1);
+        taskDAO.updateForGroup(taskAnnotate);
         taskDAO.persistTaskGroup(project, user, TaskName.GIVE_FEEDBACK, Phase.DossierFeedback);
 
 
         if (constraints.checkIfFeedbackCanBeDistributed(project)) {
             // create Task to give Feedback
-            List<Group> groupsInProjekt = groupDAO.getGroupsByProjectName(project.getName());
+            List<Group> groupsInProject = groupDAO.getGroupsByProjectName(project.getName());
             List<Task> allFeedbackTasks = new ArrayList<>();
-            for (Group group : groupsInProjekt) {
+            for (Group group : groupsInProject) {
                 Task giveFeedbackTask1 = taskDAO.getTasksWithTaskName(group.getId(), project, TaskName.GIVE_FEEDBACK).get(0);
                 if (!allFeedbackTasks.contains(giveFeedbackTask1))
                     allFeedbackTasks.add(giveFeedbackTask1);
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java
index f8c5b0cd6863e49156557ca4499f445aea445d6c..3eb1e8d124cd290cfa3d05c2641ee2390af68a28 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java
@@ -116,6 +116,7 @@ public class GroupFormationProcess {
             List<Group> groups = groupfinding.getGroupFormationAlgorithm(project).calculateGroups(project);
             groupfinding.persistGroups(groups, project);
             groupfinding.persistOriginalGroups(groups, project, groupdao.getGroupFormationMechanism(project));
+            taskDAO.persistTeacherTask(project, TaskName.CLOSE_GROUP_FINDING_PHASE, Phase.GroupFormation);
             return new GroupData(groups);
         } else {
             return new GroupData(groups1);
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java
index 006e76984375572133bfe4a8026d19e87d2f8dfd..c1642728fd4dc2eaba95239f5a4fc41aeb9f1742 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java
@@ -7,16 +7,12 @@ import unipotsdam.gf.exceptions.UserExistsInRocketChatException;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.model.RocketChatUser;
 import unipotsdam.gf.modules.group.GroupDAO;
-import unipotsdam.gf.modules.group.GroupFormationMechanism;
 import unipotsdam.gf.modules.group.preferences.database.ProfileDAO;
 import unipotsdam.gf.modules.project.Management;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.process.constraints.ConstraintsImpl;
-import unipotsdam.gf.process.phases.Phase;
-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;
@@ -24,8 +20,6 @@ import javax.inject.Singleton;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.WebApplicationException;
 
-import static unipotsdam.gf.modules.group.GroupFormationMechanism.SingleUser;
-
 
 @Singleton
 public class ProjectCreationProcess {
@@ -158,23 +152,8 @@ public class ProjectCreationProcess {
      */
     public void updateProjCreaProcTasks(Project project, User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException {
         // create info for student
-        Task task = taskDao.createWaitingForGroupFormationTask(project, user);
-
-        // ev. notifity teacher for new student
-        // ev. send email that he is now part of project and will be notified if something happens
+        taskDao.createWaitingForGroupFormationTask(project, user);
 
-        Boolean groupsCanBeFormed = constraintsImpl.checkIfGroupsCanBeFormed(project);
-        if (groupsCanBeFormed) {
-            GroupFormationMechanism groupFormationMechanism = groupDAO.getGroupFormationMechanism(project);
-            if (!groupFormationMechanism.equals(SingleUser) && !groupFormationMechanism
-                    .equals(GroupFormationMechanism.Manual)) {
-                taskDao.persistTeacherTask(project, TaskName.EDIT_FORMED_GROUPS, Phase.GroupFormation);
-            }
-            taskDao.persistTeacherTask(project, TaskName.CLOSE_GROUP_FINDING_PHASE, Phase.GroupFormation);
-            taskDao.updateForAll(task);
-            //phases.endPhase(Phase.GroupFormation, project);
-
-        }
         iCommunication.addUserToChatRoom(user, project.getName());
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java
index f92022a506466a782bec2caac4a22684858d1adf..e4ad935ec311345c593e1c8b521670ca1da2e1f9 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java
@@ -1,12 +1,12 @@
 package unipotsdam.gf.process.constraints;
 
 import unipotsdam.gf.interfaces.IGroupFinding;
+import unipotsdam.gf.modules.group.Group;
 import unipotsdam.gf.modules.group.GroupDAO;
 import unipotsdam.gf.modules.group.GroupFormationMechanism;
 import unipotsdam.gf.modules.project.Project;
 import unipotsdam.gf.modules.project.ProjectDAO;
 import unipotsdam.gf.modules.submission.controller.SubmissionController;
-import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.modules.user.UserDAO;
 import unipotsdam.gf.process.tasks.ProjectStatus;
 
@@ -70,13 +70,13 @@ public class ConstraintsImpl {
         return result;
     }
 
-    public List<String> checkWhichFeedbacksAreMissing(Project project){
-        List<User> participants = userDAO.getUsersByProjectName(project.getName());
-        List<User> doneParticipants = submissionController.getAllUsersWithFinalizedFeedback(project);
-        List<String> missingFeedbacksFrom = new ArrayList<>();
-        for(User participant: participants){
-            if (!doneParticipants.contains(participant)){
-                missingFeedbacksFrom.add(participant.getName());
+    public List<Group> checkWhichFeedbacksAreMissing(Project project) {
+        List<Group> groupsInProject = groupDAO.getGroupsByProjectName(project.getName());
+        List<Group> doneGroups = submissionController.getAllGroupsWithFinalizedFeedback(project);
+        List<Group> missingFeedbacksFrom = new ArrayList<>();
+        for (Group group : groupsInProject) {
+            if (!doneGroups.contains(group)) {
+                missingFeedbacksFrom.add(group);
             }
         }
         return missingFeedbacksFrom;
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java
index b3f7ba36641b62f6469359b0ecfa6839d36cbb31..a5cb9b8328088391740c04f47c2165ee40f174df 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java
@@ -1,6 +1,6 @@
 package unipotsdam.gf.process.progress;
 
-import unipotsdam.gf.modules.user.User;
+import unipotsdam.gf.modules.group.Group;
 
 import java.util.List;
 
@@ -8,17 +8,17 @@ public class ProgressData {
     private Boolean isAlmostComplete;
     private int numberOfCompletion;
     private int numberNeeded;
-    private java.util.List<User> usersMissing;
+    private java.util.List<Group> groupsMissing;
 
     public ProgressData() {
     }
 
     public ProgressData(
-            Boolean isAlmostComplete, int numberOfCompletion, int numberNeeded, List<User> usersMissing) {
+            Boolean isAlmostComplete, int numberOfCompletion, int numberNeeded, List<Group> groupsMissing) {
         this.isAlmostComplete = isAlmostComplete;
         this.numberOfCompletion = numberOfCompletion;
         this.numberNeeded = numberNeeded;
-        this.usersMissing = usersMissing;
+        this.groupsMissing = groupsMissing;
     }
 
     public Boolean getAlmostComplete() {
@@ -45,11 +45,11 @@ public class ProgressData {
         this.numberNeeded = numberNeeded;
     }
 
-    public List<User> getUsersMissing() {
-        return usersMissing;
+    public List<Group> getGroupsMissing() {
+        return groupsMissing;
     }
 
-    public void setUsersMissing(List<User> usersMissing) {
-        this.usersMissing = usersMissing;
+    public void setGroupsMissing(List<Group> groupsMissing) {
+        this.groupsMissing = groupsMissing;
     }
 }
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 5a317db9cbabfef51365d98cb82e39a0d24c74e9..247a7958bea38ce0ccd4ae20d83651b11da23cea 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java
@@ -1,6 +1,7 @@
 package unipotsdam.gf.process.tasks;
 
 import unipotsdam.gf.interfaces.IGroupFinding;
+import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory;
 import unipotsdam.gf.modules.group.Group;
 import unipotsdam.gf.modules.group.GroupDAO;
 import unipotsdam.gf.modules.group.GroupFormationMechanism;
@@ -21,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import static unipotsdam.gf.process.tasks.TaskName.WAITING_FOR_GROUP;
 import static unipotsdam.gf.process.tasks.TaskName.WAIT_FOR_PARTICPANTS;
@@ -65,7 +67,7 @@ public class TaskDAO {
         }
         try {
             task.setDeadline(vereinfachtesResultSet.getTimestamp("due").getTime());
-        } catch (Exception ignored) {
+        } catch (Throwable ignored) {
         }
         task.setPhase(Phase.valueOf(vereinfachtesResultSet.getString("phase")));
         task.setTaskName(TaskName.valueOf(vereinfachtesResultSet.getString("taskName")));
@@ -115,14 +117,22 @@ public class TaskDAO {
     }
 
     public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase) {
+        return createUserDefault(project, target, taskName, phase, Importance.MEDIUM);
+    }
+
+    public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase, Importance importance) {
+        return createUserDefault(project, target, taskName, phase, importance, Progress.JUSTSTARTED);
+    }
+
+    public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase, Importance importance, Progress progress) {
         Task task = new Task();
         task.setTaskName(taskName);
         task.setEventCreated(System.currentTimeMillis());
-        task.setDeadline(System.currentTimeMillis() + 7000 * 60 * 60 * 24);
+        task.setDeadline(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(7));
         task.setProjectName(project.getName());
         task.setUserEmail(target.getEmail());
-        task.setImportance(Importance.MEDIUM);
-        task.setProgress(Progress.JUSTSTARTED);
+        task.setImportance(importance);
+        task.setProgress(progress);
         task.setGroupTask(0);
         task.setTaskName(taskName);
         task.setPhase(phase);
@@ -130,6 +140,12 @@ public class TaskDAO {
         return task;
     }
 
+    public Task createUserDefaultWithoutDeadline(Project project, User target, TaskName taskName, Phase phase, Importance importance, Progress progress) {
+        Task task = createUserDefault(project, target, taskName, phase, importance, progress);
+        task.setDeadline(0L);
+        return task;
+    }
+
     private Task createGroupDefault(Project project, Integer groupId, TaskName taskName, Phase phase) {
         Task task = new Task();
         task.setTaskName(taskName);
@@ -243,7 +259,7 @@ public class TaskDAO {
                 Task task = getGeneralTask(vereinfachtesResultSet);
                 task.setTaskType(TaskType.LINKED);
                 Map<String, String> taskData = new HashMap<>();
-                taskData.put("fullSubmissionId", submissionController.getFullSubmissionId(groupId, project));
+                taskData.put("fullSubmissionId", submissionController.getFullSubmissionId(groupId, project, ContributionCategory.DOSSIER));
                 taskData.put("category", "TITEL");
                 task.setTaskData(taskData);
                 result = task;
@@ -282,7 +298,7 @@ public class TaskDAO {
             case CLOSE_DOSSIER_FEEDBACK_PHASE: {
                 Task task = getGeneralTask(vereinfachtesResultSet);
                 task.setHasRenderModel(true);
-                List<String> missingFeedbacks = constraints.checkWhichFeedbacksAreMissing(project);
+                List<Group> missingFeedbacks = constraints.checkWhichFeedbacksAreMissing(project);
                 task.setTaskData(missingFeedbacks);  //frontendCheck if missingFeedbacks.size ==0
                 result = task;
                 Task waitingForDossiers = new Task();
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java
index 98a0750ae15b0c4a7b281ba29752c53bc526a0f9..0e13d29acdd43ee8b1aa5cda96209f8990b8d386 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java
@@ -3,7 +3,7 @@ package unipotsdam.gf.process.tasks;
 public enum TaskName {
     // Teacher Tasks
     WAIT_FOR_PARTICPANTS, CLOSE_GROUP_FINDING_PHASE, WAITING_FOR_GROUP,
-    CLOSE_DOSSIER_FEEDBACK_PHASE,WAIT_FOR_REFLECTION, FORM_GROUPS_MANUALLY,
+    CLOSE_DOSSIER_FEEDBACK_PHASE, WAIT_FOR_REFLECTION, FORM_GROUPS_MANUALLY,
     CLOSE_EXECUTION_PHASE,
     WAIT_FOR_PEER_ASSESSMENTS, FINALIZE_ASSESSMENT, CLOSE_ASSESSMENT_PHASE,
 
@@ -12,6 +12,9 @@ public enum TaskName {
     FINALIZE_EJOURNAL,
     EDIT_FORMED_GROUPS, CONTACT_GROUP_MEMBERS, ASSESSMENT, WAITING_FOR_STUDENT_DOSSIERS, EDIT_FEEDBACK,
 
+    // Student ePortfolio Tasks
+    OPTIONAL_PORTFOLIO_ENTRY, REFLECT_DOSSIER_CREATION, ANSWER_REFLECTION_QUESTIONS, COLLECT_RESULTS_FOR_ASSESSMENT,
+
     // assessment tasks
     UPLOAD_PRESENTATION, UPLOAD_FINAL_REPORT,
     GIVE_ASSESSMENT, SEE_ASSESSMENT,
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java
index 62803eb8f63e9e0a7d16d65b67bbfe44279835d9..4d71166c52134bd97ac2c8b80387edbe9e76486c 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java
@@ -3,7 +3,6 @@ package unipotsdam.gf.process.tasks;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
 
 public class TaskOrder {
     private List<TaskName> orderedTasks;
@@ -16,12 +15,17 @@ public class TaskOrder {
         result.add(TaskName.CONTACT_GROUP_MEMBERS);
         result.add(TaskName.WAITING_FOR_STUDENT_DOSSIERS);
         result.add(TaskName.UPLOAD_DOSSIER);
+        result.add(TaskName.OPTIONAL_PORTFOLIO_ENTRY);
         result.add(TaskName.ANNOTATE_DOSSIER);
         result.add(TaskName.GIVE_FEEDBACK);
         result.add(TaskName.SEE_FEEDBACK);
         result.add(TaskName.CLOSE_DOSSIER_FEEDBACK_PHASE);
-        //todo Martins tasks
+        result.add(TaskName.REFLECT_DOSSIER_CREATION);
+        //end of execution phase
+        result.add(TaskName.ANSWER_REFLECTION_QUESTIONS);
+        result.add(TaskName.WAIT_FOR_REFLECTION);
         result.add(TaskName.CLOSE_EXECUTION_PHASE);
+        result.add(TaskName.COLLECT_RESULTS_FOR_ASSESSMENT);
         result.add(TaskName.WAIT_FOR_PEER_ASSESSMENTS);
         result.add(TaskName.GIVE_ASSESSMENT);
         result.add(TaskName.SEE_ASSESSMENT);
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java
index 73132b57850776c5f1bb72a2609603c47ea4910f..46307596101b12bf740471fb6964d1c8009ef4d7 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java
@@ -32,11 +32,12 @@ public class ChatWindow extends SimpleTagSupport {
 
         final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder());
         locator.inject(this);
+        TagUtilities tu = new TagUtilities();
 
         PageContext pageContext = (PageContext) getJspContext();
         HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
         /*String token = request.getParameter("token"); */
-        String projectName = request.getParameter("projectName");
+        String projectName = tu.getParamterFromQuery("projectName", request);
         Object userEmail = request.getSession().getAttribute(GFContexts.USEREMAIL);
 
         if (userEmail != null && !(request.getSession().getAttribute(GFContexts.ROCKETCHATAUTHTOKEN) == null)) {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java
index f069ee1c5d5c6d6a6a801244d750142914b4c99b..613ef5f9aceb66241c046ebd120c9534d18e7c0e 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java
@@ -16,9 +16,11 @@ import static java.net.URLDecoder.decode;
 
 public class TagUtilities {
     private static final Logger log = LoggerFactory.getLogger(TagUtilities.class);
+
     @Inject
     private ProjectDAO projectDAO;
 
+
     public TagUtilities() {
         final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder());
         locator.inject(this);
diff --git a/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp b/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp
index e9c17485ec2f23c430340be0d031624336039493..0fb1a61af38ffc51773fc1d5e98aa296c3dc52ff 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp
+++ b/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp
@@ -83,6 +83,7 @@
                             <div id="{{>nameLower}}" class="category-card not-added">
                                 <p>{{>name}}</p>
                             </div>
+                            <a onClick="deleteCategory('{{>nameLower}}');"><i class="fa fa-trash" aria-hidden="true"></i></a>
                         </li>
                     {{/for}}
                 </script>
diff --git a/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp b/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp
index 07eed6272dd8d3fde2f25607ce664cca7e9f5483..208c352c2130b854ef07acebfe881c4628b29878 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp
+++ b/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp
@@ -60,7 +60,6 @@
     <main id="seeFeedback" class="">
 
         <h3>Feedback geben </h3>
-        <p>Gib der Gruppe <span id="feedBackTarget"></span> eine Rückmeldung für das Dossier.</p>
 
         <br>
         <div class="three_rows">
diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js b/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js
index 9cb68086026f8b811bc460f518bb4ba589e229ff..90c6480c322cc45aeedd531f028988132ffe4b3e 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js
+++ b/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js
@@ -5,28 +5,6 @@ let userColorsDark = new Map();
 // declare document text, start and end character
 let startCharacter, endCharacter;
 
-/*
-    TODO
-    ----
-    create feedback page:
-        - remove quillJsTemp and show content in quillJS
-        - move colors from annotation class to utility class
-        - color text like category
-
-    show feedback page (could be this page):
-        - color feedback in user color
-        - color on mouseover
-        -
-
-    not one page!:
-        - you need to hide half of the page, just to have one page: einzige gemeinsamkeit -> editor und das reicht nicht
-
-
-    - Websocket fixen (vllt)
-    - bearbeiten druecken laesst die karte nicht verschwinden (was wollte ich damit sagen?)
- */
-
-
 /**
  * This function will fire when the DOM is ready
  */
@@ -63,8 +41,8 @@ $(document).ready(function () {
         btnBack.hide();
         btnWholeCategory.hide();
     }
-    $('#backToTasks').on('click',function(){
-        location.href="../project/tasks-student.jsp?projectName="+$('#projectName').html().trim();
+    $('#backToTasks').on('click', function () {
+        location.href = "../project/tasks-student.jsp?projectName=" + $('#projectName').html().trim();
     });
 
     // fetch full submission from database
diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js
index b32af477e88371cb62c1a6e2cb32cff5a2c42c9b..edafbf261fa240ec968898436869a34190fb576e 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js
+++ b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js
@@ -20,9 +20,8 @@ $(document).ready(function () {
     let fullSubmissionId = getQueryVariable("fullSubmissionId");
     let category = getQueryVariable("category");
     $('#categoryHeadline').html("Kategorie: " + category);
-    getFeedbackedGroup(function (response) {
-        $('#feedBackTarget').html(response.id);
-    });
+    /*getFeedbackedGroup(function (response) {
+    });*/
     prepareFeedbackMenu(category);
     let btnBack = $('#btnBack');
     btnBack.click(handleBackButtonClick);
diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js
index 7e0814dac2f2a525a380b500be4da33c6ff5948e..21f1759203cbfc8740e0613f948c9b3821db6448 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js
+++ b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js
@@ -87,8 +87,10 @@ function getContributionFeedback(fullSubmissionId, fullSubmissionPartCategory, g
         type: "GET",
         dataType: "json",
         success: function (response) {
-            response.text = JSON.parse(response.text);
-            responseHandler(response);
+            if (response) {
+                response.text = JSON.parse(response.text);
+                responseHandler(response);
+            }
         }
     });
 }
diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js
index 44fa1797156a19ee146b1bd6db2eb1146be95d52..84a772b968f4b70d6aca49a12482fd1b5fdebfbe 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js
+++ b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js
@@ -20,6 +20,7 @@ $(document).ready(function () {
         saveButtonHandler();
     });
 
+
     /**
      * Context menu handler
      */
@@ -243,4 +244,19 @@ function buildAnnotationList(categories) {
     let tmpl = $.templates("#annotationTemplate");
     let html = tmpl.render(data);
     $("#annotations").html(html);
+}
+
+function deleteCategory(category) {
+    let categoryLI = $('#' + category);
+    let textArrays = categoryLI.data('array');
+    for (let i = 0; i < textArrays.length; i++) {
+        quill.formatText(textArrays[i].start, textArrays[i].end - textArrays[i].start, 'background', '#FFF');
+    }
+    categoryLI.data('array', []);
+
+    $('.added-' + category).each(function () {
+        $(this).toggleClass('added-' + category + ' not-added');
+    });
+
+    let test = category;
 }
\ No newline at end of file
diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js
index fbc355183318de2fcbc1a7bcdc4f943d7ea72b6a..52092a4f3e5f57979cf53f0e7d12ef7a66f74f77 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js
+++ b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js
@@ -23,6 +23,7 @@ function createFullSubmission(fullSubmissionPostRequest, responseHandler) {
  * GET: Get a specific full submission for a given id
  *
  * @param id The id of the full submission
+ * @param contributionCategory
  * @param responseHandler The response handler
  * @param errorHandler The error handler
  */
diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js
index b1f26a464883b8c785cd4ed9a4b89bd719ee9e2c..5a555a2fd827295b97579ad6942fe2d3903ab13a 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js
+++ b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js
@@ -5,39 +5,43 @@ let groupId = 0;
 let contributionCategory;
 let hierarchyLevel;
 let fullSubmissionId = "";
+let personal;
 $(document).ready(function () {
-    getMyGroupId(getFullSubmissionOfGroup);
     contributionCategory = $('#contributionCategory').html().trim();
+    setPersonal();
+    if (!personal) {
+        getMyGroupId(getFullSubmissionOfGroup);
+    }
     hierarchyLevel = $('#hierarchyLevel').html().trim();
     populateTextFields();
 
     $('#btnSave').click(function () {
 
-        if (quill.getText().length > 1) {
-            let user = getUserEmail();
-            let content = quill.getContents();
-            let html = quill.root.innerHTML;
+        getMyGroupId(function (groupId) {
+            if (quill.getText().length > 1) {
+                let content = quill.getContents();
+                let html = quill.root.innerHTML;
 
-            // build request
-            let fullSubmissionPostRequest = {
-                groupId: groupId,
-                text: JSON.stringify(content),
-                html: html,
-                projectName: $('#projectName').text().trim(),
-                contributionCategory: contributionCategory.toUpperCase()
-            };
+                // build request
+                let fullSubmissionPostRequest = {
+                    groupId: groupId,
+                    text: JSON.stringify(content),
+                    html: html,
+                    projectName: $('#projectName').text().trim(),
+                    personal: personal,
+                    contributionCategory: contributionCategory.toUpperCase()
+                };
 
-            // save request in database
-            createFullSubmission(fullSubmissionPostRequest, function () {
-
-                // back to main page
-                location.href = hierarchyLevel + "project/tasks-student.jsp?projectName=" + $('#projectName').text().trim();
-            });
-        } else {
-            alert("Ein Text wird benötigt");
-        }
-        // fetch user and text
+                // save request in database
+                createFullSubmission(fullSubmissionPostRequest, function () {
 
+                    // back to main page
+                    location.href = hierarchyLevel + "project/tasks-student.jsp?projectName=" + $('#projectName').text().trim();
+                });
+            } else {
+                alert("Ein Text wird benötigt");
+            }
+        });
     });
 
     $('#backToTasks').click(function () {
@@ -66,9 +70,14 @@ $(document).ready(function () {
 });
 
 
+function setPersonal() {
+    let personalString = $("#personal").html().trim();
+    personal = personalString.toUpperCase() === 'TRUE';
+}
+
 function populateTextFields() {
     let data = {};
-    data.header = contributionCategory;
+    data.header = contributionCategory === "Portfolio" ? "Portfolio-Eintrag" : contributionCategory;
     let tmpl = $.templates("#headerTemplate");
     //tmpl.link("#result");
     let html = tmpl.render(data);
diff --git a/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp b/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp
index facd15198ec8abc35bdee8bceddfbd3df5629150..d53ce038e7c96a88df54f26b1599e2e2b2ed2026 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp
+++ b/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp
@@ -1,3 +1,4 @@
+<%@ page import="com.google.common.base.Strings" %>
 <%@ page import="unipotsdam.gf.taglibs.TagUtilities" %>
 <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
 
@@ -8,6 +9,10 @@
     if (contributionCategory == null) {
         contributionCategory = "Unbekannt";
     }
+    String personalString = tu.getParamterFromQuery("personal", request);
+    if (Strings.isNullOrEmpty(personalString)) {
+        personalString = "false";
+    }
 %>
 
 <!DOCTYPE html>
@@ -54,7 +59,6 @@
                 <div id="result"></div>
                 <script id="headerTemplate" type="text/x-jsrender">
                     <h2>{{:header}} anlegen</h2>
-
                 </script>
                 <div class="upload-text" id="documentText">
                     <label for="editor">Texteingabe</label>
@@ -92,7 +96,8 @@
         <jsp:param name="readOnly" value="false"/>
     </jsp:include>
 
-        <p id="contributionCategory" hidden><%= tu.printMe(contributionCategory)%>
+    <p id="contributionCategory" hidden><%= tu.printMe(contributionCategory)%>
+    <p id="personal" hidden><%= tu.printMe(personalString)%>
 </body>
 
 </html>
diff --git a/gemeinsamforschen/src/main/webapp/project/create-project.jsp b/gemeinsamforschen/src/main/webapp/project/create-project.jsp
index 5b379f2c327da7eef4ea5631620c3be8098d512d..54d4141694029f2e3b5f3c7f9c0a157b3e0ac9a4 100644
--- a/gemeinsamforschen/src/main/webapp/project/create-project.jsp
+++ b/gemeinsamforschen/src/main/webapp/project/create-project.jsp
@@ -45,7 +45,7 @@
                     Es müssen genau 5 Tags eingegeben werden.
                 </div>
                 <div class="alert alert-danger" role="alert" style="width:475px" id="specialChars">
-                    Der Projektname darf keine Sonderzeichen enthalten.
+                    Der Projektname darf keine Sonderzeichen oder Umlaute enthalten.
                 </div>
                 <div class="alert alert-danger" role="alert" style="width:475px" id="projectDescriptionMissing">
                     Geben Sie eine Beschreibung für Ihr Projekt an.
diff --git a/gemeinsamforschen/src/main/webapp/project/js/tasks.js b/gemeinsamforschen/src/main/webapp/project/js/tasks.js
index 9abccf0cf564049db42238883d6d33e3b1d10489..521f2350c084093111e1916bc8ece46990478dc5 100644
--- a/gemeinsamforschen/src/main/webapp/project/js/tasks.js
+++ b/gemeinsamforschen/src/main/webapp/project/js/tasks.js
@@ -58,7 +58,7 @@ function fitObjectInTmpl(object) {
     };
 
     if (object.taskType !== "INFO") {
-        if (object.groupTask === true) {
+        if (object.groupTask !== 0) {
             result.taskType = "grouptask"
         } else {
             result.taskType = "usertask"
@@ -83,7 +83,7 @@ function fitObjectInTmpl(object) {
         case "Execution":
             groupViewLink.show();
             result.phase = "card-execution";
-            result.headLine = "Reflexionsphase";
+            result.headLine = "Durchführung";
             break;
         case "Assessment":
             groupViewLink.show();
@@ -144,15 +144,23 @@ function fitObjectInTmpl(object) {
             result.infoText = "Sie erhielten Feedback zu Ihrem Dossier.";
             break;
         case "WAITING_FOR_STUDENT_DOSSIERS":
-            result.infoText = "[TEACHER] Warten Sie darauf, dass jeder Student ein Dossier" +
-                "hochlädt und ein Feedback für jemanden gab.";
+            result.infoText = "Studierende legen nun ein Dossier an und" +
+                " geben sich gegenseitig Feedback.";
             break;
         case "CLOSE_DOSSIER_FEEDBACK_PHASE":
             let count = object.taskData.length;
             if (count <= 3) {
-                result.infoText = "Warten sie noch auf die / den Studenten ";
+                result.infoText = "Es fehlen noch die Feedbacks der Gruppe/n ";
                 for (let i = 0; i < object.taskData.length; i++) {
-                    result.infoText += object.taskData[i] + " ";
+                    for (let j = 0; j < object.taskData[i].members.length; j++) {
+                        result.infoText += object.taskData[i].members[j].name;
+                        if (j < object.taskData[i].members.length - 1) {
+                            result.infoText += ", "
+                        }
+                    }
+                    if (i < object.taskData.length - 1) {
+                        result.infoText += " und "
+                    }
                 }
             } else {
                 result.infoText = "Noch haben nicht alle Studenten ihren Peers ein Feedback gegeben.";
@@ -168,6 +176,9 @@ function fitObjectInTmpl(object) {
         case "CONTACT_GROUP_MEMBERS":
             result.infoText = "Sagen sie hallo zu ihren Gruppenmitgliedern über den Chat.";
             break;
+        case "OPTIONAL_PORTFOLIO_ENTRY":
+            result.infoText = "E-Portfolio";
+            break;
         default:
             result.infoText = "";
     }
@@ -206,7 +217,11 @@ function fitObjectInTmpl(object) {
                 break;
             case "ANNOTATE_DOSSIER":
                 result.solveTaskWith = "Annotiere das Dossier";
-                result.solveTaskWithLink = "redirect(\'../annotation/create-unstructured-annotation.jsp?projectName=" + object.projectName + "&submissionId=" + object.taskData.fullSubmissionId + "\')";
+                result.solveTaskWithLink = "redirect(\'../annotation/create-unstructured-annotation.jsp?" + $.param({
+                    projectName: object.projectName,
+                    submissionId: object.taskData.fullSubmissionId,
+                    contributionCategory: "Dossier"
+                }) + "\')";
                 break;
             case "FINALIZE_DOSSIER":
                 result.solveTaskWith = "Finalisiere das Dossier";
@@ -251,6 +266,15 @@ function fitObjectInTmpl(object) {
                         "&contribution=DOSSIER\')";
                 }
                 break;
+
+            case "OPTIONAL_PORTFOLIO_ENTRY":
+                result.solveTaskWith = "Erstelle einen Portfolio-Eintrag (optional)";
+                result.solveTaskWithLink = "redirect(\'../annotation/upload-unstructured-dossier.jsp?" + $.param({
+                    projectName: object.projectName,
+                    contributionCategory: "Portfolio",
+                    personal: "true"
+                }) + "\')";
+                break;
             default:
                 result.solveTaskWith = null;
 
diff --git a/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp b/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp
index c0516901f9dcfee03bef381c8a822f5d412a45a9..9f51cc6e3cff400629682be8656acf354e86a5ba 100644
--- a/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp
+++ b/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp
@@ -93,8 +93,10 @@
     </div>
         <div class="col span_chat right">
             <chat:chatWindow orientation="right" scope="project"/>
-            <chat:chatWindow orientation="right" scope="group"/>
-            <a id="groupView" style="cursor:pointer;">Gruppenansicht</a>
+            <div id="groupView">
+                <chat:chatWindow orientation="right" scope="group"/>
+                <a style="cursor:pointer;">Gruppenansicht</a>
+            </div>
         </div>
     </div> <!-- end row -->
 </main>
diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js b/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js
index 199ed4db42d573f37b4a32b8fbfe884dc4231561..0eca7cf07dfea2bda6ee141be21d4394f1a736b0 100644
--- a/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js
+++ b/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js
@@ -21,6 +21,9 @@ function listFilesOfGroup(projectName){
                 });
                 count++;
             }
+            if (count === 1) {
+                $('#fileManagementHeader').hide();
+            }
             $('#listOfFilesTemplate').tmpl(tmplObject).appendTo('#listOfFiles');
             prepareDeletion();
         },
diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js
index 75a8407b368600f50d25a07517c1dc47a8eab32d..6fae36b2a55c8ed5cec0d96d5190ee164b72379b 100644
--- a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js
+++ b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js
@@ -246,8 +246,9 @@ function getMyGroupId(callback) {
 
 function getFullSubmissionOfGroup(groupId) {
     let projectName = $('#projectName').html().trim();
+    let contributionCategory = $('#contributionCategory').html().trim();
     $.ajax({
-        url: '../rest/submissions/full/groupId/' + groupId + '/project/' + projectName,
+        url: '../rest/submissions/full/groupId/' + groupId + '/project/' + projectName + '/contributionCategory/' + contributionCategory.toUpperCase(),
         type: 'GET',
         headers: {
             "Cache-Control": "no-cache"
diff --git a/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp b/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp
index abe3ebde94a900fbfd5725973df2fa352d2ee4e3..4a5c25b43caa5a8f29c67afdc4f7f37da206b364 100644
--- a/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp
+++ b/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp
@@ -16,35 +16,35 @@
                 <li class="icon  phase1">Projektinitialisierung</li>
                 <li class="icon inactive  phase2 ">Entwurfsphase</li>
 
-                <li class="icon inactive phase4">Reflextionsphase</li>
+        <li class="icon inactive phase4">Durchführung</li>
                 <li class="icon inactive phase5">Assessment</li>
                 <li class="icon inactive phase6">Noten</li>
             <%} else if (phase == Phase.DossierFeedback) {%>
                 <li class="icon closed phase1">Projektinitialisierung</li>
                 <li class="icon  phase2">Entwurfsphase</li>
 
-                <li class="icon inactive phase4">Reflextionsphase</li>
+        <li class="icon inactive phase4">Durchführung</li>
                 <li class="icon inactive phase5">Assessment</li>
                 <li class="icon inactive phase6">Noten</li>
             <%} else if (phase == Phase.Execution) {%>
                 <li class="neutral icon closed phase1">Projektinitialisierung</li>
                 <li class="draft icon closed phase2">Entwurfsphase</li>
 
-                <li class="icon phase4">Reflextionsphase</li>
+        <li class="icon phase4">Durchführung</li>
                 <li class="icon inactive phase5">Assessment</li>
                 <li class="icon inactive phase6">Noten</li>
             <%} else if (phase == Phase.Assessment) {%>
                 <li class="neutral icon closed phase1">Projektinitialisierung</li>
                 <li class="draft icon closed phase2">Entwurfsphase</li>
 
-                <li class="icon closed phase4">Reflextionsphase</li>
+        <li class="icon closed phase4">Durchführung</li>
                 <li class="icon phase5">Assessment</li>
                 <li class="icon inactive phase6">Noten</li>
             <%} else if (phase == Phase.Projectfinished) {%>
                 <li class="icon closed phase1">Projektinitialisierung</li>
                 <li class="icon closed phase2">Entwurfsphase</li>
 
-                <li class="icon closed phase4">Reflextionsphase</li>
+        <li class="icon closed phase4">Durchführung</li>
                 <li class="icon closed phase5">Assessment</li>
                 <li class="icon phase6">Noten</li>
             <%}%>
@@ -55,7 +55,7 @@
     <!--begin data deletion and download-->
     <script src="../taglibs/js/fileStorage.js"></script>
     <div style="margin-top:50px;"></div>
-    <h4>Ergebnisse</h4>
+    <h4 id="fileManagementHeader">Ergebnisse</h4>
     <ul id="listOfFiles">
         <script id="listOfFilesTemplate" type="text/x-jQuery-tmpl">
             <li>
diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql
index 9f6a414ab57acc7956e192915da3d5a4830d5be6..fa16c8f751cb0899145fa3a1ab8168d75163b65a 100644
--- a/gemeinsamforschen/src/test/resources/database/fltrail.sql
+++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql
@@ -3,7 +3,7 @@
 -- https://www.phpmyadmin.net/
 --
 -- Host: 127.0.0.1
--- Erstellungszeit: 24. Mai 2019 um 11:08
+-- Erstellungszeit: 10. Jun 2019 um 10:43
 -- Server-Version: 10.1.32-MariaDB
 -- PHP-Version: 7.2.5
 
@@ -131,7 +131,9 @@ CREATE TABLE `fullsubmissions`
     `projectName`          varchar(200) NOT NULL,
     `feedbackGroup`        int(11)               DEFAULT NULL,
     `finalized`            tinyint(1)            DEFAULT NULL,
-    `contributionCategory` varchar(200) NOT NULL
+    `contributionCategory` varchar(200) NOT NULL,
+    `userEmail`            varchar(255)          DEFAULT NULL,
+    `visibility`           varchar(200) NOT NULL
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8 COMMENT ='This holds the aggregated text of the dossier students should upload';
 
@@ -580,8 +582,10 @@ ALTER TABLE `contributionrating`
 --
 ALTER TABLE `fullsubmissions`
     ADD PRIMARY KEY (`id`),
-    ADD UNIQUE KEY `fullsubmissions_user_projectName_uindex` (`groupId`, `projectName`),
-    ADD KEY `fullsubmissions_projects_name_fk` (`projectName`);
+    ADD UNIQUE KEY `fullsubmissions_id_uindex` (`id`),
+    ADD KEY `fullsubmissions_projects_name_fk` (`projectName`),
+    ADD KEY `fullsubmissions_users_email_fk` (`userEmail`),
+    ADD KEY `fullsubmissions_groups_id_fk` (`groupId`);
 
 --
 -- Indizes für die Tabelle `grades`
@@ -812,7 +816,9 @@ ALTER TABLE `contributionrating`
 -- Constraints der Tabelle `fullsubmissions`
 --
 ALTER TABLE `fullsubmissions`
-    ADD CONSTRAINT `fullsubmissions_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
+    ADD CONSTRAINT `fullsubmissions_groups_id_fk` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+    ADD CONSTRAINT `fullsubmissions_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE,
+    ADD CONSTRAINT `fullsubmissions_users_email_fk` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`) ON DELETE CASCADE ON UPDATE CASCADE;
 
 --
 -- Constraints der Tabelle `grades`
diff --git a/gemeinsamforschen/visio/activities.vsdx b/gemeinsamforschen/visio/activities.vsdx
index 4232ab83d1f65d46d56daf4ae5f83a16ee61ee84..ebac91130c16d7675006b5d47af437267b0fa2c0 100644
Binary files a/gemeinsamforschen/visio/activities.vsdx and b/gemeinsamforschen/visio/activities.vsdx differ