diff --git a/src/main/java/org/eclipse/openk/api/Calender.java b/src/main/java/org/eclipse/openk/api/Calender.java
new file mode 100644
index 0000000..9225e67
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/api/Calender.java
@@ -0,0 +1,68 @@
+/**
+ ******************************************************************************
+ * Copyright © 2018 PTA GmbH.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ *
+ *     http://www.eclipse.org/legal/epl-v10.html
+ *
+ ******************************************************************************
+ */
+package org.eclipse.openk.api;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.Date;
+
+public class Calender {
+
+    @JsonProperty
+    private Integer gridMeasureId;
+
+    @JsonProperty
+    private String gridMeasureTitle;
+
+    @JsonProperty
+    private Integer gridMeasureStatusId;
+
+    @JsonProperty
+    private Integer singleGridMeasureId;
+
+    @JsonProperty
+    private String singleGridMeasureTitle;
+
+    @JsonProperty
+    private Date plannedStarttimSinglemeasure;
+
+    @JsonProperty
+    private Date plannedEndtimeSinglemeasure;
+
+
+    public Integer getGridMeasureId() { return gridMeasureId; }
+
+    public void setGridMeasureId(Integer gridMeasureId) { this.gridMeasureId = gridMeasureId; }
+
+    public Integer getSingleGridMeasureId() { return singleGridMeasureId; }
+
+    public void setSingleGridMeasureId(Integer singleGridMeasureId) { this.singleGridMeasureId = singleGridMeasureId; }
+
+    public String getGridMeasureTitle() { return gridMeasureTitle; }
+
+    public void setGridMeasureTitle(String gridMeasureTitle) { this.gridMeasureTitle = gridMeasureTitle; }
+
+    public Integer getGridMeasureStatusId() { return gridMeasureStatusId; }
+
+    public void setGridMeasureStatusId(Integer gridMeasureStatusId) { this.gridMeasureStatusId = gridMeasureStatusId; }
+
+    public String getSingleGridMeasureTitle() { return singleGridMeasureTitle; }
+
+    public void setSingleGridMeasureTitle(String singleGridMeasureTitle) { this.singleGridMeasureTitle = singleGridMeasureTitle; }
+
+    public Date getPlannedStarttimSinglemeasure() { return plannedStarttimSinglemeasure; }
+
+    public void setPlannedStarttimSinglemeasure(Date plannedStarttimSinglemeasure) { this.plannedStarttimSinglemeasure = plannedStarttimSinglemeasure; }
+
+    public Date getPlannedEndtimeSinglemeasure() { return plannedEndtimeSinglemeasure; }
+
+    public void setPlannedEndtimeSinglemeasure(Date plannedEndtimeSinglemeasure) { this.plannedEndtimeSinglemeasure = plannedEndtimeSinglemeasure; }
+}
diff --git a/src/main/java/org/eclipse/openk/core/controller/GridMeasureBackendController.java b/src/main/java/org/eclipse/openk/core/controller/GridMeasureBackendController.java
index db422f9..05f10fe 100644
--- a/src/main/java/org/eclipse/openk/core/controller/GridMeasureBackendController.java
+++ b/src/main/java/org/eclipse/openk/core/controller/GridMeasureBackendController.java
@@ -14,14 +14,7 @@
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
 import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.openk.api.BackendSettings;
-import org.eclipse.openk.api.Document;
-import org.eclipse.openk.api.FilterObject;
-import org.eclipse.openk.api.GridMeasure;
-import org.eclipse.openk.api.HGridMeasure;
-import org.eclipse.openk.api.Lock;
-import org.eclipse.openk.api.RoleAccessDefinitionApi;
-import org.eclipse.openk.api.VersionInfo;
+import org.eclipse.openk.api.*;
 import org.eclipse.openk.common.mapper.GridMeasureMapper;
 import org.eclipse.openk.common.mapper.generic.GenericApiToDbMapper;
 import org.eclipse.openk.common.util.DateUtils;
@@ -793,6 +786,41 @@
         return new ArrayList<>(networkControlsUniqueSet);
     }
 
+    public List<Calender> getCalender() {
+
+        List<TblGridMeasure> mList;
+        List<TblSingleGridmeasure> sgmList;
+        List<Calender> calenderList = new ArrayList<>();
+
+        try (AutoCloseEntityManager em = createEm()) {
+            TblGridMeasureDao gmDao = createTblGridMeasureDao(em);
+            TblSingleGridmeasureDao sgmDao = createTblSingleGridmeasureDao(em);
+            mList = gmDao.getGridMeasuresExcludingStatusInTx(PlgmProcessState.CLOSED.getStatusValue(), PlgmProcessState.CANCELED.getStatusValue());
+
+            for (TblGridMeasure m : mList) {
+                sgmList = sgmDao.getSingleGridmeasuresByGmIdInTx(m.getId());
+
+                for (TblSingleGridmeasure sgm : sgmList) {
+
+                    Calender calenderItem = new Calender();
+
+                    calenderItem.setGridMeasureId(m.getId());
+                    calenderItem.setGridMeasureTitle(m.getTitle());
+                    calenderItem.setGridMeasureStatusId(m.getFkRefGmStatus());
+                    calenderItem.setSingleGridMeasureId(sgm.getId());
+                    calenderItem.setSingleGridMeasureTitle(sgm.getTitle());
+                    calenderItem.setPlannedStarttimSinglemeasure(sgm.getPlannedStarttimeSinglemeasure());
+                    calenderItem.setPlannedEndtimeSinglemeasure(sgm.getPlannedEndtimeSinglemeasure());
+
+                    calenderList.add(calenderItem);
+                }
+            }
+        }
+        return calenderList;
+    }
+
+
+
     protected TblSingleGridmeasureDao createTblSingleGridmeasureDao(EntityManager em) { return new TblSingleGridmeasureDao(em); }
 
     protected TblGridMeasureDao createTblGridMeasureDao(EntityManager em) { return new TblGridMeasureDao(em); }
diff --git a/src/main/java/org/eclipse/openk/db/dao/TblGridMeasureDao.java b/src/main/java/org/eclipse/openk/db/dao/TblGridMeasureDao.java
index e01adcd..dba9c14 100644
--- a/src/main/java/org/eclipse/openk/db/dao/TblGridMeasureDao.java
+++ b/src/main/java/org/eclipse/openk/db/dao/TblGridMeasureDao.java
@@ -22,8 +22,6 @@
 
 public class TblGridMeasureDao extends GenericDaoJpa<TblGridMeasure, Integer>{
     public static final String FK_REF_GM_STATUS = "fkRefGmStatus";
-    //public static final String MODIFIER_NAME = "modUser";
-    //public static final String CREATOR_NAME = "createUser";
 
     public TblGridMeasureDao() {
         super();
@@ -144,7 +142,6 @@
 
     public List<TblGridMeasure> getGridMeasuresByUserNameExcludingStatus(String username, Integer statusId1, Integer statusId2) {
         try {
-            //String selectString = "from TblGridMeasure t WHERE t.fkRefGmStatus NOT IN (:fkRefGmStatus1, :fkRefGmStatus2)";
             String selectString = "from TblGridMeasure t where t.id IN (select distinct t.id from TblGridMeasure t INNER JOIN HTblGridMeasure h ON t.id = h.id WHERE h.hUser = :UserName) AND t.fkRefGmStatus NOT IN (:fkRefGmStatus1, :fkRefGmStatus2)";
             Query q = getEM().createQuery(selectString);
             q.setParameter("UserName", username);
diff --git a/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java b/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java
index 4b12506..33bc97b 100644
--- a/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java
+++ b/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java
@@ -138,6 +138,19 @@
                 .getGridMeasureById(Integer.parseInt(id)));
     }
 
+    @ApiOperation(value = "Get Calender", notes = "This service gets single gridmeasures for the calender view")
+    @ApiResponses( value ={ @ApiResponse(code = 200, message = "OK", response = GridMeasure.class,reference = "#/definitions/Calender") } )
+    @GET
+    @Path("/getCalender")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Timed
+    public Response getCalender(@ApiParam(name ="Authorization", value ="JWT Token", required =true)
+                                    @HeaderParam(Globals.KEYCLOAK_AUTH_TAG) String jwt) {
+        return invokeRunnable(jwt, SecureType.NORMAL, modusr -> new GridMeasureBackendController()
+                .getCalender());
+    }
+
 
     @ApiOperation(value = "Get Current Reminders", notes = "This service retrieves a list of Gridmeasure-Ids")
     @ApiResponses( value ={ @ApiResponse(code = 200, message = "OK", response = GridMeasure.class,reference = "#/definitions/GridMeasure") } )
diff --git a/src/test/java/org/eclipse/openk/api/CalenderTest.java b/src/test/java/org/eclipse/openk/api/CalenderTest.java
new file mode 100644
index 0000000..53831e8
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/api/CalenderTest.java
@@ -0,0 +1,121 @@
+/**
+ ******************************************************************************
+ * Copyright © 2018 PTA GmbH.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ *
+ *     http://www.eclipse.org/legal/epl-v10.html
+ *
+ ******************************************************************************
+ */
+package org.eclipse.openk.api;
+
+import static org.junit.Assert.assertEquals;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.Date;
+
+import org.junit.Test;
+
+public class CalenderTest {
+
+    @Test
+    public void testGetGridMeasureId()throws IOException {
+        Calender calender = new Calender();
+        calender.setGridMeasureId(5);
+
+        ObjectMapper om = new ObjectMapper();
+        String jsonString = om.writeValueAsString(calender);
+
+        Calender calender2 = om.readValue(jsonString, Calender.class);
+
+        assertEquals(calender.getGridMeasureId(), calender2.getGridMeasureId());
+    }
+
+    @Test
+    public void testGetGridMeasureTitle()throws IOException {
+        Calender calender = new Calender();
+        calender.setGridMeasureTitle("Test 5");
+
+        ObjectMapper om = new ObjectMapper();
+        String jsonString = om.writeValueAsString(calender);
+
+        Calender calender2 = om.readValue(jsonString, Calender.class);
+
+        assertEquals(calender.getGridMeasureTitle(), calender2.getGridMeasureTitle());
+    }
+
+    @Test
+    public void testGetGridMeasureStatusId()throws IOException {
+        Calender calender = new Calender();
+        calender.setGridMeasureStatusId(3);
+
+        ObjectMapper om = new ObjectMapper();
+        String jsonString = om.writeValueAsString(calender);
+
+        Calender calender2 = om.readValue(jsonString, Calender.class);
+
+        assertEquals(calender.getGridMeasureStatusId(), calender2.getGridMeasureStatusId());
+    }
+
+    @Test
+    public void testGetSingleGridMeasureId()throws IOException {
+        Calender calender = new Calender();
+        calender.setSingleGridMeasureId(2);
+
+        ObjectMapper om = new ObjectMapper();
+        String jsonString = om.writeValueAsString(calender);
+
+        Calender calender2 = om.readValue(jsonString, Calender.class);
+
+        assertEquals(calender.getSingleGridMeasureId(), calender2.getSingleGridMeasureId());
+    }
+
+    @Test
+    public void testGetSingleGridMeasureTitle()throws IOException {
+        Calender calender = new Calender();
+        calender.setSingleGridMeasureTitle("Test Single 2");
+
+        ObjectMapper om = new ObjectMapper();
+        String jsonString = om.writeValueAsString(calender);
+
+        Calender calender2 = om.readValue(jsonString, Calender.class);
+
+        assertEquals(calender.getSingleGridMeasureTitle(), calender2.getSingleGridMeasureTitle());
+    }
+
+    @Test
+    public void testGetPlannedStarttimSinglemeasure()throws IOException {
+        Calender calender = new Calender();
+
+        java.util.Date plannedStarttimeSinglemeasure = new Date(System.currentTimeMillis());
+        calender.setPlannedStarttimSinglemeasure(plannedStarttimeSinglemeasure);
+
+        ObjectMapper om = new ObjectMapper();
+        String jsonString = om.writeValueAsString(calender);
+
+        Calender calender2 = om.readValue(jsonString, Calender.class);
+
+        assertEquals(calender.getPlannedStarttimSinglemeasure(), calender2.getPlannedStarttimSinglemeasure());
+    }
+
+    @Test
+    public void testGetPlannedEndtimeSinglemeasure()throws IOException {
+        Calender calender = new Calender();
+
+        java.util.Date plannedEndtimeSinglemeasure = new Date(System.currentTimeMillis());
+        calender.setPlannedEndtimeSinglemeasure(plannedEndtimeSinglemeasure);
+
+        ObjectMapper om = new ObjectMapper();
+        String jsonString = om.writeValueAsString(calender);
+
+        Calender calender2 = om.readValue(jsonString, Calender.class);
+
+        assertEquals(calender.getPlannedEndtimeSinglemeasure(), calender2.getPlannedEndtimeSinglemeasure());
+    }
+
+
+}
+
diff --git a/src/test/java/org/eclipse/openk/core/controller/GridMeasureBackendControllerTest.java b/src/test/java/org/eclipse/openk/core/controller/GridMeasureBackendControllerTest.java
index eb0337b..1f2217d 100644
--- a/src/test/java/org/eclipse/openk/core/controller/GridMeasureBackendControllerTest.java
+++ b/src/test/java/org/eclipse/openk/core/controller/GridMeasureBackendControllerTest.java
@@ -380,7 +380,7 @@
         TblSingleGridmeasureDao dao = EasyMock.createMock(TblSingleGridmeasureDao.class);
         expect( dao.findByIdInTx(anyObject(), anyInt())).andReturn(mList.get(0)).anyTimes();
         expect( dao.findById(anyObject(), anyInt())).andReturn(mList.get(0)).anyTimes();
-        expect( dao.getSingleGridmeasuresByGmIdInTx(1)).andReturn(mList).anyTimes();
+        expect( dao.getSingleGridmeasuresByGmIdInTx(anyInt())).andReturn(mList).anyTimes();
         expect( dao.getSingleGridmeasuresInTx()).andReturn(mList).anyTimes();
         replay( dao );
         verify( dao );
@@ -1246,4 +1246,22 @@
         be.tblSingleGridmeasureDao = daoMock;
         assertEquals( be.getResponsiblesOnSiteFromSingleGridmeasures().size(), 3 );
     }
+
+
+    @Test
+    public void testGetCalender() {
+
+        TestableGridMeasureBackendController be = new TestableGridMeasureBackendController();
+
+        TblGridMeasureDao mockedGmDao = createTblGridMeasureDao();
+        be.tblGridMeasureDao = mockedGmDao;
+
+        TblSingleGridmeasureDao mockedSgmDao = createTblSingleGridmeasureDao();
+        be.tblSingleGridmeasureDao = mockedSgmDao;
+
+        assertEquals( be.getCalender().size(),5);
+
+    }
+
+
 }
diff --git a/src/test/java/org/eclipse/openk/resources/PlannedGridMeasuresResourcesTest.java b/src/test/java/org/eclipse/openk/resources/PlannedGridMeasuresResourcesTest.java
index d7b1877..4579c6c 100644
--- a/src/test/java/org/eclipse/openk/resources/PlannedGridMeasuresResourcesTest.java
+++ b/src/test/java/org/eclipse/openk/resources/PlannedGridMeasuresResourcesTest.java
@@ -183,4 +183,12 @@
         assertNotNull( r );
     }
 
+    @Test
+    public void testGetCalender()  {
+        Response r = new PlannedGridMeasuresResource().getCalender("LET_ME_IN");
+        assertNotNull( r );
+    }
+
+
+
 }
