Merge branch 'DEVELOP' into SI-2183-Keycloak-Client-Rollen
diff --git a/gfsBackendService/sonar-project.properties b/gfsBackendService/sonar-project.properties
index ea5875c..58afd24 100644
--- a/gfsBackendService/sonar-project.properties
+++ b/gfsBackendService/sonar-project.properties
@@ -14,6 +14,4 @@
 sonar.tests=src/test
 #sonar.test.inclusions=**/*.spec.ts
 sonar.test.exclusions=**/model/**,**/viewmodel/**, **/RabbitMqConfig.java
-#sonar.ts.tslintconfigpath=tslint.json
-
-sonar.typescript.lcov.reportPaths=coverage/lcov.info
\ No newline at end of file
+#sonar.ts.tslintconfigpath=tslint.json
\ No newline at end of file
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/api/SitCacheApi.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/api/SitCacheApi.java
index a79fa66..5d863a9 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/api/SitCacheApi.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/api/SitCacheApi.java
@@ -15,6 +15,7 @@
 package org.eclipse.openk.gridfailureinformation.api;
 
 
+import org.eclipse.openk.gridfailureinformation.viewmodel.FESettingsDto;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -29,4 +30,8 @@
     public void postPublicFailureInfos(
             @RequestBody List<FailureInformationDto> failureInfoToPublish);
 
+    @PostMapping("/fe-settings")
+    public void postFeSettings(
+            @RequestBody FESettingsDto feSettings);
+
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/DmzExportSchedulerConfig.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/DmzExportSchedulerConfig.java
index a0051a5..54edae4 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/DmzExportSchedulerConfig.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/DmzExportSchedulerConfig.java
@@ -31,8 +31,12 @@
 
     @Scheduled(cron = "${export-to-dmz.cron}")
     public void scheduleTaskDmzExport() {
-        log.info("Executing" + SCHEDULER_NAME + " task: Exporting FailureInformations with Status 'published' to DMZ" );
+        log.debug("Executing" + SCHEDULER_NAME + " task: Exporting FailureInformations with Status 'published' to DMZ" );
         exportService.exportFailureInformationsToDMZ();
-        log.info("Finished " + SCHEDULER_NAME + " task: Exporting FailureInformations with Status 'published' to DMZ");
+        log.debug("Finished " + SCHEDULER_NAME + " task: Exporting FailureInformations with Status 'published' to DMZ");
+        log.debug("Executing" + SCHEDULER_NAME + " task: Exporting FE-Settings to DMZ" );
+        exportService.exportFeSettingsToDMZ();
+        log.debug("Finished " + SCHEDULER_NAME + " task: Exporting FE-Settings to DMZ");
+
     }
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/FESettings.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/FESettings.java
index b9e03b3..26b3c51 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/FESettings.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/config/FESettings.java
@@ -22,6 +22,23 @@
     public String overviewMapInitialZoom;
     @Value("${spring.settings.detailMapInitialZoom}")
     public String detailMapInitialZoom;
+    @Value("${spring.settings.overviewMapInitialLatitude}")
+    public String overviewMapInitialLatitude;
+    @Value("${spring.settings.overviewMapInitialLongitude}")
+    public String overviewMapInitialLongitude;
+
+    @Value("${spring.settings.emailSubjectCompleteInit:}")
+    private String emailSubjectCompleteInit;
+    @Value("${spring.settings.emailContentCompleteInit:}")
+    private String emailContentCompleteInit;
+    @Value("${spring.settings.emailSubjectUpdateInit:}")
+    private String emailSubjectUpdateInit;
+    @Value("${spring.settings.emailContentUpdateInit:}")
+    private String emailContentUpdateInit;
+    @Value("${spring.settings.emailSubjectPublishInit:}")
+    private String emailSubjectPublishInit;
+    @Value("${spring.settings.emailContentPublishInit:}")
+    private String emailContentPublishInit;
 
 
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/DistributionGroupController.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/DistributionGroupController.java
index 495ed62..b1f5779 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/DistributionGroupController.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/DistributionGroupController.java
@@ -92,7 +92,7 @@
             distributionGroupService.deleteDistributionGroup(groupUuid);
         }
         catch ( Exception e ) {
-            log.info("Exception in delete distribution group: ", e);
+            log.error("Exception in delete distribution group: ", e);
             throw new ConflictException("distribution.group.still.in.use");
         }
     }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/SettingsController.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/SettingsController.java
index 24fe6ea..579c0cb 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/SettingsController.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/SettingsController.java
@@ -19,6 +19,7 @@
 import io.swagger.annotations.ApiResponses;
 import lombok.extern.log4j.Log4j2;
 import org.eclipse.openk.gridfailureinformation.service.SettingsService;
+import org.eclipse.openk.gridfailureinformation.viewmodel.FEInitialContentDto;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FESettingsDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.annotation.Secured;
@@ -40,4 +41,12 @@
         return settingsService.getFESettings();
     }
 
+    @Secured({"ROLE_GRID-FAILURE-ADMIN", "ROLE_GRID-FAILURE-READER", "ROLE_GRID-FAILURE-CREATOR", "ROLE_GRID-FAILURE-QUALIFIER", "ROLE_GRID-FAILURE-PUBLISHER"})
+    @ApiOperation(value = "Rückgabe der intitialen Texte und Betreffzeilen für die Emailvorlagen")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @GetMapping("/initial-email-content")
+    public FEInitialContentDto getInitialEmailSubjectAndContent() {
+        return settingsService.getInitialEmailSubjectAndContent();
+    }
+
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/FailureInformationRepository.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/FailureInformationRepository.java
index bfbb4e3..9a3b20e 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/FailureInformationRepository.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/repository/FailureInformationRepository.java
@@ -23,13 +23,21 @@
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 
 @Repository
 public interface FailureInformationRepository extends PagingAndSortingRepository<TblFailureInformation, Long > {
-    Page<TblFailureInformation> findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(Pageable pageable); // NOSONAR
+
+    @Query("SELECT a from TblFailureInformation a WHERE a.tblFailureInformationCondensed IS NULL " +
+            "AND ( a.refStatusIntern.id NOT IN (:statusClosedId, :statusCancelledId ) OR " +
+            "(a.refStatusIntern.id = :statusClosedId AND a.failureEndResupplied IS NOT NULL AND a.failureEndResupplied >= :dateNowFourWeeksAgo) OR" +
+            "(a.refStatusIntern.id = :statusClosedId AND a.failureEndResupplied IS NULL AND a.modDate >= :dateNowFourWeeksAgo) OR" +
+            "(a.refStatusIntern.id = :statusCancelledId AND a.modDate >= :dateNowFourWeeksAgo) ) ORDER BY a.failureBegin DESC")
+    Page<TblFailureInformation> findByTblFailureInformationForDisplay(long statusClosedId, long statusCancelledId,
+                                                                      Date dateNowFourWeeksAgo, Pageable pageable); // NOSONAR
 
     Optional<TblFailureInformation> findByUuid(UUID uuid);
 
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ExportService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ExportService.java
index 2f842ec..90887de 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ExportService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/ExportService.java
@@ -102,6 +102,9 @@
     @Autowired
     private SitCacheApi sitCacheApi;
 
+    @Autowired
+    private SettingsService settingsService;
+
     private static final String SUBJECT_DATE_PATTERN_APPLIED = "EEEE', den' dd.MM.yy 'um' HH:mm:ss";
     protected Map<String,String> contentReplaceMap;
     protected int countExportedMessages;
@@ -153,11 +156,7 @@
                     sendMessageToRabbitMq(rabbitMqMessageDto, rChannel);
                 }
 
-                // State wird nur beim RePublishFailureToMailChannelsTask für Update und Complete mitgegeben,
-                // hier nicht zurücksetzen (dies passiert immer noch beim resetPublishedFlagOnChannels Task)
-                if (processState == null) {
-                    markChannelAsPublished(targetChannel, existingTblFailureInfo);
-                }
+                markChannelAsPublished(targetChannel, existingTblFailureInfo);
 
             }
 
@@ -202,8 +201,8 @@
         List<TblFailureInformation> tblFailureInfosVeroeffentlicht = failureInformationRepository
                 .findByPublicationStatus(Constants.PUB_STATUS_VEROEFFENTLICHT);
 
-        Set<UUID> currTableViewUuidSet = failureInformationRepository
-                .findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(Pageable.unpaged())
+        Set<UUID> currTableViewUuidSet = failureInformationService
+                .findFailureInformationsForDisplay(Pageable.unpaged())
                 .stream()
                 .map(TblFailureInformation::getUuid)
                 .collect(Collectors.toSet());
@@ -215,12 +214,19 @@
                 .collect(Collectors.toList());
 
 
-        try{
+        try {
             sitCacheApi.postPublicFailureInfos(failureInfoDtossVeroeffentlicht);
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error("error.exporting.published.failure.infos", e);
-         }
+        }
+    }
+
+   public void exportFeSettingsToDMZ(){
+       try {
+           sitCacheApi.postFeSettings(settingsService.getFESettings());
+       } catch (Exception e) {
+           log.error("error.exporting.feSettings.to.DMZ", e);
+       }
    }
 
     private boolean isChannelAlreadyPublished(String targetChannel, TblFailureInformation existingTblFailureInfo) {
@@ -349,7 +355,7 @@
             log.info("RabbitMq: Successfully sent msg: Export-Exchange: " +  rabbitMqProperties.getExportExchange() + " Export-Queue: " + rabbitMqChannel.getExportQueue()
                     + " Export-Key: " + rabbitMqChannel.getExportKey());
         } catch (Exception e) {
-            log.debug(e.getMessage(), e);
+            log.error(e.getMessage(), e);
             throw new InternalServerErrorException("could.not.push.rabbitMqMessage");
         }
     }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java
index ee58a47..29b0592 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java
@@ -41,6 +41,9 @@
 public class FailureInformationReminderMailSentService {
 
     @Autowired
+    private FailureInformationService failureInformationService;
+
+    @Autowired
     private FailureInformationReminderMailSentRepository failureInformationReminderMailSentRepository;
 
     @Autowired
@@ -62,8 +65,8 @@
     long minutesBefore;
 
     public Boolean displayStatusChangeReminderAndSendMails() {
-        Page<FailureInformationDto> failureInfoPage = failureInformationRepository
-            .findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(PageRequest.of(0, 9999999))
+        Page<FailureInformationDto> failureInfoPage = failureInformationService
+            .findFailureInformationsForDisplay(PageRequest.of(0, 9999999))
             .map(failureInformationMapper::toFailureInformationDto);
 
         LocalDateTime reminderDate = LocalDateTime.now().plusMinutes(minutesBefore);
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java
index 229ce91..7ee0f7f 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationService.java
@@ -28,8 +28,30 @@
 import org.eclipse.openk.gridfailureinformation.exceptions.OperationDeniedException;
 import org.eclipse.openk.gridfailureinformation.mapper.FailureInformationMapper;
 import org.eclipse.openk.gridfailureinformation.mapper.FailureInformationPublicationChannelMapper;
-import org.eclipse.openk.gridfailureinformation.model.*;
-import org.eclipse.openk.gridfailureinformation.repository.*;
+import org.eclipse.openk.gridfailureinformation.model.HtblFailureInformation;
+import org.eclipse.openk.gridfailureinformation.model.RefBranch;
+import org.eclipse.openk.gridfailureinformation.model.RefExpectedReason;
+import org.eclipse.openk.gridfailureinformation.model.RefStatus;
+import org.eclipse.openk.gridfailureinformation.model.TblAddress;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformation;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationPublicationChannel;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationReminderMailSent;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationStation;
+import org.eclipse.openk.gridfailureinformation.model.TblStation;
+import org.eclipse.openk.gridfailureinformation.repository.AddressRepository;
+import org.eclipse.openk.gridfailureinformation.repository.BranchRepository;
+import org.eclipse.openk.gridfailureinformation.repository.DistributionGroupRepository;
+import org.eclipse.openk.gridfailureinformation.repository.ExpectedReasonRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureClassificationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationDistributionGroupRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationPublicationChannelRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationReminderMailSentRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationStationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.HistFailureInformationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.RadiusRepository;
+import org.eclipse.openk.gridfailureinformation.repository.StationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.StatusRepository;
 import org.eclipse.openk.gridfailureinformation.util.ExternalStatusCalculator;
 import org.eclipse.openk.gridfailureinformation.util.GrahamScan;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;
@@ -43,8 +65,17 @@
 import java.awt.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.*;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
 import java.util.stream.Collectors;
 
 @Log4j2
@@ -117,14 +148,24 @@
     }
 
     public Page<FailureInformationDto> findFailureInformations(Pageable pageable) {
-        Page<FailureInformationDto> retPage = failureInformationRepository
-                .findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(pageable)
+        Page<FailureInformationDto> retPage = findFailureInformationsForDisplay(pageable)
                 .map(failureInformationMapper::toFailureInformationDto);
 
         retPage.getContent().forEach(this::enrichFailureInfo);
         return retPage;
     }
 
+    public Page<TblFailureInformation> findFailureInformationsForDisplay(Pageable pageable) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime ldt = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 0, 0, 0);
+        ldt = ldt.minusWeeks(4);
+        Date nowMinusFourWeeks = Date.from(ldt.atZone(ZoneId.of("UTC")).toInstant());
+        return failureInformationRepository.findByTblFailureInformationForDisplay(
+                GfiProcessState.COMPLETED.getStatusValue(),
+                GfiProcessState.CANCELED.getStatusValue(),
+                nowMinusFourWeeks, pageable);
+    }
+
     public List<FailureInformationDto> findFailureInformationsByCondensedUuid(UUID uuid) {
 
         List<FailureInformationDto> listFailureInformationDtos = new LinkedList<>();
@@ -455,9 +496,7 @@
         setEarliestStartdate(listSubordinatedFailureInfos, condensedFailureInformation);
         setLatestEnddate(listSubordinatedFailureInfos, condensedFailureInformation);
         setExpectedReason(listSubordinatedFailureInfos, condensedFailureInformation);
-        setCity(listSubordinatedFailureInfos, condensedFailureInformation);
-        setStreet(listSubordinatedFailureInfos, condensedFailureInformation);
-        setDistrict(listSubordinatedFailureInfos, condensedFailureInformation);
+        setAddress(listSubordinatedFailureInfos, condensedFailureInformation);
         setRadius(listSubordinatedFailureInfos, condensedFailureInformation);
 
 
@@ -500,7 +539,7 @@
         final List<TblFailureInformationStation> byFkTblFailureInformation = failureInformationStationRepository.findByFkTblFailureInformation(condensedFailureInformation.getId());
         Set<String> stationsOfOldExistingCondensedFi =
                 byFkTblFailureInformation.stream()
-                .map( x -> x.getStationStationId() )
+                .map( TblFailureInformationStation::getStationStationId )
                 .collect(Collectors.toSet());
 
         // store the set for the newly created failure info
@@ -532,58 +571,44 @@
 
     }
 
-    private void setStreet(List<TblFailureInformation> listFailureInfos, TblFailureInformation condensedFailureInformation){
+    private void setAddress(List<TblFailureInformation> listFailureInfos, TblFailureInformation condensedFailureInformation){
 
-        String firstStreet = listFailureInfos.get(0).getStreet();
-
-        List<TblFailureInformation> filteredList = listFailureInfos
+        Optional<TblFailureInformation> firstCompleteFailureInformation = listFailureInfos
                 .stream()
-                .filter(f -> f.getStreet()!=null)
-                .filter(f -> f.getStreet().equals(firstStreet))
-                .collect(Collectors.toList());
+                .filter(f -> f.getPostcode() != null && f.getStreet() != null && f.getHousenumber() != null)
+                .findFirst();
 
-        if (listFailureInfos.size() == filteredList.size()) {
-            condensedFailureInformation.setStreet(firstStreet);
-        }
-        else{
-            condensedFailureInformation.setStreet(null);
+        if (!firstCompleteFailureInformation.isPresent()) {
+            setCondensedFailureInformationAddress(condensedFailureInformation, null);
+        } else {
+            String address = concatAddress(firstCompleteFailureInformation.get());
+
+            List<TblFailureInformation> filteredList = listFailureInfos
+                    .stream()
+                    .filter(f -> f.getPostcode() != null && f.getStreet() != null && f.getHousenumber() != null)
+                    .filter(f -> concatAddress(f).equals(address))
+                    .collect(Collectors.toList());
+
+            if (listFailureInfos.size() == filteredList.size()) {
+                setCondensedFailureInformationAddress(condensedFailureInformation, firstCompleteFailureInformation.get());
+            }
+            else{
+                setCondensedFailureInformationAddress(condensedFailureInformation, null);
+            }
         }
     }
 
-    private void setDistrict(List<TblFailureInformation> listFailureInfos, TblFailureInformation condensedFailureInformation){
-
-        String firstDistrict = listFailureInfos.get(0).getDistrict();
-
-        List<TblFailureInformation> filteredList = listFailureInfos
-                .stream()
-                .filter(f -> f.getDistrict()!= null)
-                .filter(f -> f.getDistrict().equals(firstDistrict))
-                .collect(Collectors.toList());
-
-        if (listFailureInfos.size() == filteredList.size()) {
-            condensedFailureInformation.setDistrict(firstDistrict);
-        }
-        else{
-            condensedFailureInformation.setDistrict(null);
-        }
+    private void setCondensedFailureInformationAddress(TblFailureInformation condensedFailureInformation, TblFailureInformation failureInformation) {
+        condensedFailureInformation.setPostcode(failureInformation != null ? failureInformation.getPostcode() : null);
+        condensedFailureInformation.setStreet(failureInformation != null ? failureInformation.getStreet() : null);
+        condensedFailureInformation.setHousenumber(failureInformation != null ? failureInformation.getHousenumber() : null);
+        condensedFailureInformation.setCity(failureInformation != null ? failureInformation.getCity() : null);
+        condensedFailureInformation.setDistrict(failureInformation != null ? failureInformation.getDistrict() : null);
     }
 
-    private void setCity(List<TblFailureInformation> listFailureInfos, TblFailureInformation condensedFailureInformation){
-
-        String firstCity = listFailureInfos.get(0).getCity();
-
-        List<TblFailureInformation> filteredList = listFailureInfos
-                .stream()
-                .filter(f -> f.getCity() != null)
-                .filter(f -> f.getCity().equals(firstCity))
-                .collect(Collectors.toList());
-
-        if (listFailureInfos.size() == filteredList.size()) {
-            condensedFailureInformation.setCity(firstCity);
-        }
-        else{
-            condensedFailureInformation.setCity(null);
-        }
+    private String concatAddress(TblFailureInformation failureInformation) {
+        if (failureInformation == null) return null;
+        return failureInformation.getPostcode() + failureInformation.getStreet() + failureInformation.getHousenumber();
     }
 
     private void setExpectedReason(List<TblFailureInformation> listFailureInfos, TblFailureInformation condensedFailureInformation){
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/SettingsService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/SettingsService.java
index b69eb45..2294820 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/SettingsService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/SettingsService.java
@@ -17,6 +17,7 @@
 import lombok.extern.log4j.Log4j2;
 import org.eclipse.openk.gridfailureinformation.config.FESettings;
 import org.eclipse.openk.gridfailureinformation.config.rabbitMq.RabbitMqChannel;
+import org.eclipse.openk.gridfailureinformation.viewmodel.FEInitialContentDto;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FESettingsDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,9 +32,14 @@
     @Autowired
     private FESettings feSettings;
 
+    private FESettingsDto feSettingsDto;
+    private FEInitialContentDto feInitialContentDto;
+
     public FESettingsDto getFESettings(){
 
-        FESettingsDto feSettingsDto = new FESettingsDto();
+        if (feSettingsDto != null) return feSettingsDto;
+
+        feSettingsDto = new FESettingsDto();
         List<RabbitMqChannel> rabbitMqChannels = feSettings.getChannels();
 
         List<String> channelNames = new LinkedList();
@@ -44,8 +50,26 @@
         feSettingsDto.setExportChannels(channelNames);
         feSettingsDto.setDetailMapInitialZoom(feSettings.getDetailMapInitialZoom());
         feSettingsDto.setOverviewMapInitialZoom(feSettings.getOverviewMapInitialZoom());
+        feSettingsDto.setOverviewMapInitialLatitude(feSettings.getOverviewMapInitialLatitude());
+        feSettingsDto.setOverviewMapInitialLongitude(feSettings.getOverviewMapInitialLongitude());
 
         return feSettingsDto;
     }
 
+    public FEInitialContentDto getInitialEmailSubjectAndContent(){
+        if (feInitialContentDto != null) return feInitialContentDto;
+
+        feInitialContentDto = new FEInitialContentDto();
+        feInitialContentDto.setEmailSubjectPublishInit(feSettings.getEmailSubjectPublishInit());
+        feInitialContentDto.setEmailContentPublishInit(feSettings.getEmailContentPublishInit());
+
+        feInitialContentDto.setEmailSubjectUpdateInit(feSettings.getEmailSubjectUpdateInit());
+        feInitialContentDto.setEmailContentUpdateInit(feSettings.getEmailContentUpdateInit());
+
+        feInitialContentDto.setEmailContentCompleteInit(feSettings.getEmailContentCompleteInit());
+        feInitialContentDto.setEmailSubjectCompleteInit(feSettings.getEmailSubjectCompleteInit());
+
+        return feInitialContentDto;
+    }
+
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/FEInitialContentDto.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/FEInitialContentDto.java
new file mode 100644
index 0000000..c8cc8b3
--- /dev/null
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/FEInitialContentDto.java
@@ -0,0 +1,34 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.gridfailureinformation.viewmodel;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class FEInitialContentDto implements Serializable {
+
+    private String emailSubjectCompleteInit;
+    private String emailContentCompleteInit;
+
+    private String emailSubjectUpdateInit;
+    private String emailContentUpdateInit;
+
+    private String emailSubjectPublishInit;
+    private String emailContentPublishInit;
+
+}
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/FESettingsDto.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/FESettingsDto.java
index e02af47..b3f2fcc 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/FESettingsDto.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/viewmodel/FESettingsDto.java
@@ -25,4 +25,7 @@
     public String overviewMapInitialZoom;
     public String detailMapInitialZoom;
 
+    public String overviewMapInitialLatitude;
+    public String overviewMapInitialLongitude;
+
 }
diff --git a/gfsBackendService/src/main/resources/application.yml b/gfsBackendService/src/main/resources/application.yml
index 1309fc1..3ea0764 100644
--- a/gfsBackendService/src/main/resources/application.yml
+++ b/gfsBackendService/src/main/resources/application.yml
@@ -45,6 +45,46 @@
   settings:
     overviewMapInitialZoom: 10
     detailMapInitialZoom: 10
+    overviewMapInitialLatitude: 49.656634
+    overviewMapInitialLongitude: 8.423207
+    # Initial emailsubject and content
+    emailSubjectPublishInit: "Die Störung (Sparte: $Sparte$) mit Beginn: $Störungsbeginn_gemeldet$ wurde in den Status veröffentlicht geändert."
+    emailContentPublishInit: "Veröffentlicht [TEST]\n
+
+    Sehr geehrte Damen und Herren,\n
+    
+    die im Betreff genannte Meldung ist über folgenden Link erreichbar:\n
+    
+    $Direkter_Link_zur_Störung$\n
+    
+    Mit freundlichen Grüßen
+
+    Ihre Admin-Meister-Team der PTA GmbH"
+    emailSubjectUpdateInit: "Die Störung (Sparte: $Sparte$) mit Beginn: $Störungsbeginn_gemeldet$ wurde in den Status aktualisiert geändert."
+    emailContentUpdateInit: "Aktualisiert [TEST]\n
+
+    Sehr geehrte Damen und Herren,\n
+
+    die im Betreff genannte Meldung ist über folgenden Link erreichbar:\n
+
+    $Direkter_Link_zur_Störung$\n
+
+    Mit freundlichen Grüßen
+    
+    Ihre Admin-Meister-Team der PTA GmbH"
+
+    emailSubjectCompleteInit: "Die Störung (Sparte: $Sparte$) mit Beginn: $Störungsbeginn_gemeldet$ wurde in den Status beendet geändert."
+    emailContentCompleteInit: "Beendet [TEST]\n
+
+    Sehr geehrte Damen und Herren,\n
+
+    die im Betreff genannte Meldung ist über folgenden Link erreichbar:\n
+
+    $Direkter_Link_zur_Störung$\n
+
+    Mit freundlichen Grüßen
+    
+    Ihre Admin-Meister-Team der PTA GmbH"
   jpa:
     show-sql: false
 
diff --git a/gfsBackendService/src/main/resources/application_localdev.yml b/gfsBackendService/src/main/resources/application_localdev.yml
index 1b7dc6d..d7b1c67 100644
--- a/gfsBackendService/src/main/resources/application_localdev.yml
+++ b/gfsBackendService/src/main/resources/application_localdev.yml
@@ -46,6 +46,8 @@
   settings:
     overviewMapInitialZoom: 10
     detailMapInitialZoom: 10
+    overviewMapInitialLatitude: 49.656634
+    overviewMapInitialLongitude: 8.423207
   jpa:
     show-sql: false
 
@@ -87,6 +89,7 @@
 
 portalFeLoginURL: http://entopkon:8880/portalFE/#/login
 portalFeModulename: SIT DEV
+
 authNAuthService:
   ribbon:
     listOfServers: http://entopkon:8880
@@ -95,6 +98,10 @@
   ribbon:
     listOfServers: http://entdockergss:9156
 
+sitCacheService:
+  ribbon:
+    listOfServers: http://localhost:3000
+
 cors:
   corsEnabled: true
 
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/SettingsControllerTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/SettingsControllerTest.java
index 5daa3ef..8dd4d20 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/SettingsControllerTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/SettingsControllerTest.java
@@ -42,5 +42,13 @@
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON));
     }
 
+    @Test
+    public void shouldReturnInitialContent() throws Exception {
+
+        mockMvc.perform(get("/settings/initial-email-content"))
+                .andExpect(status().is2xxSuccessful())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
+    }
+
 
 }
\ No newline at end of file
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java
index a8538f3..f243ca5 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java
@@ -57,6 +57,9 @@
     private FailureInformationReminderMailSentService failureInformationReminderMailSentService;
 
     @MockBean
+    private FailureInformationService failureInformationService;
+
+    @MockBean
     private FailureInformationRepository failureInformationRepository;
 
     @MockBean
@@ -77,7 +80,7 @@
         mockfailurePage.getContent().stream().findFirst().get().setFailureEndPlanned(reminderDate);
         TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
 
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationService.findFailureInformationsForDisplay(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
         when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.empty());
@@ -92,7 +95,7 @@
         Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
         RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
 
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationService.findFailureInformationsForDisplay(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
 
         Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails();
@@ -110,7 +113,7 @@
         mockfailurePage.getContent().stream().findFirst().get().setRefStatusIntern(mockRefStatus);
         TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
 
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationService.findFailureInformationsForDisplay(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
         when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.empty());
@@ -130,7 +133,7 @@
         mockfailurePage.getContent().stream().findFirst().get().setRefStatusIntern(mockRefStatus);
         TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
 
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationService.findFailureInformationsForDisplay(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
         when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.empty());
@@ -149,7 +152,7 @@
         RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
         List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
 
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationService.findFailureInformationsForDisplay(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
 
@@ -165,7 +168,7 @@
         RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
         List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
 
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationService.findFailureInformationsForDisplay(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
 
@@ -227,9 +230,8 @@
         Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
         RefStatus mockRefStatus = MockDataHelper.mockRefStatusCOMPLETED();
         mockfailurePage.getContent().stream().forEach(f -> f.setRefStatusIntern(null));
-        List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
 
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationService.findFailureInformationsForDisplay(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
 
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java
index a63d6eb..ba01353 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationServiceTest.java
@@ -21,13 +21,38 @@
 import org.eclipse.openk.gridfailureinformation.exceptions.BadRequestException;
 import org.eclipse.openk.gridfailureinformation.exceptions.NotFoundException;
 import org.eclipse.openk.gridfailureinformation.exceptions.OperationDeniedException;
-import org.eclipse.openk.gridfailureinformation.model.*;
-import org.eclipse.openk.gridfailureinformation.repository.*;
+import org.eclipse.openk.gridfailureinformation.model.HtblFailureInformation;
+import org.eclipse.openk.gridfailureinformation.model.RefBranch;
+import org.eclipse.openk.gridfailureinformation.model.RefExpectedReason;
+import org.eclipse.openk.gridfailureinformation.model.RefFailureClassification;
+import org.eclipse.openk.gridfailureinformation.model.RefRadius;
+import org.eclipse.openk.gridfailureinformation.model.RefStatus;
+import org.eclipse.openk.gridfailureinformation.model.TblAddress;
+import org.eclipse.openk.gridfailureinformation.model.TblDistributionGroup;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformation;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationDistributionGroup;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationPublicationChannel;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationReminderMailSent;
+import org.eclipse.openk.gridfailureinformation.model.TblFailureInformationStation;
+import org.eclipse.openk.gridfailureinformation.model.TblStation;
+import org.eclipse.openk.gridfailureinformation.repository.AddressRepository;
+import org.eclipse.openk.gridfailureinformation.repository.BranchRepository;
+import org.eclipse.openk.gridfailureinformation.repository.DistributionGroupRepository;
+import org.eclipse.openk.gridfailureinformation.repository.ExpectedReasonRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureClassificationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationDistributionGroupRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationPublicationChannelRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationReminderMailSentRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.FailureInformationStationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.HistFailureInformationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.RadiusRepository;
+import org.eclipse.openk.gridfailureinformation.repository.StationRepository;
+import org.eclipse.openk.gridfailureinformation.repository.StatusRepository;
 import org.eclipse.openk.gridfailureinformation.support.MockDataHelper;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationPublicationChannelDto;
 import org.junit.jupiter.api.Test;
-import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.stubbing.Answer;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,13 +65,19 @@
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.when;
 
 //import java.sql.Date;
 @Log4j2
@@ -90,7 +121,7 @@
     public void shouldFindFailureInformations() {
         Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
         RefStatus refStatus = MockDataHelper.mockRefStatusCreated();
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(failureInformationRepository.findByTblFailureInformationForDisplay(anyLong(), anyLong(), any(Date.class), any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refStatus));
 
         Page<FailureInformationDto> retPage = failureInformationService.findFailureInformations(Pageable.unpaged());
@@ -639,7 +670,7 @@
     }
 
     @Test
-    public void shouldCondenseFailureInformations_equalFailureInfos() {
+    public void shouldCondenseFailureInformations_equalFailureInfos_completeAddress() {
 
         List uuidList = MockDataHelper.mockUuidList();
 
@@ -672,6 +703,8 @@
         assertEquals(tblFailureInformation1.getStreet(), savedCondensedFailureInfoDto.getStreet());
         assertEquals(tblFailureInformation1.getDistrict(), savedCondensedFailureInfoDto.getDistrict());
         assertEquals(tblFailureInformation1.getCity(), savedCondensedFailureInfoDto.getCity());
+        assertEquals(tblFailureInformation1.getPostcode(), savedCondensedFailureInfoDto.getPostcode());
+        assertEquals(tblFailureInformation1.getHousenumber(), savedCondensedFailureInfoDto.getHousenumber());
         assertEquals(tblFailureInformation1.getRefExpectedReason().getUuid(), savedCondensedFailureInfoDto.getExpectedReasonId());
         assertEquals(tblFailureInformation1.getFailureEndPlanned(), savedCondensedFailureInfoDto.getFailureEndPlanned());
         assertEquals(tblFailureInformation1.getFailureBegin(), savedCondensedFailureInfoDto.getFailureBegin());
@@ -681,13 +714,56 @@
     }
 
     @Test
-    public void shouldCondenseFailureInformations_differentFailureInfos() {
+    public void shouldCondenseFailureInformations_setAddressNull_equalFailureInfos_notCompleteAddress() {
 
         List uuidList = MockDataHelper.mockUuidList();
 
-        //different failureInfos
+        TblFailureInformation tblFailureInformation1 = MockDataHelper.mockTblFailureInformationWithoutAddress();
+        TblFailureInformation tblFailureInformation2 = MockDataHelper.mockTblFailureInformationWithoutAddress();
+        TblFailureInformation tblFailureInformation3 = MockDataHelper.mockTblFailureInformationWithoutAddress();
+
+        List<TblFailureInformation> listFailureInfos = new ArrayList();
+        listFailureInfos.add(tblFailureInformation1);
+        listFailureInfos.add(tblFailureInformation2);
+        listFailureInfos.add(tblFailureInformation3);
+
+        RefStatus refStatus = MockDataHelper.mockRefStatusCreated();
+
+        when(failureInformationRepository.findByUuidIn(any(List.class))).thenReturn(listFailureInfos);
+        when(statusRepository.findById(anyLong())).thenReturn(Optional.of(refStatus));
+        when(statusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refStatus));
+
+        when(failureInformationRepository.save(any(TblFailureInformation.class)))
+                .then((Answer<TblFailureInformation>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblFailureInformation) args[0];
+                });
+
+        FailureInformationDto savedCondensedFailureInfoDto = failureInformationService.condenseFailureInfos(uuidList, Optional.empty());
+
+        assertNotNull(savedCondensedFailureInfoDto.getUuid());
+        assertEquals(1L, savedCondensedFailureInfoDto.getVersionNumber());
+        //TODO: status (2x) und radius überprüfen
+        assertNull(savedCondensedFailureInfoDto.getStreet());
+        assertNull(savedCondensedFailureInfoDto.getDistrict());
+        assertNull(savedCondensedFailureInfoDto.getCity());
+        assertNull(savedCondensedFailureInfoDto.getPostcode());
+        assertNull(savedCondensedFailureInfoDto.getHousenumber());
+        assertEquals(tblFailureInformation1.getRefExpectedReason().getUuid(), savedCondensedFailureInfoDto.getExpectedReasonId());
+        assertEquals(tblFailureInformation1.getFailureEndPlanned(), savedCondensedFailureInfoDto.getFailureEndPlanned());
+        assertEquals(tblFailureInformation1.getFailureBegin(), savedCondensedFailureInfoDto.getFailureBegin());
+        assertEquals(true, savedCondensedFailureInfoDto.getCondensed());
+        assertEquals(null, savedCondensedFailureInfoDto.getFailureInformationCondensedId());
+
+    }
+
+    @Test
+    public void shouldCondenseFailureInformations_setAddressNull_differentFailureInfos_differentPostcodeStreetHousenumber() {
+
+        List uuidList = MockDataHelper.mockUuidList();
+
+        //different failureInfos and different postcode, street and house number
         TblFailureInformation tblFailureInformation1 = MockDataHelper.mockTblFailureInformation();
-        TblFailureInformation tblFailureInformation2 = MockDataHelper.mockTblFailureInformation();
         TblFailureInformation tblFailureInformation3 = MockDataHelper.mockTblFailureInformation2();
 
         TblStation tblStation = MockDataHelper.mockTblStation();
@@ -708,7 +784,6 @@
 
         List<TblFailureInformation> listFailureInfos = new ArrayList();
         listFailureInfos.add(tblFailureInformation1);
-        listFailureInfos.add(tblFailureInformation2);
         listFailureInfos.add(tblFailureInformation3);
 
         //different status
@@ -731,9 +806,72 @@
         assertNotNull(savedCondensedFailureInfoDto.getUuid());
         assertEquals(1L, savedCondensedFailureInfoDto.getVersionNumber());
         //TODO: status (2x) und radius überprüfen
-        assertEquals(null, savedCondensedFailureInfoDto.getStreet());
-        assertEquals(null, savedCondensedFailureInfoDto.getDistrict());
-        assertEquals(null, savedCondensedFailureInfoDto.getCity());
+        assertNull(savedCondensedFailureInfoDto.getStreet());
+        assertNull(savedCondensedFailureInfoDto.getDistrict());
+        assertNull(savedCondensedFailureInfoDto.getCity());
+        assertNull(savedCondensedFailureInfoDto.getPostcode());
+        assertNull(savedCondensedFailureInfoDto.getCity());
+        assertEquals(tblFailureInformation1.getFailureBegin(), savedCondensedFailureInfoDto.getFailureBegin());
+        assertEquals(tblFailureInformation3.getFailureEndPlanned(), savedCondensedFailureInfoDto.getFailureEndPlanned());
+        assertEquals(true, savedCondensedFailureInfoDto.getCondensed());
+        assertEquals(null, savedCondensedFailureInfoDto.getFailureInformationCondensedId());
+
+    }
+
+    @Test
+    public void shouldCondenseFailureInformations_setAddressRight_differentFailureInfos_samePostcodeStreetHousenumber() {
+
+        List uuidList = MockDataHelper.mockUuidList();
+
+        //different failureInfos but same postcode, street and house number
+        TblFailureInformation tblFailureInformation1 = MockDataHelper.mockTblFailureInformation();
+        TblFailureInformation tblFailureInformation3 = MockDataHelper.mockTblFailureInformation3();
+
+        TblStation tblStation = MockDataHelper.mockTblStation();
+        List<TblAddress> addressList = MockDataHelper.mockTblAddressList();
+
+        SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
+        try {
+            java.util.Date date1 = dateformat.parse("01/01/2020");
+            java.util.Date date2 = dateformat.parse("24/12/2024");
+
+            // set first startdate and last enddate
+            tblFailureInformation1.setFailureBegin(date1);
+            tblFailureInformation3.setFailureEndPlanned(date2);
+        }catch(Exception e){
+            log.error("Error in FailureInformationServiceTest: SimpleDateFormat.parse");
+        }
+
+
+        List<TblFailureInformation> listFailureInfos = new ArrayList();
+        listFailureInfos.add(tblFailureInformation1);
+        listFailureInfos.add(tblFailureInformation3);
+
+        //different status
+        RefStatus refStatus = MockDataHelper.mockRefStatusCreated();
+        RefStatus refStatus2 = MockDataHelper.mockRefStatus2();
+
+        when(statusRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(refStatus));
+        when(failureInformationRepository.findByUuidIn(any(List.class))).thenReturn(listFailureInfos);
+        when(statusRepository.findById(anyLong())).thenReturn(Optional.of(refStatus)).thenReturn(Optional.of(refStatus2));
+        when(failureInformationRepository.save(any(TblFailureInformation.class)))
+                .then((Answer<TblFailureInformation>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblFailureInformation) args[0];
+                });
+        when(stationRepository.findByStationId(anyString())).thenReturn(Optional.of(tblStation));
+        when(addressRepository.findByStationId(anyString())).thenReturn(addressList);
+
+        FailureInformationDto savedCondensedFailureInfoDto = failureInformationService.condenseFailureInfos(uuidList, Optional.empty());
+
+        assertNotNull(savedCondensedFailureInfoDto.getUuid());
+        assertEquals(1L, savedCondensedFailureInfoDto.getVersionNumber());
+        //TODO: status (2x) und radius überprüfen
+        assertEquals(tblFailureInformation1.getStreet(), savedCondensedFailureInfoDto.getStreet());
+        assertEquals(tblFailureInformation1.getDistrict(), savedCondensedFailureInfoDto.getDistrict());
+        assertEquals(tblFailureInformation1.getCity(), savedCondensedFailureInfoDto.getCity());
+        assertEquals(tblFailureInformation1.getPostcode(), savedCondensedFailureInfoDto.getPostcode());
+        assertEquals(tblFailureInformation1.getHousenumber(), savedCondensedFailureInfoDto.getHousenumber());
         assertEquals(tblFailureInformation1.getFailureBegin(), savedCondensedFailureInfoDto.getFailureBegin());
         assertEquals(tblFailureInformation3.getFailureEndPlanned(), savedCondensedFailureInfoDto.getFailureEndPlanned());
         assertEquals(true, savedCondensedFailureInfoDto.getCondensed());
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/SettingsServiceTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/SettingsServiceTest.java
index f85d4d4..be872bc 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/SettingsServiceTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/SettingsServiceTest.java
@@ -19,6 +19,7 @@
 import org.eclipse.openk.gridfailureinformation.repository.AddressRepository;
 import org.eclipse.openk.gridfailureinformation.support.MockDataHelper;
 import org.eclipse.openk.gridfailureinformation.viewmodel.AddressDto;
+import org.eclipse.openk.gridfailureinformation.viewmodel.FEInitialContentDto;
 import org.eclipse.openk.gridfailureinformation.viewmodel.FESettingsDto;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,5 +48,20 @@
         assertFalse(feSettingsDto.getDetailMapInitialZoom() == null);
         assertFalse(feSettingsDto.getOverviewMapInitialZoom()== null);
         assertFalse(feSettingsDto.getExportChannels() == null);
+        assertFalse(feSettingsDto.getOverviewMapInitialLatitude() == null);
+        assertFalse(feSettingsDto.getOverviewMapInitialLongitude() == null);
+    }
+
+    @Test
+    public void shouldGetInitialEmailSubjectAndContent() {
+
+        FEInitialContentDto feSettingsDto = settingsService.getInitialEmailSubjectAndContent();
+
+        assertFalse(feSettingsDto.getEmailContentCompleteInit() == null);
+        assertFalse(feSettingsDto.getEmailSubjectCompleteInit() == null);
+        assertFalse(feSettingsDto.getEmailContentPublishInit() == null);
+        assertFalse(feSettingsDto.getEmailSubjectPublishInit() == null);
+        assertFalse(feSettingsDto.getEmailSubjectUpdateInit() == null);
+        assertFalse(feSettingsDto.getEmailContentUpdateInit() == null);
     }
 }
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
index 208286f..e64c652 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/support/MockDataHelper.java
@@ -107,6 +107,9 @@
         dto.setStreet("Budenweg");
         dto.setDistrict("West");
         dto.setCity("Waldau");
+        dto.setStreet("Dieselstr.");
+        dto.setHousenumber("54");
+        dto.setPostcode("71111");
 
         dto.setStationId("224488-123bcd");
         dto.setStationDescription("Trafo 25");
@@ -173,6 +176,9 @@
         obj.setStreet("Budenweg");
         obj.setDistrict("West");
         obj.setCity("Waldau");
+        obj.setStreet("Dieselstr.");
+        obj.setHousenumber("54");
+        obj.setPostcode("71111");
 
         obj.setStationId("224488-123bcd");
         obj.setStationDescription("Trafo 25");
@@ -226,6 +232,114 @@
         obj.setStreet("Hügelpfad");
         obj.setDistrict("Süd");
         obj.setCity("Schlumpfhausen");
+        obj.setStreet("Benzinstr.");
+        obj.setHousenumber("1");
+        obj.setPostcode("81111");
+
+        obj.setStationId("44444-123bcd");
+        obj.setStationDescription("Trafo 11");
+        obj.setStationCoords("101,2222");
+        obj.setLongitude(BigDecimal.valueOf(12.646280));
+        obj.setLatitude(BigDecimal.valueOf(51.115618));
+
+        obj.setRefRadius(mockRefRadius());
+
+        obj.setPublicationStatus("neu");
+        obj.setPublicationFreetext("Korrodiertes Kabel");
+        obj.setRefExpectedReason(mockRefExpectedReason());
+
+        obj.setCreateDate(new java.util.Date(Date.valueOf("2021-05-11").getTime()));
+        obj.setCreateUser("roggensackl");
+        obj.setModDate(new java.util.Date(Date.valueOf("2020-05-12").getTime()));
+        obj.setModUser("müllers");
+
+        obj.setRefStatusIntern(mockRefStatus2());
+        obj.setRefFailureClassification(mockRefFailureClassification());
+        obj.setRefBranch(mockRefBranch());
+
+        obj.setRefStatusIntern(mockRefStatusCreated());
+        obj.setStations(mockTblStationList().stream().collect(Collectors.toList()));
+        return obj;
+    }
+
+    public static TblFailureInformation mockTblFailureInformation3() {
+        TblFailureInformation obj = new TblFailureInformation();
+        obj.setId(22L);
+        obj.setUuid(UUID.randomUUID());
+        obj.setVersionNumber(4L);
+        obj.setResponsibility("Vatter Mousa");
+        obj.setVoltageLevel(Constants.VOLTAGE_LEVEL_NS);
+        obj.setPressureLevel(Constants.PRESSURE_LEVEL_MD);
+
+        SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
+        try {
+            java.util.Date date1 = dateformat.parse("04/12/2022");
+            java.util.Date date2 = dateformat.parse("05/12/2022");
+            java.util.Date date3 = dateformat.parse("06/12/2022");
+
+            obj.setFailureBegin(date1);
+            obj.setFailureEndPlanned(date2);
+            obj.setFailureEndResupplied(date3);
+        }
+        catch(Exception e){
+            log.warn("Fehler beim Erstellen von Daten mit DateFormat");
+        }
+
+        obj.setStreet("Budenweg");
+        obj.setDistrict("West");
+        obj.setCity("Waldau");
+        obj.setStreet("Dieselstr.");
+        obj.setHousenumber("54");
+        obj.setPostcode("71111");
+
+        obj.setStationId("224488-123bcd");
+        obj.setStationDescription("Trafo 25");
+        obj.setStationCoords("121,8855");
+        obj.setLongitude(BigDecimal.valueOf(8.646280));
+        obj.setLatitude(BigDecimal.valueOf(50.115618));
+
+        obj.setRefRadius(mockRefRadius());
+
+        obj.setPublicationStatus("veröffentlicht");
+        obj.setPublicationFreetext("Kabel aus Steckdose gerissen");
+        obj.setRefExpectedReason(mockRefExpectedReason());
+
+        obj.setCreateDate(new java.util.Date(Date.valueOf("2020-05-08").getTime()));
+        obj.setCreateUser("weizenkeimk");
+        obj.setModDate(new java.util.Date(Date.valueOf("2020-05-23").getTime()));
+        obj.setModUser("schlonzh");
+
+        obj.setRefStatusIntern(mockRefStatusCreated());
+        obj.setRefFailureClassification(mockRefFailureClassification());
+        obj.setRefBranch(mockRefBranch());
+
+        obj.setStations(mockTblStationList().stream().collect(Collectors.toList()));
+
+        return obj;
+    }
+
+    public static TblFailureInformation mockTblFailureInformationWithoutAddress() {
+        TblFailureInformation obj = new TblFailureInformation();
+        obj.setId(42L);
+        obj.setUuid(UUID.randomUUID());
+        obj.setVersionNumber(2L);
+        obj.setResponsibility("Schlumpfine");
+        obj.setVoltageLevel(Constants.VOLTAGE_LEVEL_HS);
+        obj.setPressureLevel(Constants.PRESSURE_LEVEL_MD);
+
+        SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
+        try {
+            java.util.Date date1 = dateformat.parse("12/08/2022");
+            java.util.Date date2 = dateformat.parse("02/09/2022");
+            java.util.Date date3 = dateformat.parse("02/09/2022");
+
+            obj.setFailureBegin(date1);
+            obj.setFailureEndPlanned(date2);
+            obj.setFailureEndResupplied(date3);
+        }
+        catch(Exception e){
+            log.warn("Fehler beim Erstellen von Daten mit DateFormat");
+        }
 
         obj.setStationId("44444-123bcd");
         obj.setStationDescription("Trafo 11");