From e36ad93a984bd5fa43471c986b9c3de53e7d3289 Mon Sep 17 00:00:00 2001
From: Denys Vuika <denis.vuyka@gmail.com>
Date: Thu, 14 Dec 2017 18:55:01 +0000
Subject: [PATCH] Sync latest development (#147)

* fix navigation docs issues

* update documentation (#142)

* update documentation

changed start command
used a tags for links nested inside table and p tags, because Github did not render them correctly

* set link to navigation on side-nav.md

* [ACA-1061] update project version (#145)

[ACA-1061] update project version

* move e2e to a separate repo

* fix "view" button (toolbar)
---
 e2e/components/component.ts                   |  43 --
 e2e/components/components.ts                  |  32 --
 e2e/components/data-table/data-table.ts       | 196 -------
 .../dialog/create-edit-folder-dialog.ts       | 108 ----
 e2e/components/header/header.ts               |  42 --
 e2e/components/header/user-info.ts            |  64 ---
 e2e/components/login/login.ts                 |  75 ---
 e2e/components/menu/menu.ts                   |  73 ---
 e2e/components/pagination/pagination.ts       |  75 ---
 e2e/components/sidenav/sidenav.ts             |  68 ---
 e2e/components/toolbar/toolbar-actions.ts     |  68 ---
 e2e/components/toolbar/toolbar-breadcrumb.ts  |  63 ---
 e2e/components/toolbar/toolbar.ts             |  42 --
 e2e/configs.ts                                |  78 ---
 e2e/pages/browsing-page.ts                    |  40 --
 e2e/pages/login-page.ts                       |  74 ---
 e2e/pages/logout-page.ts                      |  43 --
 e2e/pages/page.ts                             |  79 ---
 e2e/pages/pages.ts                            |  28 -
 e2e/suites/actions/create-folder.test.ts      | 279 ---------
 e2e/suites/actions/edit-folder.test.ts        | 190 -------
 e2e/suites/actions/permanently-delete.test.ts | 113 ----
 e2e/suites/actions/restore.test.ts            | 147 -----
 .../toolbar-multiple-selection.test.ts        | 535 ------------------
 .../actions/toolbar-single-selection.test.ts  | 535 ------------------
 e2e/suites/application/page-titles.test.ts    | 133 -----
 e2e/suites/authentication/login.test.ts       | 179 ------
 e2e/suites/authentication/logout.test.ts      |  74 ---
 e2e/suites/list-views/empty-list.test.ts      | 109 ----
 e2e/suites/list-views/favorites.test.ts       | 157 -----
 e2e/suites/list-views/file-libraries.test.ts  | 131 -----
 e2e/suites/list-views/personal-files.test.ts  | 159 ------
 e2e/suites/list-views/recent-files.test.ts    | 149 -----
 e2e/suites/list-views/shared-files.test.ts    | 155 -----
 e2e/suites/list-views/trash.test.ts           | 188 ------
 e2e/suites/navigation/side-navigation.test.ts | 129 -----
 e2e/suites/pagination/pag-favorites.test.ts   | 186 ------
 .../pagination/pag-personal-files.test.ts     | 183 ------
 .../pagination/pag-recent-files.test.ts       | 189 -------
 .../pagination/pag-shared-files.test.ts       | 193 -------
 e2e/suites/pagination/pag-trash.test.ts       | 184 ------
 .../apis/favorites/favorites-api.ts           |  86 ---
 .../apis/nodes/node-body-create.ts            |  38 --
 .../apis/nodes/node-content-tree.ts           |  85 ---
 .../repo-client/apis/nodes/nodes-api.ts       | 104 ----
 .../apis/people/people-api-models.ts          |  43 --
 .../repo-client/apis/people/people-api.ts     |  60 --
 e2e/utilities/repo-client/apis/repo-api.ts    |  71 ---
 .../apis/shared-links/shared-links-api.ts     |  50 --
 .../apis/sites/sites-api-models.ts            |  42 --
 .../repo-client/apis/sites/sites-api.ts       | 111 ----
 .../repo-client/apis/trashcan/trashcan-api.ts |  54 --
 .../repo-client/repo-client-models.ts         |  46 --
 e2e/utilities/repo-client/repo-client.ts      |  57 --
 .../reporters/console/console-logger.ts       |  79 ---
 e2e/utilities/reporters/console/console.ts    |  90 ---
 .../rest-client/rest-client-models.ts         |  63 ---
 e2e/utilities/rest-client/rest-client.ts      |  89 ---
 e2e/utilities/utils.ts                        |  44 --
 package.json                                  |   3 +-
 protractor.conf.js                            |   6 -
 .../favorites/favorites.component.html        |   2 +-
 src/app/components/files/files.component.html |   2 +-
 src/app/components/files/files.component.ts   |   8 +
 .../recent-files/recent-files.component.html  |   2 +-
 .../shared-files/shared-files.component.html  |   2 +-
 yarn.lock                                     | 225 +++++---
 67 files changed, 148 insertions(+), 6902 deletions(-)
 delete mode 100644 e2e/components/component.ts
 delete mode 100644 e2e/components/components.ts
 delete mode 100644 e2e/components/data-table/data-table.ts
 delete mode 100644 e2e/components/dialog/create-edit-folder-dialog.ts
 delete mode 100644 e2e/components/header/header.ts
 delete mode 100644 e2e/components/header/user-info.ts
 delete mode 100644 e2e/components/login/login.ts
 delete mode 100644 e2e/components/menu/menu.ts
 delete mode 100644 e2e/components/pagination/pagination.ts
 delete mode 100644 e2e/components/sidenav/sidenav.ts
 delete mode 100644 e2e/components/toolbar/toolbar-actions.ts
 delete mode 100644 e2e/components/toolbar/toolbar-breadcrumb.ts
 delete mode 100644 e2e/components/toolbar/toolbar.ts
 delete mode 100644 e2e/configs.ts
 delete mode 100644 e2e/pages/browsing-page.ts
 delete mode 100644 e2e/pages/login-page.ts
 delete mode 100644 e2e/pages/logout-page.ts
 delete mode 100644 e2e/pages/page.ts
 delete mode 100644 e2e/pages/pages.ts
 delete mode 100644 e2e/suites/actions/create-folder.test.ts
 delete mode 100644 e2e/suites/actions/edit-folder.test.ts
 delete mode 100644 e2e/suites/actions/permanently-delete.test.ts
 delete mode 100644 e2e/suites/actions/restore.test.ts
 delete mode 100644 e2e/suites/actions/toolbar-multiple-selection.test.ts
 delete mode 100644 e2e/suites/actions/toolbar-single-selection.test.ts
 delete mode 100644 e2e/suites/application/page-titles.test.ts
 delete mode 100644 e2e/suites/authentication/login.test.ts
 delete mode 100644 e2e/suites/authentication/logout.test.ts
 delete mode 100644 e2e/suites/list-views/empty-list.test.ts
 delete mode 100644 e2e/suites/list-views/favorites.test.ts
 delete mode 100644 e2e/suites/list-views/file-libraries.test.ts
 delete mode 100644 e2e/suites/list-views/personal-files.test.ts
 delete mode 100644 e2e/suites/list-views/recent-files.test.ts
 delete mode 100644 e2e/suites/list-views/shared-files.test.ts
 delete mode 100644 e2e/suites/list-views/trash.test.ts
 delete mode 100644 e2e/suites/navigation/side-navigation.test.ts
 delete mode 100644 e2e/suites/pagination/pag-favorites.test.ts
 delete mode 100644 e2e/suites/pagination/pag-personal-files.test.ts
 delete mode 100644 e2e/suites/pagination/pag-recent-files.test.ts
 delete mode 100644 e2e/suites/pagination/pag-shared-files.test.ts
 delete mode 100644 e2e/suites/pagination/pag-trash.test.ts
 delete mode 100644 e2e/utilities/repo-client/apis/favorites/favorites-api.ts
 delete mode 100644 e2e/utilities/repo-client/apis/nodes/node-body-create.ts
 delete mode 100644 e2e/utilities/repo-client/apis/nodes/node-content-tree.ts
 delete mode 100644 e2e/utilities/repo-client/apis/nodes/nodes-api.ts
 delete mode 100644 e2e/utilities/repo-client/apis/people/people-api-models.ts
 delete mode 100644 e2e/utilities/repo-client/apis/people/people-api.ts
 delete mode 100644 e2e/utilities/repo-client/apis/repo-api.ts
 delete mode 100644 e2e/utilities/repo-client/apis/shared-links/shared-links-api.ts
 delete mode 100644 e2e/utilities/repo-client/apis/sites/sites-api-models.ts
 delete mode 100644 e2e/utilities/repo-client/apis/sites/sites-api.ts
 delete mode 100644 e2e/utilities/repo-client/apis/trashcan/trashcan-api.ts
 delete mode 100644 e2e/utilities/repo-client/repo-client-models.ts
 delete mode 100644 e2e/utilities/repo-client/repo-client.ts
 delete mode 100644 e2e/utilities/reporters/console/console-logger.ts
 delete mode 100644 e2e/utilities/reporters/console/console.ts
 delete mode 100644 e2e/utilities/rest-client/rest-client-models.ts
 delete mode 100644 e2e/utilities/rest-client/rest-client.ts
 delete mode 100644 e2e/utilities/utils.ts

diff --git a/e2e/components/component.ts b/e2e/components/component.ts
deleted file mode 100644
index 24d7f1cb1..000000000
--- a/e2e/components/component.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, element, by, ExpectedConditions as EC, browser } from 'protractor';
-import { BROWSER_WAIT_TIMEOUT } from '../configs';
-
-export abstract class Component {
-    component: ElementFinder;
-
-    constructor(selector: string, ancestor?: ElementFinder) {
-        const locator = by.css(selector);
-
-        this.component = ancestor
-            ? ancestor.element(locator)
-            : element(locator);
-    }
-
-    wait() {
-        return browser.wait(EC.presenceOf(this.component), BROWSER_WAIT_TIMEOUT);
-    }
-}
diff --git a/e2e/components/components.ts b/e2e/components/components.ts
deleted file mode 100644
index 70992f11d..000000000
--- a/e2e/components/components.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-export * from './login/login';
-export * from './header/header';
-export * from './header/user-info';
-export * from './data-table/data-table';
-export * from './pagination/pagination';
-export * from './sidenav/sidenav';
-export * from './toolbar/toolbar';
diff --git a/e2e/components/data-table/data-table.ts b/e2e/components/data-table/data-table.ts
deleted file mode 100644
index ea809fcf3..000000000
--- a/e2e/components/data-table/data-table.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, promise, by, browser, ExpectedConditions as EC, protractor } from 'protractor';
-import { BROWSER_WAIT_TIMEOUT } from '../../configs';
-import { Component } from '../component';
-
-export class DataTable extends Component {
-    private static selectors = {
-        root: 'adf-datatable',
-
-        head: 'table > thead',
-        columnHeader: 'tr > th',
-        sortedColumnHeader: `
-            th.adf-data-table__header--sorted-asc,
-            th.adf-data-table__header--sorted-desc
-        `,
-
-        body: 'table > tbody',
-        row: 'tr',
-        selectedRow: 'tr.is-selected',
-        cell: 'td',
-        locationLink: 'app-location-link',
-
-        emptyListContainer: 'td.adf-no-content-container',
-        emptyFolderDragAndDrop: '.adf-empty-list_template .adf-empty-folder',
-
-        emptyListTitle: 'div .empty-list__title',
-        emptyListText: 'div .empty-list__text'
-    };
-
-    head: ElementFinder = this.component.element(by.css(DataTable.selectors.head));
-    body: ElementFinder = this.component.element(by.css(DataTable.selectors.body));
-    cell = by.css(DataTable.selectors.cell);
-    locationLink = by.css(DataTable.selectors.locationLink);
-    emptyList: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListContainer));
-    emptyFolderDragAndDrop: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyFolderDragAndDrop));
-    emptyListTitle: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListTitle));
-    emptyListText: ElementArrayFinder = this.component.all(by.css(DataTable.selectors.emptyListText));
-
-    constructor(ancestor?: ElementFinder) {
-        super(DataTable.selectors.root, ancestor);
-    }
-
-    // Wait methods (waits for elements)
-    waitForHeader() {
-        return browser.wait(EC.presenceOf(this.head), BROWSER_WAIT_TIMEOUT);
-    }
-
-    waitForEmptyState() {
-        return browser.wait(EC.presenceOf(this.emptyList), BROWSER_WAIT_TIMEOUT);
-    }
-
-    // Header/Column methods
-    getColumnHeaders(): ElementArrayFinder {
-        const locator = by.css(DataTable.selectors.columnHeader);
-        return this.head.all(locator);
-    }
-
-    getNthColumnHeader(nth: number): ElementFinder {
-        return this.getColumnHeaders().get(nth - 1);
-    }
-
-    getColumnHeaderByLabel(label: string): ElementFinder {
-        const locator = by.cssContainingText(DataTable.selectors.columnHeader, label);
-        return this.head.element(locator);
-    }
-
-    getSortedColumnHeader(): ElementFinder {
-        const locator = by.css(DataTable.selectors.sortedColumnHeader);
-        return this.head.element(locator);
-    }
-
-    sortByColumn(columnName: string): promise.Promise<void> {
-        const column = this.getColumnHeaderByLabel(columnName);
-        const click = browser.actions().mouseMove(column).click();
-
-        return click.perform();
-    }
-
-    // Rows methods
-    getRows(): ElementArrayFinder {
-        return this.body.all(by.css(DataTable.selectors.row));
-    }
-
-    getSelectedRows(): ElementArrayFinder {
-        return this.body.all(by.css(DataTable.selectors.selectedRow));
-    }
-
-    getNthRow(nth: number): ElementFinder {
-        return this.getRows().get(nth - 1);
-    }
-
-    getRowByName(name: string): ElementFinder {
-        return this.body.element(by.cssContainingText(`.adf-data-table-cell`, name));
-    }
-
-    countRows(): promise.Promise<number> {
-        return this.getRows().count();
-    }
-
-    // Navigation/selection methods
-    doubleClickOnItemName(name: string): promise.Promise<any> {
-        const dblClick = browser.actions()
-            .mouseMove(this.getRowByName(name))
-            .click()
-            .click();
-
-        return dblClick.perform();
-    }
-
-    clickOnItemName(name: string): promise.Promise<any> {
-        return this.getRowByName(name).click();
-    }
-
-    selectMultipleItems(names: string[]): promise.Promise<void> {
-        return browser.actions().sendKeys(protractor.Key.COMMAND).perform()
-            .then(() => {
-                names.forEach(name => {
-                    this.clickOnItemName(name);
-                });
-            })
-            .then(() => browser.actions().sendKeys(protractor.Key.NULL).perform());
-    }
-
-    clearSelection() {
-        this.getSelectedRows().count()
-            .then(count => {
-                if (count !== 0) { browser.refresh().then(() => this.waitForHeader()); }
-            });
-    }
-
-    getItemLocation(name: string) {
-        const rowLocator = by.cssContainingText(DataTable.selectors.row, name);
-        return this.body.element(rowLocator).element(this.locationLink);
-    }
-
-    clickItemLocation(name: string) {
-        return this.getItemLocation(name).click();
-    }
-
-    // empty state methods
-    isEmptyList(): promise.Promise<boolean> {
-        return this.emptyList.isPresent();
-    }
-
-    isEmptyWithDragAndDrop(): promise.Promise<boolean> {
-        return this.emptyFolderDragAndDrop.isDisplayed();
-    }
-
-    getEmptyDragAndDropText(): promise.Promise<string> {
-        return this.isEmptyWithDragAndDrop()
-            .then(() => {
-                return this.emptyFolderDragAndDrop.getText();
-            })
-            .catch(() => '');
-    }
-
-    getEmptyStateTitle(): promise.Promise<string> {
-        return this.isEmptyList()
-            .then(() => {
-                return this.emptyListTitle.getText();
-            })
-            .catch(() => '');
-    }
-
-    getEmptyStateText(): promise.Promise<string> {
-        return this.isEmptyList()
-            .then(() => {
-                return this.emptyListText.getText();
-            })
-            .catch(() => '');
-    }
-}
diff --git a/e2e/components/dialog/create-edit-folder-dialog.ts b/e2e/components/dialog/create-edit-folder-dialog.ts
deleted file mode 100644
index a6d7f29e0..000000000
--- a/e2e/components/dialog/create-edit-folder-dialog.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, by, browser, protractor, ExpectedConditions as EC, promise } from 'protractor';
-import { BROWSER_WAIT_TIMEOUT } from '../../configs';
-import { Component } from '../component';
-
-export class CreateOrEditFolderDialog extends Component {
-    private static selectors = {
-        root: 'adf-folder-dialog',
-
-        title: '.mat-dialog-title',
-        nameInput: '.mat-input-element[placeholder="Name" i]',
-        descriptionTextArea: '.mat-input-element[placeholder="Description" i]',
-        button: '.mat-dialog-actions button',
-        validationMessage: '.mat-hint span'
-    };
-
-    title: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.title));
-    nameInput: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.nameInput));
-    descriptionTextArea: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.descriptionTextArea));
-    createButton: ElementFinder = this.component.element(by.cssContainingText(CreateOrEditFolderDialog.selectors.button, 'Create'));
-    cancelButton: ElementFinder = this.component.element(by.cssContainingText(CreateOrEditFolderDialog.selectors.button, 'Cancel'));
-    updateButton: ElementFinder = this.component.element(by.cssContainingText(CreateOrEditFolderDialog.selectors.button, 'Update'));
-    validationMessage: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.validationMessage));
-
-    constructor(ancestor?: ElementFinder) {
-        super(CreateOrEditFolderDialog.selectors.root, ancestor);
-    }
-
-    waitForDialogToOpen() {
-        return browser.wait(EC.presenceOf(this.title), BROWSER_WAIT_TIMEOUT);
-    }
-
-    waitForDialogToClose() {
-        return browser.wait(EC.stalenessOf(this.title), BROWSER_WAIT_TIMEOUT);
-    }
-
-    getTitle(): promise.Promise<string> {
-        return this.title.getText();
-    }
-
-    isValidationMessageDisplayed(): promise.Promise<boolean> {
-        return this.validationMessage.isDisplayed();
-    }
-
-    getValidationMessage(): promise.Promise<string> {
-        return this.isValidationMessageDisplayed()
-            .then(() => this.validationMessage.getText())
-            .catch(() => '');
-    }
-
-    enterName(name: string): promise.Promise<CreateOrEditFolderDialog> {
-        return this.nameInput.clear()
-            .then(() => this.nameInput.sendKeys(name))
-            .then(() => this);
-    }
-
-    enterDescription(description: string): promise.Promise<CreateOrEditFolderDialog> {
-        return this.descriptionTextArea.clear()
-            .then(() => {
-                browser.actions().click(this.descriptionTextArea).sendKeys(description).perform();
-            })
-            .then(() => this);
-    }
-
-    deleteNameWithBackspace(): promise.Promise<void> {
-        return this.nameInput.clear()
-            .then(() => {
-                return this.nameInput.sendKeys(' ', protractor.Key.CONTROL, 'a', protractor.Key.NULL, protractor.Key.BACK_SPACE);
-            });
-    }
-
-    clickCreate() {
-        return this.createButton.click();
-    }
-
-    clickCancel() {
-        return this.cancelButton.click()
-            .then(() => this.waitForDialogToClose());
-    }
-
-    clickUpdate() {
-        return this.updateButton.click();
-    }
-}
diff --git a/e2e/components/header/header.ts b/e2e/components/header/header.ts
deleted file mode 100644
index be8d271d4..000000000
--- a/e2e/components/header/header.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, by } from 'protractor';
-import { Component } from '../component';
-import { UserInfo } from './user-info';
-
-export class Header extends Component {
-    private locators = {
-        logoLink: by.css('.app-menu__title'),
-        userInfo: by.css('app-current-user')
-    };
-
-    logoLink: ElementFinder = this.component.element(this.locators.logoLink);
-    userInfo: UserInfo = new UserInfo(this.component);
-
-    constructor(ancestor?: ElementFinder) {
-        super('app-header', ancestor);
-    }
-}
diff --git a/e2e/components/header/user-info.ts b/e2e/components/header/user-info.ts
deleted file mode 100644
index da110f0a9..000000000
--- a/e2e/components/header/user-info.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, element, by, promise } from 'protractor';
-import { Menu } from '../menu/menu';
-import { Component } from '../component';
-
-export class UserInfo extends Component {
-    private locators = {
-        avatar: by.css('.current-user__avatar'),
-        fullName: by.css('.current-user__full-name'),
-        menuItems: by.css('[mat-menu-item]')
-    };
-
-    fullName: ElementFinder = this.component.element(this.locators.fullName);
-    avatar: ElementFinder = this.component.element(this.locators.avatar);
-
-    menu: Menu = new Menu();
-
-    constructor(ancestor?: ElementFinder) {
-        super('app-current-user', ancestor);
-    }
-
-    openMenu(): promise.Promise<Menu> {
-        const { menu, avatar } = this;
-
-        return avatar.click()
-            .then(() => menu.wait())
-            .then(() => menu);
-    }
-
-    get name(): promise.Promise<string> {
-        return this.fullName.getText();
-    }
-
-    signOut(): promise.Promise<void> {
-        return this.openMenu()
-            .then(menu => {
-                menu.clickMenuItem('Sign out');
-            });
-    }
-}
diff --git a/e2e/components/login/login.ts b/e2e/components/login/login.ts
deleted file mode 100644
index 307059de3..000000000
--- a/e2e/components/login/login.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { by, ElementFinder, promise } from 'protractor';
-import { Component } from '../component';
-
-export class LoginComponent extends Component {
-    static selector = 'adf-login';
-
-    private locators = {
-        usernameInput: by.css('input#username'),
-        passwordInput: by.css('input#password'),
-        submitButton: by.css('button#login-button'),
-        errorMessage: by.css('.login-error-message')
-    };
-
-    usernameInput: ElementFinder = this.component.element(this.locators.usernameInput);
-    passwordInput: ElementFinder = this.component.element(this.locators.passwordInput);
-    submitButton: ElementFinder = this.component.element(this.locators.submitButton);
-    errorMessage: ElementFinder = this.component.element(this.locators.errorMessage);
-
-    constructor(ancestor?: ElementFinder) {
-        super(LoginComponent.selector, ancestor);
-    }
-
-    enterUsername(username: string): LoginComponent {
-        const { usernameInput } = this;
-
-        usernameInput.clear();
-        usernameInput.sendKeys(username);
-
-        return this;
-    }
-
-    enterPassword(password: string): LoginComponent {
-        const { passwordInput } = this;
-
-        passwordInput.clear();
-        passwordInput.sendKeys(password);
-
-        return this;
-    }
-
-    enterCredentials(username: string, password: string) {
-        this.enterUsername(username).enterPassword(password);
-
-        return this;
-    }
-
-    submit(): promise.Promise<void> {
-        return this.submitButton.click();
-    }
-}
diff --git a/e2e/components/menu/menu.ts b/e2e/components/menu/menu.ts
deleted file mode 100644
index 1f94354ec..000000000
--- a/e2e/components/menu/menu.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, by, browser, ExpectedConditions as EC, promise } from 'protractor';
-import { BROWSER_WAIT_TIMEOUT } from '../../configs';
-import { Component } from '../component';
-
-export class Menu extends Component {
-    private static selectors = {
-        root: '.mat-menu-panel',
-        item: 'button.mat-menu-item'
-    };
-
-    items: ElementArrayFinder = this.component.all(by.css(Menu.selectors.item));
-
-    constructor(ancestor?: ElementFinder) {
-        super(Menu.selectors.root, ancestor);
-    }
-
-    wait() {
-        return browser.wait(EC.visibilityOf(this.items.get(0)), BROWSER_WAIT_TIMEOUT);
-    }
-
-    getNthItem(nth: number): ElementFinder {
-        return this.items.get(nth - 1);
-    }
-
-    getItemByLabel(label: string): ElementFinder {
-        return this.component.element(by.cssContainingText(Menu.selectors.item, label));
-    }
-
-    getItemTooltip(label: string): promise.Promise<string> {
-        return this.getItemByLabel(label).getAttribute('title');
-    }
-
-    getItemsCount(): promise.Promise<number> {
-        return this.items.count();
-    }
-
-    clickNthItem(nth: number): promise.Promise<void> {
-        return this.getNthItem(nth).click();
-    }
-
-    clickMenuItem(label: string): promise.Promise<void> {
-        return this.getItemByLabel(label).click();
-    }
-
-    isMenuItemPresent(title: string): promise.Promise<boolean> {
-        return this.component.element(by.cssContainingText(Menu.selectors.item, title)).isPresent();
-    }
-}
diff --git a/e2e/components/pagination/pagination.ts b/e2e/components/pagination/pagination.ts
deleted file mode 100644
index 7c52e3312..000000000
--- a/e2e/components/pagination/pagination.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, promise, by, browser, ExpectedConditions as EC } from 'protractor';
-import { BROWSER_WAIT_TIMEOUT } from '../../configs';
-import { Menu } from '../menu/menu';
-import { Component } from '../component';
-
-export class Pagination extends Component {
-    private static selectors = {
-        root: 'adf-pagination',
-        range: '.adf-pagination__range',
-        maxItems: '.adf-pagination__max-items',
-        currentPage: '.adf-pagination__current-page',
-        totalPages: '.adf-pagination__total-pages',
-
-        previousButton: '.adf-pagination__previous-button',
-        nextButton: '.adf-pagination__next-button',
-        maxItemsButton: '.adf-pagination__max-items + button[mat-icon-button]',
-        pagesButton: '.adf-pagination__current-page + button[mat-icon-button]'
-    };
-
-    range: ElementFinder = this.component.element(by.css(Pagination.selectors.range));
-    maxItems: ElementFinder = this.component.element(by.css(Pagination.selectors.maxItems));
-    currentPage: ElementFinder = this.component.element(by.css(Pagination.selectors.currentPage));
-    totalPages: ElementFinder = this.component.element(by.css(Pagination.selectors.totalPages));
-    previousButton: ElementFinder = this.component.element(by.css(Pagination.selectors.previousButton));
-    nextButton: ElementFinder = this.component.element(by.css(Pagination.selectors.nextButton));
-    maxItemsButton: ElementFinder = this.component.element(by.css(Pagination.selectors.maxItemsButton));
-    pagesButton: ElementFinder = this.component.element(by.css(Pagination.selectors.pagesButton));
-
-    menu: Menu = new Menu();
-
-    constructor(ancestor?: ElementFinder) {
-        super(Pagination.selectors.root, ancestor);
-    }
-
-    openMaxItemsMenu(): promise.Promise<Menu> {
-        const { menu, maxItemsButton } = this;
-
-        return maxItemsButton.click()
-            .then(() => menu.wait())
-            .then(() => menu);
-    }
-
-    openCurrentPageMenu(): promise.Promise<Menu> {
-        const { menu, pagesButton } = this;
-
-        return this.pagesButton.click()
-            .then(() => menu.wait())
-            .then(() => menu);
-    }
-}
diff --git a/e2e/components/sidenav/sidenav.ts b/e2e/components/sidenav/sidenav.ts
deleted file mode 100644
index 406a5f8bb..000000000
--- a/e2e/components/sidenav/sidenav.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, by, promise } from 'protractor';
-import { Menu } from '../menu/menu';
-import { Component } from '../component';
-
-export class Sidenav extends Component {
-    private static selectors = {
-        root: 'app-sidenav',
-        link: '.sidenav-menu__item-link',
-        activeLink: '.sidenav-menu__item-link--active',
-        newButton: '.sidenav__section--new__button'
-    };
-
-    links: ElementArrayFinder = this.component.all(by.css(Sidenav.selectors.link));
-    activeLink: ElementFinder = this.component.element(by.css(Sidenav.selectors.activeLink));
-    newButton: ElementArrayFinder = this.component.all(by.css(Sidenav.selectors.newButton));
-
-    menu: Menu = new Menu();
-
-    constructor(ancestor?: ElementFinder) {
-        super(Sidenav.selectors.root, ancestor);
-    }
-
-    openNewMenu(): promise.Promise<Menu> {
-        const { menu, newButton } = this;
-
-        return newButton.click()
-            .then(() => menu.wait())
-            .then(() => menu);
-    }
-
-    isActiveByLabel(label: string): promise.Promise<boolean> {
-        return this.getLinkByLabel(label).getAttribute('class')
-            .then(className => className.includes(Sidenav.selectors.activeLink.replace('.', '')));
-    }
-
-    getLinkByLabel(label: string): ElementFinder {
-        return this.component.element(by.cssContainingText(Sidenav.selectors.link, label));
-    }
-
-    navigateToLinkByLabel(label: string): promise.Promise<any> {
-        return this.getLinkByLabel(label).click();
-    }
-}
diff --git a/e2e/components/toolbar/toolbar-actions.ts b/e2e/components/toolbar/toolbar-actions.ts
deleted file mode 100644
index 5998cdedf..000000000
--- a/e2e/components/toolbar/toolbar-actions.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, by, promise } from 'protractor';
-import { Menu } from '../menu/menu';
-import { Component } from '../component';
-
-export class ToolbarActions extends Component {
-    private static selectors = {
-        root: 'adf-toolbar',
-        button: '.mat-icon-button'
-    };
-
-    menu: Menu = new Menu();
-    buttons: ElementArrayFinder = this.component.all(by.css(ToolbarActions.selectors.button));
-
-    constructor(ancestor?: ElementFinder) {
-        super(ToolbarActions.selectors.root, ancestor);
-    }
-
-    isEmpty(): promise.Promise<boolean> {
-        return this.buttons.count().then(count => (count === 0));
-    }
-
-    isButtonPresent(title: string): promise.Promise<boolean> {
-        return this.component.element(by.css(`${ToolbarActions.selectors.button}[title="${title}"]`)).isPresent();
-    }
-
-    getButtonByLabel(label: string): ElementFinder {
-        return this.component.element(by.cssContainingText(ToolbarActions.selectors.button, label));
-    }
-
-    getButtonByTitleAttribute(title: string): ElementFinder {
-        return this.component.element(by.css(`${ToolbarActions.selectors.button}[title="${title}"]`));
-    }
-
-    openMoreMenu(): promise.Promise<Menu> {
-        const { menu } = this;
-        const moreButton = this.getButtonByTitleAttribute('More actions');
-
-        return moreButton
-            .click()
-            .then(() => menu.wait())
-            .then(() => menu);
-    }
-}
diff --git a/e2e/components/toolbar/toolbar-breadcrumb.ts b/e2e/components/toolbar/toolbar-breadcrumb.ts
deleted file mode 100644
index 872782a6d..000000000
--- a/e2e/components/toolbar/toolbar-breadcrumb.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, by, promise } from 'protractor';
-import { Menu } from '../menu/menu';
-import { Component } from '../component';
-
-export class ToolbarBreadcrumb extends Component {
-    private static selectors = {
-        root: 'adf-breadcrumb',
-        item: '.adf-breadcrumb-item'
-    };
-
-    items: ElementArrayFinder = this.component.all(by.css(ToolbarBreadcrumb.selectors.item));
-
-    constructor(ancestor?: ElementFinder) {
-        super(ToolbarBreadcrumb.selectors.root, ancestor);
-    }
-
-    getNthItem(nth: number): ElementFinder {
-        return this.items.get(nth - 1);
-    }
-
-    getItemsCount(): promise.Promise<number> {
-        return this.items.count();
-    }
-
-    getFirstItemName(): promise.Promise<string> {
-        return this.items.get(0).getAttribute('title');
-    }
-
-    getCurrentItem(): promise.Promise<ElementFinder> {
-        return this.getItemsCount()
-            .then(count => this.getNthItem(count));
-    }
-
-    getCurrentItemName(): promise.Promise<string> {
-        return this.getCurrentItem()
-            .then(node => node.getAttribute('title'));
-    }
-}
diff --git a/e2e/components/toolbar/toolbar.ts b/e2e/components/toolbar/toolbar.ts
deleted file mode 100644
index ed0bbe4d5..000000000
--- a/e2e/components/toolbar/toolbar.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { ElementFinder, ElementArrayFinder, by } from 'protractor';
-import { Component } from '../component';
-import { ToolbarActions } from './toolbar-actions';
-import { ToolbarBreadcrumb } from './toolbar-breadcrumb';
-
-export class Toolbar extends Component {
-    private static selectors = {
-        root: '.inner-layout__header'
-    };
-
-    actions: ToolbarActions = new ToolbarActions(this.component);
-    breadcrumb: ToolbarBreadcrumb = new ToolbarBreadcrumb(this.component);
-
-    constructor(ancestor?: ElementFinder) {
-        super(Toolbar.selectors.root, ancestor);
-    }
-}
diff --git a/e2e/configs.ts b/e2e/configs.ts
deleted file mode 100644
index f0f304335..000000000
--- a/e2e/configs.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-export const BROWSER_RESOLUTION_WIDTH = 1200;
-export const BROWSER_RESOLUTION_HEIGHT = 800;
-
-export const BROWSER_WAIT_TIMEOUT = 20000;
-
-// Application configs
-export const APP_HOST = 'http://localhost:3000';
-
-// Repository configs
-export const REPO_API_HOST = 'http://localhost:8080';
-export const REPO_API_TENANT = '-default-';
-
-// Admin details
-export const ADMIN_USERNAME = 'admin';
-export const ADMIN_PASSWORD = 'admin';
-export const ADMIN_FULL_NAME = 'Administrator';
-
-// Application Routes
-export const APP_ROUTES = {
-    FAVORITES: '/favorites',
-    FILE_LIBRARIES: '/libraries',
-    LOGIN: '/login',
-    LOGOUT: '/logout',
-    PERSONAL_FILES: '/personal-files',
-    RECENT_FILES: '/recent-files',
-    SHARED_FILES: '/shared',
-    TRASHCAN: '/trashcan'
-};
-
-// Sidebar labels
-export const SIDEBAR_LABELS = {
-    PERSONAL_FILES: 'Personal Files',
-    FILE_LIBRARIES: 'File Libraries',
-    SHARED_FILES: 'Shared',
-    RECENT_FILES: 'Recent Files',
-    FAVORITES: 'Favorites',
-    TRASH: 'Trash'
-};
-
-// Site visibility
-export const SITE_VISIBILITY = {
-    PUBLIC: 'PUBLIC',
-    MODERATED: 'MODERATED',
-    PRIVATE: 'PRIVATE'
-};
-
-// Site roles
-export const SITE_ROLES = {
-    SITE_CONSUMER: 'SiteConsumer',
-    SITE_COLLABORATOR: 'SiteCollaborator',
-    SITE_CONTRIBUTOR: 'SiteContributor',
-    SITE_MANAGER: 'SiteManager'
-};
diff --git a/e2e/pages/browsing-page.ts b/e2e/pages/browsing-page.ts
deleted file mode 100644
index 033859939..000000000
--- a/e2e/pages/browsing-page.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { promise } from 'protractor';
-import { Header, DataTable, Pagination, Toolbar, Sidenav } from '../components/components';
-import { Page } from './page';
-
-export class BrowsingPage extends Page {
-    header = new Header(this.app);
-    sidenav = new Sidenav(this.app);
-    toolbar = new Toolbar(this.app);
-    dataTable = new DataTable(this.app);
-    pagination = new Pagination(this.app);
-
-    signOut(): promise.Promise<void> {
-        return this.header.userInfo.signOut();
-    }
-}
diff --git a/e2e/pages/login-page.ts b/e2e/pages/login-page.ts
deleted file mode 100644
index 0a64257b0..000000000
--- a/e2e/pages/login-page.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-import { browser, ExpectedConditions as EC, promise } from 'protractor';
-import { LoginComponent } from '../components/components';
-import { Page } from './page';
-import { Utils } from '../utilities/utils';
-
-import {
-    ADMIN_USERNAME,
-    ADMIN_PASSWORD,
-    BROWSER_WAIT_TIMEOUT,
-    APP_ROUTES
-} from '../configs';
-
-export class LoginPage extends Page {
-    login: LoginComponent = new LoginComponent(this.app);
-
-    /** @override */
-    constructor() {
-        super(APP_ROUTES.LOGIN);
-    }
-
-    /** @override */
-    load(): promise.Promise<any> {
-        return super.load().then(() => {
-            const { submitButton } = this.login;
-            const hasSubmitButton = EC.presenceOf(submitButton);
-
-            return browser.wait(hasSubmitButton, BROWSER_WAIT_TIMEOUT)
-                .then(() => Utils.clearLocalStorage())
-                .then(() => browser.manage().deleteAllCookies());
-        });
-    }
-
-    loginWith(username: string, password?: string): promise.Promise<any> {
-        const pass = password || username;
-        return this.login.enterCredentials(username, pass).submit()
-            .then(() => super.waitForApp());
-    }
-
-    loginWithAdmin(): promise.Promise<any> {
-        return this.loginWith(ADMIN_USERNAME, ADMIN_PASSWORD);
-    }
-
-    tryLoginWith(username: string, password?: string): promise.Promise<void> {
-        const pass = password || username;
-        return this.login.enterCredentials(username, pass).submit()
-            .then(() => {
-                browser.wait(EC.presenceOf(this.login.errorMessage), BROWSER_WAIT_TIMEOUT);
-            });
-    }
-}
diff --git a/e2e/pages/logout-page.ts b/e2e/pages/logout-page.ts
deleted file mode 100644
index e250a9627..000000000
--- a/e2e/pages/logout-page.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { promise } from 'protractor';
-import { Page } from './page';
-import { APP_ROUTES } from '../configs';
-import { Utils } from '../utilities/utils';
-
-export class LogoutPage extends Page {
-    /** @override */
-    constructor() {
-        super(APP_ROUTES.LOGIN);
-    }
-
-    /** @override */
-    load(): promise.Promise<any> {
-        return Utils.clearLocalStorage()
-            .then(() => Utils.clearSessionStorage())
-            .then(() => super.load());
-    }
-}
diff --git a/e2e/pages/page.ts b/e2e/pages/page.ts
deleted file mode 100644
index 2ac3b031b..000000000
--- a/e2e/pages/page.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, element, by, ElementFinder, promise, ExpectedConditions as EC } from 'protractor';
-import { BROWSER_WAIT_TIMEOUT } from './../configs';
-
-export abstract class Page {
-    private static USE_HASH_STRATEGY = false;
-
-    private locators = {
-        app: by.css('app-root'),
-        layout: by.css('app-layout'),
-        overlay: by.css('.cdk-overlay-container'),
-        snackBar: by.css('simple-snack-bar'),
-        snackBarAction: by.css('.mat-simple-snackbar-action')
-    };
-
-    public app: ElementFinder = element(this.locators.app);
-    public layout: ElementFinder = element(this.locators.layout);
-    public overlay: ElementFinder = element(this.locators.overlay);
-    public snackBar: ElementFinder = element(this.locators.snackBar);
-
-    constructor(public url: string = '') {}
-
-    get title(): promise.Promise<string> {
-        return browser.getTitle();
-    }
-
-    load(relativeUrl: string = ''): promise.Promise<void> {
-        const hash = Page.USE_HASH_STRATEGY ? '/#' : '';
-        const path = `${hash}${this.url}${relativeUrl}`;
-
-        return browser.get(path);
-    }
-
-    waitForApp() {
-        return browser.wait(EC.presenceOf(this.layout), BROWSER_WAIT_TIMEOUT);
-    }
-
-    refresh(): promise.Promise<void> {
-        return browser.refresh();
-    }
-
-    isSnackBarDisplayed(): promise.Promise<boolean> {
-        return this.snackBar.isDisplayed();
-    }
-
-    getSnackBarMessage(): promise.Promise<string> {
-        return this.isSnackBarDisplayed()
-            .then(() => this.snackBar.getText())
-            .catch(() => '');
-    }
-
-    getSnackBarAction(): ElementFinder {
-        return this.snackBar.element(this.locators.snackBarAction);
-    }
-}
diff --git a/e2e/pages/pages.ts b/e2e/pages/pages.ts
deleted file mode 100644
index ce52fea89..000000000
--- a/e2e/pages/pages.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-export * from './browsing-page';
-export * from './login-page';
-export * from './logout-page';
diff --git a/e2e/suites/actions/create-folder.test.ts b/e2e/suites/actions/create-folder.test.ts
deleted file mode 100644
index b26b47686..000000000
--- a/e2e/suites/actions/create-folder.test.ts
+++ /dev/null
@@ -1,279 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { protractor, browser, by, ElementFinder } from 'protractor';
-
-import { SIDEBAR_LABELS, BROWSER_WAIT_TIMEOUT, SITE_VISIBILITY, SITE_ROLES } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { CreateOrEditFolderDialog } from '../../components/dialog/create-edit-folder-dialog';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Create folder', () => {
-    const username = `user-${Utils.random()}`;
-
-    const parent = `parent-${Utils.random()}`;
-    const folderName1 = `folder-${Utils.random()}`;
-    const folderName2 = `folder-${Utils.random()}`;
-    const folderDescription = 'description of my folder';
-    const duplicateFolderName = `folder-${Utils.random()}`;
-    const nameWithSpaces = ` folder-${Utils.random()} `;
-
-    const siteName = `site-private-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const personalFilesPage = new BrowsingPage();
-    const createDialog = new CreateOrEditFolderDialog();
-    const { dataTable } = personalFilesPage;
-
-    function openCreateDialog(): any {
-        return personalFilesPage.sidenav.openNewMenu()
-            .then(menu => menu.clickMenuItem('Create folder'))
-            .then(() => createDialog.waitForDialogToOpen());
-    }
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE))
-            .then(() => apis.admin.nodes.createFolders([ folderName1 ], `Sites/${siteName}/documentLibrary`))
-            .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER))
-            .then(() => apis.user.nodes.createFolders([ duplicateFolderName ], parent))
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterEach(done => {
-        browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done);
-    });
-
-    afterAll(done => {
-        Promise
-            .all([
-                apis.admin.sites.deleteSite(siteName),
-                apis.user.nodes.deleteNodes([ parent ]),
-                logoutPage.load()
-            ])
-            .then(done);
-    });
-
-    it('option is enabled when having enough permissions', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => personalFilesPage.sidenav.openNewMenu())
-            .then(menu => {
-                const isEnabled = menu.getItemByLabel('Create folder').isEnabled();
-                expect(isEnabled).toBe(true, 'Create folder is not enabled');
-            });
-    });
-
-    it('creates new folder with name', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.enterName(folderName1))
-            .then(() => createDialog.clickCreate())
-            .then(() => createDialog.waitForDialogToClose())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                const isPresent = dataTable.getRowByName(folderName1).isPresent();
-                expect(isPresent).toBe(true, 'Folder not displayed in list view');
-            });
-    });
-
-    it('creates new folder with name and description', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.enterName(folderName2))
-            .then(() => createDialog.enterDescription(folderDescription))
-            .then(() => createDialog.clickCreate())
-            .then(() => createDialog.waitForDialogToClose())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                const isPresent = dataTable.getRowByName(folderName2).isPresent();
-                expect(isPresent).toBe(true, 'Folder not displayed in list view');
-            })
-            .then(() => {
-                expect(apis.user.nodes.getNodeDescription(folderName2)).toEqual(folderDescription);
-            });
-    });
-
-    it('enabled option tooltip', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => personalFilesPage.sidenav.openNewMenu())
-            .then(menu => browser.actions().mouseMove(menu.getItemByLabel('Create folder')).perform()
-                .then(() => menu))
-            .then(menu => {
-                expect(menu.getItemTooltip('Create folder')).toContain('Create new folder');
-            });
-    });
-
-    it('option is disabled when not enough permissions', () => {
-        const fileLibrariesPage = new BrowsingPage();
-
-        fileLibrariesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)
-            .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(siteName))
-            .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(folderName1))
-            .then(() => fileLibrariesPage.sidenav.openNewMenu())
-            .then(menu => {
-                const isEnabled = menu.getItemByLabel('Create folder').isEnabled();
-                expect(isEnabled).toBe(false, 'Create folder is not disabled');
-            });
-    });
-
-    it('disabled option tooltip', () => {
-        const fileLibrariesPage = new BrowsingPage();
-
-        fileLibrariesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)
-            .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(siteName))
-            .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(folderName1))
-            .then(() => fileLibrariesPage.sidenav.openNewMenu())
-            .then(menu => browser.actions().mouseMove(menu.getItemByLabel('Create folder')).perform()
-                .then(() => menu))
-            .then(menu => {
-                const tooltip = menu.getItemTooltip('Create folder');
-                expect(tooltip).toContain(`You can't create a folder here`);
-            });
-    });
-
-    it('dialog UI elements', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => {
-                const dialogTitle = createDialog.getTitle();
-                const isFolderNameDisplayed = createDialog.nameInput.isDisplayed();
-                const isDescriptionDisplayed = createDialog.descriptionTextArea.isDisplayed();
-                const isCreateEnabled = createDialog.createButton.isEnabled();
-                const isCancelEnabled = createDialog.cancelButton.isEnabled();
-
-                expect(dialogTitle).toMatch('Create new folder');
-                expect(isFolderNameDisplayed).toBe(true, 'Name input is not displayed');
-                expect(isDescriptionDisplayed).toBe(true, 'Description field is not displayed');
-                expect(isCreateEnabled).toBe(false, 'Create button is not disabled');
-                expect(isCancelEnabled).toBe(true, 'Cancel button is not enabled');
-            });
-    });
-
-    it('with empty folder name', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.deleteNameWithBackspace())
-            .then(() => {
-                const isCreateEnabled = createDialog.createButton.isEnabled();
-                const validationMessage = createDialog.getValidationMessage();
-
-                expect(isCreateEnabled).toBe(false, 'Create button is enabled');
-                expect(validationMessage).toMatch('Folder name is required');
-            });
-    });
-
-    it('with folder name ending with a dot "."', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.enterName('folder-name.'))
-            .then(dialog => {
-                const isCreateEnabled = dialog.createButton.isEnabled();
-                const validationMessage = dialog.getValidationMessage();
-
-                expect(isCreateEnabled).toBe(false, 'Create button is not disabled');
-                expect(validationMessage).toMatch(`Folder name can't end with a period .`);
-            });
-    });
-
-    it('with folder name containing special characters', () => {
-        const namesWithSpecialChars = [ 'a*a', 'a"a', 'a<a', 'a>a', `a\\a`, 'a/a', 'a?a', 'a:a', 'a|a' ];
-
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => namesWithSpecialChars.forEach(name => {
-                createDialog.enterName(name);
-
-                const isCreateEnabled = createDialog.createButton.isEnabled();
-                const validationMessage = createDialog.getValidationMessage();
-
-                expect(isCreateEnabled).toBe(false, 'Create button is not disabled');
-                expect(validationMessage).toContain(`Folder name can't contain these characters`);
-            }));
-    });
-
-    it('with folder name containing only spaces', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.enterName('    '))
-            .then(dialog => {
-                const isCreateEnabled = dialog.createButton.isEnabled();
-                const validationMessage = dialog.getValidationMessage();
-
-                expect(isCreateEnabled).toBe(false, 'Create button is not disabled');
-                expect(validationMessage).toMatch(`Folder name can't contain only spaces`);
-            });
-    });
-
-    it('cancel folder creation', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.enterName('test'))
-            .then(() => createDialog.enterDescription('test description'))
-            .then(() => createDialog.clickCancel())
-            .then(() => {
-                expect(createDialog.component.isPresent()).not.toBe(true, 'dialog is not closed');
-            });
-    });
-
-    it('duplicate folder name', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.enterName(duplicateFolderName))
-            .then(() => createDialog.clickCreate())
-            .then(() => personalFilesPage.getSnackBarMessage())
-            .then(message => {
-                expect(message).toEqual(`There's already a folder with this name. Try a different name.`);
-                expect(createDialog.component.isPresent()).toBe(true, 'dialog is not present');
-            });
-    });
-
-    it('trim ending spaces from folder name', () => {
-        personalFilesPage.dataTable.doubleClickOnItemName(parent)
-            .then(() => openCreateDialog())
-            .then(() => createDialog.enterName(nameWithSpaces))
-            .then(() => createDialog.clickCreate())
-            .then(() => createDialog.waitForDialogToClose())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                const isPresent = dataTable.getRowByName(nameWithSpaces.trim()).isPresent();
-                expect(isPresent).toBe(true, 'Folder not displayed in list view');
-            });
-    });
-});
diff --git a/e2e/suites/actions/edit-folder.test.ts b/e2e/suites/actions/edit-folder.test.ts
deleted file mode 100644
index 7a8826620..000000000
--- a/e2e/suites/actions/edit-folder.test.ts
+++ /dev/null
@@ -1,190 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { protractor, element, browser, by, ElementFinder, promise } from 'protractor';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { SIDEBAR_LABELS, SITE_VISIBILITY, SITE_ROLES } from '../../configs';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-import { CreateOrEditFolderDialog } from '../../components/dialog/create-edit-folder-dialog';
-import { Utils } from '../../utilities/utils';
-
-describe('Edit folder', () => {
-    const username = `user-${Utils.random()}`;
-
-    const parent = `parent-${Utils.random()}`;
-    const folderName = `folder-${Utils.random()}`;
-    const folderDescription = 'my folder description';
-
-    const folderNameToEdit = `folder-${Utils.random()}`;
-    const duplicateFolderName = `folder-${Utils.random()}`;
-
-    const folderNameEdited = `folder-${Utils.random()}`;
-    const folderDescriptionEdited = 'my folder description edited';
-
-    const siteName = `site-private-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const personalFilesPage = new BrowsingPage();
-    const editDialog = new CreateOrEditFolderDialog();
-    const { dataTable } = personalFilesPage;
-    const editButton = personalFilesPage.toolbar.actions.getButtonByTitleAttribute('Edit');
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE))
-            .then(() => apis.admin.nodes.createFolders([ folderName ], `Sites/${siteName}/documentLibrary`))
-            .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER))
-
-            .then(() => apis.user.nodes.createNodeWithProperties( folderName, '', folderDescription, parent ))
-            .then(() => apis.user.nodes.createFolders([ folderNameToEdit, duplicateFolderName ], parent))
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-            .then(() => dataTable.waitForHeader())
-            .then(() => dataTable.doubleClickOnItemName(parent))
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterEach(done => {
-        browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done);
-    });
-
-    afterAll(done => {
-        Promise
-            .all([
-                apis.admin.sites.deleteSite(siteName),
-                apis.user.nodes.deleteNodes([ parent ]),
-                logoutPage.load()
-            ])
-            .then(done);
-    });
-
-    it('dialog UI defaults', () => {
-        dataTable.clickOnItemName(folderName)
-            .then(() => editButton.click())
-            .then(() => {
-                expect(editDialog.getTitle()).toEqual('Edit folder');
-                expect(editDialog.nameInput.getAttribute('value')).toBe(folderName);
-                expect(editDialog.descriptionTextArea.getAttribute('value')).toBe(folderDescription);
-                expect(editDialog.updateButton.isEnabled()).toBe(true, 'upload button is not enabled');
-                expect(editDialog.cancelButton.isEnabled()).toBe(true, 'cancel button is not enabled');
-            });
-    });
-
-    it('properties are modified when pressing OK', () => {
-        dataTable.clickOnItemName(folderNameToEdit)
-            .then(() => editButton.click())
-            .then(() => editDialog.waitForDialogToOpen())
-            .then(() => editDialog.enterName(folderNameEdited))
-            .then(() => editDialog.enterDescription(folderDescriptionEdited))
-            .then(() => editDialog.clickUpdate())
-            .then(() => editDialog.waitForDialogToClose())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                const isPresent = dataTable.getRowByName(folderNameEdited).isPresent();
-                expect(isPresent).toBe(true, 'Folder not displayed in list view');
-            })
-            .then(() => {
-                expect(apis.user.nodes.getNodeDescription(folderNameEdited)).toEqual(folderDescriptionEdited);
-            });
-    });
-
-    it('with empty folder name', () => {
-        dataTable.clickOnItemName(folderName)
-            .then(() => editButton.click())
-            .then(() => editDialog.deleteNameWithBackspace())
-            .then(() => {
-                expect(editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled');
-                expect(editDialog.getValidationMessage()).toMatch('Folder name is required');
-            });
-    });
-
-    it('with name with special characters', () => {
-        const namesWithSpecialChars = [ 'a*a', 'a"a', 'a<a', 'a>a', `a\\a`, 'a/a', 'a?a', 'a:a', 'a|a' ];
-
-        dataTable.clickOnItemName(folderName)
-            .then(() => editButton.click())
-            .then(() => namesWithSpecialChars.forEach(name => {
-                editDialog.enterName(name);
-
-                expect(editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not disabled');
-                expect(editDialog.getValidationMessage()).toContain(`Folder name can't contain these characters`);
-            }));
-    });
-
-    it('with name ending with a dot', () => {
-        dataTable.clickOnItemName(folderName)
-            .then(() => editButton.click())
-            .then(() => editDialog.nameInput.sendKeys('.'))
-            .then(() => {
-                expect(editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled');
-                expect(editDialog.getValidationMessage()).toMatch(`Folder name can't end with a period .`);
-            });
-    });
-
-    it('Cancel button', () => {
-        dataTable.clickOnItemName(folderName)
-            .then(() => editButton.click())
-            .then(() => editDialog.clickCancel())
-            .then(() => {
-                expect(editDialog.component.isPresent()).not.toBe(true, 'dialog is not closed');
-            });
-    });
-
-    it('with duplicate folder name', () => {
-        dataTable.clickOnItemName(folderName)
-            .then(() => editButton.click())
-            .then(() => editDialog.enterName(duplicateFolderName))
-            .then(() => editDialog.clickUpdate())
-            .then(() => personalFilesPage.getSnackBarMessage())
-            .then(message => {
-                expect(message).toEqual(`There's already a folder with this name. Try a different name.`);
-                expect(editDialog.component.isPresent()).toBe(true, 'dialog is not present');
-            });
-    });
-
-    it('trim ending spaces', () => {
-        dataTable.clickOnItemName(folderName)
-            .then(() => editButton.click())
-            .then(() => editDialog.nameInput.sendKeys('   '))
-            .then(() => editDialog.clickUpdate())
-            .then(() => editDialog.waitForDialogToClose())
-            .then(() => {
-                expect(personalFilesPage.snackBar.isPresent()).not.toBe(true, 'notification appears');
-                expect(dataTable.getRowByName(folderName).isPresent()).toBe(true, 'Folder not displayed in list view');
-            });
-    });
-});
diff --git a/e2e/suites/actions/permanently-delete.test.ts b/e2e/suites/actions/permanently-delete.test.ts
deleted file mode 100644
index 7cf88a95f..000000000
--- a/e2e/suites/actions/permanently-delete.test.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-import { Utils } from '../../utilities/utils';
-
-describe('Permanently delete from Trash', () => {
-    const username = `user-${Utils.random()}`;
-
-    const file1 = `file-${Utils.random()}.txt`;
-    const file2 = `file-${Utils.random()}.txt`;
-    let filesIds;
-
-    const folder1 = `folder-${Utils.random()}`;
-    const folder2 = `folder-${Utils.random()}`;
-    let foldersIds;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const trashPage = new BrowsingPage();
-    const { dataTable } = trashPage;
-    const { toolbar } = trashPage;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.user.nodes.createFiles([ file1, file2 ]))
-            .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id))
-            .then(() => apis.user.nodes.createFolders([ folder1, folder2 ]))
-            .then(resp => foldersIds = resp.data.list.entries.map(entries => entries.entry.id))
-
-            .then(() => apis.user.nodes.deleteNodesById(filesIds, false))
-            .then(() => apis.user.nodes.deleteNodesById(foldersIds, false))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.admin.trashcan.emptyTrash(),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('delete file', () => {
-        dataTable.clickOnItemName(file1)
-            .then(() => toolbar.actions.getButtonByTitleAttribute('Permanently delete').click())
-            .then(() => trashPage.getSnackBarMessage())
-            .then(text => {
-                expect(text).toBe(`${file1} deleted`);
-                expect(dataTable.getRowByName(file1).isPresent()).toBe(false, 'Item was not deleted');
-            });
-    });
-
-    it('delete folder', () => {
-        dataTable.clickOnItemName(folder1)
-            .then(() => toolbar.actions.getButtonByTitleAttribute('Permanently delete').click())
-            .then(() => trashPage.getSnackBarMessage())
-            .then(text => {
-                expect(text).toBe(`${folder1} deleted`);
-                expect(dataTable.getRowByName(folder1).isPresent()).toBe(false, 'Item was not deleted');
-            });
-    });
-
-    it('delete multiple items', () => {
-        dataTable.selectMultipleItems([ file2, folder2 ])
-            .then(() => toolbar.actions.getButtonByTitleAttribute('Permanently delete').click())
-            .then(() => trashPage.getSnackBarMessage())
-            .then(text => {
-                expect(text).toBe(`2 items deleted`);
-                expect(dataTable.getRowByName(file2).isPresent()).toBe(false, 'Item was not deleted');
-                expect(dataTable.getRowByName(folder2).isPresent()).toBe(false, 'Item was not deleted');
-            });
-    });
-});
diff --git a/e2e/suites/actions/restore.test.ts b/e2e/suites/actions/restore.test.ts
deleted file mode 100644
index 179408cb5..000000000
--- a/e2e/suites/actions/restore.test.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-import { Utils } from '../../utilities/utils';
-
-describe('Restore from Trash', () => {
-    const username = `user-${Utils.random()}`;
-
-    const file1 = `file-${Utils.random()}.txt`;
-    const file2 = `file-${Utils.random()}.txt`;
-    const file3 = `file-${Utils.random()}.txt`;
-    let filesIds;
-
-    const folder1 = `folder-${Utils.random()}`;
-    const folder2 = `folder-${Utils.random()}`;
-    let foldersIds;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const trashPage = new BrowsingPage();
-    const personalFilesPage = new BrowsingPage();
-    const { dataTable } = trashPage;
-    const { toolbar } = trashPage;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.user.nodes.createFiles([ file1, file2, file3 ]))
-            .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id))
-            .then(() => apis.user.nodes.createFolders([ folder1, folder2 ]))
-            .then(resp => foldersIds = resp.data.list.entries.map(entries => entries.entry.id))
-
-            .then(() => apis.user.nodes.deleteNodesById(filesIds, false))
-            .then(() => apis.user.nodes.deleteNodesById(foldersIds, false))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.user.nodes.deleteNodesById(filesIds),
-            apis.user.nodes.deleteNodesById(foldersIds),
-            apis.admin.trashcan.emptyTrash(),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('restore file', () => {
-        dataTable.clickOnItemName(file1)
-            .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click())
-            .then(() => trashPage.getSnackBarMessage())
-            .then(text => {
-                expect(text).toContain(`${file1} restored`);
-                expect(text).toContain(`View`);
-                expect(dataTable.getRowByName(file1).isPresent()).toBe(false, 'Item was not removed from list');
-            })
-            .then(() => personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
-            .then(() => personalFilesPage.dataTable.waitForHeader())
-            .then(() => {
-                expect(personalFilesPage.dataTable.getRowByName(file1).isPresent()).toBe(true, 'Item not displayed in list');
-            });
-    });
-
-    it('restore folder', () => {
-        dataTable.clickOnItemName(folder1)
-            .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click())
-            .then(() => trashPage.getSnackBarMessage())
-            .then(text => {
-                expect(text).toContain(`${folder1} restored`);
-                expect(text).toContain(`View`);
-                expect(dataTable.getRowByName(folder1).isPresent()).toBe(false, 'Item was not removed from list');
-            })
-            .then(() => personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
-            .then(() => personalFilesPage.dataTable.waitForHeader())
-            .then(() => {
-                expect(personalFilesPage.dataTable.getRowByName(folder1).isPresent()).toBe(true, 'Item not displayed in list');
-            });
-    });
-
-    it('restore multiple items', () => {
-        dataTable.selectMultipleItems([ file2, folder2 ])
-            .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click())
-            .then(() => trashPage.getSnackBarMessage())
-            .then(text => {
-                expect(text).toContain(`Restore successful`);
-                expect(text).not.toContain(`View`);
-                expect(dataTable.getRowByName(file2).isPresent()).toBe(false, 'Item was not removed from list');
-                expect(dataTable.getRowByName(folder2).isPresent()).toBe(false, 'Item was not removed from list');
-            })
-            .then(() => personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
-            .then(() => personalFilesPage.dataTable.waitForHeader())
-            .then(() => {
-                expect(personalFilesPage.dataTable.getRowByName(file2).isPresent()).toBe(true, 'Item not displayed in list');
-                expect(personalFilesPage.dataTable.getRowByName(folder2).isPresent()).toBe(true, 'Item not displayed in list');
-            });
-    });
-
-    it('View from notification', () => {
-        dataTable.clickOnItemName(file3)
-            .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click())
-            .then(() => trashPage.getSnackBarAction().click())
-            .then(() => personalFilesPage.dataTable.waitForHeader())
-            .then(() => {
-                expect(personalFilesPage.sidenav.isActiveByLabel('Personal Files')).toBe(true, 'Personal Files sidebar link not active');
-                expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
-            });
-    });
-});
diff --git a/e2e/suites/actions/toolbar-multiple-selection.test.ts b/e2e/suites/actions/toolbar-multiple-selection.test.ts
deleted file mode 100644
index 7a0f00ab8..000000000
--- a/e2e/suites/actions/toolbar-multiple-selection.test.ts
+++ /dev/null
@@ -1,535 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-import { Utils } from '../../utilities/utils';
-
-describe('Toolbar actions - multiple selection : ', () => {
-    const user1 = `user-${Utils.random()}`;
-    const user2 = `user-${Utils.random()}`;
-
-    const file1 = `file-${Utils.random()}.txt`;
-    let file1Id;
-    const file2 = `file-${Utils.random()}.txt`;
-    let file2Id;
-
-    const folder1 = `folder-${Utils.random()}`;
-    let folder1Id;
-    const folder2 = `folder-${Utils.random()}`;
-    let folder2Id;
-
-    const fileForDelete1 = `file-${Utils.random()}.txt`; let fileForDelete1Id;
-    const fileForDelete2 = `file-${Utils.random()}.txt`; let fileForDelete2Id;
-    const folderForDelete1 = `folder-${Utils.random()}`; let folderForDelete1Id;
-    const folderForDelete2 = `folder-${Utils.random()}`; let folderForDelete2Id;
-
-    const siteName = `site-private-${Utils.random()}`;
-    const file1Admin = `file-${Utils.random()}.txt`;
-    const file2Admin = `file-${Utils.random()}.txt`;
-    const folder1Admin = `folder-${Utils.random()}`;
-    const folder2Admin = `folder-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(user1, user1)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable } = page;
-    const { toolbar } = page;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(user1)
-            .then(() => apis.user.nodes.createFiles([ file1 ]).then(resp => file1Id = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFiles([ file2 ]).then(resp => file2Id = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFolders([ folder1 ]).then(resp => folder1Id = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFolders([ folder2 ]).then(resp => folder2Id = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFiles([ fileForDelete1 ]).then(resp => fileForDelete1Id = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFiles([ fileForDelete2 ]).then(resp => fileForDelete2Id = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFolders([ folderForDelete1 ]).then(resp => folderForDelete1Id = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFolders([ folderForDelete2 ]).then(resp => folderForDelete2Id = resp.data.entry.id))
-
-            .then(() => apis.user.shared.shareFileById(file1Id))
-            .then(() => apis.user.shared.shareFileById(file2Id))
-
-            .then(() => apis.user.favorites.addFavoriteById('file', file1Id))
-            .then(() => apis.user.favorites.addFavoriteById('file', file2Id))
-            .then(() => apis.user.favorites.addFavoriteById('folder', folder1Id))
-            .then(() => apis.user.favorites.addFavoriteById('folder', folder2Id))
-
-            .then(() => apis.user.nodes.deleteNodeById(fileForDelete1Id, false))
-            .then(() => apis.user.nodes.deleteNodeById(fileForDelete2Id, false))
-            .then(() => apis.user.nodes.deleteNodeById(folderForDelete1Id, false))
-            .then(() => apis.user.nodes.deleteNodeById(folderForDelete2Id, false))
-
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.user.nodes.deleteNodeById(file1Id),
-            apis.user.nodes.deleteNodeById(file2Id),
-            apis.user.nodes.deleteNodeById(folder1Id),
-            apis.user.nodes.deleteNodeById(folder2Id),
-
-            apis.user.trashcan.permanentlyDelete(fileForDelete1Id),
-            apis.user.trashcan.permanentlyDelete(fileForDelete2Id),
-            apis.user.trashcan.permanentlyDelete(folderForDelete1Id),
-            apis.user.trashcan.permanentlyDelete(folderForDelete2Id),
-
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    xit('');
-
-    describe('Personal Files', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(user1))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('correct actions appear when multiple files are selected', () => {
-            dataTable.selectMultipleItems([file1, file2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-
-        it('correct actions appear when multiple folders are selected', () => {
-            dataTable.selectMultipleItems([folder1, folder2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-
-        it('correct actions appear when both files and folders are selected', () => {
-            dataTable.selectMultipleItems([file1, file2, folder1, folder2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-    });
-
-    describe('File Libraries', () => {
-        beforeAll(done => {
-            apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC)
-                .then(() => apis.admin.people.createUser(user2))
-                .then(() => apis.admin.sites.addSiteMember(siteName, user1, SITE_ROLES.SITE_MANAGER))
-                .then(() => apis.admin.sites.addSiteMember(siteName, user2, SITE_ROLES.SITE_CONSUMER))
-                .then(() => apis.admin.nodes.createFiles([ file1Admin, file2Admin ], `Sites/${siteName}/documentLibrary`))
-                .then(() => apis.admin.nodes.createFolders([ folder1Admin, folder2Admin ], `Sites/${siteName}/documentLibrary`))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)
-                .then(() => dataTable.waitForHeader())
-                .then(() => dataTable.doubleClickOnItemName(siteName))
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            apis.admin.sites.deleteSite(siteName).then(done);
-        });
-
-        xit('');
-
-        describe('user is Manager', () => {
-            beforeAll(done => {
-                loginPage.load()
-                    .then(() => loginPage.loginWith(user1))
-                    .then(done);
-            });
-
-            afterAll(done => {
-                logoutPage.load().then(done);
-            });
-
-            it('correct actions appear when multiple files are selected', () => {
-                dataTable.selectMultipleItems([file1Admin, file2Admin])
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                    })
-                    .then(() => browser.$('body').click())
-                    .then(() => dataTable.clearSelection());
-            });
-
-            it('correct actions appear when multiple folders are selected', () => {
-                dataTable.selectMultipleItems([folder1Admin, folder2Admin])
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                    })
-                    .then(() => browser.$('body').click())
-                    .then(() => dataTable.clearSelection());
-            });
-
-            it('correct actions appear when both files and folders are selected', () => {
-                dataTable.selectMultipleItems([file1Admin, file2Admin, folder1Admin, folder2Admin])
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                    })
-                    .then(() => browser.$('body').click())
-                    .then(() => dataTable.clearSelection());
-            });
-        });
-
-        describe('user is Consumer', () => {
-            beforeAll(done => {
-                loginPage.load()
-                    .then(() => loginPage.loginWith(user2))
-                    .then(done);
-            });
-
-            afterAll(done => {
-                logoutPage.load().then(done);
-            });
-
-            it('correct actions appear when multiple files are selected', () => {
-                dataTable.selectMultipleItems([file1Admin, file2Admin])
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                    })
-                    .then(() => browser.$('body').click())
-                    .then(() => dataTable.clearSelection());
-            });
-
-            it('correct actions appear when multiple folders are selected', () => {
-                dataTable.selectMultipleItems([folder1Admin, folder2Admin])
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                    })
-                    .then(() => browser.$('body').click())
-                    .then(() => dataTable.clearSelection());
-            });
-
-            it('correct actions appear when both files and folders are selected', () => {
-                dataTable.selectMultipleItems([file1Admin, file2Admin, folder1Admin, folder2Admin])
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is not displayed for selected files`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                    })
-                    .then(() => browser.$('body').click())
-                    .then(() => dataTable.clearSelection());
-            });
-        });
-    });
-
-    describe('Shared Files', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(user1))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('correct actions appear when multiple files are selected', () => {
-            dataTable.selectMultipleItems([file1, file2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-    });
-
-    describe('Recent Files', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(user1))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('correct actions appear when multiple files are selected', () => {
-            dataTable.selectMultipleItems([file1, file2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-    });
-
-    describe('Favorites', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(user1))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('correct actions appear when multiple files are selected', () => {
-            dataTable.selectMultipleItems([file1, file2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-
-        it('correct actions appear when multiple folders are selected', () => {
-            dataTable.selectMultipleItems([folder1, folder2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-
-        it('correct actions appear when both files and folders are selected', () => {
-            dataTable.selectMultipleItems([file1, file2, folder1, folder2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
-                })
-                .then(() => browser.$('body').click())
-                .then(() => dataTable.clearSelection());
-        });
-    });
-
-    describe('Trash', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(user1))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('correct actions appear when multiple files are selected', () => {
-            dataTable.selectMultipleItems([fileForDelete1, fileForDelete2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('Permanently delete'))
-                        .toBe(true, 'Permanently delete is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed for selected files');
-                })
-                .then(() => dataTable.clearSelection());
-        });
-
-        it('correct actions appear when multiple folders are selected', () => {
-            dataTable.selectMultipleItems([folderForDelete1, folderForDelete2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('Permanently delete'))
-                        .toBe(true, 'Permanently delete is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed for selected files');
-                })
-                .then(() => dataTable.clearSelection());
-        });
-
-        it('correct actions appear when both files and folders are selected', () => {
-            dataTable.selectMultipleItems([fileForDelete1, fileForDelete2, folderForDelete1, folderForDelete2])
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('Permanently delete'))
-                        .toBe(true, 'Permanently delete is displayed for selected files');
-                    expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed for selected files');
-                })
-                .then(() => dataTable.clearSelection());
-        });
-    });
-});
diff --git a/e2e/suites/actions/toolbar-single-selection.test.ts b/e2e/suites/actions/toolbar-single-selection.test.ts
deleted file mode 100644
index 9721ef5d0..000000000
--- a/e2e/suites/actions/toolbar-single-selection.test.ts
+++ /dev/null
@@ -1,535 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-import { Utils } from '../../utilities/utils';
-
-describe('Toolbar actions - single selection : ', () => {
-    const username = `user-${Utils.random()}`;
-    const username2 = `user-${Utils.random()}`;
-
-    const fileUser = `file-${Utils.random()}.txt`;
-    let fileUserId;
-
-    const folderUser = `folder-${Utils.random()}`;
-    let folderUserId;
-
-    const fileForDelete = `file-${Utils.random()}.txt`;
-    let fileForDeleteId;
-
-    const folderForDelete = `folder-${Utils.random()}`;
-    let folderForDeleteId;
-
-    const siteName = `site-private-${Utils.random()}`;
-    const fileAdmin = `file-${Utils.random()}.txt`;
-    const folderAdmin = `folder-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable, toolbar } = page;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.user.nodes.createFiles([ fileUser ]))
-            .then(resp => fileUserId = resp.data.entry.id)
-            .then(() => apis.user.nodes.createFiles([ fileForDelete ]))
-            .then(resp => fileForDeleteId = resp.data.entry.id)
-            .then(() => apis.user.nodes.createFolders([ folderForDelete ]))
-            .then(resp => folderForDeleteId = resp.data.entry.id)
-            .then(() => apis.user.nodes.createFolders([ folderUser ]))
-            .then(resp => folderUserId = resp.data.entry.id)
-            .then(() => apis.user.shared.shareFileById(fileUserId))
-            .then(() => apis.user.favorites.addFavoriteById('file', fileUserId))
-            .then(() => apis.user.favorites.addFavoriteById('folder', folderUserId))
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.user.nodes.deleteNodeById(fileUserId),
-            apis.user.nodes.deleteNodeById(folderUserId),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    xit('');
-
-    describe('Personal Files', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(username))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('actions are not displayed when no item is selected', () => {
-            expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`);
-        });
-
-        it('actions are displayed when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`);
-                });
-        });
-
-        it('actions are displayed when a folder is selected', () => {
-            dataTable.clickOnItemName(folderUser)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderUser}`);
-                });
-        });
-
-        it('correct actions appear when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`);
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`);
-                })
-                .then(() => browser.$('body').click());
-        });
-
-        it('correct actions appear when a folder is selected', () => {
-            dataTable.clickOnItemName(folderUser)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderUser}`);
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderUser}`);
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(true, `Edit is not displayed for ${folderUser}`);
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderUser}`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${folderUser}`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${folderUser}`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderUser}`);
-                })
-                .then(() => browser.$('body').click());
-        });
-    });
-
-    describe('File Libraries', () => {
-        beforeAll(done => {
-            apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC)
-                .then(() => apis.admin.people.createUser(username2))
-                .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_MANAGER))
-                .then(() => apis.admin.sites.addSiteMember(siteName, username2, SITE_ROLES.SITE_CONSUMER))
-                .then(() => apis.admin.nodes.createFiles([ fileAdmin ], `Sites/${siteName}/documentLibrary`))
-                .then(() => apis.admin.nodes.createFolders([ folderAdmin ], `Sites/${siteName}/documentLibrary`))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)
-                .then(() => dataTable.waitForHeader())
-                .then(() => dataTable.doubleClickOnItemName(siteName))
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            apis.admin.sites.deleteSite(siteName).then(done);
-        });
-
-        xit('');
-
-        describe('user is Manager', () => {
-            beforeAll(done => {
-                loginPage.load()
-                    .then(() => loginPage.loginWith(username))
-                    .then(done);
-            });
-
-            afterAll(done => {
-                logoutPage.load().then(done);
-            });
-
-            it('actions are not displayed when no item is selected', () => {
-                expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`);
-            });
-
-            it('actions are displayed when a file is selected', () => {
-                dataTable.clickOnItemName(fileAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileAdmin}`);
-                    });
-            });
-
-            it('actions are displayed when a folder is selected', () => {
-                dataTable.clickOnItemName(folderAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderAdmin}`);
-                    });
-            });
-
-            it('correct actions appear when a file is selected', () => {
-                dataTable.clickOnItemName(fileAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileAdmin}`);
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileAdmin}`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileAdmin}`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileAdmin}`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileAdmin}`);
-                    })
-                    .then(() => browser.$('body').click());
-            });
-
-            it('correct actions appear when a folder is selected', () => {
-                dataTable.clickOnItemName(folderAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(true, `Edit is not displayed for ${folderAdmin}`);
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderAdmin}`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${folderAdmin}`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${folderAdmin}`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderAdmin}`);
-                    })
-                    .then(() => browser.$('body').click());
-            });
-        });
-
-        describe('user is Consumer', () => {
-            beforeAll(done => {
-                loginPage.load()
-                    .then(() => loginPage.loginWith(username2))
-                    .then(done);
-            });
-
-            afterAll(done => {
-                logoutPage.load().then(done);
-            });
-
-            it('actions are not displayed when no item is selected', () => {
-                expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`);
-            });
-
-            it('actions are displayed when a file is selected', () => {
-                dataTable.clickOnItemName(fileAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileAdmin}`);
-                    });
-            });
-
-            it('actions are displayed when a folder is selected', () => {
-                dataTable.clickOnItemName(folderAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderAdmin}`);
-                    });
-            });
-
-            it('correct actions appear when a file is selected', () => {
-                dataTable.clickOnItemName(fileAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileAdmin}`);
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileAdmin}`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for ${fileAdmin}`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for ${fileAdmin}`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileAdmin}`);
-                    })
-                    .then(() => browser.$('body').click());
-            });
-
-            it('correct actions appear when a folder is selected', () => {
-                dataTable.clickOnItemName(folderAdmin)
-                    .then(() => {
-                        expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderAdmin}`);
-                        expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${folderAdmin}`);
-                    })
-                    .then(() => toolbar.actions.openMoreMenu())
-                    .then(menu => {
-                        expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderAdmin}`);
-                        expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for ${folderAdmin}`);
-                        expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for ${folderAdmin}`);
-                        expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderAdmin}`);
-                    })
-                    .then(() => browser.$('body').click());
-            });
-        });
-    });
-
-    describe('Shared Files', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(username))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('actions are not displayed when no item is selected', () => {
-            expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`);
-        });
-
-        it('actions are displayed when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`);
-                });
-        });
-
-        it('correct actions appear when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`);
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`);
-                })
-                .then(() => browser.$('body').click());
-        });
-    });
-
-    describe('Recent Files', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(username))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('actions are not displayed when no item is selected', () => {
-            expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`);
-        });
-
-        it('actions are displayed when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`);
-                });
-        });
-
-        it('correct actions appear when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`);
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`);
-                })
-                .then(() => browser.$('body').click());
-        });
-    });
-
-    describe('Favorites', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(username))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('actions are not displayed when no item is selected', () => {
-            expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`);
-        });
-
-        it('actions are displayed when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`);
-                });
-        });
-
-        it('actions are displayed when a folder is selected', () => {
-            dataTable.clickOnItemName(folderUser)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderUser}`);
-                });
-        });
-
-        it('correct actions appear when a file is selected', () => {
-            dataTable.clickOnItemName(fileUser)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`);
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`);
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`);
-                })
-                .then(() => browser.$('body').click());
-        });
-
-        it('correct actions appear when a folder is selected', () => {
-            dataTable.clickOnItemName(folderUser)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderUser}`);
-                    expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderUser}`);
-                    expect(toolbar.actions.isButtonPresent('Edit')).toBe(true, `Edit is not displayed for ${folderUser}`);
-                })
-                .then(() => toolbar.actions.openMoreMenu())
-                .then(menu => {
-                    expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderUser}`);
-                    expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${folderUser}`);
-                    expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${folderUser}`);
-                    expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderUser}`);
-                })
-                .then(() => browser.$('body').click());
-        });
-    });
-
-    describe('Trash', () => {
-        beforeAll(done => {
-            apis.user.nodes.deleteNodeById(fileForDeleteId, false)
-                .then(() => apis.user.nodes.deleteNodeById(folderForDeleteId, false))
-                .then(() => loginPage.load())
-                .then(() => loginPage.loginWith(username))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            Promise.all([
-                apis.user.trashcan.permanentlyDelete(fileForDeleteId),
-                apis.user.trashcan.permanentlyDelete(folderForDeleteId),
-                logoutPage.load()
-            ])
-            .then(done);
-        });
-
-        it('actions are not displayed when no item is selected', () => {
-            expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`);
-        });
-
-        it('actions are displayed when a file is selected', () => {
-            dataTable.clickOnItemName(fileForDelete)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileForDelete}`);
-                });
-        });
-
-        it('actions are displayed when a folder is selected', () => {
-            dataTable.clickOnItemName(folderForDelete)
-                .then(() => {
-                    expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderForDelete}`);
-                });
-        });
-
-        it('correct actions appear when a file is selected', () => {
-            dataTable.clickOnItemName(fileForDelete)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('Permanently delete'))
-                        .toBe(true, `Permanently delete is not displayed for ${fileForDelete}`);
-                    expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, `Restore is not displayed for ${fileForDelete}`);
-                });
-        });
-
-        it('correct actions appear when a folder is selected', () => {
-            dataTable.clickOnItemName(folderForDelete)
-                .then(() => {
-                    expect(toolbar.actions.isButtonPresent('Permanently delete'))
-                        .toBe(true, `Permanently delete is displayed for ${folderForDelete}`);
-                    expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, `Restore is not enabled for ${folderForDelete}`);
-                });
-        });
-    });
-});
diff --git a/e2e/suites/application/page-titles.test.ts b/e2e/suites/application/page-titles.test.ts
deleted file mode 100644
index 69ee99f2e..000000000
--- a/e2e/suites/application/page-titles.test.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser } from 'protractor';
-
-import { SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-
-describe('Page titles', () => {
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-
-    xit('');
-
-    describe('on Login / Logout pages', () => {
-        it('on Login page', () => {
-            loginPage.load()
-                .then(() => {
-                    expect(browser.getTitle()).toContain('Sign in');
-                });
-        });
-
-        it('after logout', () => {
-            loginPage.load()
-                .then(() => loginPage.loginWithAdmin())
-                .then(() => page.signOut())
-                .then(() => {
-                    expect(browser.getTitle()).toContain('Sign in');
-                });
-        });
-
-        it('when pressing Back after Logout', () => {
-            loginPage.load()
-                .then(() => loginPage.loginWithAdmin())
-                .then(() => page.signOut())
-                .then(() => browser.navigate().back())
-                .then(() => {
-                    expect(browser.getTitle()).toContain('Sign in');
-                });
-        });
-    });
-
-    describe('on list views', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWithAdmin())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load()
-                .then(done);
-        });
-
-        it('Personal Files page', () => {
-            const label = SIDEBAR_LABELS.PERSONAL_FILES;
-
-            page.sidenav.navigateToLinkByLabel(label)
-                .then(() => {
-                    expect(browser.getTitle()).toContain(label);
-                });
-        });
-
-        it('File Libraries page', () => {
-            const label = SIDEBAR_LABELS.FILE_LIBRARIES;
-
-            page.sidenav.navigateToLinkByLabel(label)
-                .then(() => {
-                    expect(browser.getTitle()).toContain(label);
-                });
-        });
-
-        it('Shared Files page', () => {
-            const label = SIDEBAR_LABELS.SHARED_FILES;
-
-            page.sidenav.navigateToLinkByLabel(label)
-                .then(() => {
-                    expect(browser.getTitle()).toContain(label);
-                });
-        });
-
-        it('Recent Files page', () => {
-            const label = SIDEBAR_LABELS.RECENT_FILES;
-
-            page.sidenav.navigateToLinkByLabel(label)
-                .then(() => {
-                    expect(browser.getTitle()).toContain(label);
-                });
-        });
-
-        it('Favorites page', () => {
-            const label = SIDEBAR_LABELS.FAVORITES;
-
-            page.sidenav.navigateToLinkByLabel(label)
-                .then(() => {
-                    expect(browser.getTitle()).toContain(label);
-                });
-        });
-
-        it('Trash page', () => {
-            const label = SIDEBAR_LABELS.TRASH;
-
-            page.sidenav.navigateToLinkByLabel(label)
-                .then(() => {
-                    expect(browser.getTitle()).toContain(label);
-                });
-        });
-    });
-});
diff --git a/e2e/suites/authentication/login.test.ts b/e2e/suites/authentication/login.test.ts
deleted file mode 100644
index 50f976259..000000000
--- a/e2e/suites/authentication/login.test.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser } from 'protractor';
-
-import { APP_ROUTES } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-
-describe('Login', () => {
-    const peopleApi = new RepoClient().people;
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-
-    const testUser = `user-${Utils.random()}@alfness`;
-
-    const russianUser = {
-        username: `пользвате${Utils.random()}`,
-        password: '密碼中國'
-    };
-
-    const johnDoe = {
-        username: `user-${Utils.random()}`,
-        get password() { return this.username; },
-        firstName: 'John',
-        lastName: 'Doe'
-    };
-
-    beforeAll(done => {
-        Promise
-            .all([
-                peopleApi.createUser(testUser),
-                peopleApi.createUser(russianUser.username, russianUser.password),
-                peopleApi.createUser(johnDoe.username, johnDoe.password, {
-                    firstName: johnDoe.firstName,
-                    lastName: johnDoe.lastName
-                })
-            ])
-            .then(done);
-    });
-
-    beforeEach(done => {
-        loginPage.load().then(done);
-    });
-
-    afterEach(done => {
-        logoutPage.load()
-            .then(() => Utils.clearLocalStorage())
-            .then(done);
-    });
-
-    xit('');
-
-    describe('with valid credentials', () => {
-        it('navigate to "Personal Files"', () => {
-            const { username } = johnDoe;
-
-            loginPage.loginWith(username)
-                .then(() => {
-                    expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
-                });
-        });
-
-        it(`displays user's name in header`, () => {
-            const { userInfo } = new BrowsingPage(APP_ROUTES.PERSONAL_FILES).header;
-            const { username, firstName, lastName } = johnDoe;
-
-            loginPage.loginWith(username)
-                .then(() => {
-                    expect(userInfo.name).toEqual(`${firstName} ${lastName}`);
-                });
-        });
-
-        it(`logs in with user having username containing "@"`, () => {
-            loginPage
-                .loginWith(testUser)
-                .then(() => {
-                    expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
-                });
-        });
-
-        it('logs in with user with non-latin characters', () => {
-            const { username, password } = russianUser;
-
-            loginPage
-                .loginWith(username, password)
-                .then(() => {
-                    expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
-                });
-        });
-
-        it('redirects to Home Page when navigating to the Login page while already logged in', () => {
-            const { username } = johnDoe;
-
-            loginPage
-                .loginWith(username)
-                .then(() => browser.get(APP_ROUTES.LOGIN)
-                    .then(() => {
-                        expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
-                    })
-                );
-        });
-
-        it('redirects to Personal Files when pressing browser Back while already logged in ', () => {
-            const { username } = johnDoe;
-
-            loginPage
-                .loginWith(username)
-                .then(() => browser.navigate().back())
-                .then(() => {
-                    expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
-                });
-        });
-    });
-
-    describe('with invalid credentials', () => {
-        const { login: loginComponent } = loginPage;
-        const { submitButton, errorMessage } = loginComponent;
-
-        it('disabled submit button when no credentials are entered', () => {
-            expect(submitButton.isEnabled()).toBe(false);
-        });
-
-        it('disabled submit button when password is empty', () => {
-            loginComponent.enterUsername('any-username');
-
-            expect(submitButton.isEnabled()).toBe(false);
-        });
-
-        it('disabled submit button when username is empty', () => {
-            loginPage.login.enterPassword('any-password');
-
-            expect(submitButton.isEnabled()).toBe(false);
-        });
-
-        it('shows error when entering nonexistent user', () => {
-            loginPage
-                .tryLoginWith('nonexistent-user', 'any-password')
-                .then(() => {
-                    expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN);
-                    expect(errorMessage.isDisplayed()).toBe(true);
-                });
-        });
-
-        it('shows error when entering invalid password', () => {
-            const { username } = johnDoe;
-
-            loginPage
-                .tryLoginWith(username, 'incorrect-password')
-                .then(() => {
-                    expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN);
-                    expect(errorMessage.isDisplayed()).toBe(true);
-                });
-        });
-    });
-});
diff --git a/e2e/suites/authentication/logout.test.ts b/e2e/suites/authentication/logout.test.ts
deleted file mode 100644
index 4e4a78212..000000000
--- a/e2e/suites/authentication/logout.test.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser } from 'protractor';
-
-import { APP_ROUTES, BROWSER_WAIT_TIMEOUT } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-
-describe('Logout', () => {
-    const page = new BrowsingPage();
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-
-    const peopleApi = new RepoClient().people;
-
-    const johnDoe = `user-${Utils.random()}`;
-
-    beforeAll((done) => {
-        peopleApi
-            .createUser(johnDoe)
-            .then(done);
-    });
-
-    beforeEach((done) => {
-        loginPage.load()
-            .then(() => loginPage.loginWith(johnDoe))
-            .then(done);
-    });
-
-    afterEach((done) => {
-        logoutPage.load()
-            .then(() => Utils.clearLocalStorage())
-            .then(done);
-    });
-
-    it('redirects to Login page, on sign out', () => {
-        page.signOut()
-            .then(() => {
-                expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN);
-            });
-    });
-
-    it('redirects to Login page when pressing browser Back after logout', () => {
-        page.signOut()
-            .then(() => browser.navigate().back())
-            .then(() => {
-                expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN);
-            });
-    });
-});
diff --git a/e2e/suites/list-views/empty-list.test.ts b/e2e/suites/list-views/empty-list.test.ts
deleted file mode 100644
index 5e20cb87f..000000000
--- a/e2e/suites/list-views/empty-list.test.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Empty list views', () => {
-    const username = `user-${Utils.random()}`;
-    const password = username;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, password)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable } = page;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    afterAll(done => {
-        logoutPage.load().then(done);
-    });
-
-    it('empty Personal Files', () => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-            .then(() => {
-                expect(dataTable.isEmptyList()).toBe(true, 'list is not empty');
-                expect(dataTable.getEmptyDragAndDropText()).toContain('Drag and drop');
-            });
-    });
-
-    it('empty File Libraries', () => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)
-            .then(() => {
-                expect(dataTable.isEmptyList()).toBe(true, 'list is not empty');
-                expect(dataTable.getEmptyStateTitle()).toContain(`You aren't a member of any File Libraries yet`);
-                expect(dataTable.getEmptyStateText()).toContain('Join sites to upload, view, and share files.');
-            });
-    });
-
-    it('empty Shared Files', () => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES)
-            .then(() => {
-                expect(dataTable.isEmptyList()).toBe(true, 'list is not empty');
-                expect(dataTable.getEmptyStateTitle()).toContain('No shared files or folders');
-                expect(dataTable.getEmptyStateText()).toContain('Items you share using the Share option are shown here.');
-            });
-    });
-
-    it('empty Recent Files', () => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES)
-            .then(() => {
-                expect(dataTable.isEmptyList()).toBe(true, 'list is not empty');
-                expect(dataTable.getEmptyStateTitle()).toContain('No recent files');
-                expect(dataTable.getEmptyStateText()).toContain('Items you upload or edit in the last 30 days are shown here.');
-            });
-    });
-
-    it('empty Favorites', () => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES)
-            .then(() => {
-                expect(dataTable.isEmptyList()).toBe(true, 'list is not empty');
-                expect(dataTable.getEmptyStateTitle()).toContain('No favorite files or folders');
-                expect(dataTable.getEmptyStateText()).toContain('Favorite items that you want to easily find later.');
-            });
-    });
-
-    it('empty Trash', () => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-        .then(() => {
-            expect(dataTable.isEmptyList()).toBe(true, 'list is not empty');
-            expect(dataTable.getEmptyStateTitle()).toContain('Trash is empty');
-            expect(dataTable.getEmptyStateText()).toContain('Items you delete are moved to the Trash.');
-            expect(dataTable.getEmptyStateText()).toContain('Empty Trash to permanently delete items.');
-        });
-    });
-});
diff --git a/e2e/suites/list-views/favorites.test.ts b/e2e/suites/list-views/favorites.test.ts
deleted file mode 100644
index 8073b7d96..000000000
--- a/e2e/suites/list-views/favorites.test.ts
+++ /dev/null
@@ -1,157 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, by } from 'protractor';
-
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Favorites', () => {
-    const username = `user-${Utils.random()}`;
-    const password = username;
-
-    const siteName = `site-${Utils.random()}`;
-    const folderName = `folder-${Utils.random()}`;
-    const fileName1 = `file-${Utils.random()}.txt`;
-    const fileName2 = `file-${Utils.random()}.txt`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, password)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const favoritesPage = new BrowsingPage();
-    const { dataTable } = favoritesPage;
-    const { breadcrumb } = favoritesPage.toolbar;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC))
-            .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_MANAGER))
-            .then(() => apis.admin.nodes.createFiles([ fileName1 ], `Sites/${siteName}/documentLibrary`)
-                .then(resp => apis.user.favorites.addFavoriteById('file', resp.data.entry.id)))
-            .then(() => apis.user.nodes.createFolders([ folderName ])
-                .then(resp => apis.user.favorites.addFavoriteById('folder', resp.data.entry.id)))
-            .then(() => apis.user.nodes.createFiles([ fileName2 ], folderName)
-                .then(resp => apis.user.favorites.addFavoriteById('file', resp.data.entry.id)))
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        favoritesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES)
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.admin.sites.deleteSite(siteName),
-            apis.user.nodes.deleteNodes([ folderName ]),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('has the correct columns', () => {
-        const labels = [ 'Name', 'Location', 'Size', 'Modified', 'Modified by' ];
-        const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label));
-
-        expect(dataTable.getColumnHeaders().count()).toBe(5 + 1, 'Incorrect number of columns');
-
-        elements.forEach((element, index) => {
-            expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`);
-        });
-    });
-
-    it('displays the favorite files and folders', () => {
-        expect(dataTable.countRows()).toEqual(3, 'Incorrect number of items displayed');
-        expect(dataTable.getRowByName(fileName1).isPresent()).toBe(true, `${fileName1} not displayed`);
-        expect(dataTable.getRowByName(fileName2).isPresent()).toBe(true, `${fileName2} not displayed`);
-        expect(dataTable.getRowByName(folderName).isPresent()).toBe(true, `${folderName} not displayed`);
-    });
-
-    it('Location column displays the parent folder of the files', () => {
-        const itemsLocations = {
-            [fileName1]: siteName,
-            [fileName2]: folderName,
-            [folderName]: 'Personal Files'
-        };
-
-        dataTable.getRows()
-            .map((row) => {
-                return row.all(dataTable.cell).map(cell => cell.getText());
-            })
-            .then((rowCells) => {
-                return rowCells.reduce((acc, cell) => {
-                    acc[cell[1]] = cell[2];
-                    return acc;
-                }, {});
-            })
-            .then((favoritesList) => {
-                Object.keys(itemsLocations).forEach((item) => {
-                    expect(favoritesList[item]).toEqual(itemsLocations[item]);
-                });
-            });
-    });
-
-    it('Location column redirect - item in user Home', () => {
-        dataTable.clickItemLocation(folderName)
-            .then(() => breadcrumb.getCurrentItemName())
-            .then(name => {
-                expect(name).toBe('Personal Files');
-            });
-    });
-
-    it('Location column redirect - file in folder', () => {
-        dataTable.clickItemLocation(fileName2)
-            .then(() => breadcrumb.getCurrentItemName())
-            .then(name => {
-                expect(name).toBe(folderName);
-            })
-            .then(() => breadcrumb.getFirstItemName())
-            .then(name => {
-                expect(name).toBe('Personal Files');
-            });
-    });
-
-    it('Location column redirect - file in site', () => {
-        dataTable.clickItemLocation(fileName1)
-            .then(() => breadcrumb.getCurrentItemName())
-            .then(name => {
-                expect(name).toBe(siteName);
-            })
-            .then(() => breadcrumb.getFirstItemName())
-            .then(name => {
-                expect(name).toBe('File Libraries');
-            });
-    });
-
-});
diff --git a/e2e/suites/list-views/file-libraries.test.ts b/e2e/suites/list-views/file-libraries.test.ts
deleted file mode 100644
index 89ac75a5b..000000000
--- a/e2e/suites/list-views/file-libraries.test.ts
+++ /dev/null
@@ -1,131 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, by } from 'protractor';
-
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('File Libraries', () => {
-    const username = `user-${Utils.random()}`;
-    const password = username;
-
-    const sitePrivate = `private-${Utils.random()}`;
-    const siteModerated = `moderated-${Utils.random()}`;
-    const sitePublic = `public-${Utils.random()}`;
-
-    const adminSite = `admin-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, password)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const fileLibrariesPage = new BrowsingPage(APP_ROUTES.FILE_LIBRARIES);
-    const { dataTable } = fileLibrariesPage;
-
-    beforeAll(done => {
-        Promise
-            .all([
-                apis.admin.people.createUser(username),
-                apis.admin.sites.createSite(sitePublic, SITE_VISIBILITY.PUBLIC),
-                apis.admin.sites.createSite(siteModerated, SITE_VISIBILITY.MODERATED),
-                apis.admin.sites.createSite(sitePrivate, SITE_VISIBILITY.PRIVATE),
-                apis.admin.sites.createSite(adminSite, SITE_VISIBILITY.PUBLIC)
-            ])
-            .then(() => apis.admin.sites.addSiteMember(sitePublic, username, SITE_ROLES.SITE_CONSUMER))
-            .then(() => apis.admin.sites.addSiteMember(siteModerated, username, SITE_ROLES.SITE_MANAGER))
-            .then(() => apis.admin.sites.addSiteMember(sitePrivate, username, SITE_ROLES.SITE_CONTRIBUTOR))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        fileLibrariesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.admin.sites.deleteSite(sitePublic),
-            apis.admin.sites.deleteSite(siteModerated),
-            apis.admin.sites.deleteSite(sitePrivate),
-            apis.admin.sites.deleteSite(adminSite),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('has the correct columns', () => {
-        const labels = [ 'Title', 'Status' ];
-        const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label));
-
-        expect(dataTable.getColumnHeaders().count()).toBe(2 + 1, 'Incorrect number of columns');
-
-        elements.forEach((element, index) => {
-            expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`);
-        });
-    });
-
-    it('User can see only the sites he is a member of', () => {
-        const sitesCount = dataTable.countRows();
-
-        const expectedSites = {
-            [sitePrivate]: SITE_VISIBILITY.PRIVATE,
-            [siteModerated]: SITE_VISIBILITY.MODERATED,
-            [sitePublic]: SITE_VISIBILITY.PUBLIC
-        };
-
-        expect(sitesCount).toEqual(3, 'Incorrect number of sites displayed');
-        expect(dataTable.getRowByName(adminSite).isPresent()).toBe(false, 'Incorrect site appears in list');
-
-        dataTable.getRows()
-            .map((row) => {
-                return row.all(by.css('td')).map(cell => cell.getText());
-            })
-            .then((rowCells) => {
-                return rowCells.reduce((acc, cell) => {
-                    acc[cell[1]] = cell[2].toUpperCase();
-                    return acc;
-                }, {});
-            })
-            .then((sitesList) => {
-                Object.keys(expectedSites).forEach((site) => {
-                    expect(sitesList[site]).toEqual(expectedSites[site]);
-                });
-            });
-    });
-
-    // it('Site ID is displayed when two sites have the same name', () => {
-    //     // cannot be implemented until ACA-987 is fixed
-    // });
-});
diff --git a/e2e/suites/list-views/personal-files.test.ts b/e2e/suites/list-views/personal-files.test.ts
deleted file mode 100644
index 7a26d04eb..000000000
--- a/e2e/suites/list-views/personal-files.test.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser } from 'protractor';
-
-import { SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient } from '../../utilities/repo-client/repo-client';
-
-describe('Personal Files', () => {
-    const username = `user-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const personalFilesPage = new BrowsingPage();
-    const { dataTable } = personalFilesPage;
-
-    const adminFolder = `admin-folder-${Utils.random()}`;
-
-    const userFolder = `user-folder-${Utils.random()}`;
-    const userFile = `file-${Utils.random()}.txt`;
-
-    beforeAll(done => {
-        Promise
-            .all([
-                apis.admin.people.createUser(username),
-                apis.admin.nodes.createFolders([ adminFolder ])
-            ])
-            .then(() => apis.user.nodes.createFolders([ userFolder ]))
-            .then(() => apis.user.nodes.createFiles([ userFile ], userFolder))
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise
-            .all([
-                apis.admin.nodes.deleteNodes([ adminFolder ]),
-                apis.user.nodes.deleteNodes([ userFolder ])
-            ])
-            .then(done);
-    });
-
-    xit('');
-
-    describe(`Admin user's personal files`, () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWithAdmin())
-                .then(done);
-        });
-
-        beforeEach(done => {
-            personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('has "Data Dictionary" folder', () => {
-            expect(dataTable.getRowByName('Data Dictionary').isPresent()).toBe(true);
-        });
-
-        it('has created content', () => {
-            expect(dataTable.getRowByName(adminFolder).isPresent()).toBe(true);
-        });
-    });
-
-    describe(`Regular user's personal files`, () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(username))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('has the correct columns', () => {
-            const labels = [ 'Name', 'Size', 'Modified', 'Modified by' ];
-            const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label));
-
-            expect(dataTable.getColumnHeaders().count()).toBe(4 + 1, 'Incorrect number of columns');
-
-            elements.forEach((element, index) => {
-                expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`);
-            });
-        });
-
-        it('has default sorted column', () => {
-            expect(dataTable.getSortedColumnHeader().getText()).toBe('Modified');
-        });
-
-        it('has user created content', () => {
-            expect(dataTable.getRowByName(userFolder).isPresent())
-                .toBe(true);
-        });
-
-        it('navigates to folder', () => {
-            const getNodeIdPromise = apis.user.nodes
-                .getNodeByPath(`/${userFolder}`)
-                .then(response => response.data.entry.id);
-
-            const navigatePromise = dataTable
-                .doubleClickOnItemName(userFolder)
-                .then(() => dataTable.waitForHeader());
-
-            Promise
-                .all([
-                    getNodeIdPromise,
-                    navigatePromise
-                ])
-                .then(([ nodeId ]) => {
-                    expect(browser.getCurrentUrl())
-                        .toContain(nodeId, 'Node ID is not in the URL');
-
-                    expect(dataTable.getRowByName(userFile).isPresent())
-                        .toBe(true, 'user file is missing');
-                });
-        });
-    });
-});
diff --git a/e2e/suites/list-views/recent-files.test.ts b/e2e/suites/list-views/recent-files.test.ts
deleted file mode 100644
index 6ce587ec5..000000000
--- a/e2e/suites/list-views/recent-files.test.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, by } from 'protractor';
-
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Recent Files', () => {
-    const username = `user-${Utils.random()}`;
-    const password = username;
-
-    const folderName = `folder-${Utils.random()}`;
-    let folderId;
-    const fileName1 = `file-${Utils.random()}.txt`;
-
-    const fileName2 = `file-${Utils.random()}.txt`;
-    let file2Id;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, password)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const recentFilesPage = new BrowsingPage();
-    const { dataTable } = recentFilesPage;
-    const { breadcrumb } = recentFilesPage.toolbar;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.user.nodes.createFolders([ folderName ]))
-            .then(resp => folderId = resp.data.entry.id)
-            .then(() => apis.user.nodes.createFiles([ fileName1 ], folderName))
-
-            .then(() => apis.user.nodes.createFiles([ fileName2 ]))
-            .then(resp => file2Id = resp.data.entry.id)
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        recentFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES)
-            .then(() => dataTable.isEmptyList())
-            .then(empty => {
-                if (empty) {
-                    browser.sleep(5000);
-                    recentFilesPage.refresh();
-                }
-            })
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.user.nodes.deleteNodesById([ folderId, file2Id ]),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('has the correct columns', () => {
-        const labels = [ 'Name', 'Location', 'Size', 'Modified' ];
-        const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label));
-
-        expect(dataTable.getColumnHeaders().count()).toBe(4 + 1, 'Incorrect number of columns');
-
-        elements.forEach((element, index) => {
-            expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`);
-        });
-    });
-
-    it('displays the files added by the current user in the last 30 days', () => {
-        expect(dataTable.countRows()).toEqual(2, 'Incorrect number of sites displayed');
-        expect(dataTable.getRowByName(fileName1).isPresent()).toBe(true, `${fileName1} not displayed`);
-        expect(dataTable.getRowByName(fileName2).isPresent()).toBe(true, `${fileName2} not displayed`);
-    });
-
-    it('Location column displays the parent folder of the file', () => {
-        const itemsLocations = {
-            [fileName2]: 'Personal Files',
-            [fileName1]: folderName
-        };
-
-        dataTable.getRows()
-            .map((row) => {
-                return row.all(dataTable.cell).map(cell => cell.getText());
-            })
-            .then((rowCells) => {
-                return rowCells.reduce((acc, cell) => {
-                    acc[cell[1]] = cell[2];
-                    return acc;
-                }, {});
-            })
-            .then((recentList) => {
-                Object.keys(itemsLocations).forEach((item) => {
-                    expect(recentList[item]).toEqual(itemsLocations[item]);
-                });
-            });
-    });
-
-    it('Location column redirect - file in user Home', () => {
-        dataTable.clickItemLocation(fileName1)
-            .then(() => breadcrumb.getCurrentItemName())
-            .then(name => {
-                expect(name).toBe(folderName);
-            })
-            .then(() => breadcrumb.getFirstItemName())
-            .then(name => {
-                expect(name).toBe('Personal Files');
-            });
-    });
-
-    it('Location column redirect - file in folder', () => {
-        dataTable.clickItemLocation(fileName2)
-            .then(() => breadcrumb.getCurrentItemName())
-            .then(name => {
-                expect(name).toBe('Personal Files');
-            });
-    });
-});
diff --git a/e2e/suites/list-views/shared-files.test.ts b/e2e/suites/list-views/shared-files.test.ts
deleted file mode 100644
index c4bb2cddc..000000000
--- a/e2e/suites/list-views/shared-files.test.ts
+++ /dev/null
@@ -1,155 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, by } from 'protractor';
-
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Shared Files', () => {
-    const username = `user-${Utils.random()}`;
-    const password = username;
-
-    const siteName = `site-${Utils.random()}`;
-    const fileAdmin = `file-${Utils.random()}.txt`;
-
-    const folderUser = `folder-${Utils.random()}`;
-    const fileUser = `file-${Utils.random()}.txt`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, password)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const sharedFilesPage = new BrowsingPage();
-    const { dataTable } = sharedFilesPage;
-    const { breadcrumb } = sharedFilesPage.toolbar;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC))
-            .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER))
-            .then(() => apis.admin.nodes.createFiles([ fileAdmin ], `Sites/${siteName}/documentLibrary`))
-            .then(resp => apis.admin.shared.shareFileById(resp.data.entry.id))
-
-            .then(() => apis.user.nodes.createFolders([ folderUser ]))
-            .then(() => apis.user.nodes.createFiles([ fileUser ], folderUser))
-            .then(resp => apis.user.shared.shareFileById(resp.data.entry.id))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        sharedFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES)
-            .then(() => dataTable.isEmptyList())
-            .then(empty => {
-                if (empty) {
-                    browser.sleep(5000);
-                    sharedFilesPage.refresh();
-                }
-            })
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.admin.sites.deleteSite(siteName),
-            apis.user.nodes.deleteNodes([ folderUser ]),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('has the correct columns', () => {
-        const labels = [ 'Name', 'Location', 'Size', 'Modified', 'Modified by', 'Shared by' ];
-        const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label));
-
-        expect(dataTable.getColumnHeaders().count()).toBe(6 + 1, 'Incorrect number of columns');
-
-        elements.forEach((element, index) => {
-            expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`);
-        });
-    });
-
-    it('displays the files shared by everyone', () => {
-        expect(dataTable.countRows()).toEqual(2, 'Incorrect number of items displayed');
-        expect(dataTable.getRowByName(fileAdmin).isPresent()).toBe(true, `${fileAdmin} not displayed`);
-        expect(dataTable.getRowByName(fileUser).isPresent()).toBe(true, `${fileUser} not displayed`);
-    });
-
-    it('Location column displays the parent folder of the file', () => {
-        const itemsLocations = {
-            [fileAdmin]: siteName,
-            [fileUser]: folderUser
-        };
-
-        dataTable.getRows()
-            .map((row) => {
-                return row.all(dataTable.cell).map(cell => cell.getText());
-            })
-            .then((rowCells) => {
-                return rowCells.reduce((acc, cell) => {
-                    acc[cell[1]] = cell[2];
-                    return acc;
-                }, {});
-            })
-            .then((recentList) => {
-                Object.keys(itemsLocations).forEach((item) => {
-                    expect(recentList[item]).toEqual(itemsLocations[item]);
-                });
-            });
-    });
-
-    it('Location column redirect - file in user Home', () => {
-        dataTable.clickItemLocation(fileUser)
-            .then(() => breadcrumb.getCurrentItemName())
-            .then(name => {
-                expect(name).toBe(folderUser);
-            })
-            .then(() => breadcrumb.getFirstItemName())
-            .then(name => {
-                expect(name).toBe('Personal Files');
-            });
-    });
-
-    it('Location column redirect - file in site', () => {
-        dataTable.clickItemLocation(fileAdmin)
-            .then(() => breadcrumb.getCurrentItemName())
-            .then(name => {
-                expect(name).toBe(siteName);
-            })
-            .then(() => breadcrumb.getFirstItemName())
-            .then(name => {
-                expect(name).toBe('File Libraries');
-            });
-    });
-});
diff --git a/e2e/suites/list-views/trash.test.ts b/e2e/suites/list-views/trash.test.ts
deleted file mode 100644
index 7c4969bc4..000000000
--- a/e2e/suites/list-views/trash.test.ts
+++ /dev/null
@@ -1,188 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, by } from 'protractor';
-
-import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Trash', () => {
-    const username = `user-${Utils.random()}`;
-
-    const siteName = `site-${Utils.random()}`;
-    const fileSite = `file-${Utils.random()}.txt`;
-    let fileSiteId;
-
-    const folderAdmin = `folder-${Utils.random()}`;
-    let folderAdminId;
-    const fileAdmin = `file-${Utils.random()}.txt`;
-    let fileAdminId;
-
-    const folderUser = `folder-${Utils.random()}`;
-    let folderUserId;
-    const fileUser = `file-${Utils.random()}.txt`;
-    let fileUserId;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const trashPage = new BrowsingPage();
-    const { dataTable } = trashPage;
-    const { breadcrumb } = trashPage.toolbar;
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => apis.admin.nodes.createFiles([ fileAdmin ])
-                .then(resp => fileAdminId = resp.data.entry.id))
-            .then(() => apis.admin.nodes.createFolders([ folderAdmin ])
-                .then(resp => folderAdminId = resp.data.entry.id))
-            .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC))
-            .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_MANAGER))
-            .then(() => apis.admin.nodes.createFiles([ fileSite ], `Sites/${siteName}/documentLibrary`)
-                .then(resp => fileSiteId = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFiles([ fileUser ])
-                .then(resp => fileUserId = resp.data.entry.id))
-            .then(() => apis.user.nodes.createFolders([ folderUser ])
-                .then(resp => folderUserId = resp.data.entry.id))
-
-            .then(() => apis.admin.nodes.deleteNodesById([ fileAdminId, folderAdminId ], false))
-            .then(() => apis.user.nodes.deleteNodesById([ fileSiteId, fileUserId, folderUserId ], false))
-
-            .then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            apis.admin.sites.deleteSite(siteName),
-            apis.admin.trashcan.emptyTrash()
-        ])
-        .then(done);
-    });
-
-    xit('');
-
-    describe('as admin', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWithAdmin())
-                .then(done);
-        });
-
-        beforeEach(done => {
-            trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('has the correct columns', () => {
-            const labels = [ 'Name', 'Location', 'Size', 'Deleted', 'Deleted by' ];
-            const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label));
-
-            expect(dataTable.getColumnHeaders().count()).toBe(5 + 1, 'Incorrect number of columns');
-
-            elements.forEach((element, index) => {
-                expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`);
-            });
-        });
-
-        it('displays the files and folders deleted by everyone', () => {
-            expect(dataTable.countRows()).toEqual(5, 'Incorrect number of deleted items displayed');
-
-            expect(dataTable.getRowByName(fileAdmin).isPresent()).toBe(true, `${fileAdmin} not displayed`);
-            expect(dataTable.getRowByName(folderAdmin).isPresent()).toBe(true, `${folderAdmin} not displayed`);
-            expect(dataTable.getRowByName(fileUser).isPresent()).toBe(true, `${fileUser} not displayed`);
-            expect(dataTable.getRowByName(folderUser).isPresent()).toBe(true, `${folderUser} not displayed`);
-            expect(dataTable.getRowByName(fileSite).isPresent()).toBe(true, `${fileSite} not displayed`);
-        });
-    });
-
-    describe('as user', () => {
-        beforeAll(done => {
-            loginPage.load()
-                .then(() => loginPage.loginWith(username))
-                .then(done);
-        });
-
-        beforeEach(done => {
-            trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-                .then(() => dataTable.waitForHeader())
-                .then(done);
-        });
-
-        afterAll(done => {
-            logoutPage.load().then(done);
-        });
-
-        it('has the correct columns', () => {
-            const labels = [ 'Name', 'Location', 'Size', 'Deleted', 'Deleted by' ];
-            const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label));
-
-            expect(dataTable.getColumnHeaders().count()).toBe(5 + 1, 'Incorrect number of columns');
-
-            elements.forEach((element, index) => {
-                expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`);
-            });
-        });
-
-        it('displays the files and folders deleted by the user', () => {
-            expect(dataTable.countRows()).toEqual(3, 'Incorrect number of deleted items displayed');
-
-            expect(dataTable.getRowByName(fileSite).isPresent()).toBe(true, `${fileSite} not displayed`);
-            expect(dataTable.getRowByName(fileUser).isPresent()).toBe(true, `${fileUser} not displayed`);
-            expect(dataTable.getRowByName(folderUser).isPresent()).toBe(true, `${folderUser} not displayed`);
-            expect(dataTable.getRowByName(fileAdmin).isPresent()).toBe(false, `${fileAdmin} is displayed`);
-        });
-
-        it('Location column redirect - file in user Home', () => {
-            dataTable.clickItemLocation(fileUser)
-                .then(() => breadcrumb.getCurrentItemName())
-                .then(name => {
-                    expect(name).toBe('Personal Files');
-                });
-        });
-
-        it('Location column redirect - file in site', () => {
-            dataTable.clickItemLocation(fileSite)
-                .then(() => breadcrumb.getCurrentItemName())
-                .then(name => {
-                    expect(name).toBe(siteName);
-                })
-                .then(() => breadcrumb.getFirstItemName())
-                .then(name => {
-                    expect(name).toBe('File Libraries');
-                });
-        });
-    });
-});
diff --git a/e2e/suites/navigation/side-navigation.test.ts b/e2e/suites/navigation/side-navigation.test.ts
deleted file mode 100644
index 569c0fc5b..000000000
--- a/e2e/suites/navigation/side-navigation.test.ts
+++ /dev/null
@@ -1,129 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser } from 'protractor';
-
-import { APP_ROUTES, SIDEBAR_LABELS } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-
-describe('Side navigation', () => {
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-
-    beforeAll(done => {
-        loginPage.load()
-            .then(() => loginPage.loginWithAdmin())
-            .then(done);
-    });
-
-    beforeEach(done => {
-        page.dataTable.wait().then(done);
-    });
-
-    afterAll(done => {
-        logoutPage.load().then(done);
-    });
-
-    it('has "Personal Files" as default', () => {
-        expect(browser.getCurrentUrl())
-            .toContain(APP_ROUTES.PERSONAL_FILES);
-
-        expect(page.sidenav.isActiveByLabel('Personal Files'))
-            .toBe(true, 'Active link');
-    });
-
-    it('navigates to "File Libraries"', () => {
-        const { sidenav, dataTable } = page;
-
-        sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)
-            .then(() => dataTable.wait())
-            .then(() => browser.getCurrentUrl())
-            .then(url => {
-                expect(url).toContain(APP_ROUTES.FILE_LIBRARIES);
-                expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)).toBe(true);
-            });
-    });
-
-    it('navigates to "Personal Files"', () => {
-        const { sidenav, dataTable } = page;
-
-        sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-            .then(() => dataTable.wait())
-            .then(() => browser.getCurrentUrl())
-            .then(url => {
-                expect(url).toContain(APP_ROUTES.PERSONAL_FILES);
-                expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.PERSONAL_FILES)).toBe(true);
-            });
-    });
-
-    it('navigates to "Shared Files"', () => {
-        const { sidenav, dataTable } = page;
-
-        sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES)
-            .then(() => dataTable.wait())
-            .then(() => browser.getCurrentUrl())
-            .then(url => {
-                expect(url).toContain(APP_ROUTES.SHARED_FILES);
-                expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.SHARED_FILES)).toBe(true);
-            });
-    });
-
-    it('navigates to "Recent Files"', () => {
-        const { sidenav, dataTable } = page;
-
-        sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES)
-            .then(() => dataTable.wait())
-            .then(() => browser.getCurrentUrl())
-            .then(url => {
-                expect(url).toContain(APP_ROUTES.RECENT_FILES);
-                expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.RECENT_FILES)).toBe(true);
-            });
-    });
-
-    it('navigates to "Favorites"', () => {
-        const { sidenav, dataTable } = page;
-
-        sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES)
-            .then(() => dataTable.wait())
-            .then(() => browser.getCurrentUrl())
-            .then(url => {
-                expect(url).toContain(APP_ROUTES.FAVORITES);
-                expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.FAVORITES)).toBe(true);
-            });
-    });
-
-    it('navigates to "Trash"', () => {
-        const { sidenav, dataTable } = page;
-
-        sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-            .then(() => dataTable.wait())
-            .then(() => browser.getCurrentUrl())
-            .then(url => {
-                expect(url).toContain(APP_ROUTES.TRASHCAN);
-                expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.TRASH)).toBe(true);
-            });
-    });
-});
diff --git a/e2e/suites/pagination/pag-favorites.test.ts b/e2e/suites/pagination/pag-favorites.test.ts
deleted file mode 100644
index 18c86311d..000000000
--- a/e2e/suites/pagination/pag-favorites.test.ts
+++ /dev/null
@@ -1,186 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Pagination on Favorites', () => {
-    const username = `user-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-    const { nodes: nodesApi, favorites: favoritesApi } = apis.user;
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable, pagination } = page;
-
-    const parent = `parent-${Utils.random()}`;
-    const files = Array(101)
-        .fill('file')
-        .map((name, index): string => `${name}-${index + 1}.txt`);
-    let filesIds;
-
-    function resetToDefaultPageSize(): promise.Promise<any> {
-        return pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('25'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    function resetToDefaultPageNumber(): promise.Promise<any> {
-        return pagination.openCurrentPageMenu()
-            .then(menu => menu.clickMenuItem('1'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => nodesApi.createFiles(files, parent))
-            .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id))
-
-            .then(() => favoritesApi.addFavoritesByIds('file', filesIds))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES)
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterEach(done => {
-        browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            nodesApi.deleteNodes([ parent ]),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('default values', () => {
-        expect(pagination.range.getText()).toContain('1-25 of 101');
-        expect(pagination.maxItems.getText()).toContain('25');
-        expect(pagination.currentPage.getText()).toContain('Page 1');
-        expect(pagination.totalPages.getText()).toContain('of 5');
-        expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled');
-        expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-    });
-
-    it('page sizes', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => {
-                const [ first, second, third ] = [1, 2, 3]
-                    .map(nth => menu.getNthItem(nth).getText());
-                expect(first).toBe('25');
-                expect(second).toBe('50');
-                expect(third).toBe('100');
-            });
-    });
-
-    it('change the page size', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('50'))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.maxItems.getText()).toContain('50');
-                expect(pagination.totalPages.getText()).toContain('of 3');
-            })
-
-            .then(() => resetToDefaultPageSize());
-    });
-
-    it('current page menu items', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => {
-                expect(menu.getItemsCount()).toBe(5);
-            });
-    });
-
-    it('change the current page from menu', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(3))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('51-75 of 101');
-                expect(pagination.currentPage.getText()).toContain('Page 3');
-                expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled');
-                expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-                expect(dataTable.getRowByName('file-40.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to next page', () => {
-        pagination.nextButton.click()
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('26-50 of 101');
-                expect(dataTable.getRowByName('file-70.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to previous page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(2))
-            .then(() => dataTable.waitForHeader())
-            .then(() => pagination.previousButton.click())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('1-25 of 101');
-                expect(dataTable.getRowByName('file-88.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('last page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(5))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page');
-                expect(pagination.currentPage.getText()).toContain('Page 5');
-                expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled');
-            });
-    });
-});
diff --git a/e2e/suites/pagination/pag-personal-files.test.ts b/e2e/suites/pagination/pag-personal-files.test.ts
deleted file mode 100644
index aed53568d..000000000
--- a/e2e/suites/pagination/pag-personal-files.test.ts
+++ /dev/null
@@ -1,183 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Pagination on Personal Files', () => {
-    const username = `user-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-    const { nodes: nodesApi } = apis.user;
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable, pagination } = page;
-
-    const parent = `parent-${Utils.random()}`;
-    const files = Array(101)
-        .fill('file')
-        .map((name, index): string => `${name}-${index + 1}.txt`);
-
-    function resetToDefaultPageSize(): promise.Promise<any> {
-        return pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('25'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    function resetToDefaultPageNumber(): promise.Promise<any> {
-        return pagination.openCurrentPageMenu()
-            .then(menu => menu.clickMenuItem('1'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => nodesApi.createFiles(files, parent))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)
-            .then(() => dataTable.waitForHeader())
-            .then(() => dataTable.doubleClickOnItemName(parent))
-            .then(done);
-    });
-
-    afterEach(done => {
-        browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            nodesApi.deleteNodes([ parent ]),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('default values', () => {
-        expect(pagination.range.getText()).toContain('1-25 of 101');
-        expect(pagination.maxItems.getText()).toContain('25');
-        expect(pagination.currentPage.getText()).toContain('Page 1');
-        expect(pagination.totalPages.getText()).toContain('of 5');
-        expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled');
-        expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-    });
-
-    it('page sizes', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => {
-                const [ first, second, third ] = [1, 2, 3]
-                    .map(nth => menu.getNthItem(nth).getText());
-                expect(first).toBe('25');
-                expect(second).toBe('50');
-                expect(third).toBe('100');
-            });
-    });
-
-    it('change the page size', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('50'))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.maxItems.getText()).toContain('50');
-                expect(pagination.totalPages.getText()).toContain('of 3');
-            })
-
-            .then(() => resetToDefaultPageSize());
-    });
-
-    it('current page menu items', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => {
-                expect(menu.getItemsCount()).toBe(5);
-            });
-    });
-
-    it('change the current page from menu', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(3))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('51-75 of 101');
-                expect(pagination.currentPage.getText()).toContain('Page 3');
-                expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled');
-                expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-                expect(dataTable.getRowByName('file-60.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to next page', () => {
-        pagination.nextButton.click()
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('26-50 of 101');
-                expect(dataTable.getRowByName('file-30.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to previous page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(2))
-            .then(() => dataTable.waitForHeader())
-            .then(() => pagination.previousButton.click())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('1-25 of 101');
-                expect(dataTable.getRowByName('file-12.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('last page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(5))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page');
-                expect(pagination.currentPage.getText()).toContain('Page 5');
-                expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled');
-            });
-    });
-});
diff --git a/e2e/suites/pagination/pag-recent-files.test.ts b/e2e/suites/pagination/pag-recent-files.test.ts
deleted file mode 100644
index 7a1089e12..000000000
--- a/e2e/suites/pagination/pag-recent-files.test.ts
+++ /dev/null
@@ -1,189 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Pagination on Recent Files', () => {
-    const username = `user-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-    const { nodes: nodesApi } = apis.user;
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable, pagination } = page;
-
-    const parent = `parent-${Utils.random()}`;
-    const files = Array(101)
-        .fill('file')
-        .map((name, index): string => `${name}-${index + 1}.txt`);
-
-    function resetToDefaultPageSize(): promise.Promise<any> {
-        return pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('25'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    function resetToDefaultPageNumber(): promise.Promise<any> {
-        return pagination.openCurrentPageMenu()
-            .then(menu => menu.clickMenuItem('1'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => nodesApi.createFiles(files, parent))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES)
-            .then(() => dataTable.isEmptyList())
-            .then(empty => {
-                if (empty) {
-                    browser.sleep(3000);
-                    page.refresh();
-                }
-            })
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterEach(done => {
-        browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            nodesApi.deleteNodes([ parent ]),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('default values', () => {
-        expect(pagination.range.getText()).toContain('1-25 of 101');
-        expect(pagination.maxItems.getText()).toContain('25');
-        expect(pagination.currentPage.getText()).toContain('Page 1');
-        expect(pagination.totalPages.getText()).toContain('of 5');
-        expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled');
-        expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-    });
-
-    it('page sizes', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => {
-                const [ first, second, third ] = [1, 2, 3]
-                    .map(nth => menu.getNthItem(nth).getText());
-                expect(first).toBe('25');
-                expect(second).toBe('50');
-                expect(third).toBe('100');
-            });
-    });
-
-    it('change the page size', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('50'))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.maxItems.getText()).toContain('50');
-                expect(pagination.totalPages.getText()).toContain('of 3');
-            })
-
-            .then(() => resetToDefaultPageSize());
-    });
-
-    it('current page menu items', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => {
-                expect(menu.getItemsCount()).toBe(5);
-            });
-    });
-
-    it('change the current page from menu', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(3))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('51-75 of 101');
-                expect(pagination.currentPage.getText()).toContain('Page 3');
-                expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled');
-                expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-                expect(dataTable.getRowByName('file-40.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to next page', () => {
-        pagination.nextButton.click()
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('26-50 of 101');
-                expect(dataTable.getRowByName('file-70.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to previous page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(2))
-            .then(() => dataTable.waitForHeader())
-            .then(() => pagination.previousButton.click())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('1-25 of 101');
-                expect(dataTable.getRowByName('file-88.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('last page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(5))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page');
-                expect(pagination.currentPage.getText()).toContain('Page 5');
-                expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled');
-            });
-    });
-});
diff --git a/e2e/suites/pagination/pag-shared-files.test.ts b/e2e/suites/pagination/pag-shared-files.test.ts
deleted file mode 100644
index ac6faca9c..000000000
--- a/e2e/suites/pagination/pag-shared-files.test.ts
+++ /dev/null
@@ -1,193 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Pagination on Shared Files', () => {
-    const username = `user-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-    const { nodes: nodesApi, shared: sharedApi } = apis.user;
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable, pagination } = page;
-
-    const parent = `parent-${Utils.random()}`;
-    const files = Array(101)
-        .fill('file')
-        .map((name, index): string => `${name}-${index + 1}.txt`);
-    let filesIds;
-
-    function resetToDefaultPageSize(): promise.Promise<any> {
-        return pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('25'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    function resetToDefaultPageNumber(): promise.Promise<any> {
-        return pagination.openCurrentPageMenu()
-            .then(menu => menu.clickMenuItem('1'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => nodesApi.createFiles(files, parent))
-            .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id))
-
-            .then(() => sharedApi.shareFilesByIds(filesIds))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES)
-            .then(() => dataTable.isEmptyList())
-            .then(empty => {
-                if (empty) {
-                    browser.sleep(6000);
-                    page.refresh();
-                }
-            })
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterEach(done => {
-        browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            nodesApi.deleteNodes([ parent ]),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('default values', () => {
-        expect(pagination.range.getText()).toContain('1-25 of 101');
-        expect(pagination.maxItems.getText()).toContain('25');
-        expect(pagination.currentPage.getText()).toContain('Page 1');
-        expect(pagination.totalPages.getText()).toContain('of 5');
-        expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled');
-        expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-    });
-
-    it('page sizes', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => {
-                const [ first, second, third ] = [1, 2, 3]
-                    .map(nth => menu.getNthItem(nth).getText());
-                expect(first).toBe('25');
-                expect(second).toBe('50');
-                expect(third).toBe('100');
-            });
-    });
-
-    it('change the page size', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('50'))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.maxItems.getText()).toContain('50');
-                expect(pagination.totalPages.getText()).toContain('of 3');
-            })
-
-            .then(() => resetToDefaultPageSize());
-    });
-
-    it('current page menu items', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => {
-                expect(menu.getItemsCount()).toBe(5);
-            });
-    });
-
-    it('change the current page from menu', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(3))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('51-75 of 101');
-                expect(pagination.currentPage.getText()).toContain('Page 3');
-                expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled');
-                expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-                expect(dataTable.getRowByName('file-40.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to next page', () => {
-        pagination.nextButton.click()
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('26-50 of 101');
-                expect(dataTable.getRowByName('file-70.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to previous page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(2))
-            .then(() => dataTable.waitForHeader())
-            .then(() => pagination.previousButton.click())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('1-25 of 101');
-                expect(dataTable.getRowByName('file-88.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('last page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(5))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page');
-                expect(pagination.currentPage.getText()).toContain('Page 5');
-                expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled');
-            });
-    });
-});
diff --git a/e2e/suites/pagination/pag-trash.test.ts b/e2e/suites/pagination/pag-trash.test.ts
deleted file mode 100644
index 4f318877c..000000000
--- a/e2e/suites/pagination/pag-trash.test.ts
+++ /dev/null
@@ -1,184 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, protractor, promise } from 'protractor';
-import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs';
-import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages';
-import { Utils } from '../../utilities/utils';
-import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client';
-
-describe('Pagination on Trash', () => {
-    const username = `user-${Utils.random()}`;
-
-    const apis = {
-        admin: new RepoClient(),
-        user: new RepoClient(username, username)
-    };
-    const { nodes: nodesApi, trashcan: trashApi } = apis.user;
-
-    const loginPage = new LoginPage();
-    const logoutPage = new LogoutPage();
-    const page = new BrowsingPage();
-    const { dataTable, pagination } = page;
-
-    const filesForDelete = Array(101)
-        .fill('file')
-        .map((name, index): string => `${name}-${index + 1}.txt`);
-    let filesDeletedIds;
-
-    function resetToDefaultPageSize(): promise.Promise<any> {
-        return pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('25'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    function resetToDefaultPageNumber(): promise.Promise<any> {
-        return pagination.openCurrentPageMenu()
-            .then(menu => menu.clickMenuItem('1'))
-            .then(() => dataTable.waitForHeader());
-    }
-
-    beforeAll(done => {
-        apis.admin.people.createUser(username)
-            .then(() => nodesApi.createFiles(filesForDelete))
-            .then(resp => filesDeletedIds = resp.data.list.entries.map(entries => entries.entry.id))
-            .then(() => nodesApi.deleteNodesById(filesDeletedIds, false))
-
-            .then(() => loginPage.load())
-            .then(() => loginPage.loginWith(username))
-            .then(done);
-    });
-
-    beforeEach(done => {
-        page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
-            .then(() => dataTable.waitForHeader())
-            .then(done);
-    });
-
-    afterEach(done => {
-        browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done);
-    });
-
-    afterAll(done => {
-        Promise.all([
-            trashApi.emptyTrash(),
-            logoutPage.load()
-        ])
-        .then(done);
-    });
-
-    it('default values', () => {
-        expect(pagination.range.getText()).toContain('1-25 of 101');
-        expect(pagination.maxItems.getText()).toContain('25');
-        expect(pagination.currentPage.getText()).toContain('Page 1');
-        expect(pagination.totalPages.getText()).toContain('of 5');
-        expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled');
-        expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-    });
-
-    it('page sizes', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => {
-                const [ first, second, third ] = [1, 2, 3]
-                    .map(nth => menu.getNthItem(nth).getText());
-                expect(first).toBe('25');
-                expect(second).toBe('50');
-                expect(third).toBe('100');
-            });
-    });
-
-    it('change the page size', () => {
-        pagination.openMaxItemsMenu()
-            .then(menu => menu.clickMenuItem('50'))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.maxItems.getText()).toContain('50');
-                expect(pagination.totalPages.getText()).toContain('of 3');
-            })
-
-            .then(() => resetToDefaultPageSize());
-    });
-
-    it('current page menu items', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => {
-                expect(menu.getItemsCount()).toBe(5);
-            });
-    });
-
-    it('change the current page from menu', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(3))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('51-75 of 101');
-                expect(pagination.currentPage.getText()).toContain('Page 3');
-                expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled');
-                expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled');
-                expect(dataTable.getRowByName('file-40.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to next page', () => {
-        pagination.nextButton.click()
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('26-50 of 101');
-                expect(dataTable.getRowByName('file-70.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('navigate to previous page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(2))
-            .then(() => dataTable.waitForHeader())
-            .then(() => pagination.previousButton.click())
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(pagination.range.getText()).toContain('1-25 of 101');
-                expect(dataTable.getRowByName('file-88.txt').isPresent())
-                    .toBe(true, 'File not found on page');
-            })
-
-            .then(() => resetToDefaultPageNumber());
-    });
-
-    it('last page', () => {
-        pagination.openCurrentPageMenu()
-            .then(menu => menu.clickNthItem(5))
-            .then(() => dataTable.waitForHeader())
-            .then(() => {
-                expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page');
-                expect(pagination.currentPage.getText()).toContain('Page 5');
-                expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled');
-            });
-    });
-});
diff --git a/e2e/utilities/repo-client/apis/favorites/favorites-api.ts b/e2e/utilities/repo-client/apis/favorites/favorites-api.ts
deleted file mode 100644
index dd1cd7b47..000000000
--- a/e2e/utilities/repo-client/apis/favorites/favorites-api.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { promise } from 'protractor';
-import { RepoApi } from '../repo-api';
-import { NodesApi } from '../nodes/nodes-api';
-import { RepoClient } from './../../repo-client';
-
-export class FavoritesApi extends RepoApi {
-
-    addFavorite(api: RepoClient, nodeType: string, name: string): Promise<any> {
-        return api.nodes.getNodeByPath(name)
-            .then((response) => {
-                const { id } = response.data.entry;
-                return ([{
-                    target: {
-                        [nodeType]: {
-                            guid: id
-                        }
-                    }
-                }]);
-            })
-            .then((data) => {
-                return this.post(`/people/-me-/favorites`, { data });
-            })
-            .catch(this.handleError);
-    }
-
-    addFavoriteById(nodeType: string, id: string): Promise<any> {
-        const data = [{
-            target: {
-                [nodeType]: {
-                    guid: id
-                }
-            }
-        }];
-        return this.post(`/people/-me-/favorites`, { data })
-            .catch(this.handleError);
-    }
-
-    addFavoritesByIds(nodeType: string, ids: string[]): Promise<any[]> {
-        return ids.reduce((previous, current) => (
-            previous.then(() => this.addFavoriteById(nodeType, current))
-        ), Promise.resolve());
-    }
-
-    getFavorite(api: RepoClient, name: string): Promise<any> {
-        return api.nodes.getNodeByPath(name)
-            .then((response) => {
-                const { id } = response.data.entry;
-                return this.get(`/people/-me-/favorites/${id}`);
-            })
-            .catch((response) => Promise.resolve(response));
-    }
-
-    removeFavorite(api: RepoClient, nodeType: string, name: string): Promise<any> {
-        return api.nodes.getNodeByPath(name)
-            .then((response) => {
-                const { id } = response.data.entry;
-                return this.delete(`/people/-me-/favorites/${id}`);
-            })
-            .catch(this.handleError);
-    }
-}
diff --git a/e2e/utilities/repo-client/apis/nodes/node-body-create.ts b/e2e/utilities/repo-client/apis/nodes/node-body-create.ts
deleted file mode 100644
index 31c369d34..000000000
--- a/e2e/utilities/repo-client/apis/nodes/node-body-create.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-export const NODE_TYPE_FILE = 'cm:content';
-export const NODE_TYPE_FOLDER = 'cm:folder';
-export const NODE_TITLE = 'cm:title';
-export const NODE_DESCRIPTION = 'cm:description';
-
-export class NodeBodyCreate {
-    constructor(
-        public name: string,
-        public nodeType: string,
-        public relativePath: string = '/',
-        public properties?: any[]
-    ) {}
-}
diff --git a/e2e/utilities/repo-client/apis/nodes/node-content-tree.ts b/e2e/utilities/repo-client/apis/nodes/node-content-tree.ts
deleted file mode 100644
index 45516429b..000000000
--- a/e2e/utilities/repo-client/apis/nodes/node-content-tree.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { NodeBodyCreate, NODE_TYPE_FILE, NODE_TYPE_FOLDER, NODE_TITLE, NODE_DESCRIPTION } from './node-body-create';
-
-export interface NodeContentTree {
-    name?: string;
-    files?: string[];
-    folders?: (string|NodeContentTree)[];
-    title?: string;
-    description?: string;
-}
-
-export function flattenNodeContentTree(content: NodeContentTree, relativePath: string = '/'): NodeBodyCreate[] {
-    const { name, files, folders, title, description } = content;
-    let data: NodeBodyCreate[] = [];
-    let properties: any;
-
-    properties = {
-        [NODE_TITLE]: title,
-        [NODE_DESCRIPTION]: description
-    };
-
-    if (name) {
-        data = data.concat([{
-            nodeType: NODE_TYPE_FOLDER,
-            name,
-            relativePath,
-            properties
-        }]);
-
-        relativePath = (relativePath === '/')
-            ? `/${name}`
-            : `${relativePath}/${name}`;
-    }
-
-    if (folders) {
-        const foldersData: NodeBodyCreate[] = folders
-            .map((folder: (string|NodeContentTree)): NodeBodyCreate[] => {
-                const folderData: NodeContentTree = (typeof folder === 'string')
-                    ? { name: folder }
-                    : folder;
-
-                return flattenNodeContentTree(folderData, relativePath);
-            })
-            .reduce((nodesData: NodeBodyCreate[], folderData: NodeBodyCreate[]) => nodesData.concat(folderData), []);
-
-        data = data.concat(foldersData);
-    }
-
-    if (files) {
-        const filesData: NodeBodyCreate[] = files
-            .map((filename: string): NodeBodyCreate => ({
-                nodeType: NODE_TYPE_FILE,
-                name: filename,
-                relativePath
-            }));
-
-        data = data.concat(filesData);
-    }
-
-    return data;
-}
diff --git a/e2e/utilities/repo-client/apis/nodes/nodes-api.ts b/e2e/utilities/repo-client/apis/nodes/nodes-api.ts
deleted file mode 100644
index 410cebc92..000000000
--- a/e2e/utilities/repo-client/apis/nodes/nodes-api.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { RepoApi } from '../repo-api';
-import { NodeBodyCreate, NODE_TYPE_FILE, NODE_TYPE_FOLDER } from './node-body-create';
-import { NodeContentTree, flattenNodeContentTree } from './node-content-tree';
-
-export class NodesApi extends RepoApi {
-    // nodes
-    getNodeByPath(relativePath: string = '/'): Promise<any> {
-        return this
-            .get(`/nodes/-my-`, { parameters: { relativePath } })
-            .catch(this.handleError);
-    }
-
-    getNodeById(id: string): Promise<any> {
-        return this
-            .get(`/nodes/${id}`)
-            .catch(this.handleError);
-    }
-
-    getNodeDescription(name: string): Promise<string> {
-        return this.getNodeByPath(name)
-            .then(response => response.data.entry.properties['cm:description'])
-            .catch(() => Promise.resolve(''));
-    }
-
-    deleteNodeById(id: string, permanent: boolean = true): Promise<any> {
-        return this
-            .delete(`/nodes/${id}?permanent=${permanent}`)
-            .catch(this.handleError);
-    }
-
-    deleteNodeByPath(path: string, permanent: boolean = true): Promise<any> {
-        return this
-            .getNodeByPath(path)
-            .then((response: any): string => response.data.entry.id)
-            .then((id: string): any => this.deleteNodeById(id, permanent))
-            .catch(this.handleError);
-    }
-
-    deleteNodes(names: string[], relativePath: string = '', permanent: boolean = true): Promise<any[]> {
-        return names.reduce((previous, current) => (
-            previous.then(() => this.deleteNodeByPath(`${relativePath}/${current}`, permanent))
-        ), Promise.resolve());
-    }
-
-    deleteNodesById(ids: string[], permanent: boolean = true): Promise<any[]> {
-        return ids.reduce((previous, current) => (
-            previous.then(() => this.deleteNodeById(current, permanent))
-        ), Promise.resolve());
-    }
-
-    // children
-    getNodeChildren(nodeId: string): Promise<any> {
-        return this
-            .get(`/nodes/${nodeId}/children`)
-            .catch(this.handleError);
-    }
-
-    createChildren(data: NodeBodyCreate[]): Promise<any> {
-        return this
-            .post(`/nodes/-my-/children`, { data })
-            .catch(this.handleError);
-    }
-
-    createContent(content: NodeContentTree, relativePath: string = '/'): Promise<any> {
-        return this.createChildren(flattenNodeContentTree(content, relativePath));
-    }
-
-    createNodeWithProperties(name: string, title?: string, description?: string, relativePath: string = '/'): Promise<any> {
-        return this.createContent({ name, title, description }, relativePath);
-    }
-
-    createFolders(names: string[], relativePath: string = '/'): Promise<any> {
-        return this.createContent({ folders: names }, relativePath);
-    }
-
-    createFiles(names: string[], relativePath: string = '/'): Promise<any> {
-        return this.createContent({ files: names }, relativePath);
-    }
-}
diff --git a/e2e/utilities/repo-client/apis/people/people-api-models.ts b/e2e/utilities/repo-client/apis/people/people-api-models.ts
deleted file mode 100644
index d00dc7dd4..000000000
--- a/e2e/utilities/repo-client/apis/people/people-api-models.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-export class Person {
-    id?: string;
-    password?: string;
-    firstName?: string;
-    lastName?: string;
-    email?: string;
-    properties?: any;
-
-    constructor(username: string, password: string, details: Person) {
-        this.id = username;
-        this.password = password || username;
-        this.firstName = username;
-        this.lastName = username;
-        this.email = `${username}@alfresco.com`;
-
-        Object.assign(this, details);
-    }
-}
diff --git a/e2e/utilities/repo-client/apis/people/people-api.ts b/e2e/utilities/repo-client/apis/people/people-api.ts
deleted file mode 100644
index b13811080..000000000
--- a/e2e/utilities/repo-client/apis/people/people-api.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { RepoApi } from '../repo-api';
-import { Person } from './people-api-models';
-
-export class PeopleApi extends RepoApi {
-    getUser(username: string) {
-        return this
-            .get(`/people/${username}`)
-            .catch(this.handleError);
-    }
-
-    updateUser(username: string, details?: Person): Promise<any> {
-        if (details.id) {
-            delete details.id;
-        }
-
-        return this
-            .put(`/people/${username}`, { data: details })
-            .catch(this.handleError);
-    }
-
-    createUser(username: string, password?: string, details?: Person): Promise<any> {
-        const person: Person = new Person(username, password, details);
-        const onSuccess = (response) => response;
-        const onError = (response) => {
-            return (response.statusCode === 409)
-                ? Promise.resolve(this.updateUser(username, person))
-                : Promise.reject(response);
-        };
-
-        return this
-            .post(`/people`, { data: person })
-            .then(onSuccess, onError)
-            .catch(this.handleError);
-    }
-}
diff --git a/e2e/utilities/repo-client/apis/repo-api.ts b/e2e/utilities/repo-client/apis/repo-api.ts
deleted file mode 100644
index 0a7993f9c..000000000
--- a/e2e/utilities/repo-client/apis/repo-api.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { RestClient, RestClientArgs, RestClientResponse } from '../../rest-client/rest-client';
-import { RepoClientAuth, RepoClientConfig } from '../repo-client-models';
-
-export abstract class RepoApi {
-    private client: RestClient;
-    private defaults: RepoClientConfig = new RepoClientConfig();
-
-    constructor(
-        auth: RepoClientAuth = new RepoClientAuth(),
-        private config?: RepoClientConfig
-    ) {
-        const { username, password } = auth;
-
-        this.client = new RestClient(username, password);
-    }
-
-    private createEndpointUri(endpoint: string): string {
-        const { defaults, config } = this;
-        const { host, tenant } = Object.assign(defaults, config);
-
-        return `${host}/alfresco/api/${tenant}/public/alfresco/versions/1${endpoint}`;
-    }
-
-    protected handleError(response: RestClientResponse) {
-        const { request: { method, path, data }, data: error } = response;
-
-        console.log(`ERROR on ${method}\n${path}\n${data}`);
-        console.log(error);
-    }
-
-    protected get(endpoint: string, args: RestClientArgs = {}) {
-        return this.client.get(this.createEndpointUri(endpoint), args);
-    }
-
-    protected post(endpoint: string, args: RestClientArgs = {}) {
-        return this.client.post(this.createEndpointUri(endpoint), args);
-    }
-
-    protected put(endpoint: string, args: RestClientArgs = {}) {
-        return this.client.put(this.createEndpointUri(endpoint), args);
-    }
-
-    protected delete(endpoint: string, args: RestClientArgs = {}) {
-        return this.client.delete(this.createEndpointUri(endpoint), args);
-    }
-}
diff --git a/e2e/utilities/repo-client/apis/shared-links/shared-links-api.ts b/e2e/utilities/repo-client/apis/shared-links/shared-links-api.ts
deleted file mode 100644
index 537aef7a5..000000000
--- a/e2e/utilities/repo-client/apis/shared-links/shared-links-api.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { RepoApi } from '../repo-api';
-import { NodesApi } from '../nodes/nodes-api';
-import { RepoClient } from './../../repo-client';
-
-export class SharedLinksApi extends RepoApi {
-
-    shareFileById(id: string): Promise<any> {
-        const data = [{ nodeId: id }];
-
-        return this.post(`/shared-links`, { data })
-            .catch(this.handleError);
-    }
-
-    shareFilesByIds(ids: string[]): Promise<any[]> {
-        return ids.reduce((previous, current) => (
-            previous.then(() => this.shareFileById(current))
-        ), Promise.resolve());
-    }
-
-    getSharedLinks(): Promise<any> {
-        return this.get(`/shared-links`)
-            .catch(this.handleError);
-    }
-
-}
diff --git a/e2e/utilities/repo-client/apis/sites/sites-api-models.ts b/e2e/utilities/repo-client/apis/sites/sites-api-models.ts
deleted file mode 100644
index f6729c1d7..000000000
--- a/e2e/utilities/repo-client/apis/sites/sites-api-models.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { SITE_VISIBILITY } from '../../../../configs';
-
-export class Site {
-    title?: string;
-    visibility?: string = SITE_VISIBILITY.PUBLIC;
-    id?: string;
-    description?: string;
-
-    constructor(title: string, visibility: string, details: Site) {
-        this.title = title;
-        this.visibility = visibility;
-        this.id = title;
-        this.description = `${title} description`;
-
-        Object.assign(this, details);
-    }
-}
diff --git a/e2e/utilities/repo-client/apis/sites/sites-api.ts b/e2e/utilities/repo-client/apis/sites/sites-api.ts
deleted file mode 100644
index acf25c04b..000000000
--- a/e2e/utilities/repo-client/apis/sites/sites-api.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { RepoApi } from '../repo-api';
-import { Site } from './sites-api-models';
-
-export class SitesApi extends RepoApi {
-    getSite(id: string) {
-        return this
-            .get(`/sites/${id}`)
-            .catch(this.handleError);
-    }
-
-    updateSite(id: string, details?: Site): Promise<any> {
-        if (details.id) {
-            delete details.id;
-        }
-
-        return this
-            .put(`/sites/${id}`, { data: details })
-            .catch(this.handleError);
-    }
-
-    createOrUpdateSite(title: string, visibility: string, details?: Site): Promise<any> {
-        const site: Site = new Site(title, visibility, details);
-        const onSuccess = (response) => response;
-        const onError = (response) => {
-            return (response.statusCode === 409)
-                ? Promise.resolve(this.updateSite(site.id, site))
-                : Promise.reject(response);
-        };
-
-        return this
-            .post(`/sites`, { data: site })
-            .then(onSuccess, onError)
-            .catch(this.handleError);
-    }
-
-    createSite(title: string, visibility: string, details?: Site): Promise<any> {
-        const site: Site = new Site(title, visibility, details);
-        return this
-            .post(`/sites`, { data: site })
-            .catch(this.handleError);
-    }
-
-    createSites(titles: string[], visibility: string): Promise<any[]> {
-        return titles.reduce((previous, current) => (
-            previous.then(() => this.createSite(current, visibility))
-        ), Promise.resolve());
-    }
-
-    deleteSite(id: string, permanent: boolean = true): Promise<any> {
-        return this
-            .delete(`/sites/${id}?permanent=${permanent}`)
-            .catch(this.handleError);
-    }
-
-    deleteSites(ids: string[], permanent: boolean = true): Promise<any[]> {
-        return ids.reduce((previous, current) => (
-            previous.then(() => this.deleteSite(current))
-        ), Promise.resolve());
-    }
-
-    updateSiteMember(siteId: string, userId: string, role: string): Promise<any> {
-        return this
-            .put(`/sites/${siteId}/members/${userId}`, { data: { role } })
-            .catch(this.handleError);
-    }
-
-    addSiteMember(siteId: string, userId: string, role: string): Promise<any> {
-        const onSuccess = (response) => response;
-        const onError = (response) => {
-            return (response.statusCode === 409)
-                ? Promise.resolve(this.updateSiteMember(siteId, userId, role))
-                : Promise.reject(response);
-        };
-
-        return this
-            .post(`/sites/${siteId}/members`, { data: { role, id: userId } })
-            .then(onSuccess, onError)
-            .catch(this.handleError);
-    }
-
-    deleteSiteMember(siteId: string, userId: string): Promise<any> {
-        return this
-            .delete(`/sites/${siteId}/members/${userId}`)
-            .catch(this.handleError);
-    }
-}
diff --git a/e2e/utilities/repo-client/apis/trashcan/trashcan-api.ts b/e2e/utilities/repo-client/apis/trashcan/trashcan-api.ts
deleted file mode 100644
index 935fc19b5..000000000
--- a/e2e/utilities/repo-client/apis/trashcan/trashcan-api.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { RepoApi } from '../repo-api';
-
-export class TrashcanApi extends RepoApi {
-    permanentlyDelete(id: string): Promise<any> {
-        return this
-            .delete(`/deleted-nodes/${id}`)
-            .catch(this.handleError);
-    }
-
-    getDeletedNodes(): Promise<any> {
-        return this
-            .get(`/deleted-nodes?maxItems=1000`)
-            .catch(this.handleError);
-    }
-
-    emptyTrash(): Promise<any> {
-        return this.getDeletedNodes()
-            .then(resp => {
-                return resp.data.list.entries.map(entries => entries.entry.id);
-            })
-            .then(ids => {
-                return ids.reduce((previous, current) => (
-                    previous.then(() => this.permanentlyDelete(current))
-                ), Promise.resolve());
-            })
-            .catch(this.handleError);
-    }
-
-}
diff --git a/e2e/utilities/repo-client/repo-client-models.ts b/e2e/utilities/repo-client/repo-client-models.ts
deleted file mode 100644
index 46222947b..000000000
--- a/e2e/utilities/repo-client/repo-client-models.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import {
-    ADMIN_USERNAME,
-    ADMIN_PASSWORD,
-    REPO_API_HOST,
-    REPO_API_TENANT
-} from '../../configs';
-
-export class RepoClientAuth {
-    static DEFAULT_USERNAME: string = ADMIN_USERNAME;
-    static DEFAULT_PASSWORD: string = ADMIN_PASSWORD;
-
-    constructor(
-        public username: string = RepoClientAuth.DEFAULT_USERNAME,
-        public password: string = RepoClientAuth.DEFAULT_PASSWORD
-    ) {}
-}
-
-export class RepoClientConfig {
-    host?: string = REPO_API_HOST;
-    tenant?: string = REPO_API_TENANT;
-}
diff --git a/e2e/utilities/repo-client/repo-client.ts b/e2e/utilities/repo-client/repo-client.ts
deleted file mode 100644
index 8ffe00b95..000000000
--- a/e2e/utilities/repo-client/repo-client.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { RepoClientAuth, RepoClientConfig } from './repo-client-models';
-
-import { PeopleApi } from './apis/people/people-api';
-import { NodesApi } from './apis/nodes/nodes-api';
-import { SitesApi } from './apis/sites/sites-api';
-import { FavoritesApi } from './apis/favorites/favorites-api';
-import { SharedLinksApi } from './apis/shared-links/shared-links-api';
-import { TrashcanApi } from './apis/trashcan/trashcan-api';
-
-export class RepoClient {
-    public people: PeopleApi = new PeopleApi(this.auth, this.config);
-    public nodes: NodesApi = new NodesApi(this.auth, this.config);
-    public sites: SitesApi = new SitesApi(this.auth, this.config);
-    public favorites: FavoritesApi = new FavoritesApi(this.auth, this.config);
-    public shared: SharedLinksApi = new SharedLinksApi(this.auth, this.config);
-    public trashcan: TrashcanApi = new TrashcanApi(this.auth, this.config);
-
-    constructor(
-        private username: string = RepoClientAuth.DEFAULT_USERNAME,
-        private password: string = RepoClientAuth.DEFAULT_PASSWORD,
-        private config?: RepoClientConfig
-    ) {}
-
-    private get auth(): RepoClientAuth {
-        const { username, password } = this;
-        return { username, password };
-    }
-}
-
-export * from './apis/nodes/node-body-create';
-export * from './apis/nodes/node-content-tree';
-export * from './apis/nodes/nodes-api';
diff --git a/e2e/utilities/reporters/console/console-logger.ts b/e2e/utilities/reporters/console/console-logger.ts
deleted file mode 100644
index 8b82d83da..000000000
--- a/e2e/utilities/reporters/console/console-logger.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* tslint:disable */
-const chalk = require('chalk');
-/* tslint:enable */
-
-export const log = {
-    i: 0,
-
-    get indentation(): string {
-        return new Array(this.i).fill('   ').join('');
-    },
-
-    indent() {
-        this.i++;
-        return this;
-    },
-
-    dedent() {
-        this.i--;
-        return this;
-    },
-
-    log(message: string = '', options: any = { ignoreIndentation: false }) {
-        const indentation = (!options.ignoreIndentation)
-            ? this.indentation
-            : '';
-
-        console.log(`${indentation}${message}`);
-
-        return this;
-    },
-
-    blank() {
-        return this.log();
-    },
-
-    info(message: string = '', options: any = { bold: false, title: false }) {
-        const { bold } = options;
-        const style = (bold ? chalk.bold : chalk).gray;
-
-        return this.log(style(message), options);
-    },
-
-    success(message: string = '', options: any = { bold: false }) {
-        const style = options.bold ? chalk.bold.green : chalk.green;
-
-        return this.log(style(message), options);
-    },
-
-    error(message: string = '', options: any = { bold: false }) {
-        const style = options.bold ? chalk.bold.red : chalk.red;
-
-        return this.log(style(message), options);
-    }
-};
diff --git a/e2e/utilities/reporters/console/console.ts b/e2e/utilities/reporters/console/console.ts
deleted file mode 100644
index 7985e52c5..000000000
--- a/e2e/utilities/reporters/console/console.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { log } from './console-logger';
-
-const errors = [];
-
-export const consoleReporter = {
-    jasmineStarted(suiteInfo) {
-        log.blank().info(
-            `Running ${suiteInfo.totalSpecsDefined} tests`,
-            { bold: true, title: true }
-        ).blank();
-    },
-
-    suiteStarted(suite) {
-        log.info(suite.description).indent();
-    },
-
-    specDone: (spec) => {
-        const {
-            status,
-            description,
-            failedExpectations
-        } = spec;
-
-        if (status === 'passed') {
-            log.success(`∙ ${description}`);
-        }
-
-        if (status === 'failed') {
-            log.error(`✕ ${description}`, { bold: true });
-
-            errors.push(spec);
-
-            failedExpectations.forEach((failed) => {
-                log.error(`  ${failed.message}`);
-            });
-        }
-    },
-
-    suiteDone: (result) => {
-        log.dedent();
-    },
-
-    jasmineDone: (result) => {
-        if (!!errors.length) {
-            log .blank()
-                .blank()
-                .info(`${errors.length} failing tests`, { bold: true, title: true });
-
-            errors.forEach(error => {
-                log .blank()
-                    .error(`✕ ${error.fullName}`, { bold: true });
-
-                error.failedExpectations.forEach(failed => {
-                    log .info(`${failed.message}`)
-                        .blank()
-                        .error(`${failed.stack}`);
-                });
-            });
-        } else {
-            log.success(`All tests passed!`, { bold: true });
-        }
-
-        log.blank().blank();
-    }
-};
diff --git a/e2e/utilities/rest-client/rest-client-models.ts b/e2e/utilities/rest-client/rest-client-models.ts
deleted file mode 100644
index 89e3c9916..000000000
--- a/e2e/utilities/rest-client/rest-client-models.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-interface RequestConfig {
-    timeout?: number;
-    noDelay?: boolean;
-    keepAlive?: boolean;
-    keepAliveDelay?: number;
-}
-
-interface ResponseConfig {
-    timeout?: number;
-}
-
-interface ResponseRequest {
-    method: string;
-    path: string;
-    data: string;
-}
-
-export interface NodeRestClient {
-    get(uri: string, callback: Function): Function;
-    post(uri: string, callback: Function): Function;
-    put(uri: string, callback: Function): Function;
-    delete(uri: string, callback: Function): Function;
-}
-
-export interface RestClientArgs {
-    data?: any;
-    parameters?: any;
-    headers?: any;
-    requestConfig?: RequestConfig;
-    responseConfig?: ResponseConfig;
-}
-
-export interface RestClientResponse {
-    request: ResponseRequest;
-    data: any;
-    statusMessage: string;
-    statusCode: number;
-}
diff --git a/e2e/utilities/rest-client/rest-client.ts b/e2e/utilities/rest-client/rest-client.ts
deleted file mode 100644
index 45b4c1ca8..000000000
--- a/e2e/utilities/rest-client/rest-client.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { Client } from 'node-rest-client';
-import { NodeRestClient, RestClientArgs, RestClientResponse } from './rest-client-models';
-
-export * from './rest-client-models';
-
-export class RestClient {
-    private static DEFAULT_HEADERS = {
-        'Content-Type': 'application/json',
-        'Accept': 'application/json'
-    };
-
-    private client: NodeRestClient;
-
-    constructor(user: string, password: string) {
-        this.client = <NodeRestClient>(new Client({ user, password }));
-    }
-
-    get(uri: string, args: RestClientArgs = {}): Promise<RestClientResponse> {
-        return this.promisify('get', uri, args);
-    }
-
-    post(uri: string, args: RestClientArgs = {}): Promise<RestClientResponse> {
-        return this.promisify('post', uri, args);
-    }
-
-    put(uri: string, args: RestClientArgs = {}): Promise<RestClientResponse> {
-        return this.promisify('put', uri, args);
-    }
-
-    delete(uri: string, args: RestClientArgs = {}): Promise<RestClientResponse> {
-        return this.promisify('delete', uri, args);
-    }
-
-    private createArgs(args: RestClientArgs = {}): RestClientArgs {
-        const data = JSON.stringify(args.data);
-
-        return Object.assign({}, RestClient.DEFAULT_HEADERS, args, { data });
-    }
-
-    private promisify(fnName: string, uri: string, args: RestClientArgs): Promise<RestClientResponse> {
-        const fn: Function = this.client[fnName];
-        const fnArgs = [ encodeURI(uri), this.createArgs(args) ];
-
-        return new Promise((resolve, reject) => {
-            const fnCallback = (data, rawResponse) => {
-                const {
-                    statusCode, statusMessage,
-                    req: { method, path }
-                } = rawResponse;
-
-                const response: RestClientResponse = {
-                    data, statusCode, statusMessage,
-                    request: { method, path, data: args.data }
-                };
-
-                (response.statusCode >= 400)
-                    ? reject(response)
-                    : resolve(response);
-            };
-
-            fn(...fnArgs, fnCallback);
-        });
-    }
-}
diff --git a/e2e/utilities/utils.ts b/e2e/utilities/utils.ts
deleted file mode 100644
index 368b7aa43..000000000
--- a/e2e/utilities/utils.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*!
- * @license
- * Alfresco Example Content Application
- *
- * Copyright (C) 2005 - 2017 Alfresco Software Limited
- *
- * This file is part of the Alfresco Example Content Application.
- * If the software was purchased under a paid Alfresco license, the terms of
- * the paid license agreement will prevail.  Otherwise, the software is
- * provided under the following open source license terms:
- *
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import { browser, promise } from 'protractor';
-
-export class Utils {
-    // generate a random value
-    static random(): string {
-    return Math.random().toString(36).substring(3, 10);
-    }
-
-    // local storage
-    static clearLocalStorage(): promise.Promise<any> {
-        return browser.executeScript('window.localStorage.clear();');
-    }
-
-    // session storage
-    static clearSessionStorage(): promise.Promise<any> {
-        return browser.executeScript('window.sessionStorage.clear();');
-    }
-
-}
diff --git a/package.json b/package.json
index 334a7cba8..3e582ae2a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "alfresco-content-app",
-  "version": "0.1.0",
+  "version": "1.0.0",
   "license": "LGPL-3.0",
   "scripts": {
     "ng": "ng",
@@ -58,7 +58,6 @@
     "karma-coverage-istanbul-reporter": "^1.2.1",
     "karma-jasmine": "~1.1.0",
     "karma-jasmine-html-reporter": "^0.2.2",
-    "node-rest-client": "^3.1.0",
     "protractor": "^5.1.2",
     "rimraf": "2.6.2",
     "ts-node": "~3.2.0",
diff --git a/protractor.conf.js b/protractor.conf.js
index ba46ec01b..bc0ae870c 100644
--- a/protractor.conf.js
+++ b/protractor.conf.js
@@ -14,12 +14,6 @@ exports.config = {
     allScriptsTimeout: 30000,
 
     specs: [
-        './e2e/suites/authentication/*.test.ts',
-        './e2e/suites/list-views/*.test.ts',
-        './e2e/suites/application/page-titles.test.ts',
-        './e2e/suites/navigation/side-navigation.test.ts',
-        './e2e/suites/pagination/*.test.ts',
-        './e2e/suites/actions/*.test.ts'
     ],
 
     capabilities: {
diff --git a/src/app/components/favorites/favorites.component.html b/src/app/components/favorites/favorites.component.html
index 323786641..7c1f3b135 100644
--- a/src/app/components/favorites/favorites.component.html
+++ b/src/app/components/favorites/favorites.component.html
@@ -9,7 +9,7 @@
                 mat-icon-button
                 *ngIf="canPreviewFile(documentList.selection)"
                 title="{{ 'APP.ACTIONS.VIEW' | translate }}"
-                (click)="showPreview(documentList.selection[0]?.entry?.id)">
+                (click)="onNodeDoubleClick(documentList.selection[0]?.entry)">
                 <mat-icon>open_in_browser</mat-icon>
             </button>
 
diff --git a/src/app/components/files/files.component.html b/src/app/components/files/files.component.html
index 6461f7859..f28e822a2 100644
--- a/src/app/components/files/files.component.html
+++ b/src/app/components/files/files.component.html
@@ -11,7 +11,7 @@
                 mat-icon-button
                 *ngIf="canPreviewFile(documentList.selection)"
                 title="{{ 'APP.ACTIONS.VIEW' | translate }}"
-                (click)="showPreview(documentList.selection[0]?.entry?.id)">
+                (click)="showPreview(documentList.selection[0]?.entry)">
                 <mat-icon>open_in_browser</mat-icon>
             </button>
 
diff --git a/src/app/components/files/files.component.ts b/src/app/components/files/files.component.ts
index bf656c69b..8d3d7e729 100644
--- a/src/app/components/files/files.component.ts
+++ b/src/app/components/files/files.component.ts
@@ -155,6 +155,14 @@ export class FilesComponent extends PageComponent implements OnInit, OnDestroy {
         }
     }
 
+    showPreview(node: MinimalNodeEntryEntity) {
+        if (node) {
+            if (node.isFile) {
+                this.router.navigate(['/preview', node.id]);
+            }
+        }
+    }
+
     onBreadcrumbNavigate(route: PathElementEntity) {
         // todo: review this approach once 5.2.3 is out
         if (this.nodePath && this.nodePath.length > 2) {
diff --git a/src/app/components/recent-files/recent-files.component.html b/src/app/components/recent-files/recent-files.component.html
index daaf8a436..185a49732 100644
--- a/src/app/components/recent-files/recent-files.component.html
+++ b/src/app/components/recent-files/recent-files.component.html
@@ -9,7 +9,7 @@
                 mat-icon-button
                 *ngIf="canPreviewFile(documentList.selection)"
                 title="{{ 'APP.ACTIONS.VIEW' | translate }}"
-                (click)="showPreview(documentList.selection[0]?.entry?.id)">
+                (click)="onNodeDoubleClick(documentList.selection[0]?.entry)">
                 <mat-icon>open_in_browser</mat-icon>
             </button>
 
diff --git a/src/app/components/shared-files/shared-files.component.html b/src/app/components/shared-files/shared-files.component.html
index e7eb1481d..2cfc02f49 100644
--- a/src/app/components/shared-files/shared-files.component.html
+++ b/src/app/components/shared-files/shared-files.component.html
@@ -9,7 +9,7 @@
                 mat-icon-button
                 *ngIf="canPreviewFile(documentList.selection)"
                 title="{{ 'APP.ACTIONS.VIEW' | translate }}"
-                (click)="showPreview(documentList.selection[0]?.entry?.nodeId)">
+                (click)="onNodeDoubleClick(documentList.selection[0]?.entry)">
                 <mat-icon>open_in_browser</mat-icon>
             </button>
 
diff --git a/yarn.lock b/yarn.lock
index 58008d198..afc2765ba 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -68,26 +68,27 @@
     zone.js "0.8.14"
 
 "@angular-devkit/build-optimizer@~0.0.31":
-  version "0.0.33"
-  resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.0.33.tgz#d040f283ed7300b5be8bc970228b835ed02df42f"
+  version "0.0.36"
+  resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.0.36.tgz#e816ee9be22dbb777724f0281acfa72cfff184b7"
   dependencies:
     loader-utils "^1.1.0"
     source-map "^0.5.6"
-    typescript "^2.3.3"
+    typescript "~2.6.1"
     webpack-sources "^1.0.1"
 
-"@angular-devkit/core@0.0.21":
-  version "0.0.21"
-  resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.0.21.tgz#e2ba4ac0a4e1156f884c083b15eb1c26ddfb2ba8"
+"@angular-devkit/core@0.0.22":
+  version "0.0.22"
+  resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.0.22.tgz#e90f46bf7ff47d260a767959267bc65ffee39ef1"
   dependencies:
     source-map "^0.5.6"
 
 "@angular-devkit/schematics@~0.0.34":
-  version "0.0.37"
-  resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.0.37.tgz#d86ff93b14a44b766e72bcea1569b5d36063210e"
+  version "0.0.42"
+  resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.0.42.tgz#34eea7136455545c8abd21edf94a36870a073fea"
   dependencies:
-    "@angular-devkit/core" "0.0.21"
+    "@angular-devkit/core" "0.0.22"
     "@ngtools/json-schema" "^1.1.0"
+    "@schematics/schematics" "0.0.11"
     minimist "^1.2.0"
     rxjs "^5.5.2"
 
@@ -216,8 +217,8 @@
   resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-4.4.5.tgz#ccef139b8d3e1684b01afa35c6fbf2172e2bb676"
 
 "@angular/material-moment-adapter@^5.0.0-rc0":
-  version "5.0.0-rc0"
-  resolved "https://registry.yarnpkg.com/@angular/material-moment-adapter/-/material-moment-adapter-5.0.0-rc0.tgz#d0357aae1fef9e9181ee80ee444c2dfe9ce1df08"
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@angular/material-moment-adapter/-/material-moment-adapter-5.0.1.tgz#058371d4d60bb91555bc89e9044c9e6412bbda71"
   dependencies:
     tslib "^1.7.1"
 
@@ -266,10 +267,14 @@
   resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-8.0.0.tgz#751fd6b512d80f3a748d2de8dfc96dfefa29afe0"
 
 "@schematics/angular@~0.1.0":
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.1.7.tgz#2306aeec118ca185e180882eff54f5116de4ef05"
+  version "0.1.11"
+  resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.1.11.tgz#b5f15320bbb60969d66c76a8ef6545058ac81ece"
   dependencies:
-    "@angular-devkit/core" "0.0.21"
+    "@angular-devkit/core" "0.0.22"
+
+"@schematics/schematics@0.0.11":
+  version "0.0.11"
+  resolved "https://registry.yarnpkg.com/@schematics/schematics/-/schematics-0.0.11.tgz#c8f70f270ed38f29b2873248126fd59abd635862"
 
 "@types/jasmine@*", "@types/jasmine@^2.5.53":
   version "2.8.2"
@@ -282,8 +287,8 @@
     "@types/jasmine" "*"
 
 "@types/node@^6.0.46", "@types/node@~6.0.60":
-  version "6.0.92"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.92.tgz#e7f721ae282772e12ba2579968c00d9cce422c5d"
+  version "6.0.94"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.94.tgz#70e509b07ed9f961c8f6f4a73a61d922be5029a7"
 
 "@types/q@^0.0.32":
   version "0.0.32"
@@ -356,8 +361,8 @@ ajv@^4.9.1:
     json-stable-stringify "^1.0.1"
 
 ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5:
-  version "5.5.0"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.0.tgz#eb2840746e9dc48bd5e063a36e3fd400c5eab5a9"
+  version "5.5.1"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.1.tgz#b38bb8876d9e86bee994956a04e721e88b248eb2"
   dependencies:
     co "^4.6.0"
     fast-deep-equal "^1.0.0"
@@ -494,7 +499,7 @@ arraybuffer.slice@0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
 
-arrify@^1.0.0:
+arrify@^1.0.0, arrify@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
 
@@ -706,13 +711,13 @@ block-stream@*:
   dependencies:
     inherits "~2.0.0"
 
-blocking-proxy@0.0.5:
-  version "0.0.5"
-  resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b"
+blocking-proxy@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2"
   dependencies:
     minimist "^1.2.0"
 
-bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1:
+bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.0:
   version "3.5.1"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
 
@@ -880,7 +885,7 @@ bytes@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
 
-cacache@^10.0.0:
+cacache@^10.0.0, cacache@^10.0.1:
   version "10.0.1"
   resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.1.tgz#3e05f6e616117d9b54665b1b20c8aeb93ea5d36f"
   dependencies:
@@ -942,8 +947,8 @@ caniuse-api@^1.5.2:
     lodash.uniq "^4.5.0"
 
 caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
-  version "1.0.30000775"
-  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000775.tgz#04bccdd0214edf25b97f61a096609f7ad6904333"
+  version "1.0.30000783"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000783.tgz#16b30d47266a4f515cc69ae0316b670c9603cdbe"
 
 caseless@~0.11.0:
   version "0.11.0"
@@ -1292,23 +1297,27 @@ copy-concurrently@^1.0.0:
     run-queue "^1.0.0"
 
 copy-webpack-plugin@^4.1.1:
-  version "4.2.3"
-  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.2.3.tgz#4a3c61089f3b635777f0f0af346c338b39d63755"
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.3.0.tgz#cfdf4d131c78d66917a1bb863f86630497aacf42"
   dependencies:
-    bluebird "^3.5.1"
-    glob "^7.1.2"
+    cacache "^10.0.1"
+    find-cache-dir "^1.0.0"
+    globby "^7.1.1"
     is-glob "^4.0.0"
     loader-utils "^0.2.15"
     lodash "^4.3.0"
     minimatch "^3.0.4"
+    p-limit "^1.0.0"
+    pify "^3.0.0"
+    serialize-javascript "^1.4.0"
 
 core-js@2.4.1:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
 
 core-js@^2.2.0, core-js@^2.4.0:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
 
 core-js@~2.3.0:
   version "2.3.0"
@@ -1560,7 +1569,7 @@ debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8:
   dependencies:
     ms "2.0.0"
 
-debug@2.2.0, debug@~2.2.0:
+debug@2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
   dependencies:
@@ -1681,6 +1690,13 @@ diffie-hellman@^5.0.0:
     miller-rabin "^4.0.0"
     randombytes "^2.0.0"
 
+dir-glob@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
+  dependencies:
+    arrify "^1.0.1"
+    path-type "^3.0.0"
+
 directory-encoder@^0.7.2:
   version "0.7.2"
   resolved "https://registry.yarnpkg.com/directory-encoder/-/directory-encoder-0.7.2.tgz#59b4e2aa4f25422f6c63b527b462f5e2d0dd2c58"
@@ -1783,8 +1799,8 @@ ejs@^2.5.7:
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
 
 electron-to-chromium@^1.2.7:
-  version "1.3.27"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d"
+  version "1.3.28"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.28.tgz#8dd4e6458086644e9f9f0a1cf32e2a1f9dffd9ee"
 
 elliptic@^6.0.0:
   version "6.4.0"
@@ -1873,10 +1889,10 @@ entities@~1.1.1:
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
 
 errno@^0.1.1, errno@^0.1.3, errno@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026"
   dependencies:
-    prr "~0.0.0"
+    prr "~1.0.1"
 
 error-ex@^1.2.0:
   version "1.3.1"
@@ -2145,10 +2161,14 @@ extract-text-webpack-plugin@3.0.0:
     schema-utils "^0.3.0"
     webpack-sources "^1.0.1"
 
-extsprintf@1.3.0, extsprintf@^1.2.0:
+extsprintf@1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
 
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
 fast-deep-equal@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
@@ -2257,12 +2277,6 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.1"
     readable-stream "^2.0.4"
 
-follow-redirects@>=1.2.0:
-  version "1.2.6"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.6.tgz#4dcdc7e4ab3dd6765a97ff89c3b4c258117c79bf"
-  dependencies:
-    debug "^3.1.0"
-
 for-in@^0.1.3:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@@ -2352,8 +2366,8 @@ fs-extra@^0.26.5:
     rimraf "^2.2.8"
 
 fs-extra@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b"
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
   dependencies:
     graceful-fs "^4.1.2"
     jsonfile "^4.0.0"
@@ -2517,6 +2531,17 @@ globby@^6.1.0:
     pify "^2.0.0"
     pinkie-promise "^2.0.0"
 
+globby@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
+  dependencies:
+    array-union "^1.0.1"
+    dir-glob "^2.0.0"
+    glob "^7.1.2"
+    ignore "^3.3.5"
+    pify "^3.0.0"
+    slash "^1.0.0"
+
 globule@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09"
@@ -2821,6 +2846,10 @@ iferr@^0.1.5:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
 
+ignore@^3.3.5:
+  version "3.3.7"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
+
 image-size@~0.5.0:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
@@ -3039,8 +3068,8 @@ is-path-in-cwd@^1.0.0:
     is-path-inside "^1.0.0"
 
 is-path-inside@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
   dependencies:
     path-is-inside "^1.0.1"
 
@@ -3238,8 +3267,8 @@ jasminewd2@^2.1.0:
   resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e"
 
 js-base64@^2.1.5, js-base64@^2.1.8, js-base64@^2.1.9:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf"
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa"
 
 js-tokens@^3.0.0, js-tokens@^3.0.2:
   version "3.0.2"
@@ -3367,8 +3396,8 @@ karma-jasmine-html-reporter@^0.2.2:
     karma-jasmine "^1.0.2"
 
 karma-jasmine@^1.0.2, karma-jasmine@~1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf"
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.1.tgz#6fe840e75a11600c9d91e84b33c458e1c46a3529"
 
 karma-source-map-support@^1.2.0:
   version "1.2.0"
@@ -3718,8 +3747,8 @@ miller-rabin@^4.0.0:
     brorand "^1.0.1"
 
 "mime-db@>= 1.30.0 < 2":
-  version "1.31.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb"
+  version "1.32.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414"
 
 mime-db@~1.30.0:
   version "1.30.0"
@@ -3804,8 +3833,8 @@ moment-es6@1.0.0:
     moment "*"
 
 moment@*, moment@^2.10.6:
-  version "2.19.3"
-  resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.3.tgz#bdb99d270d6d7fda78cc0fbace855e27fe7da69f"
+  version "2.19.4"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.4.tgz#17e5e2c6ead8819c8ecfad83a0acccb312e94682"
 
 moment@2.15.2:
   version "2.15.2"
@@ -3949,14 +3978,6 @@ node-pre-gyp@^0.6.39:
     tar "^2.2.1"
     tar-pack "^3.4.0"
 
-node-rest-client@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/node-rest-client/-/node-rest-client-3.1.0.tgz#e0beb6dda7b20cc0b67a7847cf12c5fc419c37c3"
-  dependencies:
-    debug "~2.2.0"
-    follow-redirects ">=1.2.0"
-    xml2js ">=0.2.4"
-
 node-sass@^4.3.0:
   version "4.7.2"
   resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.7.2.tgz#9366778ba1469eb01438a9e8592f4262bcb6794e"
@@ -4168,7 +4189,7 @@ p-finally@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
 
-p-limit@^1.1.0:
+p-limit@^1.0.0, p-limit@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
 
@@ -4299,6 +4320,12 @@ path-type@^2.0.0:
   dependencies:
     pify "^2.0.0"
 
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  dependencies:
+    pify "^3.0.0"
+
 pbkdf2@^3.0.3:
   version "3.0.14"
   resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
@@ -4686,13 +4713,13 @@ promise@^7.1.1:
     asap "~2.0.3"
 
 protractor@^5.1.2:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.2.0.tgz#d3f39b195e85f3539ad9d8cb6560a9d2b63297c4"
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.2.2.tgz#80eff170761455eff6e2f111088a03c438844a41"
   dependencies:
     "@types/node" "^6.0.46"
     "@types/q" "^0.0.32"
     "@types/selenium-webdriver" "~2.53.39"
-    blocking-proxy "0.0.5"
+    blocking-proxy "^1.0.0"
     chalk "^1.1.3"
     glob "^7.0.3"
     jasmine "^2.5.3"
@@ -4712,9 +4739,9 @@ proxy-addr@~2.0.2:
     forwarded "~0.1.2"
     ipaddr.js "1.5.2"
 
-prr@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
 
 pseudomap@^1.0.2:
   version "1.0.2"
@@ -4953,8 +4980,8 @@ regenerate@^1.2.1:
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
 
 regenerator-runtime@^0.11.0:
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1"
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
 
 regex-cache@^0.4.2:
   version "0.4.4"
@@ -5152,12 +5179,18 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
-rxjs@5.5.2, rxjs@^5.5.2:
+rxjs@5.5.2:
   version "5.5.2"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3"
   dependencies:
     symbol-observable "^1.0.1"
 
+rxjs@^5.5.2:
+  version "5.5.5"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.5.tgz#e164f11d38eaf29f56f08c3447f74ff02dd84e97"
+  dependencies:
+    symbol-observable "1.0.1"
+
 safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
@@ -5281,6 +5314,10 @@ send@0.16.1:
     range-parser "~1.2.0"
     statuses "~1.3.1"
 
+serialize-javascript@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
+
 serve-index@^1.7.2:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
@@ -5358,6 +5395,10 @@ silent-error@^1.0.0:
   dependencies:
     debug "^2.2.0"
 
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
 sntp@1.x.x:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -5724,6 +5765,10 @@ svgo@^0.7.0:
     sax "~1.2.1"
     whet.extend "~0.9.9"
 
+symbol-observable@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
+
 symbol-observable@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32"
@@ -5878,8 +5923,8 @@ tsickle@^0.24.0:
     source-map-support "^0.4.2"
 
 tslib@^1.7.1:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.0.tgz#dc604ebad64bcbf696d613da6c954aa0e7ea1eb6"
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac"
 
 tslint@~5.7.0:
   version "5.7.0"
@@ -5931,24 +5976,24 @@ typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-typescript@^2.3.3:
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4"
-
 typescript@~2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.2.tgz#f8395f85d459276067c988aa41837a8f82870844"
 
+typescript@~2.6.1:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4"
+
 uglify-es@^3.1.3:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.0.tgz#fbbfb9dc465ec7e5065701b9720d0de977d0bc24"
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.2.tgz#15c62b7775002c81b7987a1c49ecd3f126cace73"
   dependencies:
     commander "~2.12.1"
     source-map "~0.6.1"
 
 uglify-js@3.2.x:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.2.0.tgz#cb411ee4ca0e0cadbfe3a4e1a1da97e6fa0d19c1"
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.2.2.tgz#870e4b34ed733d179284f9998efd3293f7fd73f6"
   dependencies:
     commander "~2.12.1"
     source-map "~0.6.1"
@@ -6215,8 +6260,8 @@ webpack-dev-middleware@^1.11.0, webpack-dev-middleware@~1.12.0:
     time-stamp "^2.0.0"
 
 webpack-dev-server@~2.9.3:
-  version "2.9.5"
-  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.5.tgz#79336fba0087a66ae491f4869f6545775b18daa8"
+  version "2.9.7"
+  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.7.tgz#100ad6a14775478924d417ca6dcfb9d52a98faed"
   dependencies:
     ansi-html "0.0.7"
     array-includes "^3.0.3"
@@ -6260,8 +6305,8 @@ webpack-sources@^1.0.0, webpack-sources@^1.0.1:
     source-map "~0.6.1"
 
 webpack-subresource-integrity@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.1.tgz#1fc09d46497da66e46743a2a51d2cc385b9cb0ed"
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.3.tgz#c0606d40090b070cde428bec8df3603216e472eb"
   dependencies:
     webpack-core "^0.6.8"
 
@@ -6394,7 +6439,7 @@ xml2js@0.4.4:
     sax "0.6.x"
     xmlbuilder ">=1.0.0"
 
-xml2js@>=0.2.4, xml2js@^0.4.17:
+xml2js@^0.4.17:
   version "0.4.19"
   resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
   dependencies: