diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index e886cb8..05b4a37 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -21,5 +21,4 @@ jobs:
         username: ${{ secrets.DOCKER_USERNAME }}
         password: ${{ secrets.DOCKER_PASSWORD }}
         repository: xbeeant/oo-unlimit
-        tags: latest, 7.3.3.50
-
+        tags: latest
diff --git a/.gitpod.yml b/.gitpod.yml
deleted file mode 100644
index 6c59e39..0000000
--- a/.gitpod.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-# This configuration file was automatically generated by Gitpod.
-# Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file)
-# and commit this file to your remote git repository to share the goodness with others.
-
-tasks:
-  - init: make
-
-
diff --git a/Dockerfile b/Dockerfile
index f9c5e34..460d57d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
-ARG product_version=7.3.3
-ARG build_number=50
+ARG product_version=7.1.1
+ARG build_number=23
 ARG oo_root='/var/www/onlyoffice/documentserver'
 
 ## Setup
@@ -13,7 +13,6 @@ ENV BUILD_NUMBER=${build_number}
 
 ARG build_deps="git make g++ nodejs npm"
 RUN apt-get update && apt-get install -y ${build_deps}
-#RUN npm config set registry https://registry.npm.taobao.org
 RUN npm install -g pkg grunt grunt-cli
 
 WORKDIR /build
@@ -27,32 +26,19 @@ ARG tag=v${PRODUCT_VERSION}.${BUILD_NUMBER}
 RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/build_tools.git /build/build_tools
 RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/server.git      /build/server
 
-# Working mobile editor
-RUN git clone --quiet --depth 1 https://github.com/ONLYOFFICE/sdkjs.git       /build/sdkjs
-RUN git clone --quiet --depth 1 https://github.com/ONLYOFFICE/web-apps.git    /build/web-apps
-
-## Build
-FROM clone-stage as path-stage
-
-# patch
-COPY web-apps.patch /build/web-apps.patch
-RUN cd /build/web-apps   && git apply /build/web-apps.patch
-
-
 COPY server.patch /build/server.patch
-RUN cd /build/server   && git apply --ignore-space-change --ignore-whitespace /build/server.patch
+RUN cd /build/server   && git apply /build/server.patch
 
+# Clone old version of sdk and webapp to get an old version of the mobile editor
 
-
-#COPY convertermaster.js /build/server/FileConverter/sources/convertermaster.js
-#COPY license.js /build/server/Common/sources/license.js
-#COPY Makefile /build/server/Makefile
-#COPY server.js /build/server/DocService/sources/server.js
-#COPY constants.js /build/server/Common/srouces/constants.js
-#COPY tenantManager.js /build/server/Common/srouces/tenantManager.js
+ARG tag=v6.3.1.79 # Working mobile editor
+RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/sdkjs.git       /build/sdkjs
+RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/web-apps.git    /build/web-apps
+COPY web-apps.patch /build/
+RUN cd /build/web-apps && git apply /build/web-apps.patch
 
 ## Build
-FROM path-stage as build-stage
+FROM clone-stage as build-stage
 
 # build server with license checks patched
 WORKDIR /build/server
diff --git a/server.patch b/server.patch
index f217d02..1278c2d 100644
--- a/server.patch
+++ b/server.patch
@@ -1,80 +1,96 @@
 diff --git a/Common/sources/constants.js b/Common/sources/constants.js
-index 65d4c6f..39a7e56 100644
+index 0663ead..490582a 100644
 --- a/Common/sources/constants.js
 +++ b/Common/sources/constants.js
-@@ -83,7 +83,7 @@ exports.LICENSE_RESULT = {
-   UsersViewCountOS: 15
- };
- 
--exports.LICENSE_CONNECTIONS = 20;
-+exports.LICENSE_CONNECTIONS = 9999;
- exports.LICENSE_EXPIRE_USERS_ONE_DAY = 24 * 60 * 60; // day in seconds
- 
- exports.AVS_OFFICESTUDIO_FILE_UNKNOWN =  0x0000;
+@@ -75,7 +75,7 @@ exports.LICENSE_RESULT = {
+   ExpiredLimited: 11
+ };
+ 
+-exports.LICENSE_CONNECTIONS = 20;
++exports.LICENSE_CONNECTIONS = 9999;
+ exports.LICENSE_EXPIRE_USERS_ONE_DAY = 24 * 60 * 60; // day in seconds
+ 
+ exports.AVS_OFFICESTUDIO_FILE_UNKNOWN =  0x0000;
 diff --git a/Common/sources/license.js b/Common/sources/license.js
-index 1b617c6..8fa7b53 100644
+index c273afe..8786f62 100644
 --- a/Common/sources/license.js
 +++ b/Common/sources/license.js
-@@ -45,24 +45,24 @@ exports.readLicense = function*() {
- 		count: 1,
- 		type: c_LR.Success,
- 		light: false,
--		packageType: constants.PACKAGE_TYPE_OS,
-+        packageType: constants.PACKAGE_TYPE_I,
- 		mode: constants.LICENSE_MODE.None,
--		branding: false,
-+        branding: true,
- 		connections: constants.LICENSE_CONNECTIONS,
- 		connectionsView: constants.LICENSE_CONNECTIONS,
--		customization: false,
--		advancedApi: false,
--		usersCount: 0,
--		usersViewCount: 0,
-+        customization: true,
-+        advancedApi: true,
-+        usersCount: constants.LICENSE_CONNECTIONS,
-+        usersViewCount: constants.LICENSE_CONNECTIONS,
- 		usersExpire: constants.LICENSE_EXPIRE_USERS_ONE_DAY,
--		hasLicense: false,
--		plugins: false,
-+        hasLicense: true,
-+        plugins: true,
- 		buildDate: oBuildDate,
- 		startDate: startDate,
--		endDate: null,
-+        endDate: new Date("2099-01-01T23:59:59.000Z"),
- 		customerId: "",
--		alias: ""
-+        alias: "community"
- 	}, null];
- };
- 
--exports.packageType = constants.PACKAGE_TYPE_OS;
-+exports.packageType = constants.PACKAGE_TYPE_I;
+@@ -45,20 +45,20 @@ exports.readLicense = function*() {
+ 		count: 1,
+ 		type: c_LR.Success,
+ 		light: false,
+-		packageType: constants.PACKAGE_TYPE_OS,
++		packageType: constants.PACKAGE_TYPE_I,
+ 		mode: constants.LICENSE_MODE.None,
+-		branding: false,
++		branding: true,
+ 		connections: constants.LICENSE_CONNECTIONS,
+-		customization: false,
+-		usersCount: 0,
++		customization: true,
++		usersCount: constants.LICENSE_CONNECTIONS,
+ 		usersExpire: constants.LICENSE_EXPIRE_USERS_ONE_DAY,
+-		hasLicense: false,
+-		plugins: false,
++		hasLicense: true,
++		plugins: true,
+ 		buildDate: oBuildDate,
+ 		startDate: startDate,
+-		endDate: null,
+-		customerId: ""
++		customerId: "",
++		endDate: new Date("2099-01-01T23:59:59.000Z")
+ 	}, null];
+ };
+ 
+-exports.packageType = constants.PACKAGE_TYPE_OS;
++exports.packageType = constants.PACKAGE_TYPE_I;
+diff --git a/DocService/sources/DocsCoServer.js b/DocService/sources/DocsCoServer.js
+index b654c9c..31bdf2d 100644
+--- a/DocService/sources/DocsCoServer.js
++++ b/DocService/sources/DocsCoServer.js
+@@ -165,7 +165,7 @@ let connections = []; // Активные соединения
+ let lockDocumentsTimerId = {};//to drop connection that can't unlockDocument
+ let pubsub;
+ let queue;
+-let licenseInfo = {type: constants.LICENSE_RESULT.Error, light: false, branding: false, customization: false, plugins: false};
++let licenseInfo = license.readLicense().next().value[0];
+ let licenseOriginal = null;
+ let shutdownFlag = false;
+ let expDocumentsStep = gc.getCronStep(cfgExpDocumentsCron);
+@@ -3328,7 +3328,7 @@ exports.install = function(server, callbackFunction) {
+   });
+ };
+ exports.setLicenseInfo = function(data, original ) {
+-  licenseInfo = data;
++  logger.debug('Not updating license info', data);
+   licenseOriginal = original;
+ };
+ exports.getLicenseInfo = function() {
 diff --git a/DocService/sources/server.js b/DocService/sources/server.js
-index 5c744f6..edfb423 100644
+index ccc232b..7c4e80d 100644
 --- a/DocService/sources/server.js
 +++ b/DocService/sources/server.js
-@@ -110,7 +110,6 @@ if (!(cfgTokenEnableBrowser && cfgTokenEnableRequestInbox && cfgTokenEnableReque
- 
- if (!tenantManager.isMultitenantMode()) {
- 	updateLicense();
--	fs.watchFile(cfgLicenseFile, updateLicense);
- 	setInterval(updateLicense, 86400000);
+@@ -147,7 +147,6 @@ try {
+ } catch (e) {
+ 	logger.warn('Failed to subscribe to plugin folder updates. When changing the list of plugins, you must restart the server. https://nodejs.org/docs/latest/api/fs.html#fs_availability');
  }
+-fs.watchFile(configCommon.get('license').get('license_file'), updateLicense);
+ setInterval(updateLicense, 86400000);
  
+ // Если захочется использовать 'development' и 'production',
 diff --git a/FileConverter/sources/convertermaster.js b/FileConverter/sources/convertermaster.js
-index 2a0b366..96468f9 100644
+index 2c4526f..ec07464 100644
 --- a/FileConverter/sources/convertermaster.js
 +++ b/FileConverter/sources/convertermaster.js
-@@ -93,7 +93,6 @@ if (cluster.isMaster) {
-   updateLicense();
- 
-   if (!tenantManager.isMultitenantMode()) {
--    fs.watchFile(cfgLicenseFile, updateLicense);
-     setInterval(updateLicense, 86400000);
-   }
- } else {
+@@ -85,7 +85,6 @@ if (cluster.isMaster) {
+ 
+   updateLicense();
+ 
+-  fs.watchFile(configCommon.get('license').get('license_file'), updateLicense);
+   setInterval(updateLicense, 86400000);
+ } else {
+   const converter = require('./converter');
 diff --git a/Makefile b/Makefile
 index e8e1308..23f7e2e 100644
 --- a/Makefile
diff --git a/web-apps.patch b/web-apps.patch
index e657ef0..8c0b4d2 100644
--- a/web-apps.patch
+++ b/web-apps.patch
@@ -1,51 +1,1586 @@
-From 692bef4561ef9978c6b8663dd618211bf526b69f Mon Sep 17 00:00:00 2001
-From: Beeant <huangxb0512@gmail.com>
-Date: Sat, 24 Sep 2022 21:39:36 +0800
-Subject: [PATCH] build: license
+From b99b3c2013521042374601e514d9e91c93372016 Mon Sep 17 00:00:00 2001
+From: Alexander Hofbauer <alex@derhofbauer.at>
+Date: Sat, 3 Jul 2021 08:29:29 +0200
+Subject: [PATCH] Revert "disable mobile editing"
 
+partially brings back mobile editing, especially via:
+
+  - 631cea5e0683c472ec5070f9f73f628def1fa259
+  - ae69d00eb7ca8874d7d645289f7bfecce2af5d37
+  - 35ea66e4407b8c948d5f5bb75b96c93a719ef210
+  - 19e4859e1051fe16697272be3bacaacc06cc9f40
+  - dc46e1b97f6aa80eb3b5039c5a13ab10637115ac
+  - 1ed80f9497222038da8845985786f5f0f4f5ad79
+  - 2ab911a439c904a1e1da81283b77639a1f1aa6b1
 ---
- apps/documenteditor/mobile/src/lib/patch.jsx     | 2 +-
- apps/presentationeditor/mobile/src/lib/patch.jsx | 2 +-
- apps/spreadsheeteditor/mobile/src/lib/patch.jsx  | 2 +-
- 3 files changed, 3 insertions(+), 3 deletions(-)
+ .../mobile/app/controller/Main.js             |  9 +--
+ .../mobile/app/controller/add/AddImage.js     |  7 ++
+ .../mobile/app/controller/add/AddOther.js     | 63 +++++++++++++++++-
+ .../mobile/app/controller/add/AddShape.js     |  7 ++
+ .../mobile/app/controller/add/AddTable.js     | 26 +++++++-
+ .../mobile/app/controller/edit/EditChart.js   | 32 +++++++++-
+ .../app/controller/edit/EditParagraph.js      | 54 +++++++++++++++-
+ .../mobile/app/controller/edit/EditShape.js   | 20 ++++++
+ .../mobile/app/controller/edit/EditTable.js   | 25 ++++++++
+ .../mobile/app/controller/edit/EditText.js    | 34 +++++++++-
+ .../mobile/app/controller/Main.js             |  5 +-
+ .../mobile/app/controller/add/AddImage.js     |  7 ++
+ .../mobile/app/controller/add/AddLink.js      | 61 +++++++++++++++++-
+ .../mobile/app/controller/add/AddShape.js     |  7 ++
+ .../mobile/app/controller/add/AddSlide.js     | 34 +++++++++-
+ .../mobile/app/controller/add/AddTable.js     | 31 ++++++++-
+ .../mobile/app/controller/edit/EditChart.js   | 26 +++++++-
+ .../mobile/app/controller/edit/EditShape.js   | 16 +++++
+ .../mobile/app/controller/edit/EditSlide.js   | 45 ++++++++++++-
+ .../mobile/app/controller/edit/EditTable.js   | 23 +++++++
+ .../mobile/app/controller/edit/EditText.js    | 42 +++++++++++-
+ .../mobile/app/controller/Main.js             |  5 +-
+ .../mobile/app/controller/add/AddChart.js     |  4 ++
+ .../mobile/app/controller/add/AddFunction.js  | 41 +++++++++++-
+ .../mobile/app/controller/add/AddLink.js      | 47 +++++++++++++-
+ .../mobile/app/controller/add/AddOther.js     | 10 +++
+ .../mobile/app/controller/add/AddShape.js     |  6 ++
+ .../mobile/app/controller/edit/EditCell.js    | 45 ++++++++++++-
+ .../mobile/app/controller/edit/EditChart.js   | 64 ++++++++++++++++++-
+ .../mobile/app/controller/edit/EditShape.js   | 19 ++++++
+ 30 files changed, 786 insertions(+), 29 deletions(-)
 
-diff --git a/apps/documenteditor/mobile/src/lib/patch.jsx b/apps/documenteditor/mobile/src/lib/patch.jsx
-index 963aca451..1ee48e856 100644
---- a/apps/documenteditor/mobile/src/lib/patch.jsx
-+++ b/apps/documenteditor/mobile/src/lib/patch.jsx
-@@ -4,7 +4,7 @@ const EditorUIController = () => {
- };
+diff --git a/apps/documenteditor/mobile/app/controller/Main.js b/apps/documenteditor/mobile/app/controller/Main.js
+index b53ab6578..661444a9c 100644
+--- a/apps/documenteditor/mobile/app/controller/Main.js
++++ b/apps/documenteditor/mobile/app/controller/Main.js
+@@ -289,7 +289,7 @@ define([
+                     docInfo.asc_putIsEnabledMacroses(!!enable);
+                     enable = !this.editorConfig.customization || (this.editorConfig.customization.plugins!==false);
+                     docInfo.asc_putIsEnabledPlugins(!!enable);
+-                    
++
+                     var type = /^(?:(pdf|djvu|xps))$/.exec(data.doc.fileType);
+                     if (type && typeof type[1] === 'string') {
+                         this.permissions.edit = this.permissions.review = false;
+@@ -843,7 +843,7 @@ define([
+                 Common.Utils.UserInfoParser.setParser(me.appOptions.canUseReviewPermissions);
+                 Common.Utils.UserInfoParser.setCurrentName(me.appOptions.user.fullname);
+                 me.appOptions.canUseReviewPermissions && Common.Utils.UserInfoParser.setReviewPermissions(me.permissions.reviewGroups, me.editorConfig.customization.reviewPermissions);
+-                
++
+                 me.applyModeCommonElements();
+                 me.applyModeEditorElements();
  
- EditorUIController.isSupportEditFeature = () => {
--    return false
-+    return true
- };
+@@ -1244,6 +1244,7 @@ define([
+             },
  
- EditorUIController.getToolbarOptions = () => {
-diff --git a/apps/presentationeditor/mobile/src/lib/patch.jsx b/apps/presentationeditor/mobile/src/lib/patch.jsx
-index ec7b37a2c..bfd879583 100644
---- a/apps/presentationeditor/mobile/src/lib/patch.jsx
-+++ b/apps/presentationeditor/mobile/src/lib/patch.jsx
-@@ -1,6 +1,6 @@
+             onSendThemeColors: function(colors, standart_colors) {
++               Common.Utils.ThemeColor.setColors(colors, standart_colors);
+             },
  
- const EditorUIController = () => null;
+             onAdvancedOptions: function(type, advOptions, mode, formatOptions) {
+@@ -1449,7 +1450,7 @@ define([
+             },
  
--EditorUIController.isSupportEditFeature = () => false;
-+EditorUIController.isSupportEditFeature = () => true;
+             isSupportEditFeature: function() {
+-                return false;
++                return true;
+             },
  
- export default EditorUIController;
-diff --git a/apps/spreadsheeteditor/mobile/src/lib/patch.jsx b/apps/spreadsheeteditor/mobile/src/lib/patch.jsx
-index ec7b37a2c..bfd879583 100644
---- a/apps/spreadsheeteditor/mobile/src/lib/patch.jsx
-+++ b/apps/spreadsheeteditor/mobile/src/lib/patch.jsx
-@@ -1,6 +1,6 @@
+             onRunAutostartMacroses: function() {
+@@ -1658,4 +1659,4 @@ define([
+             errorLang: 'The interface language is not loaded.<br>Please contact your Document Server administrator.'
+         }
+     })(), DE.Controllers.Main || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/documenteditor/mobile/app/controller/add/AddImage.js b/apps/documenteditor/mobile/app/controller/add/AddImage.js
+index 16ab14528..0a5faaa2d 100644
+--- a/apps/documenteditor/mobile/app/controller/add/AddImage.js
++++ b/apps/documenteditor/mobile/app/controller/add/AddImage.js
+@@ -98,6 +98,10 @@ define([
  
- const EditorUIController = () => null;
+             onInsertByFile: function (e) {
+                 DE.getController('AddContainer').hideModal();
++
++                if (this.api) {
++                    this.api.asc_addImage();
++                }
+             },
  
--EditorUIController.isSupportEditFeature = () => false;
-+EditorUIController.isSupportEditFeature = () => true;
+             onUrlChange: function (e) {
+@@ -114,6 +118,9 @@ define([
+                     if (!_.isEmpty(value)) {
+                         if ((/((^https?)|(^ftp)):\/\/.+/i.test(value))) {
+                             DE.getController('AddContainer').hideModal();
++                            _.defer(function () {
++                                me.api.AddImageUrl(value);
++                            });
+                         } else {
+                             uiApp.alert(me.txtNotUrl, me.notcriticalErrorTitle);
+                         }
+diff --git a/apps/documenteditor/mobile/app/controller/add/AddOther.js b/apps/documenteditor/mobile/app/controller/add/AddOther.js
+index 9dca563e3..ff5fc6bc8 100644
+--- a/apps/documenteditor/mobile/app/controller/add/AddOther.js
++++ b/apps/documenteditor/mobile/app/controller/add/AddOther.js
+@@ -238,7 +238,40 @@ define([
+             },
  
- export default EditorUIController;
+             onClickInsertFootnote: function() {
+-                DE.getController('AddContainer').hideModal();
++                var me = this,
++                    format = $('input[name="doc-footnote-format"]:checked').data('value'),
++                    start = $('#start-at-footnote .item-after label').text(),
++                    position = $('input[name="doc-footnote-pos"]:checked').data('value'),
++                    props = new Asc.CAscFootnotePr(),
++                    isEndNote = (position === 2);
++
++                var startTo10;
++                if (me.fromCustomFormat) {
++                    startTo10 =  parseInt(me.fromCustomFormat(start));
++                } else {
++                    startTo10 = me.api.asc_GetFootnoteProps().get_NumStart();
++                }
++                props.put_Pos(position);
++                props.put_NumFormat(format);
++                props.put_NumStart(startTo10);
++                props.put_NumRestart(Asc.c_oAscFootnoteRestart.Continuous);
++
++                if (me.api) {
++                    if (isEndNote) {
++                        me.api.asc_SetEndnoteProps(props, false);
++                    } else {
++                        me.api.asc_SetFootnoteProps(props, false);
++                    }
++
++                    setTimeout(function() {
++                        if (isEndNote) {
++                            me.api.asc_AddEndnote();
++                        } else {
++                            me.api.asc_AddFootnote();
++                        }
++                    }, 1);
++                    DE.getController('AddContainer').hideModal();
++                }
+             },
+ 
+             onFormatFootnoteChange: function(e) {
+@@ -299,6 +332,32 @@ define([
+             },
+ 
+             onInsertLink: function (e) {
++                var me      = this,
++                    url     = $('#add-link-url input').val(),
++                    display = $('#add-link-display input').val(),
++                    tip     = $('#add-link-tip input').val(),
++                    urltype = me.api.asc_getUrlType($.trim(url)),
++                    isEmail = (urltype == 2);
++
++                if (urltype < 1) {
++                    uiApp.alert(me.txtNotUrl);
++                    return;
++                }
++
++                url = url.replace(/^\s+|\s+$/g,'');
++
++                if (! /(((^https?)|(^ftp)):\/\/)|(^mailto:)/i.test(url) )
++                    url = (isEmail ? 'mailto:' : 'http://' ) + url;
++
++                url = url.replace(new RegExp("%20",'g')," ");
++
++                var props = new Asc.CHyperlinkProperty();
++                props.put_Value(url);
++                props.put_Text(_.isEmpty(display) ? url : display);
++                props.put_ToolTip(tip);
++
++                me.api.add_Hyperlink(props);
++
+                 DE.getController('AddContainer').hideModal();
+             },
+ 
+@@ -472,4 +531,4 @@ define([
+             notcriticalErrorTitle: 'Warning'
+         }
+     })(), DE.Controllers.AddOther || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/documenteditor/mobile/app/controller/add/AddShape.js b/apps/documenteditor/mobile/app/controller/add/AddShape.js
+index 32047d3dd..c8345c7af 100644
+--- a/apps/documenteditor/mobile/app/controller/add/AddShape.js
++++ b/apps/documenteditor/mobile/app/controller/add/AddShape.js
+@@ -215,6 +215,13 @@ define([
+             },
+ 
+             onShapeClick: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget);
++
++                if ($target && me.api) {
++                    me.api.AddShapeOnCurrentPage($target.data('type'));
++                }
++
+                 DE.getController('AddContainer').hideModal();
+             },
+ 
+diff --git a/apps/documenteditor/mobile/app/controller/add/AddTable.js b/apps/documenteditor/mobile/app/controller/add/AddTable.js
+index fef864537..a9dd39cf6 100644
+--- a/apps/documenteditor/mobile/app/controller/add/AddTable.js
++++ b/apps/documenteditor/mobile/app/controller/add/AddTable.js
+@@ -74,6 +74,8 @@ define([
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++
++                me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me));
+             },
+ 
+             onLaunch: function () {
+@@ -81,6 +83,12 @@ define([
+             },
+ 
+             initEvents: function () {
++                if (!this._initDefaultStyles) {
++                    this._initDefaultStyles = true;
++
++                    this.api.asc_GetDefaultTableStyles();
++                }
++
+                 $('#add-table li').single('click',  _.buffered(this.onStyleClick, 100, this));
+             },
+ 
+@@ -159,10 +167,26 @@ define([
+                 return this._styles;
+             },
+ 
++            // API handlers
++
++            onApiInitTemplates: function(templates) {
++                var me = this;
++                if (this._styles.length < 1) {
++                    _.each(templates, function(template) {
++                        me._styles.push({
++                            imageUrl    : template.asc_getImage(),
++                            templateId  : template.asc_getId()
++                        });
++                    });
++
++                    this.getView('AddTable').render();
++                }
++            },
++
+             textTableSize: 'Table Size',
+             textColumns: 'Columns',
+             textRows: 'Rows',
+             textCancel: 'Cancel'
+         }
+     })(), DE.Controllers.AddTable || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/documenteditor/mobile/app/controller/edit/EditChart.js b/apps/documenteditor/mobile/app/controller/edit/EditChart.js
+index b2cc3d9cd..8b27b1c8c 100644
+--- a/apps/documenteditor/mobile/app/controller/edit/EditChart.js
++++ b/apps/documenteditor/mobile/app/controller/edit/EditChart.js
+@@ -135,6 +135,7 @@ define([
+                 me.api = api;
+ 
+                 me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onUpdateChartStyles',  _.bind(me.onApiUpdateChartStyles, me));
+             },
+ 
+             onLaunch: function () {
+@@ -301,6 +302,23 @@ define([
+             // Handlers
+ 
+             onType: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                var image = new Asc.asc_CImgProperty(),
++                    chart = me._chartObject.get_ChartProperties();
++
++                chart.changeType(type);
++                image.put_ChartProperties(chart);
++
++                me.api.ImgApply(image);
++
++                $('.chart-types li').removeClass('active');
++                $target.addClass('active');
++
++                // Force update styles
++                me._updateChartStyles(me.api.asc_getChartPreviews(chart.getType()));
+             },
+ 
+             onStyle: function (e) {
+@@ -309,7 +327,7 @@ define([
+                     type = $target.data('type');
+ 
+                 if (!me._chartObject) return;
+-                
++
+                 var image = new Asc.asc_CImgProperty(),
+                     chart = me._chartObject.get_ChartProperties();
+ 
+@@ -549,9 +567,19 @@ define([
+                 _shapeObject = getTopObject(shapes);
+             },
+ 
++            onApiUpdateChartStyles: function () {
++                if (this.api && this._chartObject && this._chartObject.get_ChartProperties()) {
++                    this._updateChartStyles(this.api.asc_getChartPreviews(this._chartObject.get_ChartProperties().getType()));
++                }
++            },
++
+             // Helpers
+ 
+             _updateChartStyles: function(styles) {
++                Common.SharedSettings.set('chartstyles', styles);
++                Common.NotificationCenter.trigger('chartstyles:load', styles);
++
++                $('#tab-chart-style li').single('click', _.bind(this.onStyle, this));
+             },
+ 
+             _uiTransformByWrap: function(type) {
+@@ -582,4 +610,4 @@ define([
+             }
+         };
+     })(), DE.Controllers.EditChart || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js b/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js
+index 114601e6a..778d62bdd 100644
+--- a/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js
++++ b/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js
+@@ -75,6 +75,7 @@ define([
+                 });
+ 
+                 this._styles = [];
++                this._stack = [];
+                 this._styleThumbSize = undefined;
+                 this._paragraphObject = undefined;
+             },
+@@ -82,6 +83,12 @@ define([
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++
++                me.api.asc_setParagraphStylesSizes(330, 38);
++
++                me.api.asc_registerCallback('asc_onInitEditorStyles',   _.bind(me.onApiInitEditorStyles, me));
++                me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onParaStyleName',      _.bind(me.onApiParagraphStyleChange, me));
+             },
+ 
+             onLaunch: function () {
+@@ -128,7 +135,7 @@ define([
+                 if (selectedElements && _.isArray(selectedElements)) {
+                     for (var i = selectedElements.length - 1; i >= 0; i--) {
+                         if (Asc.c_oAscTypeSelectElement.Paragraph == selectedElements[i].get_ObjectType()) {
+-                            _paragraphProperty = selectedElements[i].get_ObjectValue(); 
++                            _paragraphProperty = selectedElements[i].get_ObjectValue();
+                             break;
+                         }
+                     }
+@@ -363,10 +370,53 @@ define([
+ 
+             // API handlers
+ 
++            onApiFocusObject: function (objects) {
++                this._stack = objects;
++
++                var paragraphs = [];
++
++                _.each(this._stack, function(object) {
++                    if (object.get_ObjectType() == Asc.c_oAscTypeSelectElement.Paragraph) {
++                        paragraphs.push(object);
++                    }
++                });
++
++                if (paragraphs.length > 0) {
++                    var object = paragraphs[paragraphs.length - 1]; // get top
++                    this._paragraphObject = object.get_ObjectValue();
++                } else {
++                    this._paragraphObject = undefined;
++                }
++            },
++
++            onApiInitEditorStyles: function (styles) {
++                window.styles_loaded = false;
++
++                if (styles.length < 1) {
++                    return;
++                }
++
++                var me = this;
++                this._styles = [];
++                this._styleThumbSize = {
++                    width   : styles.STYLE_THUMBNAIL_WIDTH,
++                    height  : styles.STYLE_THUMBNAIL_HEIGHT
++                };
++
++                _.each(styles.get_MergedStyles(), function(style) {
++                    me._styles.push({
++                        image   : style.asc_getImage(),
++                        name    : style.get_Name()
++                    });
++                });
++
++                window.styles_loaded = true;
++            },
++
+             onApiParagraphStyleChange: function(name) {
+                 _styleName = name;
+                 $('#paragraph-list input[name=paragraph-style]').val([_styleName]);
+             }
+         }
+     })(), DE.Controllers.EditParagraph || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/documenteditor/mobile/app/controller/edit/EditShape.js b/apps/documenteditor/mobile/app/controller/edit/EditShape.js
+index 996c13543..76a4e68a1 100644
+--- a/apps/documenteditor/mobile/app/controller/edit/EditShape.js
++++ b/apps/documenteditor/mobile/app/controller/edit/EditShape.js
+@@ -302,9 +302,29 @@ define([
+             },
+ 
+             onReorder: function (e) {
++                var $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                var properties = new Asc.asc_CImgProperty();
++
++                if ('all-up' == type) {
++                    properties.put_ChangeLevel(Asc.c_oAscChangeLevel.BringToFront);
++                } else if ('all-down' == type) {
++                    properties.put_ChangeLevel(Asc.c_oAscChangeLevel.SendToBack);
++                } else if ('move-up' == type) {
++                    properties.put_ChangeLevel(Asc.c_oAscChangeLevel.BringForward);
++                } else if ('move-down' == type) {
++                    properties.put_ChangeLevel(Asc.c_oAscChangeLevel.BringBackward);
++                }
++
++                this.api.ImgApply(properties);
+             },
+ 
+             onReplace: function (e) {
++                var $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                this.api.ChangeShapeType(type);
+             },
+ 
+             onWrapType: function (e) {
+diff --git a/apps/documenteditor/mobile/app/controller/edit/EditTable.js b/apps/documenteditor/mobile/app/controller/edit/EditTable.js
+index c94825acb..02cb7557d 100644
+--- a/apps/documenteditor/mobile/app/controller/edit/EditTable.js
++++ b/apps/documenteditor/mobile/app/controller/edit/EditTable.js
+@@ -123,6 +123,9 @@ define([
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++
++                me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me));
+             },
+ 
+             onLaunch: function () {
+@@ -131,6 +134,15 @@ define([
+ 
+             initEvents: function () {
+                 var me = this;
++
++                $('#table-remove-all').single('click',                  _.bind(function(){me.api.remTable(); me._closeIfNeed()}, me));
++                $('#insert-column-left').single('click',                _.bind(function(){me.api.addColumnLeft(); me._closeIfNeed()}, me));
++                $('#insert-column-right').single('click',               _.bind(function(){me.api.addColumnRight(); me._closeIfNeed()}, me));
++                $('#insert-row-above').single('click',                  _.bind(function(){me.api.addRowAbove(); me._closeIfNeed()}, me));
++                $('#insert-row-below').single('click',                  _.bind(function(){me.api.addRowBelow(); me._closeIfNeed()}, me));
++                $('#remove-column').single('click',                     _.bind(function(){me.api.remColumn(); me._closeIfNeed()}, me));
++                $('#remove-row').single('click',                        _.bind(function(){me.api.remRow(); me._closeIfNeed()}, me));
++
+                 me.initSettings();
+             },
+ 
+@@ -638,6 +650,19 @@ define([
+                 }
+             },
+ 
++            onApiInitTemplates: function(templates) {
++                var styles = [];
++
++                _.each(templates, function(template){
++                    styles.push({
++                        imageUrl    : template.asc_getImage(),
++                        templateId  : template.asc_getId()
++                    });
++                });
++
++                this.getView('EditTable').updateStyles(styles);
++            },
++
+             // Helpers
+ 
+             _closeIfNeed: function () {
+diff --git a/apps/documenteditor/mobile/app/controller/edit/EditText.js b/apps/documenteditor/mobile/app/controller/edit/EditText.js
+index 08f0ba0af..5126050f1 100644
+--- a/apps/documenteditor/mobile/app/controller/edit/EditText.js
++++ b/apps/documenteditor/mobile/app/controller/edit/EditText.js
+@@ -78,6 +78,21 @@ define([
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++
++                me.api.asc_registerCallback('asc_onInitEditorFonts',    _.bind(me.onApiLoadFonts, me));
++                me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onFontFamily',         _.bind(me.onApiChangeFont, me));
++                me.api.asc_registerCallback('asc_onFontSize',           _.bind(me.onApiFontSize, me));
++                me.api.asc_registerCallback('asc_onBold',               _.bind(me.onApiBold, me));
++                me.api.asc_registerCallback('asc_onItalic',             _.bind(me.onApiItalic, me));
++                me.api.asc_registerCallback('asc_onUnderline',          _.bind(me.onApiUnderline, me));
++                me.api.asc_registerCallback('asc_onStrikeout',          _.bind(me.onApiStrikeout, me));
++                me.api.asc_registerCallback('asc_onVerticalAlign',      _.bind(me.onApiVerticalAlign, me));
++                me.api.asc_registerCallback('asc_onListType',           _.bind(me.onApiBullets, me));
++                me.api.asc_registerCallback('asc_onPrAlign',            _.bind(me.onApiParagraphAlign, me));
++                me.api.asc_registerCallback('asc_onTextColor',          _.bind(me.onApiTextColor, me));
++                me.api.asc_registerCallback('asc_onParaSpacingLine',    _.bind(me.onApiLineSpacing, me));
++                me.api.asc_registerCallback('asc_onTextShd',            _.bind(me.onApiTextShd, me));
+             },
+ 
+             onLaunch: function () {
+@@ -396,6 +411,23 @@ define([
+ 
+             // API handlers
+ 
++            onApiLoadFonts: function (fonts, select) {
++                var me = this;
++
++                _.each(fonts, function(font) {
++                    var fontId = font.asc_getFontId();
++                    me._fontsArray.push({
++                        id          : fontId,
++                        name        : font.asc_getFontName(),
++    //                    displayValue: font.asc_getFontName(),
++                        imgidx      : font.asc_getFontThumbnail(),
++                        type        : font.asc_getFontType()
++                    });
++                });
++
++                Common.NotificationCenter.trigger('fonts:load', this._fontsArray, select);
++            },
++
+             onApiFocusObject: function (objects) {
+                 _stack = objects;
+ 
+@@ -555,4 +587,4 @@ define([
+             textPt: 'pt'
+         }
+     })(), DE.Controllers.EditText || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/presentationeditor/mobile/app/controller/Main.js b/apps/presentationeditor/mobile/app/controller/Main.js
+index 012b4ce3d..c36e6396a 100644
+--- a/apps/presentationeditor/mobile/app/controller/Main.js
++++ b/apps/presentationeditor/mobile/app/controller/Main.js
+@@ -1190,6 +1190,7 @@ define([
+             },
+ 
+             onSendThemeColors: function(colors, standart_colors) {
++               Common.Utils.ThemeColor.setColors(colors, standart_colors);
+             },
+ 
+             onFocusObject: function(SelectedObjects) {
+@@ -1350,7 +1351,7 @@ define([
+             },
+ 
+             isSupportEditFeature: function() {
+-                return false;
++                return true;
+             },
+ 
+             onRunAutostartMacroses: function() {
+@@ -1588,4 +1589,4 @@ define([
+             errorLang: 'The interface language is not loaded.<br>Please contact your Document Server administrator.'
+         }
+     })(), PE.Controllers.Main || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/presentationeditor/mobile/app/controller/add/AddImage.js b/apps/presentationeditor/mobile/app/controller/add/AddImage.js
+index d95a8859a..617152918 100644
+--- a/apps/presentationeditor/mobile/app/controller/add/AddImage.js
++++ b/apps/presentationeditor/mobile/app/controller/add/AddImage.js
+@@ -95,6 +95,10 @@ define([
+ 
+             onInsertByFile: function (e) {
+                 PE.getController('AddContainer').hideModal();
++
++                if (this.api) {
++                    this.api.asc_addImage();
++                }
+             },
+ 
+             onUrlChange: function (e) {
+@@ -111,6 +115,9 @@ define([
+                     if (!_.isEmpty(value)) {
+                         if ((/((^https?)|(^ftp)):\/\/.+/i.test(value))) {
+                             PE.getController('AddContainer').hideModal();
++                            _.defer(function () {
++                                me.api.AddImageUrl(value);
++                            });
+                         } else {
+                             uiApp.alert(me.txtNotUrl, me.notcriticalErrorTitle);
+                         }
+diff --git a/apps/presentationeditor/mobile/app/controller/add/AddLink.js b/apps/presentationeditor/mobile/app/controller/add/AddLink.js
+index ee2a12938..624df79c0 100644
+--- a/apps/presentationeditor/mobile/app/controller/add/AddLink.js
++++ b/apps/presentationeditor/mobile/app/controller/add/AddLink.js
+@@ -169,6 +169,65 @@ define([
+             // Handlers
+ 
+             onInsertLink: function (e) {
++                var display = $('#add-link-display input').val(),
++                    tip     = $('#add-link-tip input').val(),
++                    props   = new Asc.CHyperlinkProperty(),
++                    def_display = '';
++
++                if (this._linkType==c_oHyperlinkType.WebLink) {
++                    var url = $('#add-link-url input').val(),
++                        urltype = this.api.asc_getUrlType($.trim(url)),
++                        isEmail = (urltype == 2);
++                    if (urltype < 1) {
++                        uiApp.alert(this.txtNotUrl);
++                        return;
++                    }
++
++                    url = url.replace(/^\s+|\s+$/g,'');
++                    if (! /(((^https?)|(^ftp)):\/\/)|(^mailto:)/i.test(url) )
++                        url = (isEmail ? 'mailto:' : 'http://' ) + url;
++                    url = url.replace(new RegExp("%20",'g')," ");
++
++                    props.put_Value( url );
++                    props.put_ToolTip(tip);
++                    def_display = url;
++                } else {
++                    var url = "ppaction://hlink";
++                    var slidetip = '';
++                    switch (this._slideLink) {
++                        case 0:
++                            url = url + "showjump?jump=nextslide";
++                            slidetip = this.textNext;
++                            break;
++                        case 1:
++                            url = url + "showjump?jump=previousslide";
++                            slidetip = this.textPrev;
++                            break;
++                        case 2:
++                            url = url + "showjump?jump=firstslide";
++                            slidetip = this.textFirst;
++                            break;
++                        case 3:
++                            url = url + "showjump?jump=lastslide";
++                            slidetip = this.textLast;
++                            break;
++                        case 4:
++                            url = url + "sldjumpslide" + this._slideNum;
++                            slidetip = this.textSlide + ' ' + (this._slideNum+1);
++                            break;
++                    }
++                    props.put_Value( url );
++                    props.put_ToolTip(_.isEmpty(tip) ? slidetip : tip);
++                    def_display = slidetip;
++                }
++
++                if (!$('#add-link-display').hasClass('disabled')) {
++                    props.put_Text(_.isEmpty(display) ? def_display : display);
++                } else
++                    props.put_Text(null);
++
++                this.api.add_Hyperlink(props);
++
+                 PE.getController('AddContainer').hideModal();
+             },
+ 
+@@ -213,4 +272,4 @@ define([
+             notcriticalErrorTitle: 'Warning'
+         }
+     })(), PE.Controllers.AddLink || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/presentationeditor/mobile/app/controller/add/AddShape.js b/apps/presentationeditor/mobile/app/controller/add/AddShape.js
+index be2ef1ecf..12c4c9f17 100644
+--- a/apps/presentationeditor/mobile/app/controller/add/AddShape.js
++++ b/apps/presentationeditor/mobile/app/controller/add/AddShape.js
+@@ -212,6 +212,13 @@ define([
+             },
+ 
+             onShapeClick: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget);
++
++                if ($target && me.api) {
++                    me.api.AddShapeOnCurrentPage($target.data('type'));
++                }
++
+                 PE.getController('AddContainer').hideModal();
+             },
+ 
+diff --git a/apps/presentationeditor/mobile/app/controller/add/AddSlide.js b/apps/presentationeditor/mobile/app/controller/add/AddSlide.js
+index 4ffccc101..4e5148d90 100644
+--- a/apps/presentationeditor/mobile/app/controller/add/AddSlide.js
++++ b/apps/presentationeditor/mobile/app/controller/add/AddSlide.js
+@@ -63,6 +63,7 @@ define([
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++                me.api.asc_registerCallback('asc_onUpdateLayout', _.bind(me.onUpdateLayout, me));
+             },
+ 
+             onLaunch: function () {
+@@ -76,6 +77,12 @@ define([
+             },
+ 
+             onLayoutClick: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                me.api.AddSlide(type);
++
+                 PE.getController('AddContainer').hideModal();
+             },
+ 
+@@ -83,7 +90,32 @@ define([
+ 
+             getLayouts: function () {
+                 return this._layouts;
++            },
++
++            // API handlers
++
++            onUpdateLayout: function(layouts){
++                var me = this;
++                this._layouts = [];
++                if (!_.isEmpty(layouts)){
++                    _.each(layouts, function(layout) {
++                        var name = layout.get_Name();
++                        me._layouts.push({
++                            imageUrl    : layout.get_Image(),
++                            title       : (name !== '') ? name : PE.getController('Main').layoutNames[layout.getType()],
++                            itemWidth   : layout.get_Width(),
++                            itemHeight  : layout.get_Height(),
++                            idx         : layout.getIndex()
++                        });
++                    });
++                }
++
++                Common.SharedSettings.set('slidelayouts', this._layouts);
++                Common.NotificationCenter.trigger('slidelayouts:load', this._layouts);
++
++                this.getView('AddSlide').updateLayouts(this._layouts);
++                $('#add-slide .slide-layout li').single('click',  _.buffered(me.onLayoutClick, 100, me));
+             }
+         }
+     })(), PE.Controllers.AddSlide || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/presentationeditor/mobile/app/controller/add/AddTable.js b/apps/presentationeditor/mobile/app/controller/add/AddTable.js
+index 193e9ea59..7fa075c05 100644
+--- a/apps/presentationeditor/mobile/app/controller/add/AddTable.js
++++ b/apps/presentationeditor/mobile/app/controller/add/AddTable.js
+@@ -57,15 +57,27 @@ define([
+             initialize: function () {
+                 this._styles = [];
+                 this._initDefaultStyles = false;
++
++                //TODO is this needed? Common.NotificationCenter.on('addcontainer:show', _.bind(this.initEvents, this));
+             },
+ 
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++
++                me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me));
+             },
+ 
+             initEvents: function () {
+                 var me = this;
++
++                if (!me._initDefaultStyles) {
++                    me._initDefaultStyles = true;
++                    me._styles = [];
++
++                    me.api.asc_GetDefaultTableStyles && me.api.asc_GetDefaultTableStyles();
++                }
++
+                 $('.page[data-page="addother-insert-table"] li').single('click',  _.buffered(me.onStyleClick, 100, me));
+             },
+ 
+@@ -142,10 +154,27 @@ define([
+ 
+             // API handlers
+ 
++            onApiInitTemplates: function(templates){
++                var me = this;
++                if (this._styles.length < 1) {
++                    _.each(templates, function(template) {
++                        me._styles.push({
++                            imageUrl    : template.asc_getImage(),
++                            templateId  : template.asc_getId()
++                        });
++                    });
++
++                    this.getView('AddTable').render();
++                }
++
++                Common.SharedSettings.set('tablestyles', this._styles);
++                Common.NotificationCenter.trigger('tablestyles:load', this._styles);
++            },
++
+             textTableSize: 'Table Size',
+             textColumns: 'Columns',
+             textRows: 'Rows',
+             textCancel: 'Cancel'
+         }
+     })(), PE.Controllers.AddTable || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditChart.js b/apps/presentationeditor/mobile/app/controller/edit/EditChart.js
+index c80df4edc..0d5642e6c 100644
+--- a/apps/presentationeditor/mobile/app/controller/edit/EditChart.js
++++ b/apps/presentationeditor/mobile/app/controller/edit/EditChart.js
+@@ -106,6 +106,7 @@ define([
+                 me.api = api;
+ 
+                 me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onUpdateChartStyles',  _.bind(me.onApiUpdateChartStyles, me));
+             },
+ 
+             onLaunch: function () {
+@@ -233,6 +234,19 @@ define([
+             // Handlers
+ 
+             onType: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                var chart = new Asc.CAscChartProp();
++                chart.changeType(type);
++                me.api.ChartApply(chart);
++
++                $('.chart-types li').removeClass('active');
++                $target.addClass('active');
++
++                // Force update styles
++                me._updateChartStyles(me.api.asc_getChartPreviews(chart.getType()));
+             },
+ 
+             onStyle: function (e) {
+@@ -395,9 +409,19 @@ define([
+                 _shapeObject = getTopObject(shapes);
+             },
+ 
++            onApiUpdateChartStyles: function () {
++                if (this.api && this._chartObject) {
++                    this._updateChartStyles(this.api.asc_getChartPreviews(this._chartObject.getType()));
++                }
++            },
++
+             // Helpers
+ 
+             _updateChartStyles: function(styles) {
++                Common.SharedSettings.set('chartstyles', styles);
++                Common.NotificationCenter.trigger('chartstyles:load', styles);
++
++                $('#tab-chart-style li').single('click', _.bind(this.onStyle, this));
+             },
+ 
+             _closeIfNeed: function () {
+@@ -420,4 +444,4 @@ define([
+             }
+         };
+     })(), PE.Controllers.EditChart || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditShape.js b/apps/presentationeditor/mobile/app/controller/edit/EditShape.js
+index aa22af261..1c23e264d 100644
+--- a/apps/presentationeditor/mobile/app/controller/edit/EditShape.js
++++ b/apps/presentationeditor/mobile/app/controller/edit/EditShape.js
+@@ -235,6 +235,18 @@ define([
+             },
+ 
+             onReorder: function (e) {
++                var $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                if ('all-up' == type) {
++                    this.api.shapes_bringToFront();
++                } else if ('all-down' == type) {
++                    this.api.shapes_bringToBack();
++                } else if ('move-up' == type) {
++                    this.api.shapes_bringForward();
++                } else if ('move-down' == type) {
++                    this.api.shapes_bringBackward();
++                }
+             },
+ 
+             onAlign: function (e) {
+@@ -261,6 +273,10 @@ define([
+             },
+ 
+             onReplace: function (e) {
++                var $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                this.api.ChangeShapeType(type);
+             },
+ 
+             onBorderSize: function (e) {
+diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js b/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js
+index eaceadccd..0275e300d 100644
+--- a/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js
++++ b/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js
+@@ -89,6 +89,7 @@ define([
+                 me.api = api;
+ 
+                 me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onInitEditorStyles',   _.bind(me.onApiInitEditorStyles, me));
+                 me.api.asc_registerCallback('asc_onUpdateThemeIndex',   _.bind(me.onApiUpdateThemeIndex, me));
+             },
+ 
+@@ -217,9 +218,22 @@ define([
+             // Handlers
+ 
+             onLayoutClick: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                me.api.ChangeLayout(type);
+             },
+ 
+             onThemeClick: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                $('.container-edit .slide-theme div').removeClass('active');
++                $target.addClass('active');
++
++                me.api.ChangeTheme(type);
+             },
+ 
+             onRemoveSlide: function () {
+@@ -380,6 +394,35 @@ define([
+                 }
+             },
+ 
++            onApiInitEditorStyles: function(themes) {
++                if (themes) {
++                    window.styles_loaded = false;
++
++                    var me = this,
++                        defaultThemes = themes[0] || [],
++                        docThemes     = themes[1] || [];
++
++                    this._themes = [];
++
++                    _.each(defaultThemes, function(theme, index) {
++                        me._themes.push({
++                            themeId : theme.get_Index(),
++                            offsety     : index * 38
++                        });
++                    });
++
++                    _.each(docThemes, function(theme) {
++                        me._themes.push({
++                            imageUrl: theme.get_Image(),
++                            themeId : theme.get_Index(),
++                            offsety     : 0
++                        });
++                    });
++
++                    window.styles_loaded = true;
++                }
++            },
++
+             onApiUpdateThemeIndex: function(themeId) {
+                 _themeId = themeId;
+                 $('.container-edit .slide-theme .row div').removeClass('active');
+@@ -410,4 +453,4 @@ define([
+             textSec: 's'
+         };
+     })(), PE.Controllers.EditSlide || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditTable.js b/apps/presentationeditor/mobile/app/controller/edit/EditTable.js
+index 280165d27..4e44175a5 100644
+--- a/apps/presentationeditor/mobile/app/controller/edit/EditTable.js
++++ b/apps/presentationeditor/mobile/app/controller/edit/EditTable.js
+@@ -112,6 +112,9 @@ define([
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++
++                me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me));
+             },
+ 
+             onLaunch: function () {
+@@ -121,6 +124,13 @@ define([
+             initEvents: function () {
+                 var me = this;
+ 
++                $('#table-remove-all').single('click',                  _.bind(function(){me.api.remTable(); me._closeIfNeed()}, me));
++                $('#insert-column-left').single('click',                _.bind(function(){me.api.addColumnLeft(); me._closeIfNeed()}, me));
++                $('#insert-column-right').single('click',               _.bind(function(){me.api.addColumnRight(); me._closeIfNeed()}, me));
++                $('#insert-row-above').single('click',                  _.bind(function(){me.api.addRowAbove(); me._closeIfNeed()}, me));
++                $('#insert-row-below').single('click',                  _.bind(function(){me.api.addRowBelow(); me._closeIfNeed()}, me));
++                $('#remove-column').single('click',                     _.bind(function(){me.api.remColumn(); me._closeIfNeed()}, me));
++                $('#remove-row').single('click',                        _.bind(function(){me.api.remRow(); me._closeIfNeed()}, me));
+                 $('#table-options-margins input').single('change touchend',      _.buffered(me.onOptionMargin, 100, me));
+                 $('#table-options-margins input').single('input',       _.bind(me.onOptionMarginChanging, me));
+ 
+@@ -538,6 +548,19 @@ define([
+                 });
+ 
+                 return tableExist;
++            },
++
++            onApiInitTemplates: function(templates) {
++                var styles = [];
++
++                _.each(templates, function(template){
++                    styles.push({
++                        imageUrl    : template.asc_getImage(),
++                        templateId  : template.asc_getId()
++                    });
++                });
++
++                this.getView('EditTable').updateStyles(styles);
+             }
+         }
+     })(), PE.Controllers.EditTable || {}))
+diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditText.js b/apps/presentationeditor/mobile/app/controller/edit/EditText.js
+index 116758067..e40fde1ac 100644
+--- a/apps/presentationeditor/mobile/app/controller/edit/EditText.js
++++ b/apps/presentationeditor/mobile/app/controller/edit/EditText.js
+@@ -80,6 +80,30 @@ define([
+             setApi: function (api) {
+                 var me = this;
+                 me.api = api;
++
++                me.api.asc_registerCallback('asc_onInitEditorFonts',    _.bind(me.onApiLoadFonts, me));
++                me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++                me.api.asc_registerCallback('asc_onFontFamily',         _.bind(me.onApiChangeFont, me));
++                me.api.asc_registerCallback('asc_onFontSize',           _.bind(me.onApiFontSize, me));
++                me.api.asc_registerCallback('asc_onBold',               _.bind(me.onApiBold, me));
++                me.api.asc_registerCallback('asc_onItalic',             _.bind(me.onApiItalic, me));
++                me.api.asc_registerCallback('asc_onUnderline',          _.bind(me.onApiUnderline, me));
++                me.api.asc_registerCallback('asc_onStrikeout',          _.bind(me.onApiStrikeout, me));
++                me.api.asc_registerCallback('asc_onVerticalAlign',      _.bind(me.onApiVerticalAlign, me));
++                me.api.asc_registerCallback('asc_onTextColor',          _.bind(me.onApiTextColor, me));
++
++                me.api.asc_registerCallback('asc_onListType',           _.bind(me.onApiBullets, me));
++                me.api.asc_registerCallback('asc_onPrAlign',            _.bind(me.onApiParagraphAlign, me));
++                me.api.asc_registerCallback('asc_canIncreaseIndent',      _.bind(me.onApiCanIncreaseIndent, me));
++                me.api.asc_registerCallback('asc_canDecreaseIndent',      _.bind(me.onApiCanDecreaseIndent, me));
++                me.api.asc_registerCallback('asc_onLineSpacing',          _.bind(me.onApiLineSpacing, me));
++                me.api.asc_registerCallback('asc_onVerticalTextAlign',    _.bind(me.onApiVerticalTextAlign, me));
++
++                // me.api.asc_registerCallback('asc_onUpdateThemeIndex',     _.bind(this.onApiUpdateThemeIndex, this));
++                // me.api.asc_registerCallback('asc_onCanGroup',             _.bind(this.onApiCanGroup, this));
++                // me.api.asc_registerCallback('asc_onCanUnGroup',           _.bind(this.onApiCanUnGroup, this));
++                // me.api.asc_registerCallback('asc_onPresentationSize',     _.bind(this.onApiPageSize, this));
++                // me.api.asc_registerCallback('asc_onInitEditorStyles',     _.bind(this.onApiInitEditorStyles, this));
+             },
+ 
+             onLaunch: function () {
+@@ -472,6 +496,22 @@ define([
+ 
+             // API handlers
+ 
++            onApiLoadFonts: function (fonts, select) {
++                var me = this;
++                _.each(fonts, function(font) {
++                    var fontId = font.asc_getFontId();
++                    me._fontsArray.push({
++                        id          : fontId,
++                        name        : font.asc_getFontName(),
++//                    displayValue: font.asc_getFontName(),
++                        imgidx      : font.asc_getFontThumbnail(),
++                        type        : font.asc_getFontType()
++                    });
++                });
++
++                Common.NotificationCenter.trigger('fonts:load', this._fontsArray, select);
++            },
++
+             onApiFocusObject: function (objects) {
+                 _stack = objects;
+ 
+@@ -619,4 +659,4 @@ define([
+             textPt: 'pt'
+         }
+     })(), PE.Controllers.EditText || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/Main.js b/apps/spreadsheeteditor/mobile/app/controller/Main.js
+index 71f96d868..883eca8cd 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/Main.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/Main.js
+@@ -1332,6 +1332,7 @@ define([
+             },
+ 
+             onSendThemeColors: function(colors, standart_colors) {
++               Common.Utils.ThemeColor.setColors(colors, standart_colors);
+             },
+ 
+             onAdvancedOptions: function(type, advOptions, mode, formatOptions) {
+@@ -1553,7 +1554,7 @@ define([
+             },
+ 
+             isSupportEditFeature: function() {
+-                return false;
++                return true;
+             },
+ 
+             onRunAutostartMacroses: function() {
+@@ -1810,4 +1811,4 @@ define([
+             errorLang: 'The interface language is not loaded.<br>Please contact your Document Server administrator.'
+         }
+     })(), SSE.Controllers.Main || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js
+index bb91e2c39..58015d747 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js
+@@ -78,6 +78,10 @@ define([
+ 
+             onInsertChart: function (type) {
+                 SSE.getController('AddContainer').hideModal();
++
++                var settings = this.api.asc_getChartObject();
++                settings.changeType(type);
++                this.api.asc_addChartDrawingObject(settings);
+             },
+ 
+             txtDiagramTitle:    'Chart Title',
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js
+index 2f8e89353..964438c17 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js
+@@ -112,17 +112,52 @@ define([
+ 
+                 editorLang = (editorLang ? editorLang : 'en').split(/[\-\_]/)[0].toLowerCase();
+ 
+-                var localizationFunctionsDesc = function (data) {};
++                var localizationFunctionsDesc = function (data) {
++                    var jsonDesc = {},
++                        view = me.getView('AddFunction');
++
++                    me.fd = data;
++
++                    try {
++                        jsonDesc = JSON.parse(me.fd);
++                    } catch (e) {
++                        jsonDesc = me.fd
++                    }
++
++                    var grouparr = me.api.asc_getFormulasInfo();
++                    for (var g in grouparr) {
++                        var group = grouparr[g];
++                        var groupname = group.asc_getGroupName();
++                        var funcarr = group.asc_getFormulasArray();
++
++                        for (var f in funcarr) {
++                            var func = funcarr[f];
++                            var _name = func.asc_getName();
++                            functions[_name] = {
++                                type:       _name,
++                                group:      groupname,
++                                caption:    func.asc_getLocaleName(),
++                                args:       (jsonDesc && jsonDesc[_name]) ? jsonDesc[_name].a : '',
++                                descr:      (jsonDesc && jsonDesc[_name]) ? jsonDesc[_name].d : ''
++                            };
++                        }
++                    }
++
++                    view.setFunctions(functions, editorLang);
++                    view.render();
++                };
+ 
+                 $.getJSON(Common.Utils.String.format("{0}/{1}_desc.json", "resources/l10n/functions", editorLang), function(json) {
+                     localizationFunctionsDesc(json);
+                 }).fail(function() {
+-                    localizationFunctionsDesc(fd);
++                    localizationFunctionsDesc(me.fd);
+                 });
+             },
+ 
+             onInsertFunction: function (type) {
+                 SSE.getController('AddContainer').hideModal();
++
++                this.api.asc_insertFormula(this.api.asc_getFormulaLocaleName(type), Asc.c_oAscPopUpSelectorType.Func, true);
+             },
+ 
+             onFunctionInfo: function (type) {
+@@ -130,4 +165,4 @@ define([
+             }
+         }
+     })(), SSE.Controllers.AddFunction || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js
+index de4821e92..100de77e8 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js
+@@ -171,6 +171,51 @@ define([
+             },
+ 
+             onInsertLink: function(args){
++                var link = new Asc.asc_CHyperlink();
++
++                if ( args.type == 'ext' ) {
++                    var url     = args.url,
++                        urltype = this.api.asc_getUrlType($.trim(url)),
++                        isEmail = (urltype == 2);
++
++                    if (urltype < 1) {
++                        uiApp.alert(this.txtNotUrl);
++                        return;
++                    }
++
++                    url = url.replace(/^\s+|\s+$/g,'');
++
++                    if (! /(((^https?)|(^ftp)):\/\/)|(^mailto:)/i.test(url) )
++                        url = (isEmail ? 'mailto:' : 'http://' ) + url;
++
++                    url = url.replace(new RegExp("%20",'g')," ");
++
++                    link.asc_setType(Asc.c_oAscHyperlinkType.WebLink);
++                    link.asc_setHyperlinkUrl(url);
++                    display = url;
++                } else {
++                    var isValid = /^[A-Z]+[1-9]\d*:[A-Z]+[1-9]\d*$/.test(args.url);
++
++                    if (!isValid)
++                        isValid = /^[A-Z]+[1-9]\d*$/.test(args.url);
++
++                    if (!isValid) {
++                        uiApp.alert(this.textInvalidRange);
++                        return;
++                    }
++
++                    link.asc_setType(Asc.c_oAscHyperlinkType.RangeLink);
++                    link.asc_setSheet(args.sheet);
++                    link.asc_setRange(args.url);
++
++                    var display = args.sheet + '!' + args.url;
++                }
++
++                link.asc_setText(args.text == null ? null : !!args.text ? args.text : display);
++                link.asc_setTooltip(args.tooltip);
++
++                this.api.asc_insertHyperlink(link);
++
+                 SSE.getController('AddContainer').hideModal();
+             },
+ 
+@@ -179,4 +224,4 @@ define([
+             notcriticalErrorTitle: 'Warning'
+         }
+     })(), SSE.Controllers.AddLink || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js
+index dd1096405..776d18f92 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js
+@@ -174,6 +174,10 @@ define([
+                     if (!_.isEmpty(url)) {
+                         if ((/((^https?)|(^ftp)):\/\/.+/i.test(url))) {
+                             SSE.getController('AddContainer').hideModal();
++
++                            _.defer(function () {
++                                me.api.asc_addImageDrawingObject(url);
++                            });
+                         } else {
+                             uiApp.alert(me.txtNotUrl, me.notcriticalErrorTitle);
+                         }
+@@ -182,6 +186,7 @@ define([
+                     }
+                 } else {
+                     SSE.getController('AddContainer').hideModal();
++                    this.api.asc_addImage();
+                 }
+             },
+ 
+@@ -190,6 +195,11 @@ define([
+             },
+ 
+             onInsertFilter: function(checked) {
++                var formatTableInfo = this.api.asc_getCellInfo().asc_getFormatTableInfo();
++                var tablename = (formatTableInfo) ? formatTableInfo.asc_getTableName() : undefined;
++                if (checked)
++                    this.api.asc_addAutoFilter(); else
++                    this.api.asc_changeAutoFilter(tablename, Asc.c_oAscChangeFilterOptions.filter, checked);
+             },
+ 
+             onError: function(id, level, errData) {
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js
+index b7a1cbcf2..b3411de3b 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js
+@@ -211,6 +211,12 @@ define([
+             },
+ 
+             onShapeClick: function (e) {
++                var $target = $(e.currentTarget);
++
++                if ($target && this.api) {
++                    this.api.asc_addShapeOnSheet($target.data('type'));
++                }
++
+                 SSE.getController('AddContainer').hideModal();
+             },
+ 
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js
+index ef9666471..d75035de8 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js
+@@ -85,8 +85,10 @@ define([
+ 
+                 me.api.asc_setThumbnailStylesSizes(me._styleSize.width, me._styleSize.height);
+ 
++                me.api.asc_registerCallback('asc_onInitEditorFonts',            _.bind(me.onApiLoadFonts, me));
+                 me.api.asc_registerCallback('asc_onSelectionChanged',           _.bind(me.onApiSelectionChanged, me));
+                 me.api.asc_registerCallback('asc_onEditorSelectionChanged',     _.bind(me.onApiEditorSelectionChanged, me));
++                me.api.asc_registerCallback('asc_onInitEditorStyles',           _.bind(me.onApiInitEditorStyles, me));
+             },
+ 
+             setMode: function (mode) {
+@@ -349,6 +351,15 @@ define([
+                 me.initTextFormat();
+             },
+ 
++            onApiInitEditorStyles: function(styles){
++                window.styles_loaded = false;
++                this._cellStyles = styles;
++
++                this.getView('EditCell').renderStyles(styles);
++
++                window.styles_loaded = true;
++            },
++
+             // Handlers
+ 
+             onFontSize: function (e) {
+@@ -448,6 +459,10 @@ define([
+             },
+ 
+             onCellFormat: function (e) {
++                var $target = $(e.currentTarget),
++                    type = decodeURIComponent(atob($target.data('type')));
++
++                this.api.asc_setCellFormat(type);
+             },
+ 
+             onBorderStyle: function (e) {
+@@ -483,10 +498,38 @@ define([
+ 
+             // API handlers
+ 
++            onApiLoadFonts: function(fonts, select) {
++                var me = this;
++                _.each(fonts, function(font) {
++                    var fontId = font.asc_getFontId();
++                    me._fontsArray.push({
++                        id          : fontId,
++                        name        : font.asc_getFontName(),
++//                    displayValue: font.asc_getFontName(),
++                        imgidx      : font.asc_getFontThumbnail(),
++                        type        : font.asc_getFontType()
++                    });
++                });
++
++                Common.NotificationCenter.trigger('fonts:load', this._fontsArray, select);
++            },
++
+             onApiEditorSelectionChanged: function(fontObj) {
++                if (!this._isEdit) {
++                    return;
++                }
++
++                this._fontInfo = fontObj;
++                this.initFontSettings(fontObj);
+             },
+ 
+             onApiSelectionChanged: function(cellInfo) {
++                if (!this._isEdit) {
++                    return;
++                }
++
++                this._cellInfo = cellInfo;
++                this.initCellSettings(cellInfo);
+             },
+ 
+             // Helpers
+@@ -559,4 +602,4 @@ define([
+             textPt: 'pt'
+         }
+     })(), SSE.Controllers.EditCell || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js
+index 0bacfd0e2..5fa56e946 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js
+@@ -107,7 +107,13 @@ define([
+                 var me = this;
+                 me.api = api;
+ 
++                me.api.asc_registerCallback('asc_onSelectionChanged',   _.bind(me.onApiSelectionChanged, me));
+                 me.api.asc_registerCallback('asc_onFocusObject',        _.bind(me.onApiFocusObject, me));
++
++                me.api.asc_registerCallback('asc_onUpdateChartStyles',  _.bind(me.onApiUpdateChartStyles, me));
++                // me.api.asc_registerCallback('asc_onSelectionChanged',           _.bind(me.onApiSelectionChanged, me));
++                // me.api.asc_registerCallback('asc_onEditorSelectionChanged',     _.bind(me.onApiEditorSelectionChanged, me));
++                // me.api.asc_registerCallback('asc_onInitEditorStyles',           _.bind(me.onApiInitEditorStyles, me)); // TODO: It does not work until the error in the SDK
+             },
+ 
+             setMode: function (mode) {
+@@ -166,7 +172,7 @@ define([
+             },
+ 
+             getChart: function () {
+-                return _chartObject;
++                return this._chartObject;
+             },
+ 
+             initRootPage: function () {
+@@ -564,9 +570,41 @@ define([
+             },
+ 
+             onType: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                $('.chart-types li').removeClass('active');
++                $target.addClass('active');
++
++                _.defer(function() {
++                    var image = new Asc.asc_CImgProperty(),
++                        chart = me._chartObject.get_ChartProperties();
++
++                    chart.changeType(type);
++                    image.put_ChartProperties(chart);
++
++                    me.api.asc_setGraphicObjectProps(image);
++
++                    // Force update styles
++                    me._updateChartStyles(me.api.asc_getChartPreviews(chart.getType()));
++
++                    me.updateAxisProps(type);
++                });
+             },
+ 
+             onStyle: function (e) {
++                var me = this,
++                    $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                var image = new Asc.asc_CImgProperty(),
++                    chart = this._chartObject.get_ChartProperties();
++
++                chart.putStyle(type);
++                image.put_ChartProperties(chart);
++
++                me.api.asc_setGraphicObjectProps(image);
+             },
+ 
+             onFillColor:function (palette, color) {
+@@ -906,6 +944,28 @@ define([
+ 
+             // API handlers
+ 
++            onApiUpdateChartStyles: function () {
++                if (this.api && this._chartObject && this._chartObject.get_ChartProperties()) {
++                    this._updateChartStyles(this.api.asc_getChartPreviews(this._chartObject.get_ChartProperties().getType()));
++                }
++            },
++
++            onApiSelectionChanged: function(info) {
++                if (!this._isEdit) {
++                    return;
++                }
++
++                var me = this,
++                    selectedObjects = [],
++                    selectType = info.asc_getSelectionType();
++
++                if (selectType == Asc.c_oAscSelectionType.RangeChart) {
++                    selectedObjects = me.api.asc_getGraphicObjectProps();
++                }
++
++                me.onApiFocusObject(selectedObjects);
++            },
++
+             onApiFocusObject: function (objects) {
+                 _stack = objects;
+ 
+@@ -1057,4 +1117,4 @@ define([
+             textFit: 'Fit Width'
+         }
+     })(), SSE.Controllers.EditChart || {}))
+-});
+\ No newline at end of file
++});
+diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js
+index 83e225529..5f701a46d 100644
+--- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js
++++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js
+@@ -242,9 +242,28 @@ define([
+             },
+ 
+             onReorder: function(e) {
++                var $target = $(e.currentTarget),
++                    type = $target.data('type'),
++                    ascType;
++
++                if (type == 'all-up') {
++                    ascType = Asc.c_oAscDrawingLayerType.BringToFront;
++                } else if (type == 'all-down') {
++                    ascType = Asc.c_oAscDrawingLayerType.SendToBack;
++                } else if (type == 'move-up') {
++                    ascType = Asc.c_oAscDrawingLayerType.BringForward;
++                } else {
++                    ascType = Asc.c_oAscDrawingLayerType.SendBackward;
++                }
++
++                this.api.asc_setSelectedDrawingObjectLayer(ascType);
+             },
+ 
+             onReplace: function (e) {
++                var $target = $(e.currentTarget),
++                    type = $target.data('type');
++
++                this.api.asc_changeShapeType(type);
+             },
+ 
+             onBorderSize: function (e) {
 -- 
-2.31.1.windows.1
-
+2.32.0.rc2