diff --git a/src/app/lists/status-changes/status-changes-ag-grid-configuration.spec.ts b/src/app/lists/status-changes/status-changes-ag-grid-configuration.spec.ts
new file mode 100644
index 0000000..aaea02a
--- /dev/null
+++ b/src/app/lists/status-changes/status-changes-ag-grid-configuration.spec.ts
@@ -0,0 +1,45 @@
+/*
+******************************************************************************
+* Copyright © 2018 PTA GmbH.
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+*
+*     http://www.eclipse.org/legal/epl-v10.html
+*
+******************************************************************************
+*/
+
+
+import { TestBed, inject } from '@angular/core/testing';
+import { StatusChangesAgGridConfiguration } from './status-changes-ag-grid-configuration';
+import { SessionContext } from '../../common/session-context';
+import { STATUSES } from '../../test-data/statuses';
+import * as moment from 'moment';
+
+describe('StatusChangesAgGridConfiguration', () => {
+    let sessionContext: SessionContext;
+
+    beforeEach(() => {
+        sessionContext = new SessionContext();
+
+      TestBed.configureTestingModule({
+      });
+    });
+
+    it('should provide the correct functions', (() => {
+        const configArray: any = StatusChangesAgGridConfiguration.createColumnDefs( sessionContext );
+
+        const statusIdSegment = configArray[0];
+        expect(statusIdSegment.field).toBe('statusId');
+        sessionContext.setStatuses(STATUSES);
+        expect(statusIdSegment.valueGetter({data: { statusId: 999 }})).toBeFalsy();
+        expect(statusIdSegment.valueGetter({data: { statusId: 3 }})).toBe('beendet');
+
+        const modDateSegment = configArray[1];
+        expect(modDateSegment.field).toBe('modDate');
+        expect(modDateSegment.valueFormatter({data: {modDate: null}})).toBe('');
+
+    }));
+
+});
diff --git a/src/app/lists/status-changes/status-changes.component.spec.ts b/src/app/lists/status-changes/status-changes.component.spec.ts
new file mode 100644
index 0000000..bff707e
--- /dev/null
+++ b/src/app/lists/status-changes/status-changes.component.spec.ts
@@ -0,0 +1,302 @@
+/*
+******************************************************************************
+* Copyright © 2018 PTA GmbH.
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+*
+*     http://www.eclipse.org/legal/epl-v10.html
+*
+******************************************************************************
+*/
+import { ComponentFixture, TestBed, async, fakeAsync, tick } from '@angular/core/testing';
+import { FormsModule } from '@angular/forms';
+import { Router } from '@angular/router';
+import { DaterangepickerConfig } from 'ng2-daterangepicker';
+import { FormattedDatePipe } from '../../common-components/pipes/formatted-date.pipe';
+import { FormattedTimestampPipe } from '../../common-components/pipes/formatted-timestamp.pipe';
+import { StringToDatePipe } from '../../common-components/pipes/string-to-date.pipe';
+import { BannerMessage } from '../../common/banner-message';
+import { BannerMessageStatusEn } from '../../common/enums';
+import { Lock } from '../../model/lock';
+import { GridMeasureService } from '../../services/grid-measure.service';
+import { ReminderService } from '../../services/reminder.service';
+import { LockService } from '../../services/lock.service';
+import { MessageServiceCustom } from '../../services/message.service';
+import { UserSettingsService } from '../../services/user-settings.service';
+import { GRIDMEASURE } from '../../test-data/grid-measures';
+import { AbstractMockObservableService } from '../../testing/abstract-mock-observable.service';
+import { MockComponent } from '../../testing/mock.component';
+import { AbstractListComponent } from '../common-components/abstract-list/abstract-list.component';
+import { UniquePipe } from './../../common-components/pipes/unique.pipe';
+import { SessionContext } from './../../common/session-context';
+import { UserSettings } from './../../model/user-settings';
+import { USERS } from './../../test-data/users';
+import { StatusChangesComponent } from './status-changes.component';
+import { RoleAccessHelperService } from '../../services/jobs/role-access-helper.service';
+import { ModeValidator } from '../../custom_modules/helpers/mode-validator';
+import { STATUSCHANGES } from '../../test-data/status-changes';
+import { ToasterMessageService } from '../../services/toaster-message.service';
+import { MessageService } from 'primeng/api';
+
+class FakeRouter {
+    navigate(commands: any[]) {
+        return commands[0];
+    }
+}
+
+describe('StatusChangesComponent', () => {
+    let component: StatusChangesComponent;
+    let fixture: ComponentFixture<StatusChangesComponent>;
+    let routerStub: FakeRouter;
+    let router: Router;
+    let sessionContext: SessionContext;
+
+    routerStub = {
+        navigate: jasmine.createSpy('navigate').and.callThrough()
+    };
+
+    class MockService extends AbstractMockObservableService {
+        getGridMeasures() {
+            return this;
+        }
+
+        getHistoricalStatusChanges(id: number) {
+            return this;
+        }
+    }
+
+    class MockReminderService extends AbstractMockObservableService {
+        getCurrentReminders() {
+            return this;
+        }
+    }
+
+    class MockUserSettingService extends AbstractMockObservableService {
+        savedUserSettings: UserSettings;
+        getUserSettings(gridId: string) {
+            return this;
+        }
+        setUserSettings(userSettings: UserSettings) {
+            this.savedUserSettings = userSettings;
+            return this;
+        }
+    }
+    class MockLockService extends AbstractMockObservableService {
+        checkLock(key: number, info: string) {
+            const lock = new Lock();
+            lock.key = key;
+            lock.username = 'otto';
+            lock.info = info;
+            return lock;
+        }
+        storeLock(lock: Lock) {
+            return lock;
+        }
+
+        deleteLock(key: number, info: string) {
+            return key;
+        }
+    }
+
+    let mockGridMeasureService;
+    let mockReminderService;
+    let mockUserSettingService;
+    let mockLockService: MockLockService;
+    let roleAccessHelper: RoleAccessHelperService;
+    let toasterMessageService: ToasterMessageService;
+    let messageService: MessageService;
+    beforeEach(async(() => {
+        router = new FakeRouter() as any as Router;
+        sessionContext = new SessionContext();
+        messageService = new MessageService;
+        mockGridMeasureService = new MockService();
+        mockReminderService = new MockReminderService();
+        mockUserSettingService = new MockUserSettingService();
+        mockLockService = new MockLockService();
+        roleAccessHelper = new RoleAccessHelperService();
+        toasterMessageService = new ToasterMessageService(sessionContext, messageService);
+
+        TestBed.configureTestingModule({
+            imports: [
+                FormsModule
+            ],
+            declarations: [
+                StatusChangesComponent,
+                StringToDatePipe,
+                AbstractListComponent,
+                FormattedDatePipe,
+                FormattedTimestampPipe,
+                UniquePipe,
+                MockComponent({ selector: 'input', inputs: ['options'] }),
+                MockComponent({ selector: 'app-loading-spinner' }),
+                MockComponent({ selector: 'ag-grid-angular ', inputs: ['gridOptions', 'rowData'] })
+            ],
+            providers: [
+                ModeValidator,
+                { provide: SessionContext, useValue: sessionContext },
+                MessageServiceCustom,
+                { provide: UserSettingsService, useValue: mockUserSettingService },
+                { provide: Router, useValue: routerStub },
+                { provide: GridMeasureService, useValue: mockGridMeasureService },
+                { provide: ReminderService, useValue: mockReminderService },
+                { provide: LockService, useValue: mockLockService },
+                { provide: DaterangepickerConfig, useClass: DaterangepickerConfig },
+                { provide: RoleAccessHelperService, useValue: roleAccessHelper },
+                { provide: ToasterMessageService, useValue: toasterMessageService }
+            ]
+        }).compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(StatusChangesComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
+
+    xit('should call init', async(() => {
+        spyOn((component as any), 'init').and.callThrough();
+        spyOn(component, 'initAgGrid').and.callThrough();
+        spyOn(component, 'retrieveData').and.callThrough();
+        sessionContext.setCurrUser(USERS[1]);
+        sessionContext.setUserAuthenticated(true);
+        mockGridMeasureService.content = JSON.parse(JSON.stringify(GRIDMEASURE));
+        mockReminderService.content = [];
+        mockUserSettingService.content = {};
+        const abstractComp: any = component; // used to access privates
+        component.user = USERS[1];
+        component.gridId = 'statusChanges';
+        component.sortingState = {
+            column: 'shorty',
+            counter: 1,
+            defaultState: true,
+            isDesc: true
+        };
+        component.filteringSearchText = {
+            branchId: 'filty',
+            title: 'fix',
+            statusId: 'foxy'
+        };
+        mockUserSettingService.savedUserSettings = {};
+
+        abstractComp.saveSettings();
+        fixture.detectChanges();
+        component.ngOnInit();
+        fixture.detectChanges();
+        fixture.whenStable().then(() => {
+            fixture.detectChanges();
+            expect((component as any).init).toHaveBeenCalled();
+            expect(component.initAgGrid).toHaveBeenCalled();
+            expect(component.retrieveData).toHaveBeenCalled();
+        });
+    }));
+
+    it('should retrieveData (statuschanges) on init', async(() => {
+        mockGridMeasureService.content = JSON.parse(JSON.stringify(STATUSCHANGES));
+        mockReminderService.content = [];
+        const abstractComp: any = component; // used to access privates
+        component.user = USERS[1];
+        component.gridId = 'statusChanges';
+        component.sortingState = {
+            column: 'shorty',
+            counter: 1,
+            defaultState: true,
+            isDesc: true
+        };
+        component.filteringSearchText = {
+            branchId: 'filty',
+            title: 'fix',
+            statusId: 'foxy'
+        };
+        mockUserSettingService.savedUserSettings = {};
+
+        abstractComp.saveSettings();
+        component.retrieveData();
+        fixture.detectChanges();
+
+        fixture.whenRenderingDone().then(() => {
+            fixture.detectChanges();
+            expect(component.statuschanges.length).toBe(2);
+        });
+
+
+
+    }));
+
+    it('should raise an message on error in retrieveData (statuschanges)', fakeAsync(() => {
+        spyOn(toasterMessageService, 'showError').and.callThrough();
+        sessionContext.setUserAuthenticated(true);
+        mockGridMeasureService.error = 'Error in GridmeasureService';
+        const abstractComp: any = component; // used to access privates
+        component.user = USERS[1];
+        component.gridId = 'statusChanges';
+        component.sortingState = {
+            column: 'shorty',
+            counter: 1,
+            defaultState: true,
+            isDesc: true
+        };
+        component.filteringSearchText = {
+            branchId: 'filty',
+            title: 'fix',
+            statusId: 'foxy'
+        };
+        mockUserSettingService.savedUserSettings = {};
+
+        abstractComp.saveSettings();
+        component.retrieveData();
+        fixture.detectChanges();
+        tick();
+        expect(toasterMessageService.showError).toHaveBeenCalled();
+
+    }));
+
+    it('should set statuschanges as empty array in retrieveData for unknown gridId', fakeAsync(() => {
+
+        sessionContext.setUserAuthenticated(true);
+        const abstractComp: any = component; // used to access privates
+        component.user = USERS[1];
+        component.gridId = null;
+
+        mockUserSettingService.savedUserSettings = {};
+        component.showSpinner = true;
+        abstractComp.saveSettings();
+        component.retrieveData();
+        fixture.detectChanges();
+        tick();
+        expect(component.statuschanges.length).toBe(0);
+        expect(component.showSpinner).toBeFalsy();
+    }));
+
+    it('should call changeAllSelection and set selected false', async(() => {
+        component.selectAll = false;
+        component.statuschanges = JSON.parse(JSON.stringify(STATUSCHANGES));
+        fixture.detectChanges();
+        spyOn(component, 'changeAllSelection').and.callThrough();
+
+        fixture.detectChanges();
+
+        component.changeAllSelection();
+        expect(component.changeAllSelection).toHaveBeenCalled();
+        expect(component.statuschanges[0].selected).toBeFalsy();
+    }));
+
+    it('should call changeAllSelection and set selected true', async(() => {
+        component.selectAll = true;
+        component.statuschanges = JSON.parse(JSON.stringify(STATUSCHANGES));
+        fixture.detectChanges();
+        spyOn(component, 'changeAllSelection').and.callThrough();
+
+        fixture.detectChanges();
+
+        component.changeAllSelection();
+        expect(component.changeAllSelection).toHaveBeenCalled();
+        expect(component.statuschanges[0].selected).toBeTruthy();
+    }));
+
+
+});
