diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 6d9d81c..e07753c 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -9,6 +9,8 @@
 import { Globals } from './common/globals';
 import { BaseDataLoaderService } from './services/jobs/base-data-loader.service';
 import { MessageService, MessageDefines } from './services/message.service';
+import { JwtHelper } from 'angular2-jwt';
+import { User } from './model/user';
 
 @Component({
   selector: 'app-root',
@@ -25,12 +27,12 @@
     private sessionContext: SessionContext,
     private messageService: MessageService) {
 
-      this.http.get('assets/settings.json')
+    this.http.get('assets/settings.json')
       .subscribe(res => this.sessionContext.settings = res.json());
 
-      this.sessionContext.centralHttpResultCode$.subscribe(rc => {
-        this.onRcFromHttpService(rc);
-      });
+    this.sessionContext.centralHttpResultCode$.subscribe(rc => {
+      this.onRcFromHttpService(rc);
+    });
 
   }
 
@@ -38,36 +40,49 @@
     this.extractTokenFromParameters();
   }
 
-  
+
   /**
    * Extract the params (suscribe to router event) and store them in the sessionContext.
    */
   private extractTokenFromParameters() {
     this.activatedRoute.params.subscribe((params: Params) => {
-    this.sessionContext.setAccessToken(JSON.stringify(this.getParametersFromUrl()));
-      console.log(this.sessionContext.getAccessToken());
+      const accessToken = JSON.stringify(this.getParametersFromUrl());
+      const jwtHelper: JwtHelper = new JwtHelper();
+      const decoded: any = jwtHelper.decodeToken(accessToken);
+      const user: User = new User();
+      user.username = decoded.preferred_username;
+      user.itemName = decoded.preferred_username;
+      user.name = decoded.given_name + ' ' + decoded.family_name;      
+      
+       if (decoded.realm_access.roles.filter(s => s === Globals.OAUTH2CONF_SUPERUSER_ROLE).length >= 1) {
+        user.specialUser = true;
+       }
+      
+      this.sessionContext.setCurrUser(user);
+      this.sessionContext.setAccessToken(accessToken);      
     });
+
     this.messageService.loginLogoff$.emit(MessageDefines.MSG_LOG_IN_SUCCEEDED);
   }
 
- private  getParametersFromUrl() {
+  private getParametersFromUrl() {
     const parameter = window.location.search.substr(1);
     return parameter != null && parameter !== '' ? this.readParamAccessToken(parameter) : {};
-}
+  }
 
-private  readParamAccessToken( prmstr ) {
-  const params = {};
-  const prmarr = prmstr.split('&');
-  for ( let i = 0; i < prmarr.length; i++) {
+  private readParamAccessToken(prmstr) {
+    const params = {};
+    const prmarr = prmstr.split('&');
+    for (let i = 0; i < prmarr.length; i++) {
       const tmparr = prmarr[i].split('=');
       params[tmparr[0]] = tmparr[1];
+    }
+    return params['accessToken'];
   }
-  return params['accessToken'];
-}
 
-//TODO redirect to Portal as login component has been removed.
-//handle different adresses for redirect (test, local, production environment)
-private onRcFromHttpService(rc: number): void {
+  //TODO redirect to Portal as login component has been removed.
+  //handle different adresses for redirect (test, local, production environment)
+  private onRcFromHttpService(rc: number): void {
     if (rc === 401) {
       this.router.navigate(['/XXX']);
     }
