diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java
index 345f45d..9bed8fd 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java
@@ -136,8 +136,9 @@
 					LOGGER.debug("Start Plannig for phase " + entry.getKey());
 					PlanningPhaseDto dto = entry.getValue();
 					this.createMsgStartOfPhase(entry.getKey(), dto);
-					lastStartUserId = this.calculatePlanForPhase(dto, lastStartUserId, username, entry.getKey(),
-							lastCalcDate);
+					PlanningBodyResultDto planningBodyResultDto = this.calculatePlanForPhase(dto, lastStartUserId,
+							username, entry.getKey(), lastCalcDate);
+					lastStartUserId = planningBodyResultDto.getLastUserId();
 					this.createMsgEndOfPhase(entry.getKey());
 					LOGGER.debug("End Plannig for phase " + entry.getKey());
 				}
@@ -362,10 +363,11 @@
 
 	}
 
-	public Long calculatePlanForPhase(PlanningPhaseDto dto, Long lastStartUserId, String username, int phaseNumber,
-			Date lastCalcDate) throws SpException {
+	public PlanningBodyResultDto calculatePlanForPhase(PlanningPhaseDto dto, Long lastStartUserId, String username,
+			int phaseNumber, Date lastCalcDate) throws SpException {
 		try {
 			List<UserInStandbyGroup> lsUserInGroup = dto.getLsUsers();
+			Long lastTurnUserId = lastStartUserId;
 
 			Collections.sort(lsUserInGroup,
 					(UserInStandbyGroup o1, UserInStandbyGroup o2) -> o1.getPosition().compareTo(o2.getPosition()));
@@ -377,18 +379,21 @@
 			}
 			Date tmpDate = dto.getStartDate();
 
+			PlanningBodyResultDto planningBodyResultDto = null;
 			while (tmpDate.getTime() < dto.getEndDate().getTime()) {
 
 				// reset position if end of list has been reached
-				PlanningBodyResultDto planningBodyResultDto = this.calculateScheduleBodyEntries(lsUserInGroup,
-						dto.getStartDate(), tmpDate, lastCalcDate, currentPosition, username, lastStartUserId,
-						phaseNumber);
+				planningBodyResultDto = this.calculateScheduleBodyEntries(lsUserInGroup, dto.getStartDate(), tmpDate,
+						lastCalcDate, lastTurnUserId, username, lastStartUserId, phaseNumber);
 				tmpDate = planningBodyResultDto.getTempDate();
 				currentPosition = planningBodyResultDto.getNewPosition();
 				lastStartUserId = planningBodyResultDto.getLastStartUserId();
+				lastTurnUserId = planningBodyResultDto.getLastUserId();
+
 				this.addMessagesToList(planningBodyResultDto.getLsMsg());
 			}
-			return lastStartUserId;
+			planningBodyResultDto.setLastUserId(lastTurnUserId);
+			return planningBodyResultDto;
 		} catch (Exception e) {
 			LOGGER.error(e, e);
 			SpErrorEntry ee = SpExceptionEnum.DEFAULT_EXCEPTION.getEntry();
@@ -580,12 +585,14 @@
 	}
 
 	public PlanningBodyResultDto calculateScheduleBodyEntries(List<UserInStandbyGroup> lsUserInGroup, Date startDate,
-			Date currentDate, Date lastDate, int currentPosition, String username, Long lastStartUserId,
+			Date currentDate, Date lastDate, Long lastTurnUserId, String username, Long lastStartUserId,
 			int phaseNumber) {
 		StandbyGroup group = lsUserInGroup.get(0).getStandbyGroup();
+		int currentPosition = this.getIndexOfLastPlannedUser(lastTurnUserId, lsUserInGroup);
 		PlanningBodyResultDto resultObj = new PlanningBodyResultDto();
 		resultObj.setLastStartUserId(lastStartUserId);
 		resultObj.setNewPosition(currentPosition);
+		resultObj.setLastUserId(lsUserInGroup.get(currentPosition).getUser().getId());
 
 		// read fitting duration for the current phase.
 		List<StandbyDuration> lsFittingDurations = new ArrayList<>();
@@ -598,7 +605,6 @@
 
 		if (!lsFittingDurations.isEmpty()) {
 			for (StandbyDuration fittingDuration : lsFittingDurations) {
-				// int startWeekDayInt = fittingDuration.getValidDayFrom();
 				int startWeekDayInt = DateHelper.getDayOfWeek(currentDate);
 				int endWeekDayInt = fittingDuration.getValidDayTo();
 				int coveredDays = DateHelper.calculateDifferenceOfDays(startWeekDayInt, endWeekDayInt,
@@ -628,6 +634,7 @@
 			}
 			resultObj.setNewPosition(currentPosition);
 			resultObj.setTempDate(DateHelper.addDaysToDate(currentDate, 1));
+			resultObj.setLastUserId(lsUserInGroup.get(currentPosition).getUser().getId());
 
 		} else {
 			resultObj.setTempDate(DateHelper.addDaysToDate(currentDate, 1));
diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java
index 11ed82b..dead5ba 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java
@@ -18,11 +18,12 @@
 
 import javax.xml.bind.annotation.XmlRootElement;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import org.eclipse.openk.sp.abstracts.AbstractDto;
 import org.eclipse.openk.sp.db.model.StandbyDuration;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
 /**
  * The "Address" Data Transfer Object (DTO)
  */
@@ -36,14 +37,16 @@
 	private static final long serialVersionUID = 1L;
 
 	private Integer newPosition = 0;
-	
+
 	private Long lastStartUserId = 0L;
 
+	private Long lastUserId = 0L;
+
 	private Date tempDate = null;
 
 	private List<PlanningMsgDto> lsMsg = new ArrayList<>();
-	
-	private StandbyDuration currentDuration; 
+
+	private StandbyDuration currentDuration;
 
 	/**
 	 * @return the newPosition
@@ -98,7 +101,8 @@
 	}
 
 	/**
-	 * @param lastStartUserId the lastStartUserId to set
+	 * @param lastStartUserId
+	 *            the lastStartUserId to set
 	 */
 	public void setLastStartUserId(Long lastStartUserId) {
 		this.lastStartUserId = lastStartUserId;
@@ -112,9 +116,25 @@
 	}
 
 	/**
-	 * @param currentDuration the currentDuration to set
+	 * @param currentDuration
+	 *            the currentDuration to set
 	 */
 	public void setCurrentDuration(StandbyDuration currentDuration) {
 		this.currentDuration = currentDuration;
 	}
+
+	/**
+	 * @return the lastUserId
+	 */
+	public Long getLastUserId() {
+		return lastUserId;
+	}
+
+	/**
+	 * @param lastUserId
+	 *            the lastUserId to set
+	 */
+	public void setLastUserId(Long lastUserId) {
+		this.lastUserId = lastUserId;
+	}
 }
\ No newline at end of file
diff --git a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java
index f8fee86..0712458 100644
--- a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java
+++ b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java
@@ -148,15 +148,15 @@
 			Mockito.doReturn(stbyGroup).when(standbyGroupRepository).findOne(Mockito.any());
 			Mockito.doReturn(true).when(planningController).validateInputForPlanCalculation(standbyBlueprintDto);
 			Mockito.doReturn(planningPhaseMap).when(planningController).calculatePlanningPhaseMap(standbyBlueprintDto);
-			Mockito.doReturn(1L).when(planningController).calculatePlanForPhase(Mockito.any(), Mockito.any(),
-					Mockito.any(), Mockito.anyInt(), Mockito.any());
+			Mockito.doReturn(new PlanningBodyResultDto()).when(planningController).calculatePlanForPhase(Mockito.any(),
+					Mockito.any(), Mockito.any(), Mockito.anyInt(), Mockito.any());
 			planningController.startPlanning(standbyBlueprintDto, username);
 
 			// success test 02 - invalidInput
 			Mockito.doReturn(false).when(planningController).validateInputForPlanCalculation(standbyBlueprintDto);
 			Mockito.doReturn(planningPhaseMap).when(planningController).calculatePlanningPhaseMap(standbyBlueprintDto);
-			Mockito.doReturn(1L).when(planningController).calculatePlanForPhase(Mockito.any(), Mockito.any(),
-					Mockito.any(), Mockito.anyInt(), Mockito.any());
+			Mockito.doReturn(new PlanningBodyResultDto()).when(planningController).calculatePlanForPhase(Mockito.any(),
+					Mockito.any(), Mockito.any(), Mockito.anyInt(), Mockito.any());
 			planningController.startPlanning(standbyBlueprintDto, username);
 		} catch (SpException e) {
 			assertNull(e);
@@ -260,7 +260,6 @@
 		Date startDate = new Date();
 		Date currentDate = new Date();
 		Date lastDate = new Date();
-		int currentPosition = 0;
 		String username = "JUnit";
 		Long lastUserId = 1L;
 		List<UserInStandbyGroup> lsUserInStandbyGroup = this.getTestDataForUserInStandbyGroups();
@@ -283,7 +282,7 @@
 		// covered days = 1
 		try {
 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,
-					currentDate, lastDate, currentPosition, username, lastUserId, 1);
+					currentDate, lastDate, lastUserId, username, lastUserId, 1);
 			assertNotNull(dto);
 		} catch (Exception e) {
 			assertNotNull(e);
@@ -294,7 +293,7 @@
 		lastDate = DateHelper.addDaysToDate(new Date(), 5);
 		try {
 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,
-					currentDate, lastDate, currentPosition, username, lastUserId, 1);
+					currentDate, lastDate, lastUserId, username, lastUserId, 1);
 			assertNotNull(dto);
 		} catch (Exception e) {
 			assertNotNull(e);
@@ -305,7 +304,7 @@
 			currentDate = DateHelper.addDaysToDate(new Date(), 1);
 			lastDate = DateHelper.addDaysToDate(new Date(), 1);
 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,
-					currentDate, lastDate, currentPosition, username, lastUserId, 1);
+					currentDate, lastDate, lastUserId, username, lastUserId, 1);
 			assertNotNull(dto);
 		} catch (Exception e) {
 			assertNotNull(e);
@@ -315,7 +314,7 @@
 		when(standbyDurationRepository.findDurationForValidFromDay(Mockito.any(), Mockito.any())).thenReturn(null);
 		try {
 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,
-					currentDate, lastDate, currentPosition, username, lastUserId, 1);
+					currentDate, lastDate, lastUserId, username, lastUserId, 1);
 			assertNotNull(dto);
 			assertTrue(
 					dto.getLsMsg().get(0).getMsg().contains("wurde kein aktiver Zeitraum für folgenden Tag gefunden"));
