diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/StandbyScheduleController.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/StandbyScheduleController.java
index 92bc1e1..6b0d257 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/StandbyScheduleController.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/StandbyScheduleController.java
@@ -12,6 +12,8 @@
  ********************************************************************************/
 package org.eclipse.openk.sp.controller;
 
+import java.util.Date;
+
 import org.apache.log4j.Logger;
 import org.eclipse.openk.sp.controller.planning.BodyDataCopyController;
 import org.eclipse.openk.sp.controller.planning.PlannedDataController;
@@ -59,7 +61,11 @@
 
 	public StandbyScheduleDto getFilteredPlanByStatusId(StandbyScheduleFilterDto standbyScheduleFilterDto,
 			Long statusId) throws SpException {
-		return plannedDataController.getFilteredPlanByStatus(standbyScheduleFilterDto, statusId);
+		LOGGER.debug(new Date());
+		StandbyScheduleDto plan = plannedDataController.getFilteredPlanByStatus(standbyScheduleFilterDto, statusId);
+		LOGGER.debug(new Date() + " for count day's " + plan.getListPlanRows().size());
+
+		return plan;
 	}
 
 	public PlanningMsgResponseDto calculatePlan(StandbyScheduleBlueprintDto standbyBlueprintDto, String username)
diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlannedDataController.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlannedDataController.java
index 5171b7f..57efac7 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlannedDataController.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlannedDataController.java
@@ -17,7 +17,6 @@
 import java.util.List;
 
 import org.apache.log4j.Logger;
-import org.dozer.DozerBeanMapper;
 import org.eclipse.openk.sp.controller.AbstractController;
 import org.eclipse.openk.sp.controller.CalendarController;
 import org.eclipse.openk.sp.db.converter.EntityConverter;
@@ -67,10 +66,6 @@
 	@Autowired
 	CalendarController calendarController;
 
-	/** dozer mapping API. */
-	@Autowired
-	private DozerBeanMapper mapper;
-
 	public StandbyScheduleDto getFilteredPlanByStatus(StandbyScheduleFilterDto standbyScheduleFilterDto, Long statusId)
 			throws SpException {
 
@@ -103,9 +98,7 @@
 				throw spE;
 			}
 
-			List<StandbyGroupSelectionDto> listStandbyGroupDto = new ArrayList<>();
-			listStandbyGroupDto = entityConverter.convertEntityToDtoList(standbyList.getLsStandbyGroups(),
-					listStandbyGroupDto, StandbyGroupSelectionDto.class);
+			List<StandbyGroupSelectionDto> listStandbyGroupDto = mapGroupDto(standbyList.getLsStandbyGroups());
 
 			Date startDate = DateHelper.getStartOfDay(standbyScheduleFilterDto.getValidFrom());
 			Date endDate = DateHelper.getEndOfDay(standbyScheduleFilterDto.getValidTo());
@@ -130,26 +123,37 @@
 			List<StandbyScheduleBody> listBodyMatrix = matrixOfPlannedBodysByStatus(groupIds, startDate, endDate,
 					statusId);
 
-			for (StandbyScheduleBody standbyScheduleBody : listBodyMatrix) {
+			LOGGER.info("query for " + listBodyMatrix.size() + " bodies");
 
-				StandbyScheduleBodySelectionDto standbyScheduleBodySelectionDto = (StandbyScheduleBodySelectionDto) entityConverter
-						.convertEntityToDto(standbyScheduleBody, new StandbyScheduleBodySelectionDto());
+			// convert to dto
+			List<StandbyScheduleBodySelectionDto> listBodyDto = new ArrayList<>();
+			listBodyDto = entityConverter.convertEntityToDtoList(listBodyMatrix, listBodyDto,
+					StandbyScheduleBodySelectionDto.class);
 
-				Date date = DateHelper.getStartOfDay(standbyScheduleBodySelectionDto.getValidFrom());
+			LOGGER.info("convertetd " + listBodyDto.size() + " bodies");
+
+			for (StandbyScheduleBodySelectionDto standbyScheduleBody : listBodyDto) {
+
+				Date date = DateHelper.getStartOfDay(standbyScheduleBody.getValidFrom());
 
 				PlanRowsDto row = plan.getRow(date);
 
 				if (row != null) {
-					setStyle(row, date);
+					row.addStandbyBody(standbyScheduleBody);
 
-					row.addStandbyBody(standbyScheduleBodySelectionDto);
-
-					plan.count(standbyScheduleBodySelectionDto);
+					plan.count(standbyScheduleBody);
 				} else {
 					LOGGER.info("no row for that date found (" + date + ")");
 				}
 			}
 
+			LOGGER.info("set style for " + plan.getListPlanRows().size() + " row's.");
+			// set style
+			for (PlanRowsDto row : plan.getListPlanRows()) {
+				Date date = DateHelper.getDateFromLabel(row.getLabel());
+				setStyle(row, date);
+			}
+
 			return plan;
 
 		} catch (SpException e) {
@@ -164,6 +168,13 @@
 
 	}
 
+	public List<StandbyGroupSelectionDto> mapGroupDto(List<StandbyGroup> lsStandbyGroups) {
+		List<StandbyGroupSelectionDto> listStandbyGroupDto = new ArrayList<>();
+		listStandbyGroupDto = entityConverter.convertEntityToDtoList(lsStandbyGroups, listStandbyGroupDto,
+				StandbyGroupSelectionDto.class);
+		return listStandbyGroupDto;
+	}
+
 	@SuppressWarnings("unchecked")
 	public StandbyScheduleArchiveDto createPlan(StandbyScheduleFilterDto standbyScheduleFilterDto,
 			PlanHeaderDto planHeader, Long statusId) throws SpException {
diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/reports/ReportController.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/reports/ReportController.java
index 2cbeeff..7b1e4cd 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/reports/ReportController.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/reports/ReportController.java
@@ -351,11 +351,8 @@
 
 			LOGGER.debug("from " + groupList.size() + " in " + reportInputDataSet.size());
 			compressResultLevel1(reportInputDataSet, reportDto, groupList);
-
 		}
-
 		return reportInputDataSet;
-
 	}
 
 	private void calcReportStartDate(StandbyScheduleBody body) {
diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/mail/MailRequest.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/mail/MailRequest.java
index 397a2c0..4e75430 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/mail/MailRequest.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/mail/MailRequest.java
@@ -28,6 +28,7 @@
 import org.eclipse.openk.sp.db.model.User;
 import org.eclipse.openk.sp.dto.planning.StandbyScheduleActionDto;
 import org.eclipse.openk.sp.exceptions.SpException;
+import org.eclipse.openk.sp.util.DateHelper;
 import org.eclipse.openk.sp.util.FileHelper;
 import org.eclipse.openk.sp.util.SpMsg;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -95,9 +96,13 @@
 			String link = property.getProperty(Globals.LINK_DASHBOARD);
 			logger.info("read link from properties: " + link);
 
-			String body = generateHTML(template, standbyBody.getStandbyGroup().getTitle(), standbyBody.getValidFrom(),
-					standbyBody.getValidTo(), targetGroup.getTitle(), actionDto.getValidFrom(), actionDto.getValidTo(),
-					link);
+			String strSBFrom = DateHelper.convertToLocalString(standbyBody.getValidFrom(), "EE. dd.MM.yy HH:mm");
+			String strSBTo = DateHelper.convertToLocalString(standbyBody.getValidTo(), "EE. dd.MM.yy HH:mm");
+			String strAcFrom = DateHelper.convertToLocalString(actionDto.getValidFrom(), "EE. dd.MM.yy HH:mm");
+			String strAcTo = DateHelper.convertToLocalString(actionDto.getValidTo(), "EE. dd.MM.yy HH:mm");
+
+			String body = generateHTML(template, standbyBody.getStandbyGroup().getTitle(), strSBFrom, strSBTo,
+					targetGroup.getTitle(), strAcFrom, strAcTo, link);
 
 			email = calcMail(subject, standbyBody.getUser().getBusinessContactData().getEmail(), property, body);
 
@@ -141,8 +146,10 @@
 
 			String userName = newUser.getFirstname() + " " + newUser.getLastname();
 			String link = property.getProperty(Globals.LINK_DASHBOARD);
-			String body = generateHTML(template, standbyGroup.getTitle(), actionDto.getValidFrom(),
-					actionDto.getValidTo(), userName, link);
+			String strAcFrom = DateHelper.convertToLocalString(actionDto.getValidFrom(), "EE. dd.MM.yy HH:mm");
+			String strAcTo = DateHelper.convertToLocalString(actionDto.getValidTo(), "EE. dd.MM.yy HH:mm");
+
+			String body = generateHTML(template, standbyGroup.getTitle(), strAcFrom, strAcTo, userName, link);
 
 			email = calcMail(subject, oldUser.getBusinessContactData().getEmail(), property, body);
 
@@ -178,8 +185,10 @@
 
 			String userName = oldUser.getFirstname() + " " + oldUser.getLastname();
 			String link = property.getProperty(Globals.LINK_DASHBOARD);
-			String body = generateHTML(template, standbyGroup.getTitle(), userName, actionDto.getValidFrom(),
-					actionDto.getValidTo(), link);
+			String strAcFrom = DateHelper.convertToLocalString(actionDto.getValidFrom(), "EE. dd.MM.yy HH:mm");
+			String strAcTo = DateHelper.convertToLocalString(actionDto.getValidTo(), "EE. dd.MM.yy HH:mm");
+
+			String body = generateHTML(template, standbyGroup.getTitle(), userName, strAcFrom, strAcTo, link);
 
 			email = calcMail(subject, newUser.getBusinessContactData().getEmail(), property, body);
 
diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/util/GsonTypeHelper.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/util/GsonTypeHelper.java
index 150fd93..da695da 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/util/GsonTypeHelper.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/util/GsonTypeHelper.java
@@ -37,6 +37,7 @@
 import org.eclipse.openk.sp.dto.StandbyGroupDto;
 import org.eclipse.openk.sp.dto.StandbyListDto;
 import org.eclipse.openk.sp.dto.StandbyScheduleBodyDto;
+import org.eclipse.openk.sp.dto.StandbyScheduleBodySelectionDto;
 import org.eclipse.openk.sp.dto.UserDto;
 import org.eclipse.openk.sp.dto.UserFunctionDto;
 import org.eclipse.openk.sp.dto.UserInStandbyGroupDto;
@@ -139,6 +140,9 @@
 	public static final Type JSON_TYPE_STANDBYBODY_DTO_ARRAY_LIST = new TypeToken<ArrayList<StandbyScheduleBodyDto>>() {
 	}.getType();
 
+	public static final Type JSON_TYPE_STANDBYBODY_SELECTION_DTO_ARRAY_LIST = new TypeToken<ArrayList<StandbyScheduleBodySelectionDto>>() {
+	}.getType();
+
 	/**
 	 * StandbyDuration
 	 */
diff --git a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/StandbyListControllerTest.java b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/StandbyListControllerTest.java
index da479bd..cacd7a9 100644
--- a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/StandbyListControllerTest.java
+++ b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/StandbyListControllerTest.java
@@ -508,8 +508,8 @@
 		when(entityConverter.convertEntityToDtoList((List<AbstractEntity>) any(), (List<AbstractDto>) any(), any()))
 				.thenReturn(lsStandbyListHasStandbyGroupDto);
 
-		when(entityConverter.convertEntityToDtoList((List<AbstractEntity>) any(), (List<AbstractDto>) any(), any()))
-				.thenReturn(lsStandbyListHasStandbyGroupDto);
+//		when(entityConverter.convertEntityToDtoList((List<AbstractEntity>) any(), (List<AbstractDto>) any(), any()))
+//				.thenReturn(lsStandbyListHasStandbyGroupDto);
 		// when(entityConverter.convertDtoToEntity((AbstractDto) any(), (AbstractEntity)
 		// any()))
 		// .thenReturn(standbyGroup.getLsUserInStandbyGroups().get(0));
diff --git a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlannedDataControllerTest.java b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlannedDataControllerTest.java
index a3b12b9..7a09078 100644
--- a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlannedDataControllerTest.java
+++ b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlannedDataControllerTest.java
@@ -51,6 +51,7 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.mockito.Spy;
 import org.mockito.runners.MockitoJUnitRunner;
 
 import com.google.gson.Gson;
@@ -75,6 +76,7 @@
 	@Mock
 	private StandbyGroupRepository standbyGroupRepository;
 
+	@Spy
 	@InjectMocks
 	PlannedDataController plannedDataController;
 
@@ -265,6 +267,9 @@
 		List<StandbyScheduleBody> lsStandbyScheduleBody = (List<StandbyScheduleBody>) new Gson().fromJson(json,
 				GsonTypeHelper.JSON_TYPE_STANDBYBODY_ARRAY_LIST);
 
+		List<StandbyScheduleBodySelectionDto> listBodyDto = (List<StandbyScheduleBodySelectionDto>) new Gson()
+				.fromJson(json, GsonTypeHelper.JSON_TYPE_STANDBYBODY_SELECTION_DTO_ARRAY_LIST);
+
 		json = fh.loadStringFromResource("testStandbyGroup.json");
 		StandbyGroupSelectionDto standbyGroupSelectionDto = (StandbyGroupSelectionDto) new Gson().fromJson(json,
 				StandbyGroupSelectionDto.class);
@@ -282,8 +287,13 @@
 		Mockito.when(standbyListRepository.findOne(Mockito.anyLong())).thenReturn(standbyList);
 		when(entityConverter.convertEntityToDto((AbstractEntity) any(), (AbstractDto) any()))
 				.thenReturn((AbstractDto) bodyDto);
+//		when(entityConverter.convertEntityToDtoList((List<StandbyListHasStandbyGroup>) any(), (List<AbstractDto>) any(),
+//				StandbyGroupSelectionDto.class)).thenReturn(listGroupDto);
+
+		Mockito.doReturn(listGroupDto).when(plannedDataController).mapGroupDto(any());
+
 		when(entityConverter.convertEntityToDtoList((List<AbstractEntity>) any(), (List<AbstractDto>) any(), any()))
-				.thenReturn(listGroupDto);
+				.thenReturn(listBodyDto);
 
 		when(standbyGroupRepository.findOne(Mockito.anyLong())).thenReturn(standbyGroup);
 
