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 c1332de..2cbeeff 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
@@ -176,7 +176,7 @@
 			SpErrorEntry ee = SpExceptionEnum.NO_DATA_FOR_REPORT_FOUND.getEntry();
 			List<StandbyScheduleBody> result = performReportQuery(reportDto);
 
-			LOGGER.info(result.size() + " records found for reporting");
+			LOGGER.debug(result.size() + " records found for reporting");
 
 			if (result.isEmpty()) {
 //				ee.setMessage("Es wurden keine Daten gefunden. Report ohne Inhalt.");
@@ -186,12 +186,12 @@
 
 			if (reportDto.getStandByList() != null) {
 				LOGGER.info("report for " + REPORT_ALL_GROUPS);
-				inputDtos = compressResultOnGroups(reportDto, result);
+				inputDtos = compress2ResultOnGroups(reportDto, result);
 			} else {
 				StandbyScheduleBody lastBody = null;
 				// persönlicher Einsatzplan
 				LOGGER.info("report for " + REPORT_ONE_USER);
-				inputDtos = compressResultLevel1(inputDtos, reportDto, result);
+				inputDtos = compress1ResultOnGroups(reportDto, result);
 			}
 
 		}
@@ -282,7 +282,7 @@
 		return reportInputDataSet;
 	}
 
-	private List<ReportInputDto> compressResultOnGroups(ReportDto reportDto, List<StandbyScheduleBody> result) {
+	private List<ReportInputDto> compress2ResultOnGroups(ReportDto reportDto, List<StandbyScheduleBody> result) {
 
 		List<ReportInputDto> reportInputDataSet = new ArrayList<>();
 
@@ -318,6 +318,46 @@
 
 	}
 
+	private List<ReportInputDto> compress1ResultOnGroups(ReportDto reportDto, List<StandbyScheduleBody> result) {
+
+		List<ReportInputDto> reportInputDataSet = new ArrayList<>();
+
+		Map<Long, List<StandbyScheduleBody>> groupMap = new HashMap<>();
+
+		// sort by group
+		for (StandbyScheduleBody body : result) {
+
+			Long groupId = body.getStandbyGroup().getId();
+			if (groupMap.containsKey(groupId)) {
+
+				List<StandbyScheduleBody> groupList = groupMap.get(groupId);
+				groupList.add(body);
+				Collections.sort(groupList, (o1, o2) -> o1.getValidFrom().compareTo(o2.getValidFrom()));
+			} else {
+
+				// init all List
+				groupMap.put(groupId, new ArrayList<StandbyScheduleBody>());
+				List<StandbyScheduleBody> groupList = groupMap.get(groupId);
+				groupList.add(body);
+			}
+		}
+
+		Set<Long> keySet = groupMap.keySet();
+
+		for (Long groupId : keySet) {
+
+			List<StandbyScheduleBody> groupList = groupMap.get(groupId);
+			LOGGER.debug("compacting over groupId: " + groupId);
+
+			LOGGER.debug("from " + groupList.size() + " in " + reportInputDataSet.size());
+			compressResultLevel1(reportInputDataSet, reportDto, groupList);
+
+		}
+
+		return reportInputDataSet;
+
+	}
+
 	private void calcReportStartDate(StandbyScheduleBody body) {
 		body.setStartDateStr(DateHelper.convertToLocalString(body.getValidFrom(), "EE. dd.MM.yy HH:mm"));
 	}
