diff --git a/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealm.java b/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealm.java
index 5a44a7d..88e5932 100644
--- a/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealm.java
+++ b/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealm.java
@@ -27,30 +27,22 @@
  */
 public class LoginRealm extends AppservRealm {
 
-	
-	
 	private final static String JAAS_CONTEXT = "jaas-context";
 	private final static String AUTH_TYPE = "WebAuthorization";
-	
-	
-	
+
 	@Override
 	public String getAuthType() {
 		return AUTH_TYPE;
 	}
 
-	
-	
 	@Override
 	public Enumeration<?> getGroupNames(String username) throws InvalidOperationException, NoSuchUserException {
 		return null;
 	}
-	
-	
-	
+
 	@Override
 	protected void init(Properties props) throws BadRealmException, NoSuchRealmException {
-		if(!props.containsKey(JAAS_CONTEXT)) {
+		if (!props.containsKey(JAAS_CONTEXT)) {
 			throw new BadRealmException("mandatory property with name '" + JAAS_CONTEXT + "' not found!");
 		}
 		String jaasContext = props.getProperty(JAAS_CONTEXT);
diff --git a/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealmModule.java b/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealmModule.java
index 870c3cd..a8b79ee 100644
--- a/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealmModule.java
+++ b/org.eclipse.mdm.realm.login.glassfish/src/main/java/org/eclipse/mdm/realm/login/glassfish/LoginRealmModule.java
@@ -35,112 +35,106 @@
 
 /**
  * Login Module for Glassfish
+ * 
  * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
  *
  */
 public class LoginRealmModule implements LoginModule {
-	
+
 	private final static String MDM_GROUP = "MDM";
-	
-	private Subject subject;	
+
+	private Subject subject;
 	private String username = null;
 	private String password = null;
 	private String realm = null;
 
 	private Principal principal = null;
 	private Group group = null;
-	
+
 	private boolean phase1Succeeded = false;
 	private boolean phase2Succeeded = false;
-	
+
 	private Object connector = null;
 	private Object entityManagerList = null;
-	
-	
-	
+
 	@Override
 	public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
 			Map<String, ?> options) {
-		this.subject = subject;		
+		this.subject = subject;
 	}
 
-	
-	
 	@Override
-	public boolean login() throws LoginException {		
-		try {		
+	public boolean login() throws LoginException {
+		try {
 			PasswordCredential passwordCredential = lookupPasswordCredential(this.subject);
-			
+
 			this.realm = passwordCredential.getRealm();
 			this.username = passwordCredential.getUser();
 			this.password = String.valueOf(passwordCredential.getPassword());
-					
+
 			Object connectorService = getConnector();
 			Method connectionMethod = connector.getClass().getMethod("connect", String.class, String.class);
-			this.entityManagerList = connectionMethod.invoke(connectorService, username, password);		
+			this.entityManagerList = connectionMethod.invoke(connectorService, username, password);
 			this.phase1Succeeded = true;
-			
-		} catch(NoSuchMethodException | InvocationTargetException | IllegalAccessException | RuntimeException e) {
+
+		} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | RuntimeException e) {
 			throw new LoginException(e.getMessage());
-		}				
+		}
 		return true;
 	}
 
-	
-	
 	@SuppressWarnings("unchecked")
 	@Override
 	public boolean commit() throws LoginException {
-		
+
 		try {
-			
-			if(!this.phase1Succeeded) {
+
+			if (!this.phase1Succeeded) {
 				return false;
 			}
-	
-			if(this.entityManagerList != null && ((List<Object>)this.entityManagerList).size() > 0) {
-				
+
+			if (this.entityManagerList != null && ((List<Object>) this.entityManagerList).size() > 0) {
+
 				PrincipalGroupFactory factory = Globals.getDefaultHabitat().getService(PrincipalGroupFactory.class);
-				
+
 				this.principal = createPrincipal(factory);
 				this.group = createGroup(factory);
-				
+
 				Set<Principal> principalSet = this.subject.getPrincipals();
-				
-				if(!principalSet.contains(this.principal)) {
+
+				if (!principalSet.contains(this.principal)) {
 					principalSet.add(this.principal);
 				}
-				
-				if(!principalSet.contains(this.group)) {
+
+				if (!principalSet.contains(this.group)) {
 					principalSet.add(this.group);
 				}
-				
+
 				Object connectorService = getConnector();
-				Method regConnectionMethod = connector.getClass().getMethod("registerConnections", Principal.class, List.class);
+				Method regConnectionMethod = connector.getClass().getMethod("registerConnections", Principal.class,
+						List.class);
 				regConnectionMethod.invoke(connectorService, this.principal, this.entityManagerList);
-				
+
 				this.phase2Succeeded = true;
 			} else {
 				throw new LoginException("unable to connect '" + this.username + "'");
 			}
-			
+
 			return true;
-		} catch(NoSuchMethodException | InvocationTargetException | IllegalAccessException | RuntimeException e) {
+		} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | RuntimeException e) {
 			throw new LoginException(e.getMessage());
-		} finally {			
+		} finally {
 			this.username = null;
-			this.password = null;		
+			this.password = null;
 		}
 	}
 
-	
-	
 	@Override
 	public boolean abort() throws LoginException {
-		
-		if(!this.phase1Succeeded) {
+
+		if (!this.phase1Succeeded) {
 			return false;
-		} else if(this.phase2Succeeded && !this.phase2Succeeded) {
+		} else if (this.phase2Succeeded && !this.phase2Succeeded) {
 			this.phase1Succeeded = false;
 			this.username = null;
 			this.password = null;
@@ -150,90 +144,79 @@
 			logout();
 		}
 		return true;
-		
+
 	}
 
-	
-	
 	@SuppressWarnings("unchecked")
 	@Override
 	public boolean logout() throws LoginException {
-		
+
 		try {
-		
+
 			Object connectorService = getConnector();
 			Method disconnectMethod = connectorService.getClass().getMethod("disconnect", Principal.class);
 			disconnectMethod.invoke(connectorService, this.principal);
-			
-			((List<Object>)this.entityManagerList).clear();
-		    
+
+			((List<Object>) this.entityManagerList).clear();
+
 			this.subject.getPrincipals().clear();
-		    this.subject.getPublicCredentials().clear();
-		    this.subject.getPrivateCredentials().clear();
-		    
-		    this.username = null;
+			this.subject.getPublicCredentials().clear();
+			this.subject.getPrivateCredentials().clear();
+
+			this.username = null;
 			this.password = null;
 			this.principal = null;
 			this.group = null;
-		    
-		    this.phase1Succeeded = false;
-		    this.phase2Succeeded = false;
-		    
+
+			this.phase1Succeeded = false;
+			this.phase2Succeeded = false;
+
 			return true;
-			
-		} catch(NoSuchMethodException | InvocationTargetException | IllegalAccessException | RuntimeException e) {
+
+		} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | RuntimeException e) {
 			throw new LoginException(e.getMessage());
 		}
 	}
 
-	
-	
 	private Principal createPrincipal(PrincipalGroupFactory factory) throws LoginException {
-		try {			
+		try {
 			Realm realmInstance = Realm.getInstance(this.realm);
 			return factory.getPrincipalInstance(this.username, realmInstance.getName());
-		} catch(NoSuchRealmException e) {
-			throw new LoginException(e.getMessage());
-		}		 
-	}
-	
-	
-	
-	private Group createGroup(PrincipalGroupFactory factory) throws LoginException {
-		try {			
-			Realm realmInstance = Realm.getInstance(this.realm);
-			return factory.getGroupInstance(MDM_GROUP, realmInstance.getName());
-		} catch(NoSuchRealmException e) {
-			throw new LoginException(e.getMessage());
-		}
-	}
-	
-	
-	
-	private PasswordCredential lookupPasswordCredential(Subject subject) throws LoginException {
-		Set<Object> privateCredentials = subject.getPrivateCredentials();
-		for(Object privateCredential : privateCredentials) {
-			if(privateCredential instanceof PasswordCredential) {				
-				return ((PasswordCredential)privateCredential);
-			}
-		}		
-		throw new LoginException("password credential not found!");
-	}
-		
-	
-	
-	private Object getConnector() throws LoginException {
-		try {
-			if(this.connector == null) {
-				String JNDIName = "java:global/org.eclipse.mdm.nucleus/ConnectorService!org.eclipse.mdm.connector.boundary.ConnectorService";
-				InitialContext initialContext = new InitialContext();		
-				this.connector = initialContext.lookup(JNDIName); 
-			}
-			return this.connector;
-		} catch(NamingException e) {
+		} catch (NoSuchRealmException e) {
 			throw new LoginException(e.getMessage());
 		}
 	}
 
+	private Group createGroup(PrincipalGroupFactory factory) throws LoginException {
+		try {
+			Realm realmInstance = Realm.getInstance(this.realm);
+			return factory.getGroupInstance(MDM_GROUP, realmInstance.getName());
+		} catch (NoSuchRealmException e) {
+			throw new LoginException(e.getMessage());
+		}
+	}
+
+	private PasswordCredential lookupPasswordCredential(Subject subject) throws LoginException {
+		Set<Object> privateCredentials = subject.getPrivateCredentials();
+		for (Object privateCredential : privateCredentials) {
+			if (privateCredential instanceof PasswordCredential) {
+				return ((PasswordCredential) privateCredential);
+			}
+		}
+		throw new LoginException("password credential not found!");
+	}
+
+	private Object getConnector() throws LoginException {
+		try {
+			if (this.connector == null) {
+				String JNDIName = "java:global/org.eclipse.mdm.nucleus/ConnectorService!org.eclipse.mdm.connector.boundary.ConnectorService";
+				InitialContext initialContext = new InitialContext();
+				this.connector = initialContext.lookup(JNDIName);
+			}
+			return this.connector;
+		} catch (NamingException e) {
+			throw new LoginException(e.getMessage());
+		}
+	}
 
 }
