diff --git a/nae.json b/nae.json
index 377ed82d78..f8e92209eb 100644
--- a/nae.json
+++ b/nae.json
@@ -48,6 +48,11 @@
                 "name": "filter",
                 "address": "http://localhost:8080/api/",
                 "format": "json"
+            },
+            {
+                "name": "impersonation",
+                "address": "http://localhost:8080/api/",
+                "format": "json"
             }
         ]
     },
@@ -164,6 +169,17 @@
                 "path": "recover/:token"
             }
         },
+        "demo-impersonation": {
+            "component": {
+                "class": "ImpersonationDemoComponent",
+                "from": "./doc/impersonation-demo/impersonation-demo.component"
+            },
+            "access": "private",
+            "navigation": true,
+            "routing": {
+                "path": "impersonation-view"
+            }
+        },
         "demo-drawer": {
             "component": {
                 "class": "DrawerExampleComponent",
@@ -216,7 +232,9 @@
                         "from": "./doc/workflow-view-example/workflow-view-example.component"
                     },
                     "access": {
-                        "authority": ["ROLE_ADMIN"]
+                        "authority": [
+                            "ROLE_ADMIN"
+                        ]
                     },
                     "navigation": {
                         "title": "Workflow view",
diff --git a/projects/nae-example-app/src/app/app.module.ts b/projects/nae-example-app/src/app/app.module.ts
index fbb2a08c88..f66b6b7259 100644
--- a/projects/nae-example-app/src/app/app.module.ts
+++ b/projects/nae-example-app/src/app/app.module.ts
@@ -98,6 +98,7 @@ import { WrapperEmptyViewComponent } from './views/wrapper/wrapper-empty-view.co
 import {DoubleDrawerExampleComponent} from './doc/double-drawer-example/double-drawer-example.component';
 import { PublicSingleTaskViewComponent } from './doc/public-single-task-view/public-single-task-view.component';
 import { BreadcrumbsExampleComponent } from './doc/breadcrumbs-example/breadcrumbs-example.component';
+import {ImpersonationDemoComponent} from './doc/impersonation-demo/impersonation-demo.component';
 
 export function HttpLoaderFactory(http: HttpClient) {
     return new TranslateHttpLoader(http);
@@ -130,6 +131,7 @@ export function HttpLoaderFactory(http: HttpClient) {
         DashboardExampleComponent,
         FilterRepositoryExampleComponent,
         ProfileComponent,
+        ImpersonationDemoComponent,
         NavigationExampleComponent,
         ButtonsNavComponent,
         RolesAssignComponent,
diff --git a/projects/nae-example-app/src/app/doc/drawer-example/drawer-example.component.html b/projects/nae-example-app/src/app/doc/drawer-example/drawer-example.component.html
index 720d54b6af..ba3c9b5002 100644
--- a/projects/nae-example-app/src/app/doc/drawer-example/drawer-example.component.html
+++ b/projects/nae-example-app/src/app/doc/drawer-example/drawer-example.component.html
@@ -1,4 +1,4 @@
-<nc-navigation-drawer #sidenav [fixed]="fixed" [user]="true" [quickPanel]="true" [navigation]="true"
+<nc-navigation-drawer #sidenav [fixed]="fixed" [user]="true" [quickPanel]="true" [navigation]="true" [panelItems]="['language', 'settings', 'logout', 'impersonation']"
                        (openedChange)="openStatusChanged($event)">
 
     <div fxLayout="column" fxLayoutAlign="start start" style="padding: 16px; height: 1000px;">
diff --git a/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.html b/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.html
new file mode 100644
index 0000000000..369812408a
--- /dev/null
+++ b/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.html
@@ -0,0 +1,3 @@
+<button (click)="impersonate()">IMPERSONATE</button>
+
+<button (click)="stopImpersonate()">STOP IMPERSONATE</button>
diff --git a/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.scss b/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.spec.ts b/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.spec.ts
new file mode 100644
index 0000000000..dedc1adf9d
--- /dev/null
+++ b/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.spec.ts
@@ -0,0 +1,25 @@
+import {waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
+import {ImpersonationDemoComponent} from './impersonation-demo.component';
+
+
+describe('ImpersonationDemoComponent', () => {
+  let component: ImpersonationDemoComponent;
+  let fixture: ComponentFixture<ImpersonationDemoComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      declarations: [ ImpersonationDemoComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ImpersonationDemoComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.ts b/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.ts
new file mode 100644
index 0000000000..fc77cd5b0a
--- /dev/null
+++ b/projects/nae-example-app/src/app/doc/impersonation-demo/impersonation-demo.component.ts
@@ -0,0 +1,29 @@
+import {Component, OnInit} from '@angular/core';
+import {ImpersonationService, ImpersonationUserSelectService, LoggerService} from '@netgrif/components-core';
+
+@Component({
+    selector: 'nae-app-impersonation-demo',
+    templateUrl: './impersonation-demo.component.html',
+    styleUrls: ['./impersonation-demo.component.scss']
+})
+export class ImpersonationDemoComponent {
+
+    constructor(
+        private _impersonationSelect: ImpersonationUserSelectService,
+        private _impersonation: ImpersonationService,
+        private _log: LoggerService,
+    ) {
+        this._impersonation.impersonating$.subscribe((isImpersonating: boolean) => {
+            this._log.debug("Is impersonating " + isImpersonating);
+        });
+    }
+
+    public impersonate(): void {
+        this._impersonationSelect.selectImpersonate();
+    }
+
+    public stopImpersonate(): void {
+        this._impersonation.cease();
+    }
+
+}
diff --git a/projects/nae-example-app/src/app/nae-example-app-view.service.ts b/projects/nae-example-app/src/app/nae-example-app-view.service.ts
index 11000737c3..4da0090089 100644
--- a/projects/nae-example-app/src/app/nae-example-app-view.service.ts
+++ b/projects/nae-example-app/src/app/nae-example-app-view.service.ts
@@ -39,6 +39,7 @@ import {WrapperEmptyViewComponent} from './views/wrapper/wrapper-empty-view.comp
 import {DoubleDrawerExampleComponent} from './doc/double-drawer-example/double-drawer-example.component';
 import {PublicSingleTaskViewComponent} from './doc/public-single-task-view/public-single-task-view.component';
 import {BreadcrumbsExampleComponent} from './doc/breadcrumbs-example/breadcrumbs-example.component';
+import {ImpersonationDemoComponent} from './doc/impersonation-demo/impersonation-demo.component';
 
 @Injectable({
     providedIn: 'root'
@@ -48,6 +49,7 @@ export class NaeExampleAppViewService extends ViewService {
         // This class is managed by schematics. Do not modify it by hand.
         // If you want to add views to the application run the 'create-view' schematic.
         super([
+            {id: 'ImpersonationDemoComponent', class: ImpersonationDemoComponent},
             {id: 'BreadcrumbsExampleComponent', class: BreadcrumbsExampleComponent},
             {id: 'TitleConfigComponent', class: TitleConfigComponent},
             {id: 'PublicSingleTaskViewComponent', class: PublicSingleTaskViewComponent},
diff --git a/projects/netgrif-components-core/src/assets/i18n/de.json b/projects/netgrif-components-core/src/assets/i18n/de.json
index 1a295dee7b..fda9b56a95 100644
--- a/projects/netgrif-components-core/src/assets/i18n/de.json
+++ b/projects/netgrif-components-core/src/assets/i18n/de.json
@@ -109,6 +109,12 @@
         "option-selector": {
             "select": "Auswählen",
             "choose-one-option": "Wählen Sie eine Option aus"
+        },
+        "impersonation": {
+            "title": "Benutzer vertreten",
+            "submit": "Vertreten",
+            "cease": "Vertretung abbrechen",
+            "impersonating": "in Vertretung als"
         }
     },
     "search": {
@@ -457,5 +463,16 @@
     },
     "dynamicNavigation": {
         "couldNotResolveView": "Ein Fehler ist aufgetreten während des Ansichtauflösungsprocess. Der Ansicht kann nicht angezeigt werden"
+    },
+    "impersonation": {
+        "user": {
+            "successfullyRepresented": "Benutzer wird jetzt vertreten",
+            "currentlyAlreadyRepresented": "Für den Benutzer existiert bereits eine Vertretung",
+            "currentlyLogged": "Benutzer ist bereits angemeldet"
+        },
+        "action": {
+            "failed": "Aktion ist fehlgeschlagen",
+            "deactivated": "Vertretung wurde erfolgreich deaktiviert"
+        }
     }
 }
diff --git a/projects/netgrif-components-core/src/assets/i18n/en.json b/projects/netgrif-components-core/src/assets/i18n/en.json
index bce48f62f7..d62284dd22 100644
--- a/projects/netgrif-components-core/src/assets/i18n/en.json
+++ b/projects/netgrif-components-core/src/assets/i18n/en.json
@@ -109,6 +109,12 @@
         "option-selector": {
             "select": "Select",
             "choose-one-option": "Choose one of the provided options"
+        },
+        "impersonation": {
+            "title": "Impersonate user",
+            "submit": "Impersonate",
+            "cease": "Cancel impersonation",
+            "impersonating": "impersonating"
         }
     },
     "search": {
@@ -457,5 +463,16 @@
     },
     "dynamicNavigation": {
         "couldNotResolveView": "An error has occurred during the view resolution process. The view could not be displayed"
+    },
+    "impersonation": {
+        "user": {
+            "successfullyRepresented": "User successfully represented",
+            "currentlyAlreadyRepresented": "User is already being represented by someone else",
+            "currentlyLogged": "User is currently logged in"
+        },
+        "action": {
+            "failed": "Action failed",
+            "deactivated": "Representation was successfully deactivated"
+        }
     }
 }
diff --git a/projects/netgrif-components-core/src/assets/i18n/sk.json b/projects/netgrif-components-core/src/assets/i18n/sk.json
index 5560c6fdc0..f38ef39e09 100644
--- a/projects/netgrif-components-core/src/assets/i18n/sk.json
+++ b/projects/netgrif-components-core/src/assets/i18n/sk.json
@@ -109,6 +109,12 @@
         "option-selector": {
             "select": "Zvoliť",
             "choose-one-option": "Vyberte jednu z možností"
+        },
+        "impersonation": {
+            "title": "Zastúpenie používateľa",
+            "submit": "Zastúpiť",
+            "cease": "Zrušiť zastúpenie",
+            "impersonating": "v zastúpení"
         }
     },
     "search": {
@@ -457,5 +463,16 @@
     },
     "dynamicNavigation": {
         "couldNotResolveView": "Počas načítania zobrazenia sa vyskytla chyba. Zobrazenie nie je možné zobraziť"
+    },
+    "impersonation": {
+        "user": {
+            "successfullyRepresented": "Používateľ bol úspešne zastúpený",
+            "currentlyAlreadyRepresented": "Používateľ je momentálne zastupovaný",
+            "currentlyLogged": "Používateľ je momentálne prihlásený"
+        },
+        "action": {
+            "failed": "Akciu sa nepodarilo vykonať",
+            "deactivated": "Zastupovanie bolo úspešne deaktivované"
+        }
     }
 }
diff --git a/projects/netgrif-components-core/src/lib/authentication/models/user.transformer.ts b/projects/netgrif-components-core/src/lib/authentication/models/user.transformer.ts
index fc87921153..8a61e5ddde 100644
--- a/projects/netgrif-components-core/src/lib/authentication/models/user.transformer.ts
+++ b/projects/netgrif-components-core/src/lib/authentication/models/user.transformer.ts
@@ -24,7 +24,8 @@ export class UserTransformer implements Transformer<UserResource, User> {
             this.transformAuthorities(user.authorities),
             user.processRoles,
             groups,
-            user.nextGroups);
+            user.nextGroups,
+            user.impersonated ? this.transform(user.impersonated) : undefined);
 
     }
 
diff --git a/projects/netgrif-components-core/src/lib/authentication/public-api.ts b/projects/netgrif-components-core/src/lib/authentication/public-api.ts
index f17499ed0b..d2d9a4ca4a 100644
--- a/projects/netgrif-components-core/src/lib/authentication/public-api.ts
+++ b/projects/netgrif-components-core/src/lib/authentication/public-api.ts
@@ -12,6 +12,8 @@ export * from './authentication.factory';
 
 /* SERVICES */
 export * from './anonymous/anonymous.service';
+export * from './services/anonymous-authentication-interceptor'
+export * from './services/authentication-interceptor'
 
 /* COMPONENTS */
 export * from './components/abstract-authentication-overlay';
diff --git a/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.ts b/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.ts
index bf2c91c338..209fd8189f 100644
--- a/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.ts
+++ b/projects/netgrif-components-core/src/lib/authorization/permission/permission.service.ts
@@ -108,7 +108,7 @@ export class PermissionService {
     public checkUserPerms(users: UserPermissions, permission): boolean | undefined {
         let userPermValue: boolean;
         if (!!users) {
-            const loggedUserId = this._userService.user.id;
+            const loggedUserId = this._userService.user.getSelfOrImpersonated().id;
             Object.keys(users).forEach(user => {
                 if (user === loggedUserId && users[user][permission] !== undefined) {
                     userPermValue = userPermValue === undefined ?
diff --git a/projects/netgrif-components-core/src/lib/configuration/configuration.service.spec.ts b/projects/netgrif-components-core/src/lib/configuration/configuration.service.spec.ts
index c97b762f00..944c5754db 100644
--- a/projects/netgrif-components-core/src/lib/configuration/configuration.service.spec.ts
+++ b/projects/netgrif-components-core/src/lib/configuration/configuration.service.spec.ts
@@ -72,6 +72,11 @@ describe('ConfigurationService', () => {
                         name: 'dashboard',
                         address: 'http://localhost:8080/api/',
                         format: 'json'
+                    },
+                    {
+                        name: 'impersonation',
+                        address: 'http://localhost:8080/api/',
+                        format: 'json'
                     }
                 ]
             });
diff --git a/projects/netgrif-components-core/src/lib/filter/filter.repository.ts b/projects/netgrif-components-core/src/lib/filter/filter.repository.ts
index 4a8b20afc1..eae192747e 100644
--- a/projects/netgrif-components-core/src/lib/filter/filter.repository.ts
+++ b/projects/netgrif-components-core/src/lib/filter/filter.repository.ts
@@ -138,4 +138,11 @@ export class FilterRepository {
         });
         return result;
     }
+
+    /**
+     * Removes all stored filters from the repository
+     */
+    public removeAllFilters(): void {
+        this._filters = new Map<string, Filter>();
+    }
 }
diff --git a/projects/netgrif-components-core/src/lib/impersonation/models/user-impersonate-config-metadata.ts b/projects/netgrif-components-core/src/lib/impersonation/models/user-impersonate-config-metadata.ts
new file mode 100644
index 0000000000..4176a5ce7e
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/models/user-impersonate-config-metadata.ts
@@ -0,0 +1,3 @@
+export interface UserImpersonateConfigMetadata {
+    stringId: string
+}
diff --git a/projects/netgrif-components-core/src/lib/impersonation/models/user-impersonation-constants.ts b/projects/netgrif-components-core/src/lib/impersonation/models/user-impersonation-constants.ts
new file mode 100644
index 0000000000..47097d36c2
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/models/user-impersonation-constants.ts
@@ -0,0 +1,12 @@
+/**
+ * Holds all identifiers of the Impersonation config process in an accessible manner
+ */
+export enum UserImpersonationConstants {
+
+    IMPERSONATION_CONFIG_NET_IDENTIFIER = 'impersonation_config',
+
+    IMPERSONATION_CONFIG_FIELD_IMPERSONATED = 'impersonated',
+    IMPERSONATION_CONFIG_FIELD_ROLES = 'impersonated_roles',
+    IMPERSONATION_CONFIG_FIELD_AUTHS = 'impersonated_authorities',
+
+}
diff --git a/projects/netgrif-components-core/src/lib/impersonation/public-api.ts b/projects/netgrif-components-core/src/lib/impersonation/public-api.ts
new file mode 100644
index 0000000000..78934e3a35
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/public-api.ts
@@ -0,0 +1,9 @@
+/* MODELS */
+export * from './models/user-impersonation-constants';
+export * from './models/user-impersonate-config-metadata';
+
+/* SERVICES */
+export * from './services/impersonation.service';
+export * from './services/impersonation-user-select.service';
+export * from './services/impersonation-user-list.service';
+export * from './services/impersonation-user-resource.service';
diff --git a/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-list.service.ts b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-list.service.ts
new file mode 100644
index 0000000000..8c8cc1fd13
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-list.service.ts
@@ -0,0 +1,18 @@
+import {UserListService} from '../../user/services/user-list.service';
+import {Injectable} from '@angular/core';
+import {SnackBarService} from '../../snack-bar/services/snack-bar.service';
+import {TranslateService} from '@ngx-translate/core';
+import {LoggerService} from '../../logger/services/logger.service';
+import {ImpersonationUserResourceService} from './impersonation-user-resource.service';
+
+@Injectable()
+export class ImpersonationUserListService extends UserListService {
+
+    constructor(_resources: ImpersonationUserResourceService,
+                protected _logService: LoggerService,
+                _snackbar: SnackBarService,
+                _translate: TranslateService) {
+        super(_resources, _logService, _snackbar, _translate);
+    }
+
+}
diff --git a/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-resource.service.ts b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-resource.service.ts
new file mode 100644
index 0000000000..9c5ae65bc2
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-resource.service.ts
@@ -0,0 +1,27 @@
+import {Injectable} from '@angular/core';
+import {UserResourceService} from '../../resources/engine-endpoint/user-resource.service';
+import {ResourceProvider} from '../../resources/resource-provider.service';
+import {ConfigurationService} from '../../configuration/configuration.service';
+import {Params} from '@angular/router';
+import {Observable} from 'rxjs';
+import {Page} from '../../resources/interface/page';
+import {UserResource} from '../../resources/interface/user-resource';
+import {map} from 'rxjs/operators';
+
+@Injectable({
+    providedIn: 'root'
+})
+export class ImpersonationUserResourceService extends UserResourceService {
+
+    protected _IMPERSONATION_SERVER_URL: string;
+
+    constructor(provider: ResourceProvider, configService: ConfigurationService) {
+        super(provider, configService);
+        this._IMPERSONATION_SERVER_URL = this.getResourceAddress('impersonation');
+    }
+
+    public search(body: {fulltext: string}, params?: Params): Observable<Page<UserResource>> {
+        return this._resourceProvider.post$('/impersonate/search', this._IMPERSONATION_SERVER_URL, {query: body.fulltext}, params)
+            .pipe(map((r) => this.getResourcePage<UserResource>(r, 'users')));
+    }
+}
diff --git a/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-select.service.ts b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-select.service.ts
new file mode 100644
index 0000000000..c28fc4b224
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation-user-select.service.ts
@@ -0,0 +1,76 @@
+import {Inject, Injectable, Optional} from '@angular/core';
+import {ImpersonationService} from "./impersonation.service";
+import {NAE_USER_IMPERSONATE_COMPONENT, NAE_ADMIN_IMPERSONATE_COMPONENT} from '../../side-menu/content-components/injection-tokens';
+import {LoggerService} from '../../logger/services/logger.service';
+import {SnackBarService} from '../../snack-bar/services/snack-bar.service';
+import {SideMenuService} from '../../side-menu/services/side-menu.service';
+import {SideMenuSize} from '../../side-menu/models/side-menu-size';
+import {UserImpersonateConfigMetadata} from '../models/user-impersonate-config-metadata';
+import {
+    UserImpersonateInjectionData
+} from '../../side-menu/content-components/user-impersonate/model/user-impersonate-injection-data';
+import {SimpleFilter} from '../../filter/models/simple-filter';
+import {UserImpersonationConstants} from '../models/user-impersonation-constants';
+import moment from 'moment';
+import {UserService} from '../../user/services/user.service';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class ImpersonationUserSelectService {
+
+    constructor(protected _log: LoggerService,
+                protected _sideMenuService: SideMenuService,
+                protected _snackBar: SnackBarService,
+                protected _impersonation: ImpersonationService,
+                protected _user: UserService,
+                @Optional() @Inject(NAE_USER_IMPERSONATE_COMPONENT) protected _userImpersonateComponent: any,
+                @Optional() @Inject(NAE_ADMIN_IMPERSONATE_COMPONENT) protected _adminImpersonateComponent: any,
+    ) {}
+
+    /**
+     * Opens side menu with users who can be impersonated by logged user
+     */
+    public selectImpersonate(): void {
+        if (this.isAdmin()) {
+            this._sideMenuService.open(this._adminImpersonateComponent, SideMenuSize.LARGE, this.injectedData()).onClose.subscribe(event => {
+                this._log.debug('Impersonable user select :' + event);
+                if (event.data === undefined) {
+                    return;
+                }
+                this._impersonation.impersonateUser(event.data._id);
+            });
+        } else {
+            this._sideMenuService.open(this._userImpersonateComponent, SideMenuSize.XL, this.injectedData()).onClose.subscribe(event => {
+                this._log.debug('Impersonable config select :' + event);
+                if (event.data === undefined) {
+                    return;
+                }
+                this._impersonation.impersonateByConfig((event.data as UserImpersonateConfigMetadata).stringId);
+            });
+        }
+    }
+
+    protected injectedData(): UserImpersonateInjectionData {
+        const currentTime = moment();
+        let filterCasesFilter = SimpleFilter.fromCaseQuery({
+            process: {
+                identifier: UserImpersonationConstants.IMPERSONATION_CONFIG_NET_IDENTIFIER
+            },
+            query: `
+            (dataSet.impersonators.keyValue:${this._user.user.id}) AND
+            (dataSet.is_active.booleanValue:true) AND
+            ((!(_exists_:dataSet.valid_from.timestampValue)) OR (dataSet.valid_from.timestampValue:<` + currentTime.valueOf() + `)) AND
+            ((!(_exists_:dataSet.valid_to.timestampValue)) OR (dataSet.valid_to.timestampValue:>${currentTime.valueOf()}))
+            `
+        });
+        return {
+            filter: filterCasesFilter
+        } as UserImpersonateInjectionData
+    }
+
+    protected isAdmin(): boolean {
+        return this._user.hasAuthority('ROLE_ADMIN');
+    }
+
+}
diff --git a/projects/netgrif-components-core/src/lib/impersonation/services/impersonation.service.spec.ts b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation.service.spec.ts
new file mode 100644
index 0000000000..ef4ebbfff0
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation.service.spec.ts
@@ -0,0 +1,151 @@
+import {inject, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {ConfigurationService} from '../../configuration/configuration.service';
+import {TestConfigurationService} from '../../utility/tests/test-config';
+import {NoopAnimationsModule} from '@angular/platform-browser/animations';
+import {ImpersonationService} from './impersonation.service';
+import {UserService} from '../../user/services/user.service';
+import {SnackBarService} from '../../snack-bar/services/snack-bar.service';
+import {FilterRepository} from '../../filter/filter.repository';
+import {LoggerService} from '../../logger/services/logger.service';
+import {TranslateService} from '@ngx-translate/core';
+import {MaterialModule} from '../../material/material.module';
+import {TranslateLibModule} from '../../translate/translate-lib.module';
+import {SnackBarModule} from '../../snack-bar/snack-bar.module';
+import {RouterTestingModule} from '@angular/router/testing';
+import {MockAuthenticationService} from '../../utility/tests/mocks/mock-authentication.service';
+import {MockAuthenticationMethodService} from '../../utility/tests/mocks/mock-authentication-method-service';
+import {AuthenticationService} from '../../authentication/services/authentication/authentication.service';
+import {AuthenticationMethodService} from '../../authentication/services/authentication-method.service';
+import {User} from '../../user/models/user';
+import {ProcessRole} from '../../resources/interface/process-role';
+import {Observable, ReplaySubject} from 'rxjs';
+import {UserPreferenceService} from '../../user/services/user-preference.service';
+import {MockUserPreferenceService} from '../../utility/tests/mocks/mock-user-preference.service';
+
+describe('ImpersonationService', () => {
+    let service: ImpersonationService;
+    let userService: TestUserService;
+
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            imports: [HttpClientTestingModule, MaterialModule, TranslateLibModule, NoopAnimationsModule, SnackBarModule, RouterTestingModule],
+            providers: [
+                SnackBarService,
+                FilterRepository,
+                LoggerService,
+                TranslateService,
+                ImpersonationService,
+                {provide: UserPreferenceService, useClass: MockUserPreferenceService},
+                {provide: UserService, useClass: TestUserService},
+                {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService},
+                {provide: AuthenticationService, useClass: MockAuthenticationService},
+                {provide: ConfigurationService, useClass: TestConfigurationService}]
+        });
+        service = TestBed.inject(ImpersonationService);
+        userService = (TestBed.inject(UserService) as any) as TestUserService;
+    });
+
+    it('should be created', () => {
+        expect(service).toBeTruthy();
+    });
+
+    it('should impersonate user', (done) => {
+            inject([HttpTestingController],
+                (httpMock: HttpTestingController) => {
+                    userService.mimicUserLoaded();
+                    service.impersonating$.subscribe(bool => {
+                        expect(bool).toBeTrue();
+                        done();
+                    })
+                    service.impersonateUser('testId');
+
+                    const reqLog = httpMock.expectOne('http://localhost:8080/api/impersonate/user/testId');
+                    expect(reqLog.request.method).toEqual('POST');
+
+                    reqLog.flush({});
+                })();
+        }
+    );
+
+    it('should impersonate config', (done) => {
+            inject([HttpTestingController],
+                (httpMock: HttpTestingController) => {
+                    userService.mimicUserLoaded();
+                    service.impersonating$.subscribe(bool => {
+                        expect(bool).toBeTrue();
+                        done();
+                    })
+                    service.impersonateByConfig('configId');
+
+                    const reqLog = httpMock.expectOne('http://localhost:8080/api/impersonate/config/configId');
+                    expect(reqLog.request.method).toEqual('POST');
+
+                    reqLog.flush({});
+                })();
+        }
+    );
+
+    it('should stop impersonating', (done) => {
+            inject([HttpTestingController],
+                (httpMock: HttpTestingController) => {
+                    userService.reverse();
+                    userService.mimicUserLoaded();
+
+                    service.impersonating$.subscribe(bool => {
+                        expect(bool).toBeFalse();
+                        done();
+                    })
+                    service.cease();
+
+                    const reqLog = httpMock.expectOne('http://localhost:8080/api/impersonate/clear');
+                    expect(reqLog.request.method).toEqual('POST');
+
+                    reqLog.flush({});
+                })();
+        }
+    );
+
+    afterEach(inject([HttpTestingController], (mock: HttpTestingController) => {
+        mock.verify();
+        TestBed.resetTestingModule();
+    }));
+});
+
+
+class TestUserService {
+
+    protected mockUser$ = new ReplaySubject<User>();
+
+    public userObj = new User('id', 'mail', '', '', [], [{stringId: 'role'} as ProcessRole], [], []);
+    public userObjAfter = new User(
+        this.userObj.id, this.userObj.email, this.userObj.firstName, this.userObj.lastName, this.userObj.authorities, this.userObj.roles, this.userObj.groups, this.userObj.nextGroups,
+        new User('impId', 'mail', '', '', [], [{stringId: 'role'} as ProcessRole], [], [])
+    );
+
+    public get user(): User {
+        return this.userObj;
+    }
+
+    public get user$(): Observable<User> {
+        return this.mockUser$.asObservable();
+    }
+
+    public get anonymousUser$(): Observable<User> {
+        return this.mockUser$.asObservable();
+    }
+
+    public reload(): void {
+        this.mockUser$.next( this.userObjAfter);
+    }
+
+    public mimicUserLoaded(): void {
+        this.mockUser$.next(this.user);
+    }
+
+    public reverse(): void {
+        const temp = this.userObjAfter;
+        this.userObjAfter = this.userObj;
+        this.userObj = temp;
+    }
+}
diff --git a/projects/netgrif-components-core/src/lib/impersonation/services/impersonation.service.ts b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation.service.ts
new file mode 100644
index 0000000000..f585e528d7
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/impersonation/services/impersonation.service.ts
@@ -0,0 +1,96 @@
+import {Injectable, OnDestroy} from '@angular/core';
+import {Router} from '@angular/router';
+import {TranslateService} from '@ngx-translate/core';
+import {AbstractResourceService, ResourceProvider, UserResource} from '../../resources/public-api';
+import {ConfigurationService} from '../../configuration/configuration.service';
+import {UserService} from '../../user/services/user.service';
+import {SnackBarService} from '../../snack-bar/services/snack-bar.service';
+import {FilterRepository} from '../../filter/filter.repository';
+import {LoggerService} from '../../logger/services/logger.service';
+import {Observable, Subject, Subscription} from 'rxjs';
+import {User} from '../../user/models/user';
+
+@Injectable({
+    providedIn: 'root'
+})
+export class ImpersonationService extends AbstractResourceService implements OnDestroy {
+
+    private _impersonating$ = new Subject<boolean>();
+
+    private _lastUser: User;
+    private _sub: Subscription;
+
+    public constructor(protected provider: ResourceProvider,
+                       protected _router: Router,
+                       protected _configService: ConfigurationService,
+                       protected _userService: UserService,
+                       protected _snackbar: SnackBarService,
+                       protected _filter: FilterRepository,
+                       protected _log: LoggerService,
+                       protected _translate: TranslateService) {
+        super('impersonation', provider, _configService);
+        this._sub = this._userService.user$.subscribe(user => this._resolveUserChange(user));
+    }
+
+    public get impersonating$(): Observable<boolean> {
+        return this._impersonating$.asObservable();
+    }
+
+    public impersonateUser(userId: string): void {
+        this.provider.post$('impersonate/user/' + userId, this.SERVER_URL, {}).subscribe((user: UserResource) => {
+            this._resolveSuccess(user);
+        }, (response => {
+            this._resolveError(response);
+        }));
+    }
+
+    public impersonateByConfig(configId: string): void {
+        this.provider.post$('impersonate/config/' + configId, this.SERVER_URL, {}).subscribe((user: UserResource) => {
+            this._resolveSuccess(user);
+        }, (response => {
+            this._resolveError(response);
+        }));
+    }
+
+    public cease(): void {
+        this.provider.post$('impersonate/clear', this.SERVER_URL, {}).subscribe(user => {
+            this._snackbar.openSuccessSnackBar(this._translate.instant('impersonation.action.deactivated'));
+            return this._triggerReload();
+        }, (error => {
+            this._snackbar.openErrorSnackBar(this._translate.instant('impersonation.action.failed'));
+        }));
+    }
+
+    protected _resolveSuccess(user: UserResource) {
+        this._snackbar.openSuccessSnackBar(this._translate.instant('impersonation.user.successfullyRepresented'));
+        this._triggerReload();
+    }
+
+    protected _resolveError(response: any) {
+        if (response.status === 400) {
+            response.error.alreadyImpersonated ?
+                this._snackbar.openErrorSnackBar(this._translate.instant('impersonation.user.currentlyAlreadyRepresented')) :
+                this._snackbar.openErrorSnackBar(this._translate.instant('impersonation.user.currentlyLogged'));
+        } else {
+            this._snackbar.openErrorSnackBar(this._translate.instant('impersonation.action.failed'));
+        }
+    }
+
+    protected _triggerReload(): void {
+        this._userService.reload();
+    }
+
+    protected _resolveUserChange(user: User) {
+        if (this._lastUser && this._lastUser.isImpersonating() != user.isImpersonating()) {
+            this._filter.removeAllFilters();
+            this._impersonating$.next(user.isImpersonating());
+        }
+        this._lastUser = user;
+    }
+
+    ngOnDestroy(): void {
+        if (this._sub) {
+            this._sub.unsubscribe();
+        }
+    }
+}
diff --git a/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.spec.ts b/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.spec.ts
index e39d61716f..e82ec8eb9e 100644
--- a/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.spec.ts
+++ b/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.spec.ts
@@ -30,6 +30,8 @@ import {
     DynamicNavigationRouteProviderService
 } from '../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service';
 import { AuthenticationModule } from '../../authentication/authentication.module';
+import {ImpersonationUserSelectService} from '../../impersonation/services/impersonation-user-select.service';
+import {ImpersonationService} from '../../impersonation/services/impersonation.service';
 
 describe('AbstractNavigationDoubleDrawerComponent', () => {
     let component: TestDrawerComponent;
@@ -105,9 +107,11 @@ class TestDrawerComponent extends AbstractNavigationDoubleDrawerComponent {
                 _log: LoggerService,
                 _config: ConfigurationService,
                 _uriService: UriService,
+                _impersonationUserSelect: ImpersonationUserSelectService,
+                _impersonation: ImpersonationService,
                 _dynamicRouteProviderService: DynamicNavigationRouteProviderService) {
         super(_router, _activatedRoute, _breakpoint, _languageService, _userService, _accessService, _log, _config, _uriService,
-            _dynamicRouteProviderService)
+            _impersonationUserSelect, _impersonation, _dynamicRouteProviderService)
     }
 }
 
diff --git a/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.ts b/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.ts
index f196af29e3..5bdcd6990d 100644
--- a/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.ts
+++ b/projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.ts
@@ -19,6 +19,8 @@ import {User} from "../../user/models/user";
 import {RoleAccess, View} from "../../../commons/schema";
 import {NAE_ROUTING_CONFIGURATION_PATH} from "../../routing/routing-builder/routing-builder.service";
 import {AccessService} from "../../authorization/permission/access.service";
+import {ImpersonationUserSelectService} from '../../impersonation/services/impersonation-user-select.service';
+import {ImpersonationService} from '../../impersonation/services/impersonation.service';
 
 export interface ConfigDoubleMenu {
     mode: MatDrawerMode;
@@ -57,6 +59,7 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
     @Input() includeUser: boolean = true;
     @Input() includeLanguage: boolean = true;
     @Input() includeMoreMenu: boolean = true;
+    @Input() includeImpersonation: boolean = true;
     @Input() allClosable: boolean = true;
     @Input() folderIcon: string = "folder";
     @Input() openedFolderIcon: string = "folder_open";
@@ -121,6 +124,8 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
                           protected _log: LoggerService,
                           protected _config: ConfigurationService,
                           protected _uriService: UriService,
+                          protected _impersonationUserSelect: ImpersonationUserSelectService,
+                          protected _impersonation: ImpersonationService,
                           protected _dynamicRoutingService: DynamicNavigationRouteProviderService) {
         this.leftNodes = new Array<UriNodeResource>();
         this.rightNodes = new Array<UriNodeResource>();
@@ -269,6 +274,14 @@ export abstract class AbstractNavigationDoubleDrawerComponent implements OnInit,
         });
     }
 
+    impersonate(): void {
+        this._impersonationUserSelect.selectImpersonate();
+    }
+
+    stopImpersonating(): void {
+        this._impersonation.cease();
+    }
+
     get user(): User {
         return this._userService.user;
     }
diff --git a/projects/netgrif-components-core/src/lib/navigation/navigation-drawer/abstract-navigation-drawer.component.ts b/projects/netgrif-components-core/src/lib/navigation/navigation-drawer/abstract-navigation-drawer.component.ts
index 7d0df1d65c..dfd86c2e62 100644
--- a/projects/netgrif-components-core/src/lib/navigation/navigation-drawer/abstract-navigation-drawer.component.ts
+++ b/projects/netgrif-components-core/src/lib/navigation/navigation-drawer/abstract-navigation-drawer.component.ts
@@ -47,7 +47,7 @@ export abstract class AbstractNavigationDrawerComponent implements OnInit, After
         this.openedChange = new EventEmitter<boolean>();
         this._fixed = true;
         this.opened = true;
-        this.quickPanelItems = ['language', 'settings', 'logout'];
+        this.quickPanelItems = ['language', 'settings', 'logout', 'impersonation'];
         if (this.userPreferenceService.drawerWidth !== undefined) {
             this.contentWidth = new BehaviorSubject<number>(this.userPreferenceService.drawerWidth);
         } else {
diff --git a/projects/netgrif-components-core/src/lib/navigation/quick-panel/components/abstract-quick-panel.component.ts b/projects/netgrif-components-core/src/lib/navigation/quick-panel/components/abstract-quick-panel.component.ts
index 385e887f4d..c4bce49683 100644
--- a/projects/netgrif-components-core/src/lib/navigation/quick-panel/components/abstract-quick-panel.component.ts
+++ b/projects/netgrif-components-core/src/lib/navigation/quick-panel/components/abstract-quick-panel.component.ts
@@ -3,7 +3,7 @@ import {LanguageService} from '../../../translate/language.service';
 import {PaperViewService} from './paper-view.service';
 import {AbstractNavigationResizableDrawerComponent} from '../../navigation-drawer/abstract-navigation-resizable-drawer.component';
 
-export type QuickPanelItem = 'language' | 'settings' | 'logout';
+export type QuickPanelItem = 'language' | 'settings' | 'logout' | 'impersonation';
 
 @Component({
     selector: 'ncc-abstract-quick-panel',
diff --git a/projects/netgrif-components-core/src/lib/resources/interface/user-resource.ts b/projects/netgrif-components-core/src/lib/resources/interface/user-resource.ts
index 6c44dec3b2..4f13336f87 100644
--- a/projects/netgrif-components-core/src/lib/resources/interface/user-resource.ts
+++ b/projects/netgrif-components-core/src/lib/resources/interface/user-resource.ts
@@ -13,5 +13,6 @@ export interface UserResource extends UserResourceSmall {
     authorities: Array<Authority>;
     nextGroups: Array<string>;
     processRoles: Array<ProcessRole>;
+    impersonated?: UserResource;
     _links?: any;
 }
diff --git a/projects/netgrif-components-core/src/lib/side-menu/content-components/injection-tokens.ts b/projects/netgrif-components-core/src/lib/side-menu/content-components/injection-tokens.ts
index 46ae2c03c0..4168ffa040 100644
--- a/projects/netgrif-components-core/src/lib/side-menu/content-components/injection-tokens.ts
+++ b/projects/netgrif-components-core/src/lib/side-menu/content-components/injection-tokens.ts
@@ -7,3 +7,5 @@ export const NAE_NEW_CASE_COMPONENT = new InjectionToken<ComponentType<unknown>>
 export const NAE_OPTION_SELECTOR_COMPONENT = new InjectionToken<ComponentType<unknown>>('NaeOptionSelectorComponent');
 export const NAE_SAVE_FILTER_COMPONENT = new InjectionToken<ComponentType<unknown>>('NaeSaveFilterComponent');
 export const NAE_LOAD_FILTER_COMPONENT = new InjectionToken<ComponentType<unknown>>('NaeLoadFilterComponent');
+export const NAE_USER_IMPERSONATE_COMPONENT = new InjectionToken<ComponentType<unknown>>('NaeUserImpersonateComponent');
+export const NAE_ADMIN_IMPERSONATE_COMPONENT = new InjectionToken<ComponentType<unknown>>('NaeAdminImpersonateComponent');
diff --git a/projects/netgrif-components-core/src/lib/side-menu/content-components/public-api.ts b/projects/netgrif-components-core/src/lib/side-menu/content-components/public-api.ts
index d71103e2ab..12b66ddb3b 100644
--- a/projects/netgrif-components-core/src/lib/side-menu/content-components/public-api.ts
+++ b/projects/netgrif-components-core/src/lib/side-menu/content-components/public-api.ts
@@ -9,6 +9,7 @@ export * from './filter-selector/filter-selector-list-item/abstract-filter-selec
 export * from './option-selector/abstract-option-selector.component';
 export * from './save-filter/abstract-save-filter.component';
 export * from './load-filter/abstract-load-filter.component';
+export * from './user-impersonate/abstract-user-impersonate.component';
 
 /* MODELS */
 export * from './filter-selector/model/filter-selector-injection-data';
@@ -18,3 +19,4 @@ export * from './save-filter/model/save-filter-injection-data';
 export * from './load-filter/model/load-filter-injection-data';
 export * from './injection-tokens';
 export * from './new-case/model/new-case-injection-data';
+export * from './user-impersonate/model/user-impersonate-injection-data';
diff --git a/projects/netgrif-components-core/src/lib/side-menu/content-components/user-impersonate/abstract-user-impersonate.component.ts b/projects/netgrif-components-core/src/lib/side-menu/content-components/user-impersonate/abstract-user-impersonate.component.ts
new file mode 100644
index 0000000000..6865b1af46
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/side-menu/content-components/user-impersonate/abstract-user-impersonate.component.ts
@@ -0,0 +1,35 @@
+import {SideMenuControl} from '../../models/side-menu-control';
+import {Component, Inject} from '@angular/core';
+import {NAE_SIDE_MENU_CONTROL} from '../../side-menu-injection-token';
+import {CaseViewService} from '../../../view/case-view/service/case-view-service';
+import {Case} from '../../../resources/interface/case';
+import {AbstractCaseViewComponent} from '../../../view/case-view/abstract-case-view';
+import {UserImpersonateConfigMetadata} from '../../../impersonation/models/user-impersonate-config-metadata';
+import {UserImpersonateInjectionData} from './model/user-impersonate-injection-data';
+
+@Component({
+    selector: 'ncc-abstract-user-impersonate',
+    template: ''
+})
+export abstract class AbstractUserImpersonateComponent extends AbstractCaseViewComponent {
+
+    protected _injectedData: UserImpersonateInjectionData;
+
+    protected constructor(@Inject(NAE_SIDE_MENU_CONTROL) protected _sideMenuControl: SideMenuControl,
+                          caseViewService: CaseViewService) {
+        super(caseViewService);
+        if (this._sideMenuControl.data) {
+            this._injectedData = this._sideMenuControl.data as UserImpersonateInjectionData;
+        }
+    }
+
+    handleCaseClick(clickedCase: Case) {
+        this._sideMenuControl.close({
+            opened: false,
+            message: 'User selected',
+            data: {
+                stringId: clickedCase.stringId
+            } as UserImpersonateConfigMetadata
+        });
+    }
+}
diff --git a/projects/netgrif-components-core/src/lib/side-menu/content-components/user-impersonate/model/user-impersonate-injection-data.ts b/projects/netgrif-components-core/src/lib/side-menu/content-components/user-impersonate/model/user-impersonate-injection-data.ts
new file mode 100644
index 0000000000..8e757ff898
--- /dev/null
+++ b/projects/netgrif-components-core/src/lib/side-menu/content-components/user-impersonate/model/user-impersonate-injection-data.ts
@@ -0,0 +1,9 @@
+import {SideMenuInjectionData} from '../../../models/side-menu-injection-data';
+import {Filter} from '../../../../filter/models/filter';
+
+export interface UserImpersonateInjectionData extends SideMenuInjectionData {
+    /**
+     * A case filter of the filter cases
+     */
+    filter: Filter;
+}
diff --git a/projects/netgrif-components-core/src/lib/side-menu/models/side-menu-size.ts b/projects/netgrif-components-core/src/lib/side-menu/models/side-menu-size.ts
index dcbbe04625..5098229ad2 100644
--- a/projects/netgrif-components-core/src/lib/side-menu/models/side-menu-size.ts
+++ b/projects/netgrif-components-core/src/lib/side-menu/models/side-menu-size.ts
@@ -1,5 +1,6 @@
 export enum SideMenuSize {
     SMALL = 'side-menu-width-small',
     MEDIUM = 'side-menu-width-medium',
-    LARGE = 'side-menu-width-large'
+    LARGE = 'side-menu-width-large',
+    XL = 'side-menu-width-xl',
 }
diff --git a/projects/netgrif-components-core/src/lib/task/services/cancel-task.service.spec.ts b/projects/netgrif-components-core/src/lib/task/services/cancel-task.service.spec.ts
index 66fca26b51..f400c6b646 100644
--- a/projects/netgrif-components-core/src/lib/task/services/cancel-task.service.spec.ts
+++ b/projects/netgrif-components-core/src/lib/task/services/cancel-task.service.spec.ts
@@ -33,6 +33,8 @@ import {TaskEventOutcome} from '../../event/model/event-outcomes/task-outcomes/t
 import {createMockCase} from '../../utility/tests/utility/create-mock-case';
 import {createMockNet} from '../../utility/tests/utility/create-mock-net';
 import {ChangedFieldsService} from '../../changed-fields/services/changed-fields.service';
+import {User} from '../../user/models/user';
+import {ProcessRole} from '../../resources/interface/process-role';
 
 describe('CancelTaskService', () => {
     let service: CancelTaskService;
@@ -249,12 +251,7 @@ class TestTaskResourceService {
 
 class TestUserService {
     public get user() {
-        return {
-            email: 'mail',
-            roles: [{
-                stringId: 'role'
-            }]
-        };
+        return new User('id', 'mail', '', '', [], [{stringId: 'role'} as ProcessRole]);
     }
 
     public hasRoleById(): boolean {
diff --git a/projects/netgrif-components-core/src/lib/user/models/user.ts b/projects/netgrif-components-core/src/lib/user/models/user.ts
index a592e2ad63..4f3a09b50e 100644
--- a/projects/netgrif-components-core/src/lib/user/models/user.ts
+++ b/projects/netgrif-components-core/src/lib/user/models/user.ts
@@ -14,7 +14,8 @@ export class User implements IUser {
         public authorities: Array<string>,
         public roles: Array<ProcessRole>,
         public groups?: Array<string>,
-        public nextGroups?: Array<string>
+        public nextGroups?: Array<string>,
+        public impersonated?: User
     ) {
     }
 
@@ -42,4 +43,18 @@ export class User implements IUser {
     public isEmpty(): boolean {
         return this.id === '';
     }
+
+    /**
+     * @returns self if no impersonated user is present, or impersonated user otherwise
+     */
+    public getSelfOrImpersonated(): User {
+        return this.isImpersonating() ? this.impersonated : this;
+    }
+
+    /**
+     * @returns true if user is impersonating another user
+     */
+    public isImpersonating(): boolean {
+        return !!this.impersonated;
+    }
 }
diff --git a/projects/netgrif-components-core/src/lib/user/services/user-comparator.service.ts b/projects/netgrif-components-core/src/lib/user/services/user-comparator.service.ts
index 120b6fa5df..e422b6cb2d 100644
--- a/projects/netgrif-components-core/src/lib/user/services/user-comparator.service.ts
+++ b/projects/netgrif-components-core/src/lib/user/services/user-comparator.service.ts
@@ -9,8 +9,9 @@ export class UserComparatorService {
 
   constructor(private _userService: UserService) { }
 
-  public compareUsers(user: IUser): boolean {
-      return user.email === this._userService.user.email ||
+  public compareUsers(user: IUser, acceptImpersonator: boolean = true): boolean {
+      const loggedUser = acceptImpersonator ? this._userService.user.getSelfOrImpersonated() : this._userService.user;
+      return user.email === loggedUser.email ||
           user.email.includes('anonymous') && this._userService.user.email.includes('anonymous');
   }
 }
diff --git a/projects/netgrif-components-core/src/lib/user/services/user.service.ts b/projects/netgrif-components-core/src/lib/user/services/user.service.ts
index 517faeecaa..84c3783470 100644
--- a/projects/netgrif-components-core/src/lib/user/services/user.service.ts
+++ b/projects/netgrif-components-core/src/lib/user/services/user.service.ts
@@ -82,21 +82,23 @@ export class UserService implements OnDestroy {
      *                    If calculated intersection isn't empty returns true, otherwise false.
      */
     public hasAuthority(authority: Array<string> | string): boolean {
-        if (!authority || !this._user.authorities) {
+        const user = this._user.getSelfOrImpersonated();
+        if (!authority || !user.authorities) {
             return false;
         }
         if (authority instanceof Array) {
-            return authority.some(a => this._user.authorities.some(u => u === a));
+            return authority.some(a => user.authorities.some(u => u === a));
         } else {
-            return this._user.authorities.some(a => a === authority);
+            return user.authorities.some(a => a === authority);
         }
     }
 
     public hasRole(role: ProcessRole): boolean {
-        if (!role || !this._user.roles) {
+        const user = this._user.getSelfOrImpersonated();
+        if (!role || !user.roles) {
             return false;
         }
-        return this._user.roles.some(r => r === role);
+        return user.roles.some(r => r === role);
     }
 
     /**
@@ -104,10 +106,11 @@ export class UserService implements OnDestroy {
      * @param roleStringId ID of the role we want to check
      */
     public hasRoleById(roleStringId: string): boolean {
-        if (!roleStringId || !this._user.roles) {
+        const user = this._user.getSelfOrImpersonated();
+        if (!roleStringId || !user.roles) {
             return false;
         }
-        return this._user.roles.some(r => r.stringId === roleStringId);
+        return user.roles.some(r => r.stringId === roleStringId);
     }
 
     /**
@@ -116,10 +119,11 @@ export class UserService implements OnDestroy {
      * @param netIdentifier identifier (import ID) of the process the role is defined in
      */
     public hasRoleByIdentifier(roleIdentifier: string, netIdentifier: string): boolean {
-        if (!roleIdentifier || !netIdentifier || !this._user.roles) {
+        const user = this._user.getSelfOrImpersonated();
+        if (!roleIdentifier || !netIdentifier || !user.roles) {
             return false;
         }
-        return this._user.roles.some(r => r.netImportId === netIdentifier && r.importId === roleIdentifier);
+        return user.roles.some(r => r.netImportId === netIdentifier && r.importId === roleIdentifier);
     }
 
     /**
@@ -128,10 +132,11 @@ export class UserService implements OnDestroy {
      * @param netIdentifier identifier (import ID) of the process the role is defined in
      */
     public hasRoleByName(roleName: string, netIdentifier: string): boolean {
-        if (!roleName || !netIdentifier || !this._user.roles) {
+        const user = this._user.getSelfOrImpersonated();
+        if (!roleName || !netIdentifier || !user.roles) {
             return false;
         }
-        return this._user.roles.some(r => r.netImportId === netIdentifier && r.name === roleName);
+        return user.roles.some(r => r.netImportId === netIdentifier && r.name === roleName);
     }
 
     public login(credentials: Credentials): Observable<User> {
diff --git a/projects/netgrif-components-core/src/lib/utility/tests/test-config.ts b/projects/netgrif-components-core/src/lib/utility/tests/test-config.ts
index b4036aa1cc..e002026dd2 100644
--- a/projects/netgrif-components-core/src/lib/utility/tests/test-config.ts
+++ b/projects/netgrif-components-core/src/lib/utility/tests/test-config.ts
@@ -46,6 +46,11 @@ export class TestConfigurationService extends ConfigurationService {
                         name: 'dashboard',
                         address: 'http://localhost:8080/api/',
                         format: 'json'
+                    },
+                    {
+                        name: 'impersonation',
+                        address: 'http://localhost:8080/api/',
+                        format: 'json'
                     }
                 ]
             },
diff --git a/projects/netgrif-components-core/src/public-api.ts b/projects/netgrif-components-core/src/public-api.ts
index 5ffdb13257..87547e4c88 100644
--- a/projects/netgrif-components-core/src/public-api.ts
+++ b/projects/netgrif-components-core/src/public-api.ts
@@ -44,3 +44,4 @@ export * from './lib/allowed-nets/public-api';
 export * from './lib/event-queue/public-api';
 export * from './lib/changed-fields/public-api';
 export * from './lib/event/public-api';
+export * from './lib/impersonation/public-api';
diff --git a/projects/netgrif-components/nae-theme.scss b/projects/netgrif-components/nae-theme.scss
index 53cd2740a6..32c1728c20 100644
--- a/projects/netgrif-components/nae-theme.scss
+++ b/projects/netgrif-components/nae-theme.scss
@@ -6,6 +6,7 @@
 @import "src/lib/navigation/navigation.theme";
 @import "src/lib/admin/role-assignment/role-assignment.component.theme";
 @import "src/lib/side-menu/content-components/user-assign/user-assign-list/user-assign-item/theme/user-assign-item.component.theme";
+@import "src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/theme/admin-impersonate-item.component.theme";
 @import 'src/lib/view/view.theme';
 @import 'src/lib/tabs/tabs.theme';
 @import "src/lib/search/advanced-search/search-predicate-component/search-predicate.component.theme";
@@ -21,6 +22,7 @@
     @include header-component($app-theme);
     @include roles-assignment-theme($app-theme);
     @include user-assign-item-component-theme($app-theme);
+    @include admin-impersonate-item-component-theme($app-theme);
     @include view-theme($app-theme);
     @include tabs-theme($app-theme);
     @include search-predicate-theme($app-theme);
diff --git a/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.html b/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.html
index b795aed865..ca006ab48e 100644
--- a/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.html
+++ b/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.html
@@ -34,10 +34,19 @@
                     [routerLink]="profileRouterLink" routerLinkActive="active">
                     <mat-icon class="margin-auto" fxFlex>face</mat-icon>
                     <div class="large-menu-item" fxLayout="column" fxFlexAlign="start center" fxFlex>
-                        <span class="large-menu-item-text" fxFlex="50">{{user.fullName}}</span>
+                        <span *ngIf="!user.isImpersonating()"  class="large-menu-item-text" fxFlex="50">{{user.fullName}}</span>
+                        <span *ngIf="user.isImpersonating()" class="large-menu-item-text" fxFlex="50">{{user.fullName}} ({{user.getSelfOrImpersonated().fullName}})</span>
                         <span class="large-menu-item-text" style="font-size: 12px;" fxFlex="50">{{user.email}}</span>
                     </div>
                 </div>
+                <button *ngIf="includeImpersonation && !user.isImpersonating()" mat-menu-item (click)="impersonate()">
+                    <mat-icon>supervisor_account</mat-icon>
+                    <span>{{'side-menu.impersonation.submit' | translate}}</span>
+                </button>
+                <button *ngIf="includeImpersonation && user.isImpersonating()" mat-menu-item (click)="stopImpersonating()">
+                    <mat-icon>clear</mat-icon>
+                    <span>{{'side-menu.impersonation.cease' | translate }}</span>
+                </button>
                 <button mat-menu-item (click)="logout()">
                     <mat-icon>exit_to_app</mat-icon>
                     <span>{{ 'toolbar.menu.logout' | translate }}</span>
diff --git a/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.ts b/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.ts
index 0fbba5648a..bfe1957f51 100644
--- a/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.ts
+++ b/projects/netgrif-components/src/lib/navigation/navigation-double-drawer/navigation-double-drawer.component.ts
@@ -8,7 +8,7 @@ import {
     LoggerService,
     UserService,
     AbstractNavigationDoubleDrawerComponent,
-    DynamicNavigationRouteProviderService, AccessService
+    DynamicNavigationRouteProviderService, AccessService, ImpersonationUserSelectService, ImpersonationService
 } from '@netgrif/components-core';
 import {animate, state, style, transition, trigger} from "@angular/animations";
 
@@ -59,9 +59,11 @@ export class NavigationDoubleDrawerComponent extends AbstractNavigationDoubleDra
                 _log: LoggerService,
                 _config: ConfigurationService,
                 _uriService: UriService,
+                _impersonationUserSelect: ImpersonationUserSelectService,
+                _impersonation: ImpersonationService,
                 _dynamicRouteProviderService: DynamicNavigationRouteProviderService) {
         super(_router, _activatedRoute, _breakpoint, _languageService, _userService, _accessService, _log, _config, _uriService,
-            _dynamicRouteProviderService)
+            _impersonationUserSelect, _impersonation, _dynamicRouteProviderService)
     }
 
     public toggleSection(section: string): void {
diff --git a/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.html b/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.html
new file mode 100644
index 0000000000..43a6808704
--- /dev/null
+++ b/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.html
@@ -0,0 +1,6 @@
+<button *ngIf="!isImpersonating()" [matTooltip]="'side-menu.impersonation.submit' | translate" (click)="impersonate()" mat-icon-button>
+    <mat-icon>supervisor_account</mat-icon>
+</button>
+<button *ngIf="isImpersonating()" [matTooltip]="'side-menu.impersonation.cease' | translate" (click)="stopImpersonating()" mat-icon-button>
+    <mat-icon>clear</mat-icon>
+</button>
diff --git a/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.spec.ts b/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.spec.ts
new file mode 100644
index 0000000000..8428295c61
--- /dev/null
+++ b/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.spec.ts
@@ -0,0 +1,50 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {ImpersonateQuickPanelComponent} from './impersonate-quick-panel.component';
+import {
+    AuthenticationMethodService,
+    ConfigurationService,
+    MaterialModule,
+    MockAuthenticationMethodService,
+    SnackBarService, TestConfigurationService,
+    TranslateLibModule
+} from '@netgrif/components-core';
+import {CommonModule} from '@angular/common';
+import {RouterTestingModule} from '@angular/router/testing';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import {NoopAnimationsModule} from '@angular/platform-browser/animations';
+
+describe('ImpersonateQuickPanelComponent', () => {
+    let component: ImpersonateQuickPanelComponent;
+    let fixture: ComponentFixture<ImpersonateQuickPanelComponent>;
+
+    beforeEach(async () => {
+        await TestBed.configureTestingModule({
+            imports: [
+                CommonModule,
+                RouterTestingModule.withRoutes([]),
+                MaterialModule,
+                TranslateLibModule,
+                HttpClientTestingModule,
+                NoopAnimationsModule
+            ],
+            declarations: [ImpersonateQuickPanelComponent],
+            providers: [
+                SnackBarService,
+                {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService},
+                {provide: ConfigurationService, useClass: TestConfigurationService},
+            ]
+        })
+            .compileComponents();
+    });
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(ImpersonateQuickPanelComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
+});
diff --git a/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.ts b/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.ts
new file mode 100644
index 0000000000..96389761e9
--- /dev/null
+++ b/projects/netgrif-components/src/lib/navigation/quick-panel/components/impersonate-quick-panel/impersonate-quick-panel.component.ts
@@ -0,0 +1,29 @@
+import {Component} from '@angular/core';
+import {ImpersonationService, ImpersonationUserSelectService, UserService} from '@netgrif/components-core';
+
+@Component({
+    selector: 'nc-impersonate-quick-panel',
+    templateUrl: './impersonate-quick-panel.component.html',
+    styleUrls: []
+})
+export class ImpersonateQuickPanelComponent {
+
+    constructor(
+        private impersonateUserSelect: ImpersonationUserSelectService,
+        private impersonationService: ImpersonationService,
+        private user: UserService,
+    ) {}
+
+    public impersonate(): void {
+        this.impersonateUserSelect.selectImpersonate();
+    }
+
+    public stopImpersonating(): void {
+        this.impersonationService.cease();
+    }
+
+    public isImpersonating(): boolean {
+        return this.user.user.isImpersonating();
+    }
+
+}
diff --git a/projects/netgrif-components/src/lib/navigation/quick-panel/components/quick-panel.component.html b/projects/netgrif-components/src/lib/navigation/quick-panel/components/quick-panel.component.html
index 23970a8f09..9e374a7e43 100644
--- a/projects/netgrif-components/src/lib/navigation/quick-panel/components/quick-panel.component.html
+++ b/projects/netgrif-components/src/lib/navigation/quick-panel/components/quick-panel.component.html
@@ -1,6 +1,7 @@
 <div fxLayout="row" fxLayoutAlign="space-between center" class="quick-panel" [style.width.px]="width">
     <nc-language-selector *ngIf="items.includes('language')" [language]="getLang()"></nc-language-selector>
     <nc-internal-link *ngIf="items.includes('settings')" icon="settings" link="/settings"></nc-internal-link>
+    <nc-impersonate-quick-panel *ngIf="items.includes('impersonation')"></nc-impersonate-quick-panel>
     <nc-logout-shortcut *ngIf="items.includes('logout')"></nc-logout-shortcut>
 
     <button mat-icon-button [matMenuTriggerFor]="quickPanelMoreMenu">
diff --git a/projects/netgrif-components/src/lib/navigation/quick-panel/public-api.ts b/projects/netgrif-components/src/lib/navigation/quick-panel/public-api.ts
index 804c1fd06f..a24c766078 100644
--- a/projects/netgrif-components/src/lib/navigation/quick-panel/public-api.ts
+++ b/projects/netgrif-components/src/lib/navigation/quick-panel/public-api.ts
@@ -6,5 +6,6 @@ export * from './components/quick-panel.component';
 export * from './components/internal-link/internal-link.component';
 export * from './components/logout-shortcut/logout-shortcut.component';
 export * from './components/language-selector/language-selector.component';
+export * from './components/impersonate-quick-panel/impersonate-quick-panel.component';
 
 /* SERVICES */
diff --git a/projects/netgrif-components/src/lib/navigation/quick-panel/quick-panel.module.ts b/projects/netgrif-components/src/lib/navigation/quick-panel/quick-panel.module.ts
index 95d009241d..38a14bb4f9 100644
--- a/projects/netgrif-components/src/lib/navigation/quick-panel/quick-panel.module.ts
+++ b/projects/netgrif-components/src/lib/navigation/quick-panel/quick-panel.module.ts
@@ -6,6 +6,7 @@ import {LanguageSelectorComponent} from './components/language-selector/language
 import {InternalLinkComponent} from './components/internal-link/internal-link.component';
 import {RouterModule} from '@angular/router';
 import {MaterialModule, TranslateLibModule} from '@netgrif/components-core';
+import { ImpersonateQuickPanelComponent } from './components/impersonate-quick-panel/impersonate-quick-panel.component';
 
 
 @NgModule({
@@ -13,13 +14,15 @@ import {MaterialModule, TranslateLibModule} from '@netgrif/components-core';
         QuickPanelComponent,
         LogoutShortcutComponent,
         LanguageSelectorComponent,
-        InternalLinkComponent
+        InternalLinkComponent,
+        ImpersonateQuickPanelComponent
     ],
     exports: [
         QuickPanelComponent,
         LogoutShortcutComponent,
         LanguageSelectorComponent,
-        InternalLinkComponent
+        InternalLinkComponent,
+        ImpersonateQuickPanelComponent
     ],
     imports: [
         CommonModule,
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.html b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.html
new file mode 100644
index 0000000000..40274c6bbc
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.html
@@ -0,0 +1,9 @@
+<div fxLayout="row" fxLayoutAlign="start center" class="user-item" [ngClass]="{
+            'admin-impersonate-item-selected': (selectedId$ | async) === user.id
+        }">
+    <mat-icon class="icon">account_circle</mat-icon>
+    <div fxLayout="column">
+        <span>{{user.fullName}}</span>
+        <span>{{user.email}}</span>
+    </div>
+</div>
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.scss b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.scss
new file mode 100644
index 0000000000..a7674e4e5d
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.scss
@@ -0,0 +1,24 @@
+.user-item {
+    padding: 10px 15px;
+    cursor: pointer;
+}
+
+.user-item:hover {
+    background-color: rgba(0, 0, 0, .14);
+    border-radius: 2.5px;
+}
+
+.icon {
+    margin-right: 16px;
+    height: 40px;
+    width: 40px;
+    font-size: 40px;
+}
+
+.email-selected {
+    font-size: 0.9em;
+}
+
+.email-unselected {
+    font-size: 0.9em;
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.spec.ts b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.spec.ts
new file mode 100644
index 0000000000..8f762bd528
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.spec.ts
@@ -0,0 +1,42 @@
+import {waitForAsync, ComponentFixture, TestBed} from '@angular/core/testing';
+import {AdminImpersonateItemComponent} from './admin-impersonate-item.component';
+import {Component} from '@angular/core';
+import {MaterialModule, TranslateLibModule, UserValue} from '@netgrif/components-core';
+import {NoopAnimationsModule} from '@angular/platform-browser/animations';
+
+describe('AdminImpersonateItemComponent', () => {
+    let component: AdminImpersonateItemComponent;
+    let fixture: ComponentFixture<TestWrapperComponent>;
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [MaterialModule,
+                TranslateLibModule,
+                NoopAnimationsModule],
+            declarations: [
+                AdminImpersonateItemComponent,
+                TestWrapperComponent
+            ]
+        })
+            .compileComponents();
+        fixture = TestBed.createComponent(TestWrapperComponent);
+        component = fixture.debugElement.children[0].componentInstance;
+        fixture.detectChanges();
+    }));
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
+
+    afterEach(() => {
+        TestBed.resetTestingModule();
+    });
+});
+
+@Component({
+    selector: 'nc-test-wrapper',
+    template: '<nc-user-impersonate-item [user]="user"></nc-user-impersonate-item>'
+})
+class TestWrapperComponent {
+    user = new UserValue('0', '', '', '');
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.ts b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.ts
new file mode 100644
index 0000000000..0242374ee7
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component.ts
@@ -0,0 +1,17 @@
+import {Component} from '@angular/core';
+import {AbstractUserAssignItemComponent} from '@netgrif/components-core';
+
+/**
+ * Includes avatar user icon and full username in the side menu.
+ */
+@Component({
+    selector: 'nc-admin-impersonate-item',
+    templateUrl: './admin-impersonate-item.component.html',
+    styleUrls: ['./admin-impersonate-item.component.scss']
+})
+export class AdminImpersonateItemComponent extends AbstractUserAssignItemComponent {
+
+    constructor() {
+        super();
+    }
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/theme/admin-impersonate-item.component.theme.scss b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/theme/admin-impersonate-item.component.theme.scss
new file mode 100644
index 0000000000..bfaac70599
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-item/theme/admin-impersonate-item.component.theme.scss
@@ -0,0 +1,15 @@
+@use '@angular/material' as mat;
+
+@mixin admin-impersonate-item-component-theme($theme) {
+    $primary: map-get($theme, primary);
+
+    .admin-impersonate-item-selected {
+        background-color: mat.get-color-from-palette($primary, 300);
+        color: mat.get-contrast-color-from-palette($primary, 300) !important;
+    }
+
+    .admin-impersonate-item-selected:hover {
+        background-color: mat.get-color-from-palette($primary, 500) !important;
+        color: mat.get-contrast-color-from-palette($primary, 500) !important;
+    }
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.html b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.html
new file mode 100644
index 0000000000..9971328fe0
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.html
@@ -0,0 +1,27 @@
+<div fxLayout="column" fxLayoutAlign="start center" fxFlex>
+    <ng-container *ngIf="users$ | async as users">
+        <div *ngIf="!loading && users.length === 0" fxFlex="100" fxLayout="column" fxLayoutAlign="center center">
+            <mat-icon color="accent" class="margin-bottom-default">person_add_disabled</mat-icon>
+            <span class="font-size-20">{{ 'side-menu.user.noUser' | translate }}</span>
+        </div>
+
+        <div class="full-height full-width" fxFlex="100">
+            <cdk-virtual-scroll-viewport itemSize="60" (scrolledIndexChange)="loadNextPage()"
+                                         class="full-height full-width">
+                <nc-admin-impersonate-item
+                    *cdkVirtualFor="let user of users;
+                                    trackBy: trackBy;
+                                    templateCacheSize: 0"
+                    [user]="user"
+                    [selectedId$]="selectedUser$"
+                    (click)="select(user)">
+                </nc-admin-impersonate-item>
+
+                <div *ngIf="loading" fxLayout="column" fxLayoutAlign="center center"
+                     class="margin-top-default">
+                    <mat-spinner color="primary" diameter="40"></mat-spinner>
+                </div>
+            </cdk-virtual-scroll-viewport>
+        </div>
+    </ng-container>
+</div>
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.scss b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.scss
new file mode 100644
index 0000000000..943757ceb4
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.scss
@@ -0,0 +1,13 @@
+@import '../../../../../styles/core';
+
+.font-size-20 {
+    font-size: 20px;
+}
+
+.margin-bottom-default {
+    margin-bottom: 8px;
+}
+
+.margin-top-default {
+    margin-top: 8px;
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.spec.ts b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.spec.ts
new file mode 100644
index 0000000000..45151a9c05
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.spec.ts
@@ -0,0 +1,74 @@
+import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing';
+import {AdminImpersonateListComponent} from './admin-impersonate-list.component';
+import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
+import {Component, NO_ERRORS_SCHEMA} from '@angular/core';
+import {FormControl} from '@angular/forms';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import {BrowserDynamicTestingModule} from '@angular/platform-browser-dynamic/testing';
+import {
+    ConfigurationService,
+    ErrorSnackBarComponent, ImpersonationUserListService,
+    MaterialModule,
+    TestConfigurationService,
+    TranslateLibModule,
+    UserListInjectedData,
+    UserListService,
+    UserValue
+} from '@netgrif/components-core';
+import {AdminImpersonateItemComponent} from './admin-impersonate-item/admin-impersonate-item.component';
+
+describe('AdminImpersonateListComponent', () => {
+    let component: AdminImpersonateListComponent;
+    let fixture: ComponentFixture<TestWrapperComponent>;
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                MaterialModule,
+                BrowserAnimationsModule,
+                HttpClientTestingModule,
+                TranslateLibModule
+            ],
+            providers: [
+                {provide: UserListService, useClass: ImpersonationUserListService},
+                {provide: ConfigurationService, useClass: TestConfigurationService}
+            ],
+            declarations: [
+                AdminImpersonateListComponent,
+                AdminImpersonateItemComponent,
+                ErrorSnackBarComponent,
+                TestWrapperComponent
+            ],
+            schemas: [NO_ERRORS_SCHEMA]
+        })
+            .overrideModule(BrowserDynamicTestingModule, {
+                set: {
+                    entryComponents: [
+                        ErrorSnackBarComponent
+                    ]
+                }
+            })
+            .compileComponents();
+
+        fixture = TestBed.createComponent(TestWrapperComponent);
+        component = fixture.debugElement.children[0].componentInstance;
+        fixture.detectChanges();
+    }));
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
+
+    afterEach(() => {
+        TestBed.resetTestingModule();
+    });
+});
+
+@Component({
+    selector: 'nc-test-wrapper',
+    template: '<nc-user-impersonate-list [searchUserControl]="formControl" [roles]="injectedData.roles"></nc-user-impersonate-list>'
+})
+class TestWrapperComponent {
+    injectedData = {roles: [], value: new UserValue('5', 'admin', 'netgrif', 'super@netgrif.com')} as UserListInjectedData;
+    formControl = new FormControl();
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.ts b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.ts
new file mode 100644
index 0000000000..07784b34bf
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate-list/admin-impersonate-list.component.ts
@@ -0,0 +1,17 @@
+import {Component} from '@angular/core';
+import {AbstractUserAssignListComponent, UserListService} from '@netgrif/components-core';
+
+/**
+ * Is responsible for displaying, filtering, loading and selecting users.
+ */
+@Component({
+    selector: 'nc-admin-impersonate-list',
+    templateUrl: './admin-impersonate-list.component.html',
+    styleUrls: ['./admin-impersonate-list.component.scss']
+})
+export class AdminImpersonateListComponent extends AbstractUserAssignListComponent {
+
+    constructor(userListService: UserListService) {
+        super(userListService);
+    }
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.html b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.html
new file mode 100644
index 0000000000..b2bc228a1f
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.html
@@ -0,0 +1,29 @@
+<div class="full-width full-height" fxLayout="column" fxLayoutAlign="start stretch">
+    <mat-toolbar color="primary">{{ 'side-menu.impersonation.title' | translate | uppercase }}</mat-toolbar>
+    <div class="user-assign-container side-menu-root" fxLayout="column" fxFlex>
+        <div fxLayout="row" fxLayoutAlign="start center" class="netgrif-input netgrif-input-fix">
+            <mat-icon fxFlex class="search-icon">search</mat-icon>
+            <mat-form-field fxFlex="100" class="user-assign-search" color="primary" appearance="outline">
+                <input matInput placeholder="{{ 'side-menu.user.choose' | translate }}"
+                       [formControl]="searchUserControl">
+                <button mat-button *ngIf="searchUserControl.value" matSuffix mat-icon-button
+                        (click)="searchUserControl.setValue('')">
+                    <mat-icon>close</mat-icon>
+                </button>
+            </mat-form-field>
+        </div>
+
+        <nc-admin-impersonate-list fxFlex
+                             [searchUserControl]="searchUserControl"
+                             [roles]="roles"
+                             [negativeRoles]="negativeRoles"
+                             [initiallySelectedUser]="initiallySelectedUser"
+                             (userSelected)="userWasSelected($event)">
+        </nc-admin-impersonate-list>
+
+        <div fxLayout="row" fxLayoutAlign="end center">
+            <button mat-raised-button color="primary"
+                    (click)="assign()">{{ 'side-menu.impersonation.submit' | translate | uppercase }}</button>
+        </div>
+    </div>
+</div>
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.scss b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.scss
new file mode 100644
index 0000000000..d5e7c575f9
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.scss
@@ -0,0 +1,15 @@
+@import '../../side-menu.theme';
+@import '../../../../styles/core';
+
+.user-assign-container {
+    padding: 16px;
+    position: relative;
+}
+
+.user-assign-search {
+    width: 100%;
+}
+
+.search-icon {
+    margin-right: 10px;
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.spec.ts b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.spec.ts
new file mode 100644
index 0000000000..4dbe01d49f
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.spec.ts
@@ -0,0 +1,63 @@
+import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing';
+import {
+    ConfigurationService, ImpersonationUserListService,
+    MaterialModule,
+    NAE_SIDE_MENU_CONTROL,
+    SideMenuControl,
+    SnackBarModule,
+    TestConfigurationService,
+    TranslateLibModule,
+    UserListService
+} from '@netgrif/components-core';
+import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import {Observable} from 'rxjs';
+import {AdminImpersonateComponent} from './admin-impersonate.component';
+import {AdminImpersonateListComponent} from './admin-impersonate-list/admin-impersonate-list.component';
+import {
+    AdminImpersonateItemComponent
+} from './admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component';
+
+describe('AdminImpersonateComponent', () => {
+    let component: AdminImpersonateComponent;
+    let fixture: ComponentFixture<AdminImpersonateComponent>;
+
+    beforeEach(waitForAsync(() => {
+        TestBed.configureTestingModule({
+            imports: [
+                MaterialModule,
+                BrowserAnimationsModule,
+                HttpClientTestingModule,
+                TranslateLibModule,
+                SnackBarModule
+            ],
+            providers: [
+                {provide: UserListService, useClass: ImpersonationUserListService},
+                {
+                    provide: NAE_SIDE_MENU_CONTROL, useValue: new SideMenuControl(() => {
+                    }, new Observable<boolean>(), null)
+                },
+                {provide: ConfigurationService, useClass: TestConfigurationService}
+            ],
+            declarations: [
+                AdminImpersonateComponent,
+                AdminImpersonateListComponent,
+                AdminImpersonateItemComponent
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(AdminImpersonateComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
+
+    afterEach(() => {
+        TestBed.resetTestingModule();
+    });
+});
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.ts b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.ts
new file mode 100644
index 0000000000..c242f69c6e
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/admin-impersonate.component.ts
@@ -0,0 +1,22 @@
+import {Component, Inject} from '@angular/core';
+import {AbstractUserAssignComponent, NAE_SIDE_MENU_CONTROL, SideMenuControl, UserListService, ImpersonationUserListService} from '@netgrif/components-core';
+
+/**
+ * Is the main - parent component of the entire user assignment in the side menu.
+ *
+ * Holds logic link of the [AdminImpersonateListComponent]{@link AdminImpersonateListComponent}
+ * along with searching, selecting, and then assigning to the user field.
+ */
+@Component({
+    selector: 'nc-admin-impersonate',
+    templateUrl: './admin-impersonate.component.html',
+    styleUrls: ['./admin-impersonate.component.scss'],
+    providers: [{
+        provide: UserListService, useClass: ImpersonationUserListService
+    }]
+})
+export class AdminImpersonateComponent extends AbstractUserAssignComponent {
+    constructor(@Inject(NAE_SIDE_MENU_CONTROL) sideMenuControl: SideMenuControl) {
+        super(sideMenuControl);
+    }
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/side-menu-admin-impersonate-component.module.ts b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/side-menu-admin-impersonate-component.module.ts
new file mode 100644
index 0000000000..f2e526910c
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/admin-impersonate/side-menu-admin-impersonate-component.module.ts
@@ -0,0 +1,41 @@
+import {NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {AdminImpersonateComponent} from './admin-impersonate.component';
+import {FlexLayoutModule, FlexModule} from '@angular/flex-layout';
+import {FormsModule} from '@angular/forms';
+import {
+    CovalentModule,
+    MaterialModule,
+    NAE_ADMIN_IMPERSONATE_COMPONENT,
+    TranslateLibModule
+} from '@netgrif/components-core';
+import {MatFormFieldModule} from '@angular/material/form-field';
+import {AdminImpersonateListComponent} from './admin-impersonate-list/admin-impersonate-list.component';
+import {
+    AdminImpersonateItemComponent
+} from './admin-impersonate-list/admin-impersonate-item/admin-impersonate-item.component';
+
+
+@NgModule({
+    declarations: [
+        AdminImpersonateComponent,
+        AdminImpersonateListComponent,
+        AdminImpersonateItemComponent,
+    ],
+    imports: [
+        CommonModule,
+        MaterialModule,
+        CovalentModule,
+        FlexLayoutModule,
+        FlexModule,
+        FormsModule,
+        TranslateLibModule,
+        MatFormFieldModule
+    ],
+    exports: [AdminImpersonateComponent],
+    providers: [
+        { provide: NAE_ADMIN_IMPERSONATE_COMPONENT, useValue: AdminImpersonateComponent },
+    ]
+})
+export class SideMenuAdminImpersonateComponentModule {
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/load-filter/load-filter.component.spec.ts b/projects/netgrif-components/src/lib/side-menu/content-components/load-filter/load-filter.component.spec.ts
index dc60202510..aeff43a455 100644
--- a/projects/netgrif-components/src/lib/side-menu/content-components/load-filter/load-filter.component.spec.ts
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/load-filter/load-filter.component.spec.ts
@@ -1,3 +1,4 @@
+// TODO TEST 30.9.2022
 // import {ComponentFixture, TestBed} from '@angular/core/testing';
 // import {LoadFilterComponent} from './load-filter.component';
 // import {
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/public-api.ts b/projects/netgrif-components/src/lib/side-menu/content-components/public-api.ts
index d6874a82be..60a246267c 100644
--- a/projects/netgrif-components/src/lib/side-menu/content-components/public-api.ts
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/public-api.ts
@@ -3,6 +3,8 @@ export * from './side-menu-content-component.module';
 export * from './import-net/side-menu-import-net-component.module';
 export * from './new-case/side-menu-new-case-component.module';
 export * from './user-assign/side-menu-user-assign-component.module';
+export * from './admin-impersonate/side-menu-admin-impersonate-component.module';
+export * from './user-impersonate/side-menu-user-impersonate-component.module';
 export * from './filter-selector/side-menu-filter-selector-component.module';
 export * from './option-selector/side-menu-option-selector-component.module';
 export * from './save-filter/side-menu-save-filter-component.module';
@@ -12,9 +14,11 @@ export * from './load-filter/side-menu-load-filter-component.module';
 export * from './import-net/import-net.component';
 export * from './new-case/new-case.component';
 export * from './user-assign/user-assign.component';
+export * from './admin-impersonate/admin-impersonate.component';
 export * from './filter-selector/filter-selector.component';
 export * from './option-selector/option-selector.component';
 export {SaveFilterComponent} from './save-filter/save-filter.component';
 export {LoadFilterComponent} from './load-filter/load-filter.component';
+export {UserImpersonateComponent} from './user-impersonate/user-impersonate.component';
 
 /* MODELS */
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/side-menu-content-component.module.ts b/projects/netgrif-components/src/lib/side-menu/content-components/side-menu-content-component.module.ts
index 611b5b3ca2..c7e6ed80e7 100644
--- a/projects/netgrif-components/src/lib/side-menu/content-components/side-menu-content-component.module.ts
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/side-menu-content-component.module.ts
@@ -12,19 +12,28 @@ import {
     NAE_OPTION_SELECTOR_COMPONENT,
     NAE_SAVE_FILTER_COMPONENT,
     NAE_USER_ASSIGN_COMPONENT,
-    NAE_LOAD_FILTER_COMPONENT
+    NAE_LOAD_FILTER_COMPONENT,
+    NAE_USER_IMPERSONATE_COMPONENT, NAE_ADMIN_IMPERSONATE_COMPONENT
 } from '@netgrif/components-core';
 import {UserAssignComponent} from './user-assign/user-assign.component';
 import {NewCaseComponent} from './new-case/new-case.component';
 import {OptionSelectorComponent} from './option-selector/option-selector.component';
 import {SaveFilterComponent} from './save-filter/save-filter.component';
 import {LoadFilterComponent} from './load-filter/load-filter.component';
+import {
+    SideMenuAdminImpersonateComponentModule
+} from './admin-impersonate/side-menu-admin-impersonate-component.module';
+import {AdminImpersonateComponent} from './admin-impersonate/admin-impersonate.component';
+import {UserImpersonateComponent} from './user-impersonate/user-impersonate.component';
+import {SideMenuUserImpersonateComponentModule} from './user-impersonate/side-menu-user-impersonate-component.module';
 
 
 @NgModule({
     imports: [
         CommonModule,
         SideMenuUserAssignComponentModule,
+        SideMenuAdminImpersonateComponentModule,
+        SideMenuUserImpersonateComponentModule,
         SideMenuNewCaseComponentModule,
         SideMenuImportNetComponentModule,
         SideMenuFilterSelectorComponentModule,
@@ -34,6 +43,8 @@ import {LoadFilterComponent} from './load-filter/load-filter.component';
     ],
     exports: [
         SideMenuUserAssignComponentModule,
+        SideMenuAdminImpersonateComponentModule,
+        SideMenuUserImpersonateComponentModule,
         SideMenuNewCaseComponentModule,
         SideMenuImportNetComponentModule,
         SideMenuFilterSelectorComponentModule,
@@ -43,6 +54,8 @@ import {LoadFilterComponent} from './load-filter/load-filter.component';
     ],
     providers: [
         {provide: NAE_USER_ASSIGN_COMPONENT, useValue: UserAssignComponent},
+        {provide: NAE_ADMIN_IMPERSONATE_COMPONENT, useValue: AdminImpersonateComponent},
+        {provide: NAE_USER_IMPERSONATE_COMPONENT, useValue: UserImpersonateComponent},
         {provide: NAE_NEW_CASE_COMPONENT, useValue: NewCaseComponent},
         {provide: NAE_OPTION_SELECTOR_COMPONENT, useValue: OptionSelectorComponent},
         {provide: NAE_SAVE_FILTER_COMPONENT, useValue: SaveFilterComponent},
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/side-menu-user-impersonate-component.module.ts b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/side-menu-user-impersonate-component.module.ts
new file mode 100644
index 0000000000..ea3c9fa672
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/side-menu-user-impersonate-component.module.ts
@@ -0,0 +1,28 @@
+import {NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {UserImpersonateComponent} from './user-impersonate.component';
+import {
+    MaterialModule,
+    NAE_USER_IMPERSONATE_COMPONENT,
+    TranslateLibModule
+} from '@netgrif/components-core';
+import {CaseViewComponentModule} from '../../../view/case-view/case-view.module';
+import {HeaderComponentModule} from '../../../header/header.module';
+
+
+@NgModule({
+    imports: [
+        CommonModule,
+        MaterialModule,
+        TranslateLibModule,
+        CaseViewComponentModule,
+        HeaderComponentModule,
+    ],
+    declarations: [UserImpersonateComponent],
+    exports: [UserImpersonateComponent],
+    providers: [
+        { provide: NAE_USER_IMPERSONATE_COMPONENT, useValue: UserImpersonateComponent }
+    ]
+})
+export class SideMenuUserImpersonateComponentModule {
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.html b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.html
new file mode 100644
index 0000000000..397e251e78
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.html
@@ -0,0 +1,6 @@
+<mat-toolbar color="primary">{{'side-menu.impersonation.title' | translate}}</mat-toolbar>
+<div class="load-filter-container side-menu-root" fxLayout="column" fxLayoutAlign="start stretch">
+    <nc-header #header [type]="headerType" [maxHeaderColumns]="3" [responsiveHeaders]="true" [hideEditMode]="true" class="case-header-padding" [ngStyle]="{'width': getWidth()}"></nc-header>
+    <nc-case-list [selectedHeaders$]="selectedHeaders$" [showDeleteMenu]="false" [width]="getWidth()"
+                  (caseClick)="handleCaseClick($event)" [responsiveBody]="true" fxFlex [textEllipsis]="true" class="virtual-scroll-list-padding"></nc-case-list>
+</div>
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.scss b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.scss
new file mode 100644
index 0000000000..aa2944751e
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.scss
@@ -0,0 +1,16 @@
+@import '../../side-menu.theme';
+
+.load-filter-container {
+    height: calc(100% - 64px);
+    padding-left: 8px;
+    padding-right: 8px;
+}
+
+.case-header-padding {
+    padding-bottom: 16px;
+    padding-top: 4px;
+}
+
+.virtual-scroll-list-padding {
+    padding-right: 4px;
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.spec.ts b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.spec.ts
new file mode 100644
index 0000000000..442355b5a4
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.spec.ts
@@ -0,0 +1,61 @@
+// TODO TEST 30.9.2022
+// import {ComponentFixture, TestBed} from '@angular/core/testing';
+//
+// import {UserImpersonateComponent} from './user-impersonate.component';
+// import {Observable} from 'rxjs';
+// import {
+//     ConfigurationService,
+//     FilterType,
+//     MaterialModule,
+//     NAE_SIDE_MENU_CONTROL,
+//     SideMenuControl,
+//     SimpleFilter,
+//     SnackBarService,
+//     TranslateLibModule
+// } from '@netgrif/components-core';
+// import {
+//     NaeExampleAppConfigurationService
+// } from '../../../../../../nae-example-app/src/app/nae-example-app-configuration.service';
+// import {CommonModule} from '@angular/common';
+// import {RouterTestingModule} from '@angular/router/testing';
+// import {HttpClientTestingModule} from '@angular/common/http/testing';
+// import {NoopAnimationsModule} from '@angular/platform-browser/animations';
+//
+// describe('UserImpersonateComponent', () => {
+//     let component: UserImpersonateComponent;
+//     let fixture: ComponentFixture<UserImpersonateComponent>;
+//
+//     beforeEach(async () => {
+//         await TestBed.configureTestingModule({
+//             imports: [
+//                 CommonModule,
+//                 RouterTestingModule.withRoutes([]),
+//                 MaterialModule,
+//                 TranslateLibModule,
+//                 HttpClientTestingModule,
+//                 NoopAnimationsModule
+//             ],
+//             declarations: [UserImpersonateComponent],
+//             providers: [
+//                 SnackBarService,
+//                 {provide: ConfigurationService, useClass: NaeExampleAppConfigurationService},
+//                 {
+//                     provide: NAE_SIDE_MENU_CONTROL,
+//                     useValue: new SideMenuControl(() => {
+//                     }, new Observable<boolean>(), null, {filter: new SimpleFilter('', FilterType.CASE, {process: {identifier: '__EMPTY__'}})})
+//                 }
+//             ]
+//         })
+//             .compileComponents();
+//     });
+//
+//     beforeEach(() => {
+//         fixture = TestBed.createComponent(UserImpersonateComponent);
+//         component = fixture.componentInstance;
+//         fixture.detectChanges();
+//     });
+//
+//     it('should create', () => {
+//         expect(component).toBeTruthy();
+//     });
+// });
diff --git a/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.ts b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.ts
new file mode 100644
index 0000000000..9eaddb3884
--- /dev/null
+++ b/projects/netgrif-components/src/lib/side-menu/content-components/user-impersonate/user-impersonate.component.ts
@@ -0,0 +1,66 @@
+import {AfterViewInit, Component, Inject, ViewChild} from '@angular/core';
+import {
+    NAE_SIDE_MENU_CONTROL,
+    AbstractUserImpersonateComponent,
+    SideMenuControl,
+    LoggerService,
+    CaseViewService,
+    BaseFilter,
+    AllowedNetsServiceFactory,
+    AllowedNetsService,
+    SearchService,
+    NAE_BASE_FILTER,
+    NAE_DEFAULT_HEADERS,
+    UserImpersonationConstants,
+    UserImpersonateInjectionData
+} from '@netgrif/components-core';
+import {HeaderComponent} from '../../../header/header.component';
+
+function baseFilterFactory(sideMenuControl: SideMenuControl): BaseFilter {
+    if (!sideMenuControl.data) {
+        throw new Error('NewFilterCaseId was not provided in the side menu injection data');
+    }
+    const injectedData = sideMenuControl.data as UserImpersonateInjectionData;
+
+    return {filter: injectedData.filter};
+}
+
+function localAllowedNetsFactory(factory: AllowedNetsServiceFactory): AllowedNetsService {
+    return factory.createFromArray([UserImpersonationConstants.IMPERSONATION_CONFIG_NET_IDENTIFIER]);
+}
+
+@Component({
+    selector: 'nc-user-impersonate',
+    templateUrl: './user-impersonate.component.html',
+    styleUrls: ['./user-impersonate.component.scss'],
+    providers: [
+        CaseViewService,
+        SearchService,
+        {   provide: NAE_BASE_FILTER,
+            useFactory: baseFilterFactory,
+            deps: [NAE_SIDE_MENU_CONTROL]},
+        {   provide: AllowedNetsService,
+            useFactory: localAllowedNetsFactory,
+            deps: [AllowedNetsServiceFactory]},
+        {   provide: NAE_DEFAULT_HEADERS,
+            useValue: [
+                `${UserImpersonationConstants.IMPERSONATION_CONFIG_NET_IDENTIFIER}-${UserImpersonationConstants.IMPERSONATION_CONFIG_FIELD_IMPERSONATED}`,
+                `${UserImpersonationConstants.IMPERSONATION_CONFIG_NET_IDENTIFIER}-${UserImpersonationConstants.IMPERSONATION_CONFIG_FIELD_ROLES}`,
+                `${UserImpersonationConstants.IMPERSONATION_CONFIG_NET_IDENTIFIER}-${UserImpersonationConstants.IMPERSONATION_CONFIG_FIELD_AUTHS}`,
+            ]}
+    ]
+})
+export class UserImpersonateComponent extends AbstractUserImpersonateComponent implements AfterViewInit {
+
+    @ViewChild('header') public caseHeaderComponent: HeaderComponent;
+
+    constructor(@Inject(NAE_SIDE_MENU_CONTROL) sideMenuControl: SideMenuControl,
+                log: LoggerService,
+                caseViewService: CaseViewService) {
+        super(sideMenuControl, caseViewService);
+    }
+
+    ngAfterViewInit(): void {
+        this.initializeHeader(this.caseHeaderComponent);
+    }
+}
diff --git a/projects/netgrif-components/src/lib/side-menu/side-menu-container/side-menu-container.component.scss b/projects/netgrif-components/src/lib/side-menu/side-menu-container/side-menu-container.component.scss
index 949e73dd90..9f17572285 100644
--- a/projects/netgrif-components/src/lib/side-menu/side-menu-container/side-menu-container.component.scss
+++ b/projects/netgrif-components/src/lib/side-menu/side-menu-container/side-menu-container.component.scss
@@ -22,6 +22,10 @@
     width: 496px;
 }
 
+.side-menu-width-xl {
+    width: 600px;
+}
+
 .side-menu-size-mobile {
     width: 246px;
 }
diff --git a/projects/netgrif-components/src/lib/user/user-card/user-card.component.html b/projects/netgrif-components/src/lib/user/user-card/user-card.component.html
index e73918109a..10aacd7d62 100644
--- a/projects/netgrif-components/src/lib/user/user-card/user-card.component.html
+++ b/projects/netgrif-components/src/lib/user/user-card/user-card.component.html
@@ -19,6 +19,7 @@
         </div>
         <div fxLayout="column" fxLayoutAlign="center center" class="full-width full-showcase-text padding-default">
             <span>{{user.fullName}}</span>
+            <span class="impersonated-user-name" *ngIf="user.isImpersonating()">{{'side-menu.impersonation.impersonating' | translate }} {{user.getSelfOrImpersonated().fullName}}</span>
             <span>{{user.email}}</span>
         </div>
     </div>
diff --git a/projects/netgrif-components/src/lib/user/user-card/user-card.component.scss b/projects/netgrif-components/src/lib/user/user-card/user-card.component.scss
index b972d1292c..514749658c 100644
--- a/projects/netgrif-components/src/lib/user/user-card/user-card.component.scss
+++ b/projects/netgrif-components/src/lib/user/user-card/user-card.component.scss
@@ -62,6 +62,10 @@
     }
 }
 
+.impersonated-user-name {
+    font-size: 16px;
+}
+
 .horizontal-showcase-container {
     height: 80px;
     border: 1px solid #fd971f;
