diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/rest/CyclicReportsRestService.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/rest/CyclicReportsRestService.java
new file mode 100644
index 0000000..0875c48
--- /dev/null
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/rest/CyclicReportsRestService.java
@@ -0,0 +1,101 @@
+/* *******************************************************************************
+ * Copyright (c) 2020 Basys GmbH
+ * 
+ * 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.sp.rest;
+
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.log4j.Logger;
+import org.eclipse.openk.common.Globals;
+import org.eclipse.openk.resources.BaseResource;
+import org.eclipse.openk.sp.controller.CyclicReportsController;
+import org.eclipse.openk.sp.dto.ReportGenerationConfigDto;
+import org.eclipse.openk.sp.util.FileHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import io.swagger.annotations.ApiParam;
+
+@Path("auto-reports")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+public class CyclicReportsRestService extends BaseResource {
+
+	@Autowired
+	private CyclicReportsController automaticReportsController;
+
+	public CyclicReportsRestService() {
+		super(Logger.getLogger(CyclicReportsRestService.class.getName()), new FileHelper());
+	}
+
+	@GET
+	@Path("/")
+	public Response getAllReportGenerationConfig(
+			@ApiParam(name = "Authorization", value = "JWT Token", required = true) @HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String jwt) {
+
+		ModifyingInvokable<List<ReportGenerationConfigDto>> invokable = modusr -> automaticReportsController.getAllReportGenerationConfig();
+
+		String[] securityRoles = Globals.getAllRolls();
+
+		return invokeRunnable(jwt, securityRoles, invokable);
+	}
+
+	@PUT
+	@Path("/")
+	public Response addReportGenerationConfig(@Valid ReportGenerationConfigDto reportGenerationConfig,
+			@ApiParam(name = "Authorization", value = "JWT Token", required = true) @HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String jwt) {
+
+		ModifyingInvokable<ReportGenerationConfigDto> invokable = modusr -> automaticReportsController.addReportGenerationConfig(reportGenerationConfig);
+
+		String[] securityRoles ={Globals.KEYCLOAK_ROLE_BP_ADMIN};
+
+		return invokeRunnable(jwt, securityRoles, invokable);
+	}
+
+	@DELETE
+	@Path("/{configId}")
+	public Response deleteReportGenerationConfig(@PathParam("configId") Long configId,
+			@ApiParam(name = "Authorization", value = "JWT Token", required = true) @HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String jwt) {
+
+		ModifyingInvokable<Response> invokable = modusr -> automaticReportsController.deleteReportGenerationConfig(configId);
+
+		String[] securityRoles ={Globals.KEYCLOAK_ROLE_BP_ADMIN};
+
+		return invokeRunnable(jwt, securityRoles, invokable);
+	}
+
+	@POST
+	@Path("/{configId}")
+	public Response editReportGenerationConfig(@PathParam("configId") Long configId,
+			@Valid ReportGenerationConfigDto reportGenerationConfig,
+			@ApiParam(name = "Authorization", value = "JWT Token", required = true) @HeaderParam(value = Globals.KEYCLOAK_AUTH_TAG) String jwt) {
+
+		ModifyingInvokable<ReportGenerationConfigDto> invokable = modusr -> automaticReportsController.editReportGenerationConfig(configId, reportGenerationConfig);
+
+		String[] securityRoles ={Globals.KEYCLOAK_ROLE_BP_ADMIN};
+
+		return invokeRunnable(jwt, securityRoles, invokable);
+	}
+
+}
diff --git a/oKBereitschaftsplanungBackend/src/main/resources/application.properties b/oKBereitschaftsplanungBackend/src/main/resources/application.properties
index ad3c753..0371c60 100644
--- a/oKBereitschaftsplanungBackend/src/main/resources/application.properties
+++ b/oKBereitschaftsplanungBackend/src/main/resources/application.properties
@@ -28,7 +28,7 @@
 portal.useHttps=true
 
 #Application
-backend.version=DEVELOP 0.9.0
+backend.version=DEVELOP 0.10.0
 backend.timezone=${timezone}
 frontend.dashboard.url=https://${tomcatHost}/spfe/dashboard
 
@@ -65,3 +65,15 @@
 validate.transfer=false
 validate.delete=false
 
+#cyclic report generation
+report.cyclic.datePattern=yyyyMMdd
+report.cyclic.timePattern=HHmm
+report.cyclic.weekPattern=ww
+report.cyclic.zoneName=Europe/Berlin
+report.cyclic.locale=de
+report.cyclic.archivePath=/opt/openkdg/reports
+report.cyclic.sendReportMail=true
+report.cyclic.archiveReport=true
+report.cyclic.slotDeltaMin=5
+report.cyclic.checkCron=15 0/5 * * * ?
+report.mail.propertiesPath=/opt/openkdg/mail-notification.properties
diff --git a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/CyclicReportsControllerTest.java b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/CyclicReportsControllerTest.java
new file mode 100644
index 0000000..0256394
--- /dev/null
+++ b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/CyclicReportsControllerTest.java
@@ -0,0 +1,412 @@
+package org.eclipse.openk.sp.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.ws.rs.core.Response;
+
+import org.eclipse.openk.sp.abstracts.AbstractDto;
+import org.eclipse.openk.sp.abstracts.AbstractEntity;
+import org.eclipse.openk.sp.controller.reports.ReportController;
+import org.eclipse.openk.sp.db.converter.EntityConverter;
+import org.eclipse.openk.sp.db.dao.CyclicReportGenerationConfigRepository;
+import org.eclipse.openk.sp.db.model.ReportGenerationConfig;
+import org.eclipse.openk.sp.dto.ReportGenerationConfigDto;
+import org.eclipse.openk.sp.dto.report.ReportDto;
+import org.eclipse.openk.sp.exceptions.SpException;
+import org.eclipse.openk.sp.util.ArchiveHelper;
+import org.eclipse.openk.sp.util.MailHelper;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.springframework.test.util.ReflectionTestUtils;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CyclicReportsControllerTest {
+	
+
+
+	@InjectMocks
+	private CyclicReportsController automaticReportsController;
+
+
+	@Mock
+	private CyclicReportGenerationConfigRepository automaticReportGenerationConfigRepository;
+
+	@Mock
+	private MailHelper mailHelper;
+
+	@Mock
+	private ArchiveHelper archiveHelper;
+
+	@Mock
+	private EntityConverter entityConverter;
+
+	@Mock
+	private ReportController reportController;
+	
+	@Before
+	public void init() {
+		ReflectionTestUtils.setField(automaticReportsController, "datePattern", "yyyy-MM-dd"); 
+		ReflectionTestUtils.setField(automaticReportsController, "timePattern", "HH-mm"); 
+		ReflectionTestUtils.setField(automaticReportsController, "weekPattern", "'KW'ww"); 
+		ReflectionTestUtils.setField(automaticReportsController, "archivePath", "/opt/openk/reports"); 
+		ReflectionTestUtils.setField(automaticReportsController, "slotDeltaMin", 5); 
+		ReflectionTestUtils.setField(automaticReportsController, "zoneName", "Europe/Berlin"); 
+		ReflectionTestUtils.setField(automaticReportsController, "locale", "de"); 
+		ReflectionTestUtils.setField(automaticReportsController, "sendReportMail", true); 
+		ReflectionTestUtils.setField(automaticReportsController, "archiveReport", true); 
+		ReflectionTestUtils.invokeMethod(automaticReportsController, "init");
+	}
+	
+	@Test
+	public void constructorTest() {
+		CyclicReportsController controller = new CyclicReportsController();
+		assertNotNull(controller);
+	}
+
+	@Test
+	public void getAllReportGenerationConfigTest() throws SpException {
+		List<ReportGenerationConfig> configs = new ArrayList<>();
+		ReportGenerationConfig config = new ReportGenerationConfig();
+		
+		configs.add(config);
+		Mockito.when(automaticReportGenerationConfigRepository.findAll()).thenReturn(configs);
+		ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
+		Mockito.when(entityConverter.convertEntityToDto((AbstractEntity) any(), (AbstractDto) any()))
+				.thenReturn((AbstractDto) reportGenerationConfigDto);
+		
+		List<ReportGenerationConfigDto> configDtos = automaticReportsController.getAllReportGenerationConfig();
+		assertNotNull(configDtos);
+		
+		assertTrue(configDtos.size() == 1);
+		ReportGenerationConfigDto configDto = configDtos.get(0);
+		assertTrue(configDto == reportGenerationConfigDto);
+
+	}
+
+	@Test
+	public void deleteReportGenerationConfigTest() throws SpException {
+		Long configId = 23L;
+		ReportGenerationConfig config = new ReportGenerationConfig();
+		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.of(config));
+		Response response = automaticReportsController.deleteReportGenerationConfig(configId);
+		assertEquals(204, response.getStatus());
+		Mockito.verify(automaticReportGenerationConfigRepository).delete(Mockito.eq(configId));
+	}
+
+	@Test
+	public void deleteReportGenerationConfigTestNotFound() {
+		Long configId = 23L;
+		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.empty());
+		try {
+			automaticReportsController.deleteReportGenerationConfig(configId);
+			fail("Should have thrown SpException");
+		} catch  (SpException e) {
+			// pass
+		}
+	}
+	
+	@Test
+	public void editReportGenerationConfigTest() throws SpException {
+		Long configId = 23L;
+		ReportGenerationConfig config = new ReportGenerationConfig();
+		config.setId(configId);
+		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.of(config));
+		ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
+		Mockito.when(entityConverter.convertDtoToEntity((AbstractDto) any(), (AbstractEntity) any())).thenReturn((AbstractEntity) config);
+		ReportGenerationConfigDto response = automaticReportsController.editReportGenerationConfig(configId, reportGenerationConfigDto);
+		assertEquals(configId, response.getId());
+		Mockito.verify(automaticReportGenerationConfigRepository).save(Mockito.eq(config));
+	}
+	
+	@Test
+	public void editReportGenerationConfigTestNotFound() throws SpException {
+		Long configId = 23L;
+		ReportGenerationConfigDto config = new ReportGenerationConfigDto();
+		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.empty());
+		try {
+			automaticReportsController.editReportGenerationConfig(configId, config);
+			fail("Should have thrown SpException");
+		} catch  (SpException e) {
+			// pass
+		}
+	}
+
+	@Test
+	public void addReportGenerationConfigTest() throws SpException {
+		Long configId = 23L;
+		ReportGenerationConfig config = new ReportGenerationConfig();
+		config.setId(configId);
+		ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
+		Mockito.when(entityConverter.convertDtoToEntity((AbstractDto) any(), (AbstractEntity) any())).thenReturn((AbstractEntity) config);
+		Mockito.when(entityConverter.convertEntityToDto((AbstractEntity) any(), (AbstractDto) any()))
+				.thenReturn((AbstractDto) reportGenerationConfigDto);
+		ReportGenerationConfigDto response = automaticReportsController.addReportGenerationConfig(reportGenerationConfigDto);
+		assertEquals(reportGenerationConfigDto, response);
+		Mockito.verify(automaticReportGenerationConfigRepository).save(Mockito.eq(config));
+	}
+	
+
+	@Test
+	public void generateReportTest() throws SpException {
+		ReportGenerationConfig reportCfg = new ReportGenerationConfig();
+		String reportName = "REPORT_NAME";
+		reportCfg.setReportName(reportName);
+		String printFormat = "print_format";
+		reportCfg.setPrintFormat(printFormat );
+		Long statusId = 23L;
+		reportCfg.setStatusId(statusId);
+		Integer validDayFromOffset = -3;
+		reportCfg.setValidFromDayOffset(validDayFromOffset);
+		Integer validDayFromHour = 2;
+		reportCfg.setValidFromHour(validDayFromHour);
+		Integer validDayFromMinute =  5;
+		reportCfg.setValidFromMinute(validDayFromMinute);
+
+		Integer validDayToOffset = 3;
+		reportCfg.setValidToDayOffset(validDayToOffset);
+		Integer validDayToHour = 3;
+		reportCfg.setValidToHour(validDayToHour);
+		Integer validDayToMinute =  10;
+		reportCfg.setValidToMinute(validDayToMinute);
+		LocalDateTime triggerDate = LocalDateTime.of(2020, 1, 10, 3, 50);
+
+		Date fromDate = Date.from(LocalDateTime.of(2020, 1, 7, 2, 5).atZone(ZoneId.of("UTC")).toInstant());
+		Date toDate = Date.from(LocalDateTime.of(2020, 1, 13, 3, 10).atZone(ZoneId.of("UTC")).toInstant());
+	
+		File file = Mockito.mock(File.class);
+		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
+		File resp = automaticReportsController.generateReport(reportCfg, triggerDate);
+		assertTrue(file ==  resp);
+		ArgumentCaptor<ReportDto> reportDtoCaptor = ArgumentCaptor.forClass(ReportDto.class);
+
+		Mockito.verify(reportController).generateReport(reportDtoCaptor.capture());
+		ReportDto reportDto = reportDtoCaptor.getValue();
+		assertEquals(reportName, reportDto.getReportName());
+		assertEquals(printFormat, reportDto.getPrintFormat());
+		assertEquals(statusId, reportDto.getStatusId());
+		assertEquals(fromDate, reportDto.getValidFromDate());
+		assertEquals(toDate, reportDto.getValidToDate());
+	}
+
+	@Test
+	public void getReportGenerationConfigsTest() {
+		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
+		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
+
+		automaticReportsController.getReportGenerationConfigs(triggerTimeGreaterEqual, triggerTimeLowerEqual);
+		Mockito.verify(automaticReportGenerationConfigRepository).findConfigs(3, 1, 5, 9);
+	}
+
+	@Test
+	public void generateAndDistributeReportsTest() throws SpException, MessagingException, IOException {
+		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
+		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
+
+		List<ReportGenerationConfig> configs = new ArrayList<>();
+		ReportGenerationConfig config = sampleReportGenerationConfig();
+		configs.add(config);
+		Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
+	
+		File file = Mockito.mock(File.class);
+		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
+
+		MimeMessage msg = Mockito.mock(MimeMessage.class);
+		Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
+		
+		Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
+		
+		automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
+		
+		Mockito.verify(reportController).generateReport(Mockito.any(ReportDto.class));
+		Mockito.verify(mailHelper).send(Mockito.any(MimeMessage.class));
+		Mockito.verify(archiveHelper).copyFile(Mockito.any(String.class), Mockito.eq("/opt/openk/reports/" + config.getFileNamePattern() + "." + config.getPrintFormat()));
+		
+	}
+	
+	@Test
+	public void generateAndDistributeReportsTestIOException() throws SpException, MessagingException, IOException {
+		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
+		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
+
+		List<ReportGenerationConfig> configs = new ArrayList<>();
+		ReportGenerationConfig config = sampleReportGenerationConfig();
+		configs.add(config);
+		Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
+	
+		File file = Mockito.mock(File.class);
+		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
+		
+		Mockito.doThrow(new IOException()).when(archiveHelper).copyFile(Mockito.any(), Mockito.any());
+		
+		automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
+	
+	}
+	
+	@Test
+	public void generateAndDistributeReportsTestSpException() throws SpException, MessagingException, IOException {
+		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
+		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
+
+		List<ReportGenerationConfig> configs = new ArrayList<>();
+		ReportGenerationConfig config = sampleReportGenerationConfig();
+		configs.add(config);
+		Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
+	
+		File file = Mockito.mock(File.class);
+		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
+		
+		Mockito.doThrow(new SpException()).when(reportController).generateReport(Mockito.any());
+		
+		automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
+	
+	}
+
+
+
+	@Test
+	public void sendReportTest() throws MessagingException, IOException {
+
+		File reportFile = Mockito.mock(File.class);
+		String fileName = "fileName";
+		ReportGenerationConfig cfg = new ReportGenerationConfig();
+		String subject = "subject";
+		cfg.setSubject(subject);
+		String emailText = "mailText";
+		cfg.setEmailText(emailText);
+		List<String> toList = new ArrayList<>();
+		String email = "mail@test.tld";
+		toList.add(email);
+		cfg.setTo(toList);
+
+		ArgumentCaptor<MimeMessage> msgCaptor = ArgumentCaptor.forClass(MimeMessage.class);
+
+		MimeMessage msg = Mockito.mock(MimeMessage.class);
+		Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
+		Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
+		LocalDateTime triggerTime = LocalDateTime.now();
+		automaticReportsController.sendReport(reportFile, fileName, cfg, triggerTime);
+		Mockito.verify(mailHelper).send(msgCaptor.capture());
+		MimeMessage sendMail = msgCaptor.getValue();
+		assertTrue(sendMail == msg);
+	
+	}
+	
+	@Test
+	public void sendReportTestMessagingException() throws MessagingException, IOException {
+	
+		File reportFile = Mockito.mock(File.class);
+		String fileName = "fileName";
+		ReportGenerationConfig cfg = new ReportGenerationConfig();
+		String subject = "subject";
+		cfg.setSubject(subject);
+		List<String> toList = new ArrayList<>();
+		String email = "mail@test.tld";
+		toList.add(email);
+		cfg.setTo(toList);
+
+		MimeMessage msg = Mockito.mock(MimeMessage.class);
+		Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
+		Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
+		Mockito.doThrow(new MessagingException()).when(mailHelper).newMultipartMail();
+		LocalDateTime triggerTime = LocalDateTime.now();
+		automaticReportsController.sendReport(reportFile, fileName, cfg, triggerTime);
+		
+	}
+
+	@Test
+	public void fileNameOfCfgTest() {
+		ReportGenerationConfig cfg = new ReportGenerationConfig();
+		String printFormat = "pdf";
+		String fileNamePattern = "DDD-{Date}-{Time}-{Week}-filename";
+		cfg.setPrintFormat(printFormat);
+		cfg.setFileNamePattern(fileNamePattern);
+		LocalDateTime triggerDateTime = LocalDateTime.of(2020, 1, 1, 1, 5);
+		
+		String expected = "DDD-2020-01-01-01-05-KW01-filename.pdf";
+		
+		String fileName = automaticReportsController.fileNameOfCfg(triggerDateTime, cfg);
+		assertEquals(expected, fileName);
+	}
+
+
+	@Test
+	public void testCheckCyclicGenerationSlot() {
+		LocalDateTime now = LocalDateTime.now(ZoneId.of("Europe/Berlin"));
+		int weekDay = now.getDayOfWeek().getValue();
+		int hour = now.getHour();
+		int minute = now.getMinute();
+		
+		int minuteGE = ( minute / 5) * 5;
+		int minuteLE = minuteGE + 5 - 1;
+
+		automaticReportsController.checkCyclicGenerationSlot();
+
+		Mockito.verify(automaticReportGenerationConfigRepository).findConfigs(weekDay, hour, minuteGE, minuteLE);
+
+	}
+	private ReportGenerationConfig sampleReportGenerationConfig() {
+		ReportGenerationConfig config = new ReportGenerationConfig();
+		
+		Integer triggerHour = 1;
+		Integer triggerMinute = 1;
+		Integer triggerWeekDay = 1;
+		Integer validFromDayOffset = -1;
+		Integer validFromHour = 2;
+		Integer validFromMinute = 30;
+		Integer validToDayOffset = 1;
+		Integer validToHour = 3;
+		Integer validToMinute = 35;
+		Long standByListId = 23L;
+		Long statusId = 4L;
+		String fileNamePattern = "pattern";
+		String name = "name";
+		String printFormat = "pdf";
+		String reportName = "REPORT_NAME";
+		String subject = "subject";
+		config.setFileNamePattern(fileNamePattern);
+		config.setName(name);
+		config.setPrintFormat(printFormat);
+		config.setReportName(reportName);
+		config.setStandByListId(standByListId);
+		config.setStatusId(statusId);
+		config.setSubject(subject);
+		config.setTriggerHour(triggerHour);
+		config.setTriggerMinute(triggerMinute);
+		config.setTriggerWeekDay(triggerWeekDay);
+		config.setValidFromDayOffset(validFromDayOffset);
+		config.setValidFromHour(validFromHour);
+		config.setValidFromMinute(validFromMinute);
+		config.setValidToDayOffset(validToDayOffset);
+		config.setValidToHour(validToHour);
+		config.setValidToMinute(validToMinute);
+		List<String> to = new ArrayList<>();
+		to.add("email@test.tld");
+		config.setTo(to);
+		config.setEmailText("emailText");
+		return config;
+	}
+
+
+}
diff --git a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/rest/CyclicReportsRestServiceTest.java b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/rest/CyclicReportsRestServiceTest.java
new file mode 100644
index 0000000..1fdbb81
--- /dev/null
+++ b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/rest/CyclicReportsRestServiceTest.java
@@ -0,0 +1,79 @@
+/* *******************************************************************************
+ * Copyright (c) 2020 Basys GmbH
+ * 
+ * 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.sp.rest;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+
+import javax.ws.rs.core.Response;
+
+import org.eclipse.openk.sp.controller.CyclicReportsController;
+import org.eclipse.openk.sp.dto.ReportGenerationConfigDto;
+import org.eclipse.openk.sp.exceptions.SpException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CyclicReportsRestServiceTest {
+
+	@InjectMocks
+	private CyclicReportsRestService automaticReportsRestService;
+
+	@Mock
+	private CyclicReportsController automaticReportsController;
+
+	@Test
+	public void constructorTest() {
+		CyclicReportsRestService arrs = new CyclicReportsRestService();
+		assertNotNull(arrs);
+	}
+
+	@Test
+	public void getAllReportGenerationConfigTest() throws SpException {
+		String jwt = "TOKEN";
+		Mockito.when(automaticReportsController.getAllReportGenerationConfig()).thenReturn(new ArrayList<>());
+		Response response = automaticReportsRestService.getAllReportGenerationConfig(jwt);
+		assertNotNull(response);
+	}
+
+	@Test
+	public void addReportGenerationConfigTest() {
+		String jwt = "TOKEN";
+		ReportGenerationConfigDto reportGenerationConfig = new ReportGenerationConfigDto();
+		Response response = automaticReportsRestService.addReportGenerationConfig(reportGenerationConfig, jwt);
+		assertNotNull(response);
+	}
+
+	@Test
+	public void deleteReportGenerationConfigTest() {
+		String jwt = "TOKEN";
+		Long configId = 23L;
+		Response response = automaticReportsRestService.deleteReportGenerationConfig(configId, jwt);
+		assertNotNull(response);
+	}
+
+	@Test
+	public void editReportGenerationConfigTest() {
+		String jwt = "TOKEN";
+		ReportGenerationConfigDto reportGenerationConfig = new ReportGenerationConfigDto();
+		Long configId = 23L;
+		Response response = automaticReportsRestService.editReportGenerationConfig(configId, reportGenerationConfig,
+				jwt);
+		assertNotNull(response);
+	}
+}
