From 03a93e45d9546eb0928b3dc5e68aed0a518fcdd9 Mon Sep 17 00:00:00 2001
From: Cristina Jalba <Cristina.Jalba@ness.com>
Date: Fri, 3 Apr 2020 11:15:06 +0300
Subject: [PATCH] [ACA-2951]Add APS1 calls to adf testing package (#5566)

* Add APS1 calls to adf testing package

* no message

* Change to use AlfrescoApi instead of ApiService

* Refactor process-services tests to use API calls implementation from testing package

* Fix resource file

* no message

* Fix widget tests

* Fix tests

* no message

* Unblocking travis
---
 e2e/process-services/apps-section.e2e.ts      |  9 ++-
 .../attach-file-widget.e2e.ts                 |  8 +--
 .../attach-form-component.e2e.ts              |  7 +--
 .../comment-component-processes.e2e.ts        |  5 +-
 .../custom-process-filters-sorting.e2e.ts     |  6 +-
 .../custom-tasks-filters.e2e.ts               |  8 ++-
 .../dynamic-table-date-picker.e2e.ts          | 10 ++--
 .../empty-process-list-component.e2e.ts       | 10 ++--
 .../form-people-widget.e2e.ts                 | 10 ++--
 .../form-widgets-component.e2e.ts             | 10 ++--
 e2e/process-services/info-drawer.e2e.ts       |  7 +--
 ...nation-processlist-adding-processes.e2e.ts |  6 +-
 .../pagination-tasklist-adding-tasks.e2e.ts   |  6 +-
 ...process-attachment-list-action-menu.e2e.ts |  6 +-
 .../process-filters-component.e2e.ts          |  7 +--
 .../process-instance-details.e2e.ts           |  5 +-
 .../process-list-component.e2e.ts             |  8 ++-
 .../processlist-pagination.e2e.ts             |  7 ++-
 .../sort-tasklist-pagination.e2e.ts           |  8 +--
 .../start-process-component.e2e.ts            | 17 +++---
 .../start-task-custom-app.e2e.ts              |  8 +--
 e2e/process-services/stencil.e2e.ts           |  7 +--
 e2e/process-services/task-assignee.e2e.ts     |  8 ++-
 .../task-attachment-list-action-menu.e2e.ts   |  7 +--
 e2e/process-services/task-audit.e2e.ts        |  7 +--
 e2e/process-services/task-details-form.e2e.ts |  5 +-
 .../task-details-no-form.e2e.ts               |  5 +-
 e2e/process-services/task-details.e2e.ts      |  5 +-
 .../task-filters-component.e2e.ts             | 11 ++--
 .../task-filters-sorting.e2e.ts               |  7 +--
 .../task-list-pagination.e2e.ts               |  5 +-
 .../widgets/amount-widget.e2e.ts              |  5 +-
 .../widgets/attach-file-widget.e2e.ts         |  7 +--
 .../widgets/attach-folder-widget.e2e.ts       |  5 +-
 .../widgets/checkbox-widget.e2e.ts            |  5 +-
 .../widgets/date-time-widget.e2e.ts           |  5 +-
 .../widgets/date-widget.e2e.ts                |  5 +-
 .../widgets/document-template-widget.e2e.ts   |  5 +-
 .../widgets/dropdown-widget.e2e.ts            |  5 +-
 .../widgets/dynamic-table-widget.e2e.ts       | 11 ++--
 .../widgets/header-widget.e2e.ts              |  5 +-
 .../widgets/hyperlink-widget.e2e.ts           |  5 +-
 .../widgets/multi-line-widget.e2e.ts          |  5 +-
 .../widgets/number-widget.e2e.ts              |  5 +-
 .../widgets/people-group-widget.e2e.ts        |  7 +--
 .../widgets/people-widget.e2e.ts              |  5 +-
 .../widgets/radio-buttons-widget.e2e.ts       |  5 +-
 .../widgets/text-widget.e2e.ts                |  5 +-
 .../widgets/typeahead-widget.e2e.ts           |  7 +--
 .../widget-visibility-condition.e2e.ts        |  5 +-
 e2e/util/resources.js                         | 16 ++++++
 .../core/actions/APS/applications.service.ts  | 57 +++++++++++++++++++
 .../lib/core/actions/APS/models.service.ts    | 43 ++++++++++++++
 .../src/lib/core/actions/APS/public-api.ts    | 19 +++++++
 .../src/lib/core/actions/public-api.ts        |  1 +
 55 files changed, 325 insertions(+), 153 deletions(-)
 create mode 100644 lib/testing/src/lib/core/actions/APS/applications.service.ts
 create mode 100644 lib/testing/src/lib/core/actions/APS/models.service.ts
 create mode 100644 lib/testing/src/lib/core/actions/APS/public-api.ts

diff --git a/e2e/process-services/apps-section.e2e.ts b/e2e/process-services/apps-section.e2e.ts
index 598043f503..24f376c274 100644
--- a/e2e/process-services/apps-section.e2e.ts
+++ b/e2e/process-services/apps-section.e2e.ts
@@ -16,7 +16,7 @@
  */
 
 import { browser } from 'protractor';
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import CONSTANTS = require('../util/constants');
@@ -36,6 +36,7 @@ describe('Modify applications', () => {
     const apps = new AppsActions();
     const modelActions = new ModelsActions();
     let firstApp, appVersionToBeDeleted;
+    let applicationService;
 
     beforeAll(async () => {
         const users = new UsersActions();
@@ -45,14 +46,16 @@ describe('Modify applications', () => {
             hostBpm: browser.params.testConfig.adf_aps.host
         });
 
+        applicationService = new ApplicationService(this.alfrescoJsApi);
+
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
 
         const user = await users.createTenantAndUser(this.alfrescoJsApi);
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        firstApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
-        appVersionToBeDeleted = await apps.importPublishDeployApp(this.alfrescoJsApi, appToBeDeleted.file_location);
+        firstApp = await applicationService.importPublishDeployApp(app.file_path);
+        appVersionToBeDeleted = await applicationService.importPublishDeployApp(appToBeDeleted.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(user);
    });
diff --git a/e2e/process-services/attach-file-widget.e2e.ts b/e2e/process-services/attach-file-widget.e2e.ts
index a3450abfab..653b0f8381 100644
--- a/e2e/process-services/attach-file-widget.e2e.ts
+++ b/e2e/process-services/attach-file-widget.e2e.ts
@@ -15,12 +15,11 @@
  * limitations under the License.
  */
 
-import { LoginPage, Widget, ViewerPage } from '@alfresco/adf-testing';
+import { LoginPage, Widget, ViewerPage, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../util/constants');
 import { FileModel } from '../models/ACS/file.model';
 import { browser } from 'protractor';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { UsersActions } from '../actions/users.actions';
@@ -40,20 +39,21 @@ describe('Start Task - Task App', () => {
 
     beforeAll(async () => {
         const users = new UsersActions();
-        const apps = new AppsActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
             provider: 'BPM',
             hostBpm: browser.params.testConfig.adf_aps.host
         });
 
+        const applicationService = new ApplicationService(this.alfrescoJsApi);
+
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
 
         processUserModel = await users.createTenantAndUser(this.alfrescoJsApi);
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        await applicationService.importPublishDeployApp(app.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
    });
diff --git a/e2e/process-services/attach-form-component.e2e.ts b/e2e/process-services/attach-form-component.e2e.ts
index 4809a3976b..e8cfbdbae8 100644
--- a/e2e/process-services/attach-form-component.e2e.ts
+++ b/e2e/process-services/attach-form-component.e2e.ts
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-import { FormFields, LoginPage } from '@alfresco/adf-testing';
+import { FormFields, LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser, by } from 'protractor';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { AttachFormPage } from '../pages/adf/process-services/attach-form.page';
@@ -51,9 +50,9 @@ describe('Attach Form Component', () => {
             provider: 'BPM',
             hostBpm: browser.params.testConfig.adf_aps.host
         });
+        const applicationService = new ApplicationService(this.alfrescoJsApi);
 
         const users = new UsersActions();
-        const appsActions = new AppsActions();
 
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
 
@@ -63,7 +62,7 @@ describe('Attach Form Component', () => {
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        const appModel = await appsActions.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const appModel = await applicationService.importPublishDeployApp(app.file_path);
 
         appId = appModel.id;
 
diff --git a/e2e/process-services/comment-component-processes.e2e.ts b/e2e/process-services/comment-component-processes.e2e.ts
index dbcd6dc52a..fd71e3968d 100644
--- a/e2e/process-services/comment-component-processes.e2e.ts
+++ b/e2e/process-services/comment-component-processes.e2e.ts
@@ -16,7 +16,7 @@
  */
 
 import { browser } from 'protractor';
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { ProcessFiltersPage } from '../pages/adf/process-services/process-filters.page';
 import { CommentsPage } from '../pages/adf/comments.page';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
@@ -42,6 +42,7 @@ describe('Comment component for Processes', () => {
 
         const apps = new AppsActions();
         const users = new UsersActions();
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
 
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
 
@@ -51,7 +52,7 @@ describe('Comment component for Processes', () => {
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        const importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const importedApp = await applicationsService.importPublishDeployApp(app.file_path);
         appId = importedApp.id;
 
         const processWithComment = await apps.startProcess(this.alfrescoJsApi, 'Task App', 'Comment APS');
diff --git a/e2e/process-services/custom-process-filters-sorting.e2e.ts b/e2e/process-services/custom-process-filters-sorting.e2e.ts
index b8ad9b370b..bf546d5f21 100644
--- a/e2e/process-services/custom-process-filters-sorting.e2e.ts
+++ b/e2e/process-services/custom-process-filters-sorting.e2e.ts
@@ -17,7 +17,7 @@
 
 import { browser } from 'protractor';
 
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { ProcessFiltersPage } from '../pages/adf/process-services/process-filters.page';
 import { FiltersPage } from '../pages/adf/process-services/filters.page';
@@ -60,12 +60,14 @@ describe('Sorting for process filters', () => {
 
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
 
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
         user = await users.createTenantAndUser(this.alfrescoJsApi);
         tenantId = user.tenantId;
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        const importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const importedApp = await applicationsService.importPublishDeployApp(app.file_path);
         appId = importedApp.id;
 
         await loginPage.loginToProcessServicesUsingUserModel(user);
diff --git a/e2e/process-services/custom-tasks-filters.e2e.ts b/e2e/process-services/custom-tasks-filters.e2e.ts
index 7fcb4303f3..7930c58c2f 100644
--- a/e2e/process-services/custom-tasks-filters.e2e.ts
+++ b/e2e/process-services/custom-tasks-filters.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { DateUtil, LoginPage, PaginationPage } from '@alfresco/adf-testing';
+import { DateUtil, LoginPage, PaginationPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
 import { AppsActions } from '../actions/APS/apps.actions';
@@ -79,17 +79,19 @@ describe('Start Task - Custom App', () => {
 
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
 
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
         const newTenant = await this.alfrescoJsApi.activiti.adminTenantsApi.createTenant(new Tenant());
 
         processUserModel = await users.createApsUser(this.alfrescoJsApi, newTenant.id);
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        appModel = await applicationsService.importPublishDeployApp(app.file_path);
 
         appRuntime = await appsRuntime.getRuntimeAppByName(this.alfrescoJsApi, app.title);
 
-        secondAppModel = await apps.importPublishDeployApp(this.alfrescoJsApi, secondApp.file_location);
+        secondAppModel = await applicationsService.importPublishDeployApp(secondApp.file_path);
 
         secondAppRuntime = await appsRuntime.getRuntimeAppByName(this.alfrescoJsApi, secondApp.title);
 
diff --git a/e2e/process-services/dynamic-table-date-picker.e2e.ts b/e2e/process-services/dynamic-table-date-picker.e2e.ts
index 21d7cccc01..072f58dabe 100644
--- a/e2e/process-services/dynamic-table-date-picker.e2e.ts
+++ b/e2e/process-services/dynamic-table-date-picker.e2e.ts
@@ -15,13 +15,12 @@
  * limitations under the License.
  */
 
-import { LoginPage, Widget, DatePickerCalendarPage, DateUtil } from '@alfresco/adf-testing';
+import { LoginPage, Widget, DatePickerCalendarPage, DateUtil, ApplicationService } from '@alfresco/adf-testing';
 import { ProcessFiltersPage } from '../pages/adf/process-services/process-filters.page';
 import { ProcessServiceTabBarPage } from '../pages/adf/process-services/process-service-tab-bar.page';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { browser } from 'protractor';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 
 describe('Dynamic Table', () => {
@@ -32,7 +31,6 @@ describe('Dynamic Table', () => {
     const datePicker = new DatePickerCalendarPage();
     const navigationBarPage = new NavigationBarPage();
     const widget = new Widget();
-    const apps = new AppsActions();
     const users = new UsersActions();
     const alfrescoJsApi = new AlfrescoApi({
         provider: 'BPM',
@@ -68,7 +66,8 @@ describe('Dynamic Table', () => {
 
         beforeAll(async () => {
             await alfrescoJsApi.login(user.email, user.password);
-            const importedApp = await apps.importPublishDeployApp(alfrescoJsApi, app.file_location);
+            const applicationsService = new ApplicationService(alfrescoJsApi);
+            const importedApp = await applicationsService.importPublishDeployApp(app.file_path);
             appId = importedApp.id;
             await loginPage.loginToProcessServicesUsingUserModel(user);
         });
@@ -128,8 +127,9 @@ describe('Dynamic Table', () => {
 
         beforeAll(async () => {
             await alfrescoJsApi.login(user.email, user.password);
+            const applicationsService = new ApplicationService(alfrescoJsApi);
 
-            const importedApp = await apps.importPublishDeployApp(alfrescoJsApi, app.file_location);
+            const importedApp = await applicationsService.importPublishDeployApp(app.file_path);
             appId = importedApp.id;
             await loginPage.loginToProcessServicesUsingUserModel(user);
         });
diff --git a/e2e/process-services/empty-process-list-component.e2e.ts b/e2e/process-services/empty-process-list-component.e2e.ts
index 70d6c86c36..3b0a5124fa 100644
--- a/e2e/process-services/empty-process-list-component.e2e.ts
+++ b/e2e/process-services/empty-process-list-component.e2e.ts
@@ -16,7 +16,7 @@
  */
 
 import { browser } from 'protractor';
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import { ProcessFiltersPage } from '../pages/adf/process-services/process-filters.page';
@@ -24,7 +24,6 @@ import { ProcessDetailsPage } from '../pages/adf/process-services/process-detail
 import { ProcessListPage } from '../pages/adf/process-services/process-list.page';
 import { StartProcessPage } from '../pages/adf/process-services/start-process.page';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 
 describe('Empty Process List Test', () => {
@@ -43,7 +42,6 @@ describe('Empty Process List Test', () => {
     let user;
 
     beforeAll(async () => {
-        const apps = new AppsActions();
         const users = new UsersActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
@@ -53,12 +51,14 @@ describe('Empty Process List Test', () => {
 
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
 
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
         user = await users.createTenantAndUser(this.alfrescoJsApi);
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        await apps.importPublishDeployApp(this.alfrescoJsApi, appA.file_location);
-        await apps.importPublishDeployApp(this.alfrescoJsApi, appB.file_location);
+        await applicationsService.importPublishDeployApp(appA.file_path);
+        await applicationsService.importPublishDeployApp(appB.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(user);
    });
diff --git a/e2e/process-services/form-people-widget.e2e.ts b/e2e/process-services/form-people-widget.e2e.ts
index a7b4587d66..467aa0e5b2 100644
--- a/e2e/process-services/form-people-widget.e2e.ts
+++ b/e2e/process-services/form-people-widget.e2e.ts
@@ -15,19 +15,18 @@
  * limitations under the License.
  */
 
-import { LoginPage, Widget } from '@alfresco/adf-testing';
+import { LoginPage, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { ProcessFiltersPage } from '../pages/adf/process-services/process-filters.page';
 import { StartProcessPage } from '../pages/adf/process-services/start-process.page';
 import { ProcessDetailsPage } from '../pages/adf/process-services/process-details.page';
 import { TaskDetailsPage } from '../pages/adf/process-services/task-details.page';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 import { browser } from 'protractor';
 import { ProcessServiceTabBarPage } from '../pages/adf/process-services/process-service-tab-bar.page';
 
-describe('Form widgets - People', () => {
+describe('Form widgets - People ', () => {
 
     const loginPage = new LoginPage();
     let processUserModel;
@@ -43,7 +42,6 @@ describe('Form widgets - People', () => {
 
     beforeAll(async () => {
         const users = new UsersActions();
-        const appsActions = new AppsActions();
 
         alfrescoJsApi = new AlfrescoApi({
             provider: 'BPM',
@@ -56,7 +54,9 @@ describe('Form widgets - People', () => {
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+
+        appModel = await applicationsService.importPublishDeployApp(app.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
    });
diff --git a/e2e/process-services/form-widgets-component.e2e.ts b/e2e/process-services/form-widgets-component.e2e.ts
index d582657670..766a9ad1fa 100644
--- a/e2e/process-services/form-widgets-component.e2e.ts
+++ b/e2e/process-services/form-widgets-component.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../util/constants');
 import FormDefinitionModel = require('../models/APS/FormDefinitionModel');
@@ -42,7 +42,6 @@ describe('Form widgets', () => {
 
         beforeAll(async () => {
             const users = new UsersActions();
-            const appsActions = new AppsActions();
 
             alfrescoJsApi = new AlfrescoApi({
                 provider: 'BPM',
@@ -55,7 +54,9 @@ describe('Form widgets', () => {
 
             await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-            appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location);
+            const applicationsService = new ApplicationService(alfrescoJsApi);
+
+            appModel = await applicationsService.importPublishDeployApp(app.file_path);
 
             await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
 
@@ -212,7 +213,8 @@ describe('Form widgets', () => {
             processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
             await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-            appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location);
+            const applicationsService = new ApplicationService(alfrescoJsApi);
+            appModel = await applicationsService.importPublishDeployApp(app.file_path);
 
             const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
             deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/info-drawer.e2e.ts b/e2e/process-services/info-drawer.e2e.ts
index 20ad62527b..7c71d14b14 100644
--- a/e2e/process-services/info-drawer.e2e.ts
+++ b/e2e/process-services/info-drawer.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { BrowserActions, BrowserVisibility, LocalStorageUtil, LoginPage, StringUtil } from '@alfresco/adf-testing';
+import { BrowserActions, BrowserVisibility, LocalStorageUtil, LoginPage, StringUtil, ApplicationService } from '@alfresco/adf-testing';
 import {
     AlfrescoApiCompatibility as AlfrescoApi,
     AppDefinitionRepresentation,
@@ -26,7 +26,6 @@ import { UsersActions } from '../actions/users.actions';
 import { Tenant } from '../models/APS/tenant';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
-import { AppsActions } from '../actions/APS/apps.actions';
 import CONSTANTS = require('../util/constants');
 import moment = require('moment');
 import { ProcessServiceTabBarPage } from '../pages/adf/process-services/process-service-tab-bar.page';
@@ -38,7 +37,6 @@ describe('Info Drawer', () => {
     const loginPage = new LoginPage();
     const navigationBarPage = new NavigationBarPage();
     const taskPage = new TasksPage();
-    const apps = new AppsActions();
     const processServiceTabBarPage = new ProcessServiceTabBarPage();
     const processFiltersPage = new ProcessFiltersPage();
 
@@ -79,7 +77,8 @@ describe('Info Drawer', () => {
         const processUserModel = await users.createApsUser(this.alfrescoJsApi, newTenant.id);
         processUserModelFullName = processUserModel.firstName + ' ' + processUserModel.lastName;
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appCreated = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        appCreated = await applicationsService.importPublishDeployApp(app.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
     });
diff --git a/e2e/process-services/pagination-processlist-adding-processes.e2e.ts b/e2e/process-services/pagination-processlist-adding-processes.e2e.ts
index d0356289a3..fcb9611d71 100644
--- a/e2e/process-services/pagination-processlist-adding-processes.e2e.ts
+++ b/e2e/process-services/pagination-processlist-adding-processes.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, PaginationPage } from '@alfresco/adf-testing';
+import { LoginPage, PaginationPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
 import { AppsActions } from '../actions/APS/apps.actions';
@@ -58,7 +58,9 @@ describe('Process List - Pagination when adding processes', () => {
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
+        resultApp = await applicationsService.importPublishDeployApp(app.file_path);
 
         for (i = 0; i < (nrOfProcesses - 5); i++) {
             await apps.startProcess(this.alfrescoJsApi, resultApp);
diff --git a/e2e/process-services/pagination-tasklist-adding-tasks.e2e.ts b/e2e/process-services/pagination-tasklist-adding-tasks.e2e.ts
index 29bf69d470..cd85bfd8bb 100644
--- a/e2e/process-services/pagination-tasklist-adding-tasks.e2e.ts
+++ b/e2e/process-services/pagination-tasklist-adding-tasks.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, PaginationPage } from '@alfresco/adf-testing';
+import { LoginPage, PaginationPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
 import { AppsActions } from '../actions/APS/apps.actions';
@@ -59,7 +59,9 @@ describe('Items per page set to 15 and adding of tasks', () => {
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
+        resultApp = await applicationsService.importPublishDeployApp(app.file_path);
 
         for (i = 0; i < (nrOfTasks - 5); i++) {
             await apps.startProcess(this.alfrescoJsApi, resultApp);
diff --git a/e2e/process-services/process-attachment-list-action-menu.e2e.ts b/e2e/process-services/process-attachment-list-action-menu.e2e.ts
index 4d626236aa..1e91e07fd7 100644
--- a/e2e/process-services/process-attachment-list-action-menu.e2e.ts
+++ b/e2e/process-services/process-attachment-list-action-menu.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, FileBrowserUtil, ViewerPage } from '@alfresco/adf-testing';
+import { LoginPage, FileBrowserUtil, ViewerPage, ApplicationService } from '@alfresco/adf-testing';
 import { ProcessFiltersPage } from '../pages/adf/process-services/process-filters.page';
 import { ProcessDetailsPage } from '../pages/adf/process-services/process-details.page';
 import { AttachmentListPage } from '../pages/adf/process-services/attachment-list.page';
@@ -67,7 +67,9 @@ describe('Attachment list action menu for processes', () => {
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        const importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
+        const importedApp = await applicationsService.importPublishDeployApp(app.file_path);
         appId = importedApp.id;
 
         await apps.startProcess(this.alfrescoJsApi, importedApp, processName.completed);
diff --git a/e2e/process-services/process-filters-component.e2e.ts b/e2e/process-services/process-filters-component.e2e.ts
index 0b5d36a360..d59cc50281 100644
--- a/e2e/process-services/process-filters-component.e2e.ts
+++ b/e2e/process-services/process-filters-component.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, BrowserActions } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import { StartProcessPage } from '../pages/adf/process-services/start-process.page';
@@ -25,7 +25,6 @@ import { ProcessDetailsPage } from '../pages/adf/process-services/process-detail
 import { ProcessListPage } from '../pages/adf/process-services/process-list.page';
 
 import { AlfrescoApiCompatibility as AlfrescoApi, UserProcessInstanceFilterRepresentation } from '@alfresco/js-api';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 import { browser } from 'protractor';
 import { ProcessListDemoPage } from '../pages/adf/demo-shell/process-services/process-list-demo.page';
@@ -60,7 +59,6 @@ describe('Process Filters Test', () => {
     };
 
     beforeAll(async () => {
-        const apps = new AppsActions();
         const users = new UsersActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
@@ -71,7 +69,8 @@ describe('Process Filters Test', () => {
         await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
         user = await users.createTenantAndUser(this.alfrescoJsApi);
         await this.alfrescoJsApi.login(user.email, user.password);
-        appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(app.file_path);
         await loginPage.loginToProcessServicesUsingUserModel(user);
     });
 
diff --git a/e2e/process-services/process-instance-details.e2e.ts b/e2e/process-services/process-instance-details.e2e.ts
index bea5948751..5526923c3d 100644
--- a/e2e/process-services/process-instance-details.e2e.ts
+++ b/e2e/process-services/process-instance-details.e2e.ts
@@ -20,7 +20,7 @@ import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { UsersActions } from '../actions/users.actions';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import { AppsActions } from '../actions/APS/apps.actions';
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { ProcessServiceTabBarPage } from '../pages/adf/process-services/process-service-tab-bar.page';
 import { ProcessListPage } from '../pages/adf/process-services/process-list.page';
@@ -55,7 +55,8 @@ describe('Process Instance Details', () => {
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(app.file_path);
         const processModel = await apps.startProcess(this.alfrescoJsApi, appModel, 'process');
 
         await loginPage.loginToProcessServicesUsingUserModel(user);
diff --git a/e2e/process-services/process-list-component.e2e.ts b/e2e/process-services/process-list-component.e2e.ts
index 041534ce46..e3910605f2 100644
--- a/e2e/process-services/process-list-component.e2e.ts
+++ b/e2e/process-services/process-list-component.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, BrowserActions } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, ApplicationService } from '@alfresco/adf-testing';
 import { ProcessListDemoPage } from '../pages/adf/demo-shell/process-services/process-list-demo.page';
 import { browser } from 'protractor';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
@@ -63,12 +63,14 @@ describe('Process List Test', () => {
 
         await this.alfrescoJsApi.login(user.email, user.password);
 
-        appDateModel = await apps.importPublishDeployApp(this.alfrescoJsApi, appWithDateField.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
+        appDateModel = await applicationsService.importPublishDeployApp(appWithDateField.file_path);
 
         procWithDate = await apps.startProcess(this.alfrescoJsApi, appDateModel, processName.procWithDate);
         completedProcWithDate = await apps.startProcess(this.alfrescoJsApi, appDateModel, processName.completedProcWithDate);
 
-        appUserWidgetModel = await apps.importPublishDeployApp(this.alfrescoJsApi, appWithUserWidget.file_location);
+        appUserWidgetModel = await applicationsService.importPublishDeployApp(appWithUserWidget.file_path);
 
         await apps.startProcess(this.alfrescoJsApi, appUserWidgetModel, processName.procWithUserWidget);
         completedProcWithUserWidget = await apps.startProcess(this.alfrescoJsApi, appUserWidgetModel, processName.completedProcWithUserWidget);
diff --git a/e2e/process-services/processlist-pagination.e2e.ts b/e2e/process-services/processlist-pagination.e2e.ts
index a4051ca6b0..8d2de8ba88 100644
--- a/e2e/process-services/processlist-pagination.e2e.ts
+++ b/e2e/process-services/processlist-pagination.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, PaginationPage } from '@alfresco/adf-testing';
+import { LoginPage, PaginationPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
 import { AppsActions } from '../actions/APS/apps.actions';
@@ -54,7 +54,6 @@ describe('Process List - Pagination', () => {
     const processNameBase = 'process';
 
     beforeAll(async () => {
-        const apps = new AppsActions();
         const users = new UsersActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
@@ -68,7 +67,9 @@ describe('Process List - Pagination', () => {
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        deployedTestApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
+        deployedTestApp = await applicationsService.importPublishDeployApp(app.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
    });
diff --git a/e2e/process-services/sort-tasklist-pagination.e2e.ts b/e2e/process-services/sort-tasklist-pagination.e2e.ts
index 9ebf943dbe..d4dfe895d1 100644
--- a/e2e/process-services/sort-tasklist-pagination.e2e.ts
+++ b/e2e/process-services/sort-tasklist-pagination.e2e.ts
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-import { LoginPage, PaginationPage } from '@alfresco/adf-testing';
+import { LoginPage, PaginationPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
@@ -47,7 +46,6 @@ describe('Task List Pagination - Sorting', () => {
     };
 
     beforeAll(async () => {
-        const apps = new AppsActions();
         const users = new UsersActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
@@ -61,7 +59,9 @@ describe('Task List Pagination - Sorting', () => {
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
+        await applicationsService.importPublishDeployApp(app.file_path);
 
         for (let i = 0; i < nrOfTasks; i++) {
             await this.alfrescoJsApi.activiti.taskApi.createNewTask({ name: taskNames[i] });
diff --git a/e2e/process-services/start-process-component.e2e.ts b/e2e/process-services/start-process-component.e2e.ts
index 230f1a43ce..df3ee61596 100644
--- a/e2e/process-services/start-process-component.e2e.ts
+++ b/e2e/process-services/start-process-component.e2e.ts
@@ -21,11 +21,11 @@ import {
     LoginPage, SelectAppsDialog,
     StartProcessDialog,
     StringUtil,
-    Widget
+    Widget,
+    ApplicationService
 } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { FileModel } from '../models/ACS/file.model';
 import { Tenant } from '../models/APS/tenant';
 import { User } from '../models/APS/user';
@@ -53,7 +53,6 @@ describe('Start Process Component', () => {
     const startProcessDialog = new StartProcessDialog();
     const contentServicesPage = new ContentServicesPage();
     const selectAppsDialog = new SelectAppsDialog();
-    const apps = new AppsActions();
     const widget = new Widget();
     const app = browser.params.resources.Files.APP_WITH_PROCESSES;
     const simpleApp = browser.params.resources.Files.WIDGETS_SMOKE_TEST;
@@ -99,11 +98,13 @@ describe('Start Process Component', () => {
 
                 await this.alfrescoJsApiUserTwo.login(secondProcUserModel.email, secondProcUserModel.password);
 
-                const appCreated = await apps.importPublishDeployApp(this.alfrescoJsApiUserTwo, app.file_location);
+                const applicationsService = new ApplicationService(this.alfrescoJsApiUserTwo);
 
-                simpleAppCreated = await apps.importPublishDeployApp(this.alfrescoJsApiUserTwo, simpleApp.file_location);
+                const appCreated = await applicationsService.importPublishDeployApp(app.file_path);
 
-                dateFormAppCreated = await apps.importPublishDeployApp(this.alfrescoJsApiUserTwo, dateFormApp.file_location);
+                simpleAppCreated = await applicationsService.importPublishDeployApp(simpleApp.file_path);
+
+                dateFormAppCreated = await applicationsService.importPublishDeployApp(dateFormApp.file_path);
 
                 appId = appCreated.id;
             } catch (error) {
@@ -515,7 +516,9 @@ describe('Start Process Component', () => {
             });
             await this.alfrescoJsBPMAdminUser.login(processUserModel.email, processUserModel.password);
 
-            const appCreated = await apps.importPublishDeployApp(this.alfrescoJsBPMAdminUser, startProcessAttachFileApp.file_location);
+            const applicationsService = new ApplicationService(this.alfrescoJsBPMAdminUser);
+
+            const appCreated = await applicationsService.importPublishDeployApp(startProcessAttachFileApp.file_path);
             appId = appCreated.id;
 
         });
diff --git a/e2e/process-services/start-task-custom-app.e2e.ts b/e2e/process-services/start-task-custom-app.e2e.ts
index 05deea8a02..8d896e5f9e 100644
--- a/e2e/process-services/start-task-custom-app.e2e.ts
+++ b/e2e/process-services/start-task-custom-app.e2e.ts
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser, by } from 'protractor';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 import { FileModel } from '../models/ACS/file.model';
 import { Tenant } from '../models/APS/tenant';
@@ -50,7 +49,6 @@ describe('Start Task - Custom App', () => {
     });
 
     beforeAll(async () => {
-        const apps = new AppsActions();
         const users = new UsersActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
@@ -68,7 +66,9 @@ describe('Start Task - Custom App', () => {
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+
+        appModel = await applicationsService.importPublishDeployApp(app.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
    });
diff --git a/e2e/process-services/stencil.e2e.ts b/e2e/process-services/stencil.e2e.ts
index 9b8df353f2..a871c9879e 100644
--- a/e2e/process-services/stencil.e2e.ts
+++ b/e2e/process-services/stencil.e2e.ts
@@ -16,9 +16,8 @@
  */
 
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
 import { browser } from 'protractor';
 import { User } from '../models/APS/user';
@@ -52,12 +51,12 @@ describe('Stencil', () => {
     let user: User;
 
     beforeAll(async () => {
-        const appsActions = new AppsActions();
         await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
         user = await usersActions.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(user.email, user.password);
-        await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        await applicationsService.importPublishDeployApp(app.file_path);
         await loginPage.loginToProcessServicesUsingUserModel(user);
     });
 
diff --git a/e2e/process-services/task-assignee.e2e.ts b/e2e/process-services/task-assignee.e2e.ts
index 542f3b7cb9..ebe296b87e 100644
--- a/e2e/process-services/task-assignee.e2e.ts
+++ b/e2e/process-services/task-assignee.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import { StartProcessPage } from '../pages/adf/process-services/start-process.page';
@@ -65,8 +65,9 @@ describe('Task Assignee', () => {
             } catch (e) {}
 
             await this.alfrescoJsApi.login(user.email, user.password);
+            const applicationsService = new ApplicationService(this.alfrescoJsApi);
             try {
-                await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location, { renewIdmEntries: true });
+                await applicationsService.importPublishDeployApp(app.file_path, { renewIdmEntries: true });
             } catch (e) {
                 console.error(`failed to publish the application`);
             }
@@ -143,7 +144,8 @@ describe('Task Assignee', () => {
             } catch (e) {}
 
             await this.alfrescoJsApi.login(user.email, user.password);
-            const appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location, { renewIdmEntries: true });
+            const applicationsService = new ApplicationService(this.alfrescoJsApi);
+            const appModel = await applicationsService.importPublishDeployApp(app.file_path, { renewIdmEntries: true });
             await apps.startProcess(this.alfrescoJsApi, appModel, app.processNames[1]);
         });
 
diff --git a/e2e/process-services/task-attachment-list-action-menu.e2e.ts b/e2e/process-services/task-attachment-list-action-menu.e2e.ts
index c16de72a28..e5faca7d77 100644
--- a/e2e/process-services/task-attachment-list-action-menu.e2e.ts
+++ b/e2e/process-services/task-attachment-list-action-menu.e2e.ts
@@ -16,7 +16,7 @@
  */
 
 import { browser } from 'protractor';
-import { LoginPage, FileBrowserUtil, ViewerPage } from '@alfresco/adf-testing';
+import { LoginPage, FileBrowserUtil, ViewerPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
 import { AttachmentListPage } from '../pages/adf/process-services/attachment-list.page';
@@ -25,7 +25,6 @@ import path = require('path');
 import fs = require('fs');
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { UsersActions } from '../actions/users.actions';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { FileModel } from '../models/ACS/file.model';
 
 describe('Attachment list action menu for tasks', () => {
@@ -50,7 +49,6 @@ describe('Attachment list action menu for tasks', () => {
     };
 
     beforeAll(async () => {
-        const apps = new AppsActions();
         const users = new UsersActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
@@ -63,7 +61,8 @@ describe('Attachment list action menu for tasks', () => {
         tenantId = user.tenantId;
 
         await this.alfrescoJsApi.login(user.email, user.password);
-        const { id } = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        const { id } = await applicationsService.importPublishDeployApp(app.file_path);
         appId = id;
 
         await loginPage.loginToProcessServicesUsingUserModel(user);
diff --git a/e2e/process-services/task-audit.e2e.ts b/e2e/process-services/task-audit.e2e.ts
index 311b25466e..23fb3c2261 100644
--- a/e2e/process-services/task-audit.e2e.ts
+++ b/e2e/process-services/task-audit.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, BrowserActions, FileBrowserUtil } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, FileBrowserUtil, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import CONSTANTS = require('../util/constants');
@@ -23,7 +23,6 @@ import { Tenant } from '../models/APS/tenant';
 import { browser } from 'protractor';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { UsersActions } from '../actions/users.actions';
-import { AppsActions } from '../actions/APS/apps.actions';
 
 describe('Task Audit', () => {
 
@@ -39,7 +38,6 @@ describe('Task Audit', () => {
 
     beforeAll(async () => {
         const users = new UsersActions();
-        const apps = new AppsActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
             provider: 'BPM',
@@ -52,7 +50,8 @@ describe('Task Audit', () => {
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
         this.alfrescoJsApi.activiti.taskApi.createNewTask({ name: taskTaskApp });
-        await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        await applicationsService.importPublishDeployApp(app.file_path);
 
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
     });
diff --git a/e2e/process-services/task-details-form.e2e.ts b/e2e/process-services/task-details-form.e2e.ts
index d2de86b5ce..9228a5d102 100644
--- a/e2e/process-services/task-details-form.e2e.ts
+++ b/e2e/process-services/task-details-form.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, StringUtil, Widget } from '@alfresco/adf-testing';
+import { LoginPage, StringUtil, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
 import { AppsActions } from '../actions/APS/apps.actions';
@@ -175,7 +175,8 @@ describe('Task Details - Form', () => {
         beforeAll(async () => {
             app = browser.params.resources.Files.SIMPLE_APP_WITH_USER_FORM;
             appActions = new AppsActions();
-            await appActions.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+            const applicationsService = new ApplicationService(this.alfrescoJsApi);
+            await applicationsService.importPublishDeployApp(app.file_path);
         });
 
         beforeEach(async () => {
diff --git a/e2e/process-services/task-details-no-form.e2e.ts b/e2e/process-services/task-details-no-form.e2e.ts
index 5151adbeed..0279f01523 100644
--- a/e2e/process-services/task-details-no-form.e2e.ts
+++ b/e2e/process-services/task-details-no-form.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../util/constants');
@@ -48,7 +48,8 @@ describe('Task Details - No form', () => {
         processUserModel = await users.createApsUser(this.alfrescoJsApi, id);
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        importedApp = await applicationsService.importPublishDeployApp(app.file_path);
         await apps.startProcess(this.alfrescoJsApi, importedApp);
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
    });
diff --git a/e2e/process-services/task-details.e2e.ts b/e2e/process-services/task-details.e2e.ts
index 5baaba93d1..7999f2f356 100644
--- a/e2e/process-services/task-details.e2e.ts
+++ b/e2e/process-services/task-details.e2e.ts
@@ -25,7 +25,7 @@ import { AppsActions } from '../actions/APS/apps.actions';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import CONSTANTS = require('../util/constants');
 import moment = require('moment');
-import { LoginPage, BrowserActions, StringUtil } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, StringUtil, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
 import { browser } from 'protractor';
 
@@ -63,7 +63,8 @@ describe('Task Details component', () => {
         processUserModel = await users.createApsUser(this.alfrescoJsApi, id);
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(app.file_path);
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
     });
 
diff --git a/e2e/process-services/task-filters-component.e2e.ts b/e2e/process-services/task-filters-component.e2e.ts
index 6945e692e1..566bbc7e5a 100644
--- a/e2e/process-services/task-filters-component.e2e.ts
+++ b/e2e/process-services/task-filters-component.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
@@ -25,7 +25,6 @@ import { ProcessServiceTabBarPage } from '../pages/adf/process-services/process-
 import { AppSettingsTogglesPage } from '../pages/adf/process-services/dialog/app-settings-toggles.page';
 import { TaskFiltersDemoPage } from '../pages/adf/demo-shell/process-services/task-filters-demo.page';
 import { AlfrescoApiCompatibility as AlfrescoApi, UserProcessInstanceFilterRepresentation } from '@alfresco/js-api';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 import { browser } from 'protractor';
 import { User } from '../models/APS/user';
@@ -54,14 +53,14 @@ describe('Task', () => {
 
         beforeEach(async () => {
 
-            const apps = new AppsActions();
             const users = new UsersActions();
 
             await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
             user = await users.createTenantAndUser(this.alfrescoJsApi);
 
             await this.alfrescoJsApi.login(user.email, user.password);
-            const { id } = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+            const applicationsService = new ApplicationService(this.alfrescoJsApi);
+            const { id } = await applicationsService.importPublishDeployApp(app.file_path);
             appId = id;
 
             await loginPage.loginToProcessServicesUsingUserModel(user);
@@ -199,7 +198,6 @@ describe('Task', () => {
         const app = browser.params.resources.Files.APP_WITH_PROCESSES;
 
         beforeAll(async () => {
-            const apps = new AppsActions();
             const users = new UsersActions();
 
             this.alfrescoJsApi = new AlfrescoApi({
@@ -211,7 +209,8 @@ describe('Task', () => {
             user = await users.createTenantAndUser(this.alfrescoJsApi);
 
             await this.alfrescoJsApi.login(user.email, user.password);
-            const importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+            const applicationsService = new ApplicationService(this.alfrescoJsApi);
+            const importedApp = await applicationsService.importPublishDeployApp(app.file_path);
             const appDefinitions = await this.alfrescoJsApi.activiti.appsApi.getAppDefinitions();
             appId = appDefinitions.data.find((currentApp) => currentApp.modelId === importedApp.id).id;
 
diff --git a/e2e/process-services/task-filters-sorting.e2e.ts b/e2e/process-services/task-filters-sorting.e2e.ts
index c5b1f25aa3..6212f60ab7 100644
--- a/e2e/process-services/task-filters-sorting.e2e.ts
+++ b/e2e/process-services/task-filters-sorting.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage } from '@alfresco/adf-testing';
+import { LoginPage, ApplicationService } from '@alfresco/adf-testing';
 import { NavigationBarPage } from '../pages/adf/navigation-bar.page';
 import { ProcessServicesPage } from '../pages/adf/process-services/process-services.page';
 import { TasksPage } from '../pages/adf/process-services/tasks.page';
@@ -23,7 +23,6 @@ import { TasksListPage } from '../pages/adf/process-services/tasks-list.page';
 import { TaskDetailsPage } from '../pages/adf/process-services/task-details.page';
 import { TaskFiltersDemoPage } from '../pages/adf/demo-shell/process-services/task-filters-demo.page';
 import { AlfrescoApiCompatibility as AlfrescoApi, UserProcessInstanceFilterRepresentation } from '@alfresco/js-api';
-import { AppsActions } from '../actions/APS/apps.actions';
 import { UsersActions } from '../actions/users.actions';
 import { browser } from 'protractor';
 
@@ -51,7 +50,6 @@ describe('Task Filters Sorting', () => {
         { name: 'Task 6', dueDate: '03/01/2019' }];
 
     beforeAll(async () => {
-        const apps = new AppsActions();
         const users = new UsersActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
@@ -63,7 +61,8 @@ describe('Task Filters Sorting', () => {
         user = await users.createTenantAndUser(this.alfrescoJsApi);
 
         await this.alfrescoJsApi.login(user.email, user.password);
-        const importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        const importedApp = await applicationsService.importPublishDeployApp(app.file_path);
         const appDefinitions = await this.alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         appId = appDefinitions.data.find((currentApp) => currentApp.modelId === importedApp.id).id;
 
diff --git a/e2e/process-services/task-list-pagination.e2e.ts b/e2e/process-services/task-list-pagination.e2e.ts
index 9bdebf2575..2166c41d3d 100644
--- a/e2e/process-services/task-list-pagination.e2e.ts
+++ b/e2e/process-services/task-list-pagination.e2e.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { LoginPage, PaginationPage } from '@alfresco/adf-testing';
+import { LoginPage, PaginationPage, ApplicationService } from '@alfresco/adf-testing';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { browser } from 'protractor';
 import { AppsActions } from '../actions/APS/apps.actions';
@@ -63,7 +63,8 @@ describe('Task List Pagination', () => {
         processUserModel = await users.createTenantAndUser(this.alfrescoJsApi);
 
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        const resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        const resultApp = await applicationsService.importPublishDeployApp(app.file_path);
 
         for (let i = 0; i < nrOfTasks; i++) {
             await apps.startProcess(this.alfrescoJsApi, resultApp);
diff --git a/e2e/process-services/widgets/amount-widget.e2e.ts b/e2e/process-services/widgets/amount-widget.e2e.ts
index ffee8e258f..de974161c2 100644
--- a/e2e/process-services/widgets/amount-widget.e2e.ts
+++ b/e2e/process-services/widgets/amount-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -49,7 +49,8 @@ describe('Amount Widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/attach-file-widget.e2e.ts b/e2e/process-services/widgets/attach-file-widget.e2e.ts
index 385113365a..0bb7737b33 100644
--- a/e2e/process-services/widgets/attach-file-widget.e2e.ts
+++ b/e2e/process-services/widgets/attach-file-widget.e2e.ts
@@ -15,12 +15,11 @@
  * limitations under the License.
  */
 
-import { LoginPage, Widget, ViewerPage, FileBrowserUtil } from '@alfresco/adf-testing';
+import { LoginPage, Widget, ViewerPage, FileBrowserUtil, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { FileModel } from '../../models/ACS/file.model';
 import { browser } from 'protractor';
-import { AppsActions } from '../../actions/APS/apps.actions';
 import { NavigationBarPage } from '../../pages/adf/navigation-bar.page';
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { UsersActions } from '../../actions/users.actions';
@@ -45,7 +44,6 @@ describe('Attach widget - File', () => {
 
     beforeAll(async () => {
         const users = new UsersActions();
-        const apps = new AppsActions();
 
         this.alfrescoJsApi = new AlfrescoApi({
             provider: 'BPM',
@@ -56,7 +54,8 @@ describe('Attach widget - File', () => {
         processUserModel = await users.createTenantAndUser(this.alfrescoJsApi);
         await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password);
 
-        await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(this.alfrescoJsApi);
+        await applicationsService.importPublishDeployApp(app.file_path);
         await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
     });
 
diff --git a/e2e/process-services/widgets/attach-folder-widget.e2e.ts b/e2e/process-services/widgets/attach-folder-widget.e2e.ts
index 8af203f5be..bdc1f61de6 100644
--- a/e2e/process-services/widgets/attach-folder-widget.e2e.ts
+++ b/e2e/process-services/widgets/attach-folder-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -47,7 +47,8 @@ describe('Attach Folder widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/checkbox-widget.e2e.ts b/e2e/process-services/widgets/checkbox-widget.e2e.ts
index e68b40ed49..dee688e891 100644
--- a/e2e/process-services/widgets/checkbox-widget.e2e.ts
+++ b/e2e/process-services/widgets/checkbox-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Checkbox Widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/date-time-widget.e2e.ts b/e2e/process-services/widgets/date-time-widget.e2e.ts
index 13d2689049..c0a5fcb4b8 100644
--- a/e2e/process-services/widgets/date-time-widget.e2e.ts
+++ b/e2e/process-services/widgets/date-time-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Date and time widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/date-widget.e2e.ts b/e2e/process-services/widgets/date-widget.e2e.ts
index e0dac90638..72816e107a 100644
--- a/e2e/process-services/widgets/date-widget.e2e.ts
+++ b/e2e/process-services/widgets/date-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget, FormPage } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, FormPage, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -51,7 +51,8 @@ describe('Date widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/document-template-widget.e2e.ts b/e2e/process-services/widgets/document-template-widget.e2e.ts
index b5454ecf1e..5a977f2126 100644
--- a/e2e/process-services/widgets/document-template-widget.e2e.ts
+++ b/e2e/process-services/widgets/document-template-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Document Template widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp( app.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/dropdown-widget.e2e.ts b/e2e/process-services/widgets/dropdown-widget.e2e.ts
index a582b29d1d..595e9d2e7c 100644
--- a/e2e/process-services/widgets/dropdown-widget.e2e.ts
+++ b/e2e/process-services/widgets/dropdown-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Dropdown widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/dynamic-table-widget.e2e.ts b/e2e/process-services/widgets/dynamic-table-widget.e2e.ts
index 43ce6ebd1f..975206e8e9 100644
--- a/e2e/process-services/widgets/dynamic-table-widget.e2e.ts
+++ b/e2e/process-services/widgets/dynamic-table-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -49,7 +49,8 @@ describe('Dynamic Table widget ', () => {
             processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
             await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-            appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+            const applicationsService = new ApplicationService(alfrescoJsApi);
+            appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
             const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
             deployedApp = appDefinitions.data.find((currentApp) => currentApp.modelId === appModel.id);
@@ -98,7 +99,8 @@ describe('Dynamic Table widget ', () => {
             processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
             await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-            appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+            const applicationsService = new ApplicationService(alfrescoJsApi);
+            appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
             const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
             deployedApp = appDefinitions.data.find((currentApp) => currentApp.modelId === appModel.id);
@@ -154,7 +156,8 @@ describe('Dynamic Table widget ', () => {
             processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
             await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-            const application = await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location);
+            const applicationsService = new ApplicationService(alfrescoJsApi);
+            const application = await applicationsService.importPublishDeployApp(app.file_path);
 
             const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
             deployedApp = appDefinitions.data.find((currentApp) => currentApp.modelId === application.id);
diff --git a/e2e/process-services/widgets/header-widget.e2e.ts b/e2e/process-services/widgets/header-widget.e2e.ts
index da2afc37b8..bbfe4b7da6 100644
--- a/e2e/process-services/widgets/header-widget.e2e.ts
+++ b/e2e/process-services/widgets/header-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Header widget', async () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/hyperlink-widget.e2e.ts b/e2e/process-services/widgets/hyperlink-widget.e2e.ts
index e2fc8a6062..c9dc7162b2 100644
--- a/e2e/process-services/widgets/hyperlink-widget.e2e.ts
+++ b/e2e/process-services/widgets/hyperlink-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Hyperlink widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/multi-line-widget.e2e.ts b/e2e/process-services/widgets/multi-line-widget.e2e.ts
index 382e6b65b8..b7f669c7b9 100644
--- a/e2e/process-services/widgets/multi-line-widget.e2e.ts
+++ b/e2e/process-services/widgets/multi-line-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Multi-line Widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/number-widget.e2e.ts b/e2e/process-services/widgets/number-widget.e2e.ts
index 082add112e..20a73672ad 100644
--- a/e2e/process-services/widgets/number-widget.e2e.ts
+++ b/e2e/process-services/widgets/number-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Number widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/people-group-widget.e2e.ts b/e2e/process-services/widgets/people-group-widget.e2e.ts
index b28ab71d41..78f23ff680 100644
--- a/e2e/process-services/widgets/people-group-widget.e2e.ts
+++ b/e2e/process-services/widgets/people-group-widget.e2e.ts
@@ -16,9 +16,8 @@
  */
 
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
-import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, StringUtil, Widget } from '@alfresco/adf-testing';
+import { LoginPage, StringUtil, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import { browser } from 'protractor';
 import { User } from '../../models/APS/user';
@@ -41,14 +40,14 @@ describe('People and Group widget', () => {
     let user: User;
 
     beforeAll(async () => {
-        const appsActions = new AppsActions();
         await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
         user = await usersActions.createTenantAndUser(alfrescoJsApi);
         await createGroupAndUsers(user.tenantId);
 
         await alfrescoJsApi.login(user.email, user.password);
         try {
-            await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location, { renewIdmEntries: true });
+            const applicationsService = new ApplicationService(alfrescoJsApi);
+            await applicationsService.importPublishDeployApp(app.file_path, { renewIdmEntries: true });
         } catch (e) { console.error('failed to deploy the application'); }
         await loginPage.loginToProcessServicesUsingUserModel(user);
     });
diff --git a/e2e/process-services/widgets/people-widget.e2e.ts b/e2e/process-services/widgets/people-widget.e2e.ts
index 33f377376e..f9624e2ce6 100644
--- a/e2e/process-services/widgets/people-widget.e2e.ts
+++ b/e2e/process-services/widgets/people-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('People widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/radio-buttons-widget.e2e.ts b/e2e/process-services/widgets/radio-buttons-widget.e2e.ts
index 3c0c40cfb9..28ad95416c 100644
--- a/e2e/process-services/widgets/radio-buttons-widget.e2e.ts
+++ b/e2e/process-services/widgets/radio-buttons-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Radio Buttons Widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/text-widget.e2e.ts b/e2e/process-services/widgets/text-widget.e2e.ts
index 24d78bc5d1..b363b5dd88 100644
--- a/e2e/process-services/widgets/text-widget.e2e.ts
+++ b/e2e/process-services/widgets/text-widget.e2e.ts
@@ -18,7 +18,7 @@
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
 import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
+import { LoginPage, BrowserActions, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import CONSTANTS = require('../../util/constants');
 import { browser } from 'protractor';
@@ -48,7 +48,8 @@ describe('Text widget', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/process-services/widgets/typeahead-widget.e2e.ts b/e2e/process-services/widgets/typeahead-widget.e2e.ts
index b582b0f688..677219e103 100644
--- a/e2e/process-services/widgets/typeahead-widget.e2e.ts
+++ b/e2e/process-services/widgets/typeahead-widget.e2e.ts
@@ -16,9 +16,8 @@
  */
 
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
-import { AppsActions } from '../../actions/APS/apps.actions';
 import { UsersActions } from '../../actions/users.actions';
-import { LoginPage, Widget } from '@alfresco/adf-testing';
+import { LoginPage, Widget, ApplicationService } from '@alfresco/adf-testing';
 import { TasksPage } from '../../pages/adf/process-services/tasks.page';
 import { browser } from 'protractor';
 import { User } from '../../models/APS/user';
@@ -41,12 +40,12 @@ describe('Typeahead widget', () => {
     let user: User;
 
     beforeAll(async () => {
-        const appsActions = new AppsActions();
         await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
         user = await usersActions.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(user.email, user.password);
-        await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location, { renewIdmEntries: true });
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        await applicationsService.importPublishDeployApp(app.file_path, { renewIdmEntries: true });
         await loginPage.loginToProcessServicesUsingUserModel(user);
     });
 
diff --git a/e2e/process-services/widgets/widget-visibility-condition.e2e.ts b/e2e/process-services/widgets/widget-visibility-condition.e2e.ts
index 1aa09d372a..850789eb14 100644
--- a/e2e/process-services/widgets/widget-visibility-condition.e2e.ts
+++ b/e2e/process-services/widgets/widget-visibility-condition.e2e.ts
@@ -16,7 +16,7 @@
  */
 
 import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
-import { LoginPage, Widget, BrowserActions } from '@alfresco/adf-testing';
+import { LoginPage, Widget, BrowserActions, ApplicationService } from '@alfresco/adf-testing';
 import { browser } from 'protractor';
 import { UsersActions } from '../../actions/users.actions';
 import CONSTANTS = require('../../util/constants');
@@ -71,7 +71,8 @@ describe('Process-Services - Visibility conditions', () => {
         processUserModel = await users.createTenantAndUser(alfrescoJsApi);
 
         await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
-        appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
+        const applicationsService = new ApplicationService(alfrescoJsApi);
+        appModel = await applicationsService.importPublishDeployApp(browser.params.resources.Files.WIDGET_CHECK_APP.file_path);
 
         const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
         deployedApp = appDefinitions.data.find((currentApp) => {
diff --git a/e2e/util/resources.js b/e2e/util/resources.js
index ae29745c13..ef5addac21 100644
--- a/e2e/util/resources.js
+++ b/e2e/util/resources.js
@@ -22,11 +22,13 @@
  * @class util.Resources
  */
 var exports = module.exports = {};
+var path = require('path');
 
 exports.Files = {
 
     APP_WITH_DATE_FIELD_FORM: {
         file_location: "/resources/apps/TestDate.zip",
+        file_path: path.join(__dirname, '../resources/apps/TestDate.zip'),
         title: "TestDate",
         process_title: "TestDateField",
         id: -1,
@@ -38,6 +40,7 @@ exports.Files = {
 
     APP_WITH_PROCESSES: {
         file_location: "/resources/apps/App_with_processes.zip",
+        file_path: path.join(__dirname, '../resources/apps/App_with_processes.zip'),
         title: "App_with_processes",
         description: "Description for app",
         process_se_name: "process_with_se",
@@ -47,12 +50,14 @@ exports.Files = {
 
     APP_DYNAMIC_TABLE_DROPDOWN: {
         file_location: "/resources/apps/AppDynamicTableDropdown.zip",
+        file_path: path.join(__dirname, '../resources/apps/AppDynamicTableDropdown.zip'),
         title: "App3576",
         description: "Description for app",
         processName: "Process3576"
     },
     START_PROCESS_ATTACH_FILE: {
         file_location: "/resources/apps/Start_process_attach_file.zip",
+        file_path: path.join(__dirname, '../resources/apps/Start_process_attach_file.zip'),
         title: "start process app",
         description: "Description for app",
         processName: "start process file"
@@ -60,6 +65,7 @@ exports.Files = {
 
     TEST_ASSIGNEE: {
         file_location: "/resources/apps/Assignee.zip",
+        file_path: path.join(__dirname, '../resources/apps/Assignee.zip'),
         title: "Assignee",
         description: "Description for app",
         processNames: ["simple", "candidate-task"],
@@ -75,6 +81,7 @@ exports.Files = {
 
     APP_WITH_USER_WIDGET: {
         file_location: "/resources/apps/appWithUser.zip",
+        file_path: path.join(__dirname, '../resources/apps/appWithUser.zip'),
         title: "appWithUser",
         description: "Description for app",
         processName: "ProcessWithUser",
@@ -85,12 +92,14 @@ exports.Files = {
 
     NO_FORM_APP: {
         file_location: "/resources/apps/No form app.zip",
+        file_path: path.join(__dirname, '../resources/apps/No form app.zip'),
         title: "No form app",
         taskName: "No form task"
     },
 
     SIMPLE_APP_WITH_USER_FORM: {
         file_location: "/resources/apps/Simple App with User Form.zip",
+        file_path: path.join(__dirname, '../resources/apps/Simple App with User Form.zip'),
         title: "Simple App with User Form",
         description: "Simple app with a process having a User task with a form attached.",
         processName: "Simple Process",
@@ -113,6 +122,7 @@ exports.Files = {
 
     WIDGETS_SMOKE_TEST: {
         file_location: "/resources/apps/Widgets smoke test.zip",
+        file_path: path.join(__dirname, '../resources/apps/Widgets smoke test.zip'),
         title: "Widgets smoke test",
         formName: "Widgets smoke test",
         form_fields: {
@@ -141,6 +151,7 @@ exports.Files = {
 
     FORM_ADF: {
         file_location: "/resources/apps/Test-ADF.zip",
+        file_path: path.join(__dirname, '../resources/apps/Test-ADF.zip'),
         title: "Test App",
         formName: "test-1",
         form_fields: {
@@ -152,6 +163,7 @@ exports.Files = {
 
     FILE_FORM_ADF: {
         file_location: "/resources/apps/App_file_form.zip",
+        file_path: path.join(__dirname, '../resources/apps/App_file_form.zip'),
         attached_file: "generatedDocument.docx",
         title: "ADF-180-test",
         formName: "ADF-180-test",
@@ -163,6 +175,7 @@ exports.Files = {
     WIDGET_CHECK_APP: {
 
         file_location: "/resources/apps/WidgetApps.zip",
+        file_path: path.join(__dirname, '../resources/apps/WidgetApps.zip'),
 
         TEXT: {
             formName: "TextWidgetForm",
@@ -383,6 +396,7 @@ exports.Files = {
 
     MORE_WIDGETS: {
         file_location: "/resources/apps/More Widgets.zip",
+        file_path: path.join(__dirname, '../resources/apps/More Widgets.zip'),
         title: "More Widgets",
         group: { name:  "Users", subgroup: [  { name: "Heros" },  { name: "Villains" }] },
         subGroupUser: { firstName: "Hero", lastName: "User" } ,
@@ -421,12 +435,14 @@ exports.Files = {
 
     STENCIL_PROCESS: {
         file_location: "/resources/apps/Stencil_app.zip",
+        file_path: path.join(__dirname, '../resources/apps/Stencil_app.zip'),
         processName: 'stencil_process',
         taskName: 'stencil task'
     },
 
     DYNAMIC_TABLE_APP: {
         file_location: "/resources/apps/Dynamic Table App.zip",
+        file_path: path.join(__dirname, '../resources/apps/Dynamic Table App.zip'),
         title: "Dynamic Table App",
         formName: "Dynamic Table App",
         process_se_name: "DynamicTableProcess"
diff --git a/lib/testing/src/lib/core/actions/APS/applications.service.ts b/lib/testing/src/lib/core/actions/APS/applications.service.ts
new file mode 100644
index 0000000000..017a862597
--- /dev/null
+++ b/lib/testing/src/lib/core/actions/APS/applications.service.ts
@@ -0,0 +1,57 @@
+/*!
+ * @license
+ * Copyright 2019 Alfresco Software, Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
+import { Logger } from '../../utils/logger';
+import * as remote from 'selenium-webdriver/remote';
+import { browser } from 'protractor';
+import * as fs from 'fs';
+
+export class AppPublish {
+    comment: string = '';
+    force: boolean = true;
+}
+
+export class ApplicationService {
+
+    api: AlfrescoApi;
+
+    constructor(api: AlfrescoApi) {
+        this.api = api;
+    }
+
+    async importPublishDeployApp(appFileLocation, option = {}) {
+        try {
+            const appCreated = await this.importApplication(appFileLocation, option);
+            const publishApp = await this.api.activiti.appsApi.publishAppDefinition(appCreated.id, new AppPublish());
+            await this.api.activiti.appsApi.deployAppDefinitions({ appDefinitions: [{ id: publishApp.appDefinition.id }] });
+            return appCreated;
+        } catch (error) {
+            Logger.error('Import Publish Deploy Application - Service error, Response: ', JSON.parse(JSON.stringify(error)).response.text);
+        }
+    }
+
+    async importApplication(appFileLocation, options = {}): Promise<any> {
+        try {
+            browser.setFileDetector(new remote.FileDetector());
+            const file = fs.createReadStream(appFileLocation);
+            return await this.api.activiti.appsDefinitionApi.importAppDefinition(file, options);
+        } catch (error) {
+            Logger.error('Import Application - Service error, Response: ', JSON.parse(JSON.stringify(error)).response.text);
+        }
+    }
+}
diff --git a/lib/testing/src/lib/core/actions/APS/models.service.ts b/lib/testing/src/lib/core/actions/APS/models.service.ts
new file mode 100644
index 0000000000..7e13f04062
--- /dev/null
+++ b/lib/testing/src/lib/core/actions/APS/models.service.ts
@@ -0,0 +1,43 @@
+/*!
+ * @license
+ * Copyright 2019 Alfresco Software, Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
+import { Logger } from '../../utils/logger';
+
+export class ModelsActions {
+
+    api: AlfrescoApi;
+
+    constructor(api: AlfrescoApi) {
+        this.api = api;
+    }
+
+    async deleteVersionModel(modelId) {
+        try {
+            return this.api.activiti.modelsApi.deleteModel(modelId, { cascade: false, deleteRuntimeApp : true });
+        } catch (error) {
+            Logger.error('Delete Model Version - Service error, Response: ', JSON.parse(JSON.stringify(error)).response.text);
+        }
+    }
+
+    async deleteEntireModel(modelId) {
+        try {
+            return this.api.activiti.modelsApi.deleteModel(modelId, { cascade: true, deleteRuntimeApp : true });
+        } catch (error) {
+            Logger.error('Delete Model - Service error, Response: ', JSON.parse(JSON.stringify(error)).response.text);
+        }
+    }
+}
diff --git a/lib/testing/src/lib/core/actions/APS/public-api.ts b/lib/testing/src/lib/core/actions/APS/public-api.ts
new file mode 100644
index 0000000000..508e260424
--- /dev/null
+++ b/lib/testing/src/lib/core/actions/APS/public-api.ts
@@ -0,0 +1,19 @@
+/*!
+ * @license
+ * Copyright 2019 Alfresco Software, Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export * from './applications.service';
+export * from './models.service';
diff --git a/lib/testing/src/lib/core/actions/public-api.ts b/lib/testing/src/lib/core/actions/public-api.ts
index 07aff579cd..df8983df7a 100644
--- a/lib/testing/src/lib/core/actions/public-api.ts
+++ b/lib/testing/src/lib/core/actions/public-api.ts
@@ -16,4 +16,5 @@
  */
 
 export * from './identity/public-api';
+export * from './APS/public-api';
 export * from './api.service';