Merge branch 'DEVELOP_BE' of ssh://git.eclipse.org:29418/elogbook/authandauth into DEVELOP_BE
diff --git a/pom.xml b/pom.xml
index 3467b1a..3151c18 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>openk.pta.de</groupId>
     <artifactId>portal</artifactId>
-    <version>1.0.1</version>
+    <version>1.0.2</version>
     <packaging>war</packaging>
 
     <properties>
diff --git a/src/main/asciidoc/interfaceDocumentation/auth_n_auth_interfaceDocumentation.adoc b/src/main/asciidoc/interfaceDocumentation/auth_n_auth_interfaceDocumentation.adoc
index d72f38e..8db2339 100644
--- a/src/main/asciidoc/interfaceDocumentation/auth_n_auth_interfaceDocumentation.adoc
+++ b/src/main/asciidoc/interfaceDocumentation/auth_n_auth_interfaceDocumentation.adoc
@@ -348,5 +348,44 @@
 
 *Remarks*:
 
+=== Get health state
+This service returns the health state of this module.
+
+*URL:* /healthcheck/pretty=true
+
+*Method:* GET
+
+
+
+*Request-Headers*:
+
+* Authorization – none
+
+
+*Produces*: application/json
+
+*Response*:
+
+If the module is healthy then...
+[source,json]
+----
+{"Keycloak present":{"healthy":true}}
+----
+
+If the module is *not* healthy...
+[source,json]
+----
+{
+    "Keycloak present":
+    {
+        "healthy":false,
+        "message":"<Error message>"
+    }
+}
+----
+
+
+*Remarks*:
+
 
 
diff --git a/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java
index 4b4d853..d33c9b2 100644
--- a/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java
+++ b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java
@@ -39,13 +39,8 @@
     public String getUsername() { return username; }
     public void setUsername(String username) { this.username = username; }
 
-    public boolean getEnabled() { return enabled; }
-    public void setEnabled(boolean enabled) { this.enabled = enabled; }
-
-    public boolean getTotp() { return totp; }
     public void setTotp(boolean totp) { this.totp = totp; }
 
-    public boolean getEmailVerified() { return emailVerified; }
     public void setEmailVerified(boolean emailVerified) { this.emailVerified = emailVerified; }
 
     public String getFirstName() { return firstName; }
diff --git a/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java b/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java
index be182d5..404045d 100644
--- a/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java
+++ b/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java
@@ -28,7 +28,6 @@
 import java.lang.reflect.Type;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.util.Base64;
 import java.util.List;
 import org.apache.log4j.Logger;
 import org.eclipse.openk.portal.common.BackendConfig;
@@ -45,11 +44,20 @@
 
   public static JwtToken login(String user, String password) throws PortalInternalServerError {
     String token = sendPost(BackendConfig.getInstance().getAuthServerUrl() + "auth/realms/" +
-            BackendConfig.getInstance().getKeycloakRealm() + "/protocol/openid-connect/token",
-        "username=" + user + "&password=" + password + "&client_id=" + BackendConfig.getInstance().getKeycloakClient() + "&grant_type=password");
+                    BackendConfig.getInstance().getKeycloakRealm() + "/protocol/openid-connect/token",
+            "username=" + user + "&password=" + password + "&client_id="
+                    + BackendConfig.getInstance().getKeycloakClient() + "&grant_type=password");
     return getJwtTokenFromJson(token);
   }
 
+  public static boolean serviceAvailable() throws PortalInternalServerError {
+    String jsonRet = sendGet(BackendConfig.getInstance().getAuthServerUrl() + "auth/realms/" +
+                    BackendConfig.getInstance().getKeycloakRealm(), "", null);
+
+    return jsonRet != null ? jsonRet.contains("realm") && jsonRet.contains(BackendConfig.getInstance().getKeycloakRealm())
+                           : false;
+  }
+
   public static List<KeyCloakUser> getUsers(JwtToken jwtToken, int maxUsers) throws PortalInternalServerError {
     String users = sendGet(BackendConfig.getInstance().getAuthServerUrl() + "auth/admin/realms/" + BackendConfig.getInstance().getKeycloakRealm() + "/users?max="+maxUsers,
         MediaType.APPLICATION_JSON, jwtToken.getAccessToken());
diff --git a/src/main/java/org/eclipse/openk/portal/controller/BackendController.java b/src/main/java/org/eclipse/openk/portal/controller/BackendController.java
index e46a4c5..caf8388 100644
--- a/src/main/java/org/eclipse/openk/portal/controller/BackendController.java
+++ b/src/main/java/org/eclipse/openk/portal/controller/BackendController.java
@@ -16,10 +16,8 @@
 import org.eclipse.openk.portal.auth2.model.JwtToken;
 import org.eclipse.openk.portal.auth2.model.KeyCloakUser;
 import org.eclipse.openk.portal.auth2.util.JwtHelper;
-import org.eclipse.openk.portal.common.BackendConfig;
 import org.eclipse.openk.portal.common.JsonGeneratorBase;
 import org.eclipse.openk.portal.exceptions.PortalException;
-import org.eclipse.openk.portal.exceptions.PortalInternalServerError;
 import org.eclipse.openk.portal.exceptions.PortalUnauthorized;
 import org.eclipse.openk.portal.viewmodel.LoginCredentials;
 import org.eclipse.openk.portal.viewmodel.UserCache;
diff --git a/src/main/java/org/eclipse/openk/portal/controller/ControllerImplementations.java b/src/main/java/org/eclipse/openk/portal/controller/ControllerImplementations.java
index c343d29..8d3fb8e 100644
--- a/src/main/java/org/eclipse/openk/portal/controller/ControllerImplementations.java
+++ b/src/main/java/org/eclipse/openk/portal/controller/ControllerImplementations.java
@@ -29,8 +29,6 @@
 
     public static class GetUsers extends BackendInvokable {
 
-        public GetUsers() {}
-
         @Override
         public Response invoke() throws PortalException {
             List<KeyCloakUser> keyCloakUserList = UserCache.getInstance().getKeyCloakUsers();
diff --git a/src/main/java/org/eclipse/openk/portal/health/base/HealthCheck.java b/src/main/java/org/eclipse/openk/portal/health/base/HealthCheck.java
new file mode 100644
index 0000000..f6bc66c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/portal/health/base/HealthCheck.java
@@ -0,0 +1,17 @@
+/*
+ ******************************************************************************
+ * Copyright © 2017-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.portal.health.base;
+
+public abstract class HealthCheck {
+
+    protected abstract Result check() throws Exception; // NOSONAR
+}
diff --git a/src/main/java/org/eclipse/openk/portal/health/base/HealthChecker.java b/src/main/java/org/eclipse/openk/portal/health/base/HealthChecker.java
new file mode 100644
index 0000000..34ebd90
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/portal/health/base/HealthChecker.java
@@ -0,0 +1,47 @@
+/*
+ ******************************************************************************
+ * Copyright © 2017-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.portal.health.base;
+
+import org.apache.log4j.Logger;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+public class HealthChecker {
+    private static final Logger logger = Logger.getLogger(HealthChecker.class);
+
+    private List<HealthCheck> registeredHealthChecks = new LinkedList<>();
+    private Map<HealthCheck, String> namingMap = new HashMap<>();
+
+    public void register( String title, HealthCheck hc ) {
+        namingMap.put(hc, title);
+        registeredHealthChecks.add(hc);
+    }
+
+    public List<NamedHealthCheckResult> performHealthChecks() {
+        List<NamedHealthCheckResult> hcList = new LinkedList<>();
+        for( HealthCheck hc : registeredHealthChecks) {
+            try {
+                hcList.add(new NamedHealthCheckResult(namingMap.get(hc), hc.check()));
+
+            } catch (Throwable t) { // NOSONAR  we definately want to catch everything here!!!
+                logger.error("Error during healthcheck", t);
+                hcList.add(new NamedHealthCheckResult(namingMap.get(hc),
+                        Result.unhealthy("Exception during test: "+t+" -> See Log!")));
+            }
+        }
+        return hcList;
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/portal/health/base/NamedHealthCheckResult.java b/src/main/java/org/eclipse/openk/portal/health/base/NamedHealthCheckResult.java
new file mode 100644
index 0000000..9726cb9
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/portal/health/base/NamedHealthCheckResult.java
@@ -0,0 +1,53 @@
+/*
+ ******************************************************************************
+ * Copyright © 2017-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.portal.health.base;
+
+import com.google.gson.GsonBuilder;
+
+import java.util.List;
+
+public class NamedHealthCheckResult {
+    private String name;
+    private Result result;
+
+    public NamedHealthCheckResult( String name, Result result ) {
+        this.name = name;
+        this.result = result;
+    }
+
+    public String toJson() {
+        StringBuffer buffer = new StringBuffer(); // NOSONAR - _fd we don't a new dependency because of this
+        buffer.append("\""+name+"\":");
+        buffer.append(new GsonBuilder().disableHtmlEscaping().create().toJson(result));
+        return buffer.toString();
+    }
+
+    public static String toJson(List<NamedHealthCheckResult> resultArray ) {
+        StringBuilder builder = new StringBuilder();
+        builder.append('{');
+        for( int i=0; i < resultArray.size(); i++ ) {
+            builder.append(resultArray.get(i).toJson());
+            if( i+1 < resultArray.size() ) {
+                builder.append(',');
+            }
+        }
+        return builder.append('}').toString();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Result getResult() {
+        return result;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/portal/health/base/Result.java b/src/main/java/org/eclipse/openk/portal/health/base/Result.java
new file mode 100644
index 0000000..6ff7de7
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/portal/health/base/Result.java
@@ -0,0 +1,41 @@
+/*
+ ******************************************************************************
+ * Copyright © 2017-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.portal.health.base;
+
+
+public class Result {
+    private boolean healthy;
+    private String message;
+
+    private Result() {}
+
+    public static Result healthy() {
+        Result res = new Result();
+        res.healthy = true;
+        return res;
+    }
+
+    public static Result unhealthy(String message) {
+        Result res = new Result();
+        res.healthy = false;
+        res.message = message;
+        return res;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public boolean isHealthy() {
+        return healthy;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/portal/health/impl/KeyCloakPresentHealthCheck.java b/src/main/java/org/eclipse/openk/portal/health/impl/KeyCloakPresentHealthCheck.java
new file mode 100644
index 0000000..80a7b52
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/portal/health/impl/KeyCloakPresentHealthCheck.java
@@ -0,0 +1,37 @@
+/*
+ ******************************************************************************
+ * Copyright © 2017-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.portal.health.impl;
+
+import org.eclipse.openk.portal.auth2.util.JwtHelper;
+import org.eclipse.openk.portal.common.BackendConfig;
+import org.eclipse.openk.portal.exceptions.PortalInternalServerError;
+import org.eclipse.openk.portal.health.base.HealthCheck;
+import org.eclipse.openk.portal.health.base.Result;
+
+public class KeyCloakPresentHealthCheck extends HealthCheck {
+
+    protected boolean checkit() throws PortalInternalServerError {
+        return JwtHelper.serviceAvailable();
+    }
+
+    @Override
+    protected Result check() throws Exception {
+        if( checkit() ) {
+            return Result.healthy();
+        }
+        else {
+            BackendConfig gc = BackendConfig.getInstance();
+            String msg = gc.getAuthServerUrl() + "/" + gc.getKeycloakRealm();
+            return Result.unhealthy("KeyCloak-Service not available: "+msg);
+        }
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/portal/rest/BackendRestService.java b/src/main/java/org/eclipse/openk/portal/rest/BackendRestService.java
index 532349d..79ce8e8 100644
--- a/src/main/java/org/eclipse/openk/portal/rest/BackendRestService.java
+++ b/src/main/java/org/eclipse/openk/portal/rest/BackendRestService.java
@@ -11,7 +11,8 @@
 */
 package org.eclipse.openk.portal.rest;
 
-import javax.ws.rs.PathParam;
+import javax.ws.rs.*;
+
 import org.apache.log4j.Logger;
 import org.eclipse.openk.portal.auth2.model.JwtToken;
 import org.eclipse.openk.portal.common.Globals;
@@ -24,14 +25,11 @@
 import org.eclipse.openk.portal.exceptions.PortalException;
 import org.eclipse.openk.portal.exceptions.PortalExceptionMapper;
 import org.eclipse.openk.portal.exceptions.PortalUnauthorized;
+import org.eclipse.openk.portal.health.base.HealthChecker;
+import org.eclipse.openk.portal.health.base.NamedHealthCheckResult;
+import org.eclipse.openk.portal.health.impl.KeyCloakPresentHealthCheck;
 import org.eclipse.openk.portal.viewmodel.VersionInfo;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
@@ -137,6 +135,23 @@
         return invoke(accessToken, false, new ControllerImplementations.GetUsers());
     }
 
+    @GET
+    @Path("/healthcheck")
+    @Produces("application/json")
+    public Response getHealthCheck(@FormParam(value = "pretty") boolean yn) {
+        HealthChecker hc = new HealthChecker();
+        hc.register("Keycloak present", new KeyCloakPresentHealthCheck());
+
+        String returnJson = NamedHealthCheckResult.toJson(hc.performHealthChecks());
+
+        try {
+            return ResponseBuilderWrapper.INSTANCE.buildOKResponse(returnJson);
+        } catch (PortalException e) {
+            logger.error("unexpected error", e);
+            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+        }
+    }
+
     private boolean isBackdoor( String sessionId ) {
         // backdoor is only available when the version(POM) contains "DEVELOP" or "SNAPSHOT"
         return DEVELOP_MODE && LET_ME_IN.equals(sessionId);
diff --git a/src/main/resources/moduleConfigDevServer.json b/src/main/resources/moduleConfigDevServer.json
index 9ee6421..4c5eef2 100644
--- a/src/main/resources/moduleConfigDevServer.json
+++ b/src/main/resources/moduleConfigDevServer.json
@@ -45,5 +45,14 @@
     "link": "http://172.18.22.160:8880/plannedGridMeasures",
     "pictureLink": "https://www.openkonsequenz.de//components/com_flexicontent/librairies/phpthumb/phpThumb.php?src=/medien/cache/main_image/l_ok_module5.jpg",
     "requiredRole": "planned-policies-access"
+  },
+  {
+    "name": "Geplante Maßnahmen (Web)",
+    "cols": 1,
+    "rows": 1,
+    "color": "#ffffff",
+    "link": "http://87.128.212.254:8880/plannedGridMeasures",
+    "pictureLink": "https://www.openkonsequenz.de//components/com_flexicontent/librairies/phpthumb/phpThumb.php?src=/medien/cache/main_image/l_ok_module5.jpg",
+    "requiredRole": "planned-policies-access"
   }
 ]
diff --git a/src/test/java/org/eclipse/openk/portal/common/BackendConfigTest.java b/src/test/java/org/eclipse/openk/portal/common/BackendConfigTest.java
index 6b53881..4efadc9 100644
--- a/src/test/java/org/eclipse/openk/portal/common/BackendConfigTest.java
+++ b/src/test/java/org/eclipse/openk/portal/common/BackendConfigTest.java
@@ -20,15 +20,15 @@
     @Test
     public void testConfig() {
         BackendConfig bc = BackendConfig.getInstance();
-        assertEquals( (int)bc.getInternalSessionLengthMillis(), 3600000 );
-        assertEquals( (int)bc.getReloadUsersInSec(), 300 );
-        assertEquals( bc.getAuthServerUrl(), "http://entjava002:8080/");
-        assertEquals( bc.getKeycloakRealm(), "elogbook");
-        assertEquals( bc.getKeycloakClient(),"elogbook-backend");
-        assertEquals( bc.getKeycloakAdmin(), "admin");
-        assertEquals( bc.getKeycloakPW(), "nimda");
-        assertEquals( BackendConfig.getConfigFileName(), "backendConfigDevLocal.json");
+        assertEquals( 3600000, (int)bc.getInternalSessionLengthMillis() );
+        assertEquals( 300 , (int)bc.getReloadUsersInSec());
+        assertEquals( "http://entjava002:8080/", bc.getAuthServerUrl() );
+        assertEquals( "elogbook", bc.getKeycloakRealm());
+        assertEquals( "elogbook-backend", bc.getKeycloakClient());
+        assertEquals( "admin", bc.getKeycloakAdmin() );
+        assertEquals( "nimda", bc.getKeycloakPW() );
+        assertEquals( "backendConfigDevLocal.json", BackendConfig.getConfigFileName() );
         BackendConfig.setConfigFileName("backendConfigProduction.json");
-        assertEquals( BackendConfig.getConfigFileName(), "backendConfigProduction.json");
+        assertEquals( "backendConfigProduction.json", BackendConfig.getConfigFileName() );
     }
 }
diff --git a/src/test/java/org/eclipse/openk/portal/common/util/ResourceLoaderBaseTest.java b/src/test/java/org/eclipse/openk/portal/common/util/ResourceLoaderBaseTest.java
index f53ff8c..9d888ef 100644
--- a/src/test/java/org/eclipse/openk/portal/common/util/ResourceLoaderBaseTest.java
+++ b/src/test/java/org/eclipse/openk/portal/common/util/ResourceLoaderBaseTest.java
@@ -21,6 +21,6 @@
     public void testloadStringFromResourceError() {
         ResourceLoaderBase rlb = new ResourceLoaderBase();
         String str = rlb.loadStringFromResource("UNKNOWN_FILE");
-        assertEquals(str, "");
+        assertEquals("", str);
     }
 }
diff --git a/src/test/java/org/eclipse/openk/portal/controller/BaseWebServiceTest.java b/src/test/java/org/eclipse/openk/portal/controller/BaseWebServiceTest.java
index 8f0cea6..10a17dc 100644
--- a/src/test/java/org/eclipse/openk/portal/controller/BaseWebServiceTest.java
+++ b/src/test/java/org/eclipse/openk/portal/controller/BaseWebServiceTest.java
@@ -83,7 +83,7 @@
 
 		ti.exceptionToThrow = new PortalBadRequest();
 		Response ret = tws.invoke("ssess", false, ti);
-		Assert.assertEquals(ret.getStatus(), Globals.HTTPSTATUS_BAD_REQUEST);
+		Assert.assertEquals(Globals.HTTPSTATUS_BAD_REQUEST, ret.getStatus());
 	}
 
 	@Test
@@ -93,7 +93,7 @@
 
 		ti.throwRuntime = true;
 		Response ret = tws.invoke("ssess",  false, ti);
-		assertEquals(ret.getStatus(), Globals.HTTPSTATUS_INTERNAL_SERVER_ERROR);
+		assertEquals(Globals.HTTPSTATUS_INTERNAL_SERVER_ERROR, ret.getStatus());
 	}
 
 	@Test
@@ -102,7 +102,7 @@
 		TestInvokable ti = new TestInvokable();
 		tws.throwUnauthException = true;
 		Response ret = tws.invoke("ssess",  false, ti);
-		assertEquals(ret.getStatus(), Globals.HTTPSTATUS_UNAUTHORIZED);
+		assertEquals(Globals.HTTPSTATUS_UNAUTHORIZED, ret.getStatus());
 	}
 
 	@Test
@@ -252,8 +252,8 @@
 
 		Response ret = tws.invoke("ssess",  false, ti);
 		assertTrue(ti.isInvoked);
-		assertEquals(tws.sessionId, "ssess");
-		assertEquals(ret.getStatus(), 666);
+		assertEquals("ssess", tws.sessionId);
+		assertEquals(666, ret.getStatus() );
 
 	}
 
diff --git a/src/test/java/org/eclipse/openk/portal/controller/ResponseBuilderWrapperTest.java b/src/test/java/org/eclipse/openk/portal/controller/ResponseBuilderWrapperTest.java
index 03906d6..a64e04e 100644
--- a/src/test/java/org/eclipse/openk/portal/controller/ResponseBuilderWrapperTest.java
+++ b/src/test/java/org/eclipse/openk/portal/controller/ResponseBuilderWrapperTest.java
@@ -27,16 +27,16 @@
         String json = "{ 'ret' : 'OK' }";
         Response.ResponseBuilder rb = ResponseBuilderWrapper.INSTANCE.getResponseBuilder( json );
         Response resp = rb.build();
-        assertEquals(resp.getStatus(), Globals.HTTPSTATUS_OK );
+        assertEquals(Globals.HTTPSTATUS_OK, resp.getStatus());
     }
 
     @Test
     public void testBuildOkResponse() throws PortalException {
         String json = "{ 'test' : 'Value' }";
         Response resp = ResponseBuilderWrapper.INSTANCE.buildOKResponse( json );
-        assertEquals( resp.getStatus(), Globals.HTTPSTATUS_OK );
+        assertEquals( Globals.HTTPSTATUS_OK, resp.getStatus());
 
         resp = ResponseBuilderWrapper.INSTANCE.buildOKResponse(json, "ssess");
-        assertEquals( resp.getStatus(), Globals.HTTPSTATUS_OK);
+        assertEquals( Globals.HTTPSTATUS_OK, resp.getStatus());
     }
 }
diff --git a/src/test/java/org/eclipse/openk/portal/controller/TokenManagerTest.java b/src/test/java/org/eclipse/openk/portal/controller/TokenManagerTest.java
index 00bff61..1c31de2 100644
--- a/src/test/java/org/eclipse/openk/portal/controller/TokenManagerTest.java
+++ b/src/test/java/org/eclipse/openk/portal/controller/TokenManagerTest.java
@@ -54,7 +54,7 @@
 
         HashMap<String, TokenManager.SessionItem> regMap = Whitebox.getInternalState(sessione, "registry");
 
-        assertEquals(regMap.size(), 3);
+        assertEquals(3, regMap.size());
         assertTrue(regMap.containsKey("HUGO1"));
         assertTrue(regMap.containsKey(specialToken.getAccessToken()));
         assertTrue(regMap.containsKey("HUGO3"));
@@ -77,14 +77,14 @@
         assertEquals( sit1.getSessionCreationTime()+200, sit1.getSessionLastAccessTime());
         sit1.setUser(null);
         assertNull(sit1.getUser());
-        assertEquals(sit1.getSessionId(), "HUGO1");
+        assertEquals("HUGO1", sit1.getSessionId() );
         sit1.setCookieToken("CaptainCookie");
-        assertEquals(sit1.getCookieToken(), "CaptainCookie");
+        assertEquals("CaptainCookie", sit1.getCookieToken());
 
         TokenManager.getInstance().logout("HUGO1");
-        assertEquals(regMap.size(), 2);
+        assertEquals(2, regMap.size());
         TokenManager.getInstance().logout( "FAKE");
-        assertEquals(regMap.size(), 2);
+        assertEquals(2, regMap.size());
 
 
         // session out of time
diff --git a/src/test/java/org/eclipse/openk/portal/exceptions/PortalExceptionsTest.java b/src/test/java/org/eclipse/openk/portal/exceptions/PortalExceptionsTest.java
index ef2b754..5cdf190 100644
--- a/src/test/java/org/eclipse/openk/portal/exceptions/PortalExceptionsTest.java
+++ b/src/test/java/org/eclipse/openk/portal/exceptions/PortalExceptionsTest.java
@@ -20,11 +20,11 @@
 
     @Test
     public void testConstructors() {
-        assertEquals(new PortalBadRequest().getHttpStatus(), Globals.HTTPSTATUS_BAD_REQUEST);
-        assertEquals(new PortalForbidden().getHttpStatus(), Globals.HTTPSTATUS_FORBIDDEN);
-        assertEquals(new PortalInternalServerError(null, null).getHttpStatus(), Globals.HTTPSTATUS_INTERNAL_SERVER_ERROR);
-        assertEquals(new PortalNotFound().getHttpStatus(), Globals.HTTPSTATUS_NOT_FOUND);
-        assertEquals(new PortalUnauthorized().getHttpStatus(), Globals.HTTPSTATUS_UNAUTHORIZED);
+        assertEquals(Globals.HTTPSTATUS_BAD_REQUEST, new PortalBadRequest().getHttpStatus() );
+        assertEquals(Globals.HTTPSTATUS_FORBIDDEN, new PortalForbidden().getHttpStatus());
+        assertEquals(Globals.HTTPSTATUS_INTERNAL_SERVER_ERROR, new PortalInternalServerError(null, null).getHttpStatus());
+        assertEquals(Globals.HTTPSTATUS_NOT_FOUND, new PortalNotFound().getHttpStatus());
+        assertEquals(Globals.HTTPSTATUS_UNAUTHORIZED, new PortalUnauthorized().getHttpStatus());
     }
 
 
diff --git a/src/test/java/org/eclipse/openk/portal/health/base/HealthCheckerTest.java b/src/test/java/org/eclipse/openk/portal/health/base/HealthCheckerTest.java
new file mode 100644
index 0000000..87aed26
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/portal/health/base/HealthCheckerTest.java
@@ -0,0 +1,93 @@
+/*
+ ******************************************************************************
+ * 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.portal.health.base;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.*;
+
+public class HealthCheckerTest {
+    public boolean hc1Called;
+    public boolean hc2Called;
+    public boolean hc3Called;
+
+    @Before
+    public void init() {
+        hc1Called = false;
+        hc2Called = false;
+        hc3Called = false;
+    }
+
+    @Test
+    public void test_ok() {
+        HealthCheck hc1 = new HealthCheck() {
+
+            @Override
+            protected Result check() throws Exception {
+                hc1Called = true;
+                return Result.healthy();
+            }
+        };
+
+        HealthCheck hc2 = new HealthCheck() {
+            @Override
+            protected Result check() throws Exception {
+                hc2Called = true;
+                return Result.unhealthy("because of...");
+            }
+        };
+
+        HealthChecker theChecker = new HealthChecker();
+        theChecker.register("firstTest", hc1 );
+        theChecker.register( "secondTest", hc2 );
+
+        List<NamedHealthCheckResult> retList = theChecker.performHealthChecks();
+
+        assertEquals( 2, retList.size() );
+        assertTrue( hc1Called );
+        assertTrue( hc2Called );
+        assertNull( retList.get(0).getResult().getMessage());
+        assertNotNull( retList.get(1).getResult().getMessage());
+        assertEquals( "firstTest", retList.get(0).getName());
+        assertEquals( "secondTest", retList.get(1).getName());
+        assertTrue( retList.get(0).getResult().isHealthy());
+        assertFalse( retList.get(1).getResult().isHealthy());
+    }
+
+    @Test
+    public void test_nok() {
+        HealthCheck hc1 = new HealthCheck() {
+
+            @Override
+            protected Result check() throws Exception {
+                hc3Called = true;
+                throw new Exception("Error in healthCheck");
+            }
+        };
+
+
+        HealthChecker theChecker = new HealthChecker();
+        theChecker.register("errorTest", hc1 );
+
+        List<NamedHealthCheckResult> retList = theChecker.performHealthChecks();
+
+        assertEquals( 1, retList.size() );
+        assertTrue( hc3Called );
+        assertNotNull( retList.get(0).getResult().getMessage());
+        assertFalse( retList.get(0).getResult().isHealthy());
+
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/portal/health/base/NamedHealthCheckResultTest.java b/src/test/java/org/eclipse/openk/portal/health/base/NamedHealthCheckResultTest.java
new file mode 100644
index 0000000..0fdd4e7
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/portal/health/base/NamedHealthCheckResultTest.java
@@ -0,0 +1,25 @@
+package org.eclipse.openk.portal.health.base;
+
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class NamedHealthCheckResultTest {
+    @Test
+    public void testAll() {
+        NamedHealthCheckResult h1 = new NamedHealthCheckResult("Uno", Result.healthy());
+        NamedHealthCheckResult h2 = new NamedHealthCheckResult("Due", Result.unhealthy("Darum"));
+
+        assertEquals("\"Uno\":{\"healthy\":true}", h1.toJson());
+        assertEquals("\"Due\":{\"healthy\":false,\"message\":\"Darum\"}", h2.toJson());
+
+        List<NamedHealthCheckResult> lista = new LinkedList<>();
+        lista.add(h1);
+        lista.add(h2);
+        assertEquals( "{\"Uno\":{\"healthy\":true},\"Due\":{\"healthy\":false,\"message\":\"Darum\"}}",
+                NamedHealthCheckResult.toJson(lista));
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/portal/health/base/ResultTest.java b/src/test/java/org/eclipse/openk/portal/health/base/ResultTest.java
new file mode 100644
index 0000000..9379922
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/portal/health/base/ResultTest.java
@@ -0,0 +1,20 @@
+package org.eclipse.openk.portal.health.base;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class ResultTest {
+
+    @Test
+    public void testAll() {
+        Result res1 = Result.healthy();
+        Result res2 = Result.unhealthy("Msg");
+
+        assertTrue(res1.isHealthy());
+        assertFalse(res2.isHealthy());
+        assertNull(res1.getMessage());
+        assertNotNull(res2.getMessage());
+
+    }
+}
diff --git a/src/test/java/org/eclipse/openk/portal/health/impl/KeyCloakPresentHealthCheckTest.java b/src/test/java/org/eclipse/openk/portal/health/impl/KeyCloakPresentHealthCheckTest.java
new file mode 100644
index 0000000..1727b6a
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/portal/health/impl/KeyCloakPresentHealthCheckTest.java
@@ -0,0 +1,37 @@
+package org.eclipse.openk.portal.health.impl;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.powermock.reflect.Whitebox;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class KeyCloakPresentHealthCheckTest {
+    private KeyCloakPresentHealthCheck hc;
+
+    @Before
+    public void init() {
+        hc = new KeyCloakPresentHealthCheck() {
+            public boolean checkit;
+
+            @Override
+            protected boolean checkit() {
+                return checkit;
+            }
+        };
+    }
+
+    @Test
+    public void testOk() throws Exception {
+        Whitebox.setInternalState(hc, "checkit", true);
+        assertTrue(hc.check().isHealthy());
+    }
+
+    @Test
+    public void testNok() throws Exception {
+        Whitebox.setInternalState(hc, "checkit", false);
+        assertFalse(hc.check().isHealthy());
+    }
+
+}
diff --git a/src/test/java/org/eclipse/openk/portal/viewmodel/ErrorReturnTest.java b/src/test/java/org/eclipse/openk/portal/viewmodel/ErrorReturnTest.java
index 09bee1f..b4ba312 100644
--- a/src/test/java/org/eclipse/openk/portal/viewmodel/ErrorReturnTest.java
+++ b/src/test/java/org/eclipse/openk/portal/viewmodel/ErrorReturnTest.java
@@ -28,7 +28,7 @@
 		String json = super.loadStringFromResource("testErrorReturn.json");
 		ErrorReturn errRet = getGson().fromJson(json, ErrorReturn.class);
 		assertFalse(errRet.getErrorText().isEmpty());
-		assertEquals(errRet.getErrorCode(), 999);
+		assertEquals(999, errRet.getErrorCode());
 	}
 
 	@Test
diff --git a/src/test/java/org/eclipse/openk/portal/viewmodel/GeneralReturnItemTest.java b/src/test/java/org/eclipse/openk/portal/viewmodel/GeneralReturnItemTest.java
index 19516de..217cd7d 100644
--- a/src/test/java/org/eclipse/openk/portal/viewmodel/GeneralReturnItemTest.java
+++ b/src/test/java/org/eclipse/openk/portal/viewmodel/GeneralReturnItemTest.java
@@ -27,7 +27,7 @@
 	public void TestStructureAgainstJson() {
 		String json = super.loadStringFromResource("testGeneralReturnItem.json");
 		GeneralReturnItem gRRet = JsonGeneratorBase.getGson().fromJson(json, GeneralReturnItem.class);
-		assertEquals(gRRet.getRet(), "It works!");
+		assertEquals("It works!", gRRet.getRet());
 	}
 
 	@Test
diff --git a/src/test/java/org/eclipse/openk/portal/viewmodel/LoginCredentialsTest.java b/src/test/java/org/eclipse/openk/portal/viewmodel/LoginCredentialsTest.java
index 46d132a..d6ad438 100644
--- a/src/test/java/org/eclipse/openk/portal/viewmodel/LoginCredentialsTest.java
+++ b/src/test/java/org/eclipse/openk/portal/viewmodel/LoginCredentialsTest.java
@@ -24,8 +24,8 @@
 	public void testStructureAgainstJson() {
 		String json = super.loadStringFromResource("testLoginCredentials.json");
 		LoginCredentials lc = JsonGeneratorBase.getGson().fromJson(json, LoginCredentials.class);
-		assertEquals(lc.getUserName(), "Carlo");
-		assertEquals(lc.getPassword(), "Cottura");
+		assertEquals("Carlo", lc.getUserName() );
+		assertEquals("Cottura", lc.getPassword());
 	}
 
 	@Test
diff --git a/src/test/java/org/eclipse/openk/portal/viewmodel/UserModuleTest.java b/src/test/java/org/eclipse/openk/portal/viewmodel/UserModuleTest.java
index ea6b126..ead9bd4 100644
--- a/src/test/java/org/eclipse/openk/portal/viewmodel/UserModuleTest.java
+++ b/src/test/java/org/eclipse/openk/portal/viewmodel/UserModuleTest.java
@@ -20,17 +20,17 @@
     @Test
     public void testModuleConfigProduction() {
         UserModule[] um = UserModule.getInstance();
-        assertEquals( um[0].getModuleName(), "Betriebstagebuch");
-        assertEquals( um[0].getColor(), "#ffffff");
-        assertEquals( (long)um[0].getCols(), 1);
-        assertEquals( (long)um[0].getRows(), 1);
-        assertEquals( um[0].getLink(), "http://localhost:4200/");
-        assertEquals( um[0].getPictureLink(), "https://www.openkonsequenz.de/medien/cache/main_image/m_logbuch_2443636.jpg");
-        assertEquals( um[0].getRequiredRole(), "elogbook-access");
+        assertEquals( "Betriebstagebuch", um[0].getModuleName() );
+        assertEquals( "#ffffff", um[0].getColor() );
+        assertEquals( 1, (long)um[0].getCols() );
+        assertEquals( 1, (long)um[0].getRows() );
+        assertEquals( "http://localhost:4200/", um[0].getLink() );
+        assertEquals( "https://www.openkonsequenz.de/medien/cache/main_image/m_logbuch_2443636.jpg", um[0].getPictureLink() );
+        assertEquals( "elogbook-access", um[0].getRequiredRole() );
 
-        assertEquals( UserModule.getConfigFileName(), "moduleConfigDevLocal.json");
+        assertEquals( "moduleConfigDevLocal.json", UserModule.getConfigFileName());
         UserModule.setConfigFileName("moduleConfigDevLocal.json");
-        assertEquals( UserModule.getConfigFileName(), "moduleConfigDevLocal.json");
+        assertEquals( "moduleConfigDevLocal.json", UserModule.getConfigFileName() );
     }
 
 }