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 3510ff0..9d98f86 100644
--- a/src/main/java/org/eclipse/openk/core/controller/GridMeasureBackendController.java
+++ b/src/main/java/org/eclipse/openk/core/controller/GridMeasureBackendController.java
@@ -142,27 +142,6 @@
         return gridMeasure;
     }
 
-    public List getGridMeasuresByUser(String user) {
-
-        List<TblGridMeasure> tblGridMeasuresList = new ArrayList<>();
-        List<GridMeasure> gridMeasuresList = new ArrayList<>();
-
-        try (AutoCloseEntityManager em = createEm()) {
-            em.getTransaction().begin();
-            TblGridMeasureDao gmDao = createTblGridMeasureDao(em);
-
-            GridMeasureMapper gmMapper = new GridMeasureMapper();
-            tblGridMeasuresList = gmDao.getGridMeasuresByUserName(user);
-            em.getTransaction().commit();
-
-            for (TblGridMeasure tgm : tblGridMeasuresList) {
-                GridMeasure vm = gmMapper.mapToVModel(tgm);
-                gridMeasuresList.add(vm);
-            }
-        }
-        return gridMeasuresList;
-    }
-
     public List<HGridMeasure> getHistoricalStatusChangesById(Integer gmId)  {
 
         List<HGridMeasure> hGridMeasures = new java.util.ArrayList<>();
diff --git a/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java b/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java
index c03a9b8..0e79f53 100644
--- a/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java
+++ b/src/main/java/org/eclipse/openk/resources/PlannedGridMeasuresResource.java
@@ -123,7 +123,7 @@
                 .getGridMeasures(modusr, filterObjectPro));
     }
 
-    @ApiOperation(value = "Get grid measure", notes = "This service retrieves a grid measure from the database using the id")
+    @ApiOperation(value = "Get grid measure", notes = "This service retrieves a grid measure from the database using the id and a filter-object")
     @ApiResponses( value ={ @ApiResponse(code = 200, message = "OK", response = GridMeasure.class,reference = "#/definitions/GridMeasure") } )
     @GET
     @Path("/getGridMeasure/{id}")
@@ -138,7 +138,7 @@
                 .getGridMeasureById(Integer.parseInt(id)));
     }
 
-    @ApiOperation(value = "Get grid measure by user", notes = "This service retrieves all grid measures with the current user as creator or modifier from the database")
+    /*@ApiOperation(value = "Get grid measure by user", notes = "This service retrieves all grid measures with the current user as creator or modifier from the database")
     @ApiResponses( value ={ @ApiResponse(code = 200, message = "OK", response = GridMeasure.class,reference = "#/definitions/GridMeasure") } )
     @GET
     @Path("/getGridMeasuresByUser")
@@ -149,7 +149,7 @@
                                    @HeaderParam(Globals.KEYCLOAK_AUTH_TAG) String jwt){
         return invokeRunnable(jwt, SecureType.NORMAL, modusr -> new GridMeasureBackendController()
                 .getGridMeasuresByUser(modusr));
-    }
+    }*/
 
 
     @ApiOperation(value = "Get Current Reminders", notes = "This service retrieves a list of Gridmeasure-Ids")
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 3523492..cb6284b 100644
--- a/src/test/java/org/eclipse/openk/core/controller/GridMeasureBackendControllerTest.java
+++ b/src/test/java/org/eclipse/openk/core/controller/GridMeasureBackendControllerTest.java
@@ -304,12 +304,19 @@
         expect(dao.getGridMeasuresByStatusId(anyInt())).andReturn(mList).anyTimes();
         expect(dao.getGridMeasuresExcludingStatusInTx(anyInt())).andReturn(mList).anyTimes();
         expect(dao.getGridMeasuresExcludingStatusInTx(anyInt(), anyInt())).andReturn(mList).anyTimes();
+
+        expect(dao.getGridMeasuresByUserName(anyString())).andReturn(mList).anyTimes();
+        expect(dao.getGridMeasuresByUserNameExcludingStatus(anyString(),anyInt())).andReturn(mList).anyTimes();
+        expect(dao.getGridMeasuresByUserNameExcludingStatus(anyString(),anyInt(), anyInt())).andReturn(mList).anyTimes();
+
         expect(dao.getMailAddressesFromGridmeasures()).andReturn(mailAddressesList).anyTimes();
         replay( dao );
         verify( dao );
         return dao;
     }
 
+
+
     private TblGridMeasureDao createTblGridMeasureDaoStatus() {
 
         java.util.List<TblGridMeasure> mList = new ArrayList<TblGridMeasure>();
@@ -737,13 +744,18 @@
 
     }
 
-/*    @Ignore
+    @Ignore
     @Test
     public void testGetGridMeasures() throws Exception {
         TblGridMeasureDao dao = createTblGridMeasureDao();
         tbc.tblGridMeasureDao = dao;
 
-        List<GridMeasure> retList = tbc.getGridMeasures(null);
+        FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(false);
+        filterObject.setCanceledStatusActive(false);
+        filterObject.setClosedStatusActive(false);
+
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
         List<TblGridMeasure> orgList = dao.getGridMeasuresInTx();
         assertEquals(orgList.size(), retList.size());
         assertEquals(orgList.get(2).getId(), retList.get(2).getId());
@@ -751,16 +763,16 @@
         assertEquals(orgList.get(0).getTitle(), retList.get(0).getTitle());
     }
 
-    @Ignore
     @Test
     public void testGetGridMeasuresWithFilter() throws Exception {
         TblGridMeasureDao dao = createTblGridMeasureDao();
         tbc.tblGridMeasureDao = dao;
         FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(false);
         filterObject.setCanceledStatusActive(true);
         filterObject.setClosedStatusActive(true);
 
-        List<GridMeasure> retList = tbc.getGridMeasures(filterObject);
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
         List<TblGridMeasure> orgList = dao.getGridMeasuresInTx();
         assertEquals(orgList.size(), retList.size());
         assertEquals(orgList.get(2).getId(), retList.get(2).getId());
@@ -768,50 +780,110 @@
         assertEquals(orgList.get(0).getTitle(), retList.get(0).getTitle());
     }
 
-    @Ignore
     @Test
     public void testGetGridMeasuresWithFilterWithoutClosed() throws Exception {
         TblGridMeasureDao dao = createTblGridMeasureDao();
         tbc.tblGridMeasureDao = dao;
         FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(false);
         filterObject.setCanceledStatusActive(true);
         filterObject.setClosedStatusActive(false);
 
-        List<GridMeasure> retList = tbc.getGridMeasures(filterObject);
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo",filterObject);
         List<TblGridMeasure> orgList = dao.getGridMeasuresExcludingStatusInTx(PlgmProcessState.CLOSED.getStatusValue());
         assertEquals(orgList.size(), retList.size());
         assertEquals(orgList.get(2).getId(), retList.get(2).getId());
     }
 
-    @Ignore
     @Test
     public void testGetGridMeasuresWithFilterWithoutCanceled() throws Exception {
         TblGridMeasureDao dao = createTblGridMeasureDao();
         tbc.tblGridMeasureDao = dao;
         FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(false);
         filterObject.setCanceledStatusActive(false);
         filterObject.setClosedStatusActive(true);
 
-        List<GridMeasure> retList = tbc.getGridMeasures(filterObject);
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
         List<TblGridMeasure> orgList = dao.getGridMeasuresExcludingStatusInTx(PlgmProcessState.CANCELED.getStatusValue());
         assertEquals(orgList.size(), retList.size());
         assertEquals(orgList.get(2).getId(), retList.get(2).getId());
     }
 
-    @Ignore
     @Test
     public void testGetGridMeasuresWithFilterWithoutCanceledAndClosed() throws Exception {
         TblGridMeasureDao dao = createTblGridMeasureDao();
         tbc.tblGridMeasureDao = dao;
         FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(false);
         filterObject.setCanceledStatusActive(false);
         filterObject.setClosedStatusActive(false);
 
-        List<GridMeasure> retList = tbc.getGridMeasures(filterObject);
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
         List<TblGridMeasure> orgList = dao.getGridMeasuresExcludingStatusInTx(PlgmProcessState.CANCELED.getStatusValue(), PlgmProcessState.CLOSED.getStatusValue());
         assertEquals(orgList.size(), retList.size());
         assertEquals(orgList.get(2).getId(), retList.get(2).getId());
-    }*/
+    }
+
+    @Test
+    public void testGetGridMeasuresOnlyUsersGMs() throws Exception {
+        TblGridMeasureDao dao = createTblGridMeasureDao();
+        tbc.tblGridMeasureDao = dao;
+        FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(true);
+        filterObject.setCanceledStatusActive(true);
+        filterObject.setClosedStatusActive(true);
+
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
+        List<TblGridMeasure> orgList = dao.getGridMeasuresByUserName("testhugo");
+        assertEquals(orgList.size(), retList.size());
+        assertEquals(orgList.get(2).getId(), retList.get(2).getId());
+    }
+
+    @Test
+    public void testGetGridMeasuresOnlyUsersGMsWithoutClosed() throws Exception {
+        TblGridMeasureDao dao = createTblGridMeasureDao();
+        tbc.tblGridMeasureDao = dao;
+        FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(true);
+        filterObject.setCanceledStatusActive(true);
+        filterObject.setClosedStatusActive(false);
+
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
+        List<TblGridMeasure> orgList = dao.getGridMeasuresByUserName("testhugo");
+        assertEquals(orgList.size(), retList.size());
+        assertEquals(orgList.get(2).getId(), retList.get(2).getId());
+    }
+
+    @Test
+    public void testGetGridMeasuresOnlyUsersGMsWithoutCanceled() throws Exception {
+        TblGridMeasureDao dao = createTblGridMeasureDao();
+        tbc.tblGridMeasureDao = dao;
+        FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(true);
+        filterObject.setCanceledStatusActive(false);
+        filterObject.setClosedStatusActive(true);
+
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
+        List<TblGridMeasure> orgList = dao.getGridMeasuresByUserName("testhugo");
+        assertEquals(orgList.size(), retList.size());
+        assertEquals(orgList.get(2).getId(), retList.get(2).getId());
+    }
+
+    @Test
+    public void testGetGridMeasuresOnlyUsersGMsWithoutCanceledAndClosed() throws Exception {
+        TblGridMeasureDao dao = createTblGridMeasureDao();
+        tbc.tblGridMeasureDao = dao;
+        FilterObject filterObject = new FilterObject();
+        filterObject.setOnlyUsersGMsDesired(true);
+        filterObject.setCanceledStatusActive(false);
+        filterObject.setClosedStatusActive(false);
+
+        List<GridMeasure> retList = tbc.getGridMeasures("testhugo", filterObject);
+        List<TblGridMeasure> orgList = dao.getGridMeasuresByUserName("testhugo");
+        assertEquals(orgList.size(), retList.size());
+        assertEquals(orgList.get(2).getId(), retList.get(2).getId());
+    }
 
     @Test
     public void testGetGridMeasureById() throws Exception {
