diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 9638ae2da441efb014794a1ed99ae581fdda95b6..c58080846f036f9611512c7779e345b7e2ae7cb8 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -18,7 +18,7 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
+              <auditMode v="2" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -174,7 +174,7 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
+              <auditMode v="1" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -323,7 +323,7 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
+              <auditMode v="2" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -458,8 +458,8 @@
                 <name>GENDER</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="50" />
+                <columnType v="1" />
+                <size v="1" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -518,7 +518,6 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -797,7 +796,7 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
+              <auditMode v="1" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -860,8 +859,8 @@
                 <name>ADDR_TYPE</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
+                <columnType v="5" />
+                <size v="5" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -1044,7 +1043,7 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
+              <auditMode v="1" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -1181,4 +1180,41 @@
       </entityGroup>
     </aliasDefDb>
   </aliasDefinitionSub>
+  <indexSearchGroups>
+    <indexSearchGroup>
+      <name>ORG</name>
+      <title>Company</title>
+      <icon>VAADIN:BUILDING</icon>
+      <idColumn>RELATIONID</idColumn>
+      <titleColumn>TITLECOLUMN</titleColumn>
+      <descriptionColumn>DESCCOLUMN</descriptionColumn>
+      <query>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/org/query.js</query>
+      <resultContextNeon>Org_context</resultContextNeon>
+      <affectedTables>
+        <element>ADDRESS</element>
+        <element>COMM</element>
+        <element>RELATION</element>
+        <element>ORG</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js</affectedIds>
+    </indexSearchGroup>
+    <indexSearchGroup>
+      <name>PERS</name>
+      <title>Contact</title>
+      <icon>VAADIN:USERS</icon>
+      <idColumn>RELATIONID</idColumn>
+      <titleColumn>TITLECOLUMN</titleColumn>
+      <descriptionColumn>DESCCOLUMN</descriptionColumn>
+      <query>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js</query>
+      <resultContextNeon>Pers_context</resultContextNeon>
+      <affectedTables>
+        <element>ADDRESS</element>
+        <element>COMM</element>
+        <element>PERS</element>
+        <element>RELATION</element>
+        <element>ORG</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js</affectedIds>
+    </indexSearchGroup>
+  </indexSearchGroups>
 </aliasDefinition>
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..ae199b2018a9652efde2cbe29362e0e1f0e0b58c
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/org/affectedIds.js
@@ -0,0 +1,41 @@
+import("system.db");
+import("system.result");
+import("system.vars");
+import("IndexSearch_lib");
+var indexHelper, infoContainer, onUpdFn, tableName, res;
+
+indexHelper = new IndexsearchUtils();
+tableName = vars.get("$local.table");
+idValue = vars.get("$local.idvalue");
+infoContainer =  indexHelper.createAffectedInfoContainer(idValue, null, vars.get("$local.action")
+    ,function (){return vars.get("$local.columns")}
+    ,function (){return vars.get("$local.oldvalues")}
+    ,function (){return vars.get("$local.values")});
+
+switch (tableName)
+{
+    case "RELATION":
+        res = [idValue];
+        break;    
+    case "ORG":
+        res = db.array(db.COLUMN, "select RELATION.RELATIONID from RELATION where RELATION.PERS_ID is null and RELATION.ORG_ID = '" + idValue + "'");
+        break;
+    case "ADDRESS":
+        res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from ADDRESS where ADDRESS.ADDRESSID = ?", [
+                    [id, db.getColumnTypes("ADDRESS", ["ADDRESSID"])[0]]
+            ]]);
+        });
+        break;
+    case "COMM":
+        res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from COMM where COMMID = ?", [
+                    [id, db.getColumnTypes("COMM", ["COMMID"])[0]]
+            ]]);
+        });
+        break;
+}
+
+if (res) {
+    result.object(res);
+}
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/org/query.js b/aliasDefinition/Data_alias/indexsearchgroups/org/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..b49ee30966107787b47007bcf2fd2dd0c0c9f27e
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/org/query.js
@@ -0,0 +1,26 @@
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Sql_lib");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where RELATION.RELATIONID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlUtils();
+sqlQuery = "select RELATION.RELATIONID "
+    + "," + sqlHelper.concat(["ORG.NAME", "ORG.CUSTOMERCODE", "defaultAddress.COUNTRY", "defaultAddress.ZIP", "defaultAddress.CITY"]) 
+    + " as TITLECOLUMN "
+    + "," + sqlHelper.concat(["ADDRESS", "BUILDINGNO", "', '", "COUNTRY", "'-'", "ZIP", "CITY"], ' ') + " as DESCCOLUMN "
+    //additional indexed fields
+    + ",ORG.NAME, COMM.ADDR "
+    + " from ORG "
+    + " join RELATION on RELATION.ORG_ID = ORG.ORGID and RELATION.PERS_ID is null "
+    + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = RELATION.ADDRESS_ID "
+    + " left join COMM on COMM.RELATION_ID = RELATION.RELATIONID "
+    + (queryCondition || "") 
+    + " order by RELATION.RELATIONID ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..a87cc105b4964eab1b273f808b2586b93b041a24
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/pers/affectedIds.js
@@ -0,0 +1,45 @@
+import("system.db");
+import("system.result");
+import("system.vars");
+import("IndexSearch_lib");
+var indexHelper, infoContainer, onUpdFn, tableName, res;
+
+indexHelper = new IndexsearchUtils();
+tableName = vars.get("$local.table");
+idValue = vars.get("$local.idvalue");
+infoContainer =  indexHelper.createAffectedInfoContainer(idValue, null, vars.get("$local.action")
+    ,function (){return vars.get("$local.columns")}
+    ,function (){return vars.get("$local.oldvalues")}
+    ,function (){return vars.get("$local.values")});
+
+switch (tableName)
+{
+    case "RELATION":
+        res = [idValue];
+        break;    
+    case "PERS":
+        res = db.array(db.COLUMN, "select RELATION.RELATIONID from RELATION where RELATION.PERS_ID = '" + idValue + "'");
+        break;
+    case "ORG":
+        res = db.array(db.COLUMN, "select RELATION.RELATIONID from RELATION where RELATION.PERS_ID is not null and RELATION.ORG_ID = '" + idValue + "'");
+        break;
+    case "ADDRESS":
+        res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from ADDRESS where ADDRESS.ADDRESSID = ?", [
+                    [id, db.getColumnTypes("ADDRESS", ["ADDRESSID"])[0]]
+            ]]);
+        });
+        break;
+    case "COMM":
+        res = indexHelper.getAffectedIdValues("RELATION_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select ADDRESS.RELATION_ID from COMM where COMMID = ?", [
+                    [id, db.getColumnTypes("COMM", ["COMMID"])[0]]
+            ]]);
+        });
+        break;
+}
+
+if (res) {
+    result.object(res);
+}
+    
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js b/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..39d30b5b8b9606410fc06eb5fcabe34e1d5b018c
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js
@@ -0,0 +1,27 @@
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Sql_lib");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where RELATION.RELATIONID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlUtils();
+sqlQuery = "select RELATION.RELATIONID "
+    + "," + sqlHelper.concat(["PERS.SALUTATION", "PERS.FIRSTNAME", "PERS.LASTNAME", "ORG.NAME"]) 
+    + " as TITLECOLUMN "
+    + "," + sqlHelper.concat(["ADDRESS", "BUILDINGNO", "', '", "COUNTRY", "'-'", "ZIP", "CITY"], ' ') + " as DESCCOLUMN "
+    //additional indexed fields
+    + ",ORG.NAME, COMM.ADDR "
+    + " from PERS "
+    + " join RELATION on RELATION.PERS_ID = PERS.PERSID "
+    + " join ORG on RELATION.ORG_ID = ORG.ORGID "
+    + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = RELATION.ADDRESS_ID "
+    + " left join COMM on COMM.RELATION_ID = RELATION.RELATIONID "
+    + (queryCondition || "") 
+    + " order by RELATION.RELATIONID ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Org_entity/Org_entity.aod b/entity/Org_entity/Org_entity.aod
index f0132921f1e08fd4809f14c9aa5d15c6d6983c57..b2ad0af5ac69ed0d7a9b41391bfcc688caee3d25 100644
--- a/entity/Org_entity/Org_entity.aod
+++ b/entity/Org_entity/Org_entity.aod
@@ -56,6 +56,7 @@
       <name>ORGID</name>
       <tableName>ORG</tableName>
       <columnName>ORGID</columnName>
+      <valueProcess>%aditoprj%/entity/Org_entity/entityfields/orgid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>ORG_USER_EDIT</name>
@@ -105,7 +106,6 @@
       <name>RELATIONID</name>
       <tableName>RELATION</tableName>
       <columnName>RELATIONID</columnName>
-      <valueProcess>%aditoprj%/entity/Org_entity/entityfields/relationid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>STATUS</name>
@@ -228,15 +228,15 @@
   </entityFields>
   <linkInformation>
     <linkInformation>
-      <name>7fe13e6e-8605-44e1-989b-41e103f5c884</name>
+      <name>a08ad13b-9031-4b6f-8c42-9df8d4185ce5</name>
       <tableName>ORG</tableName>
       <primaryKey>ORGID</primaryKey>
-      <isUIDTable v="true" />
     </linkInformation>
     <linkInformation>
-      <name>181abde8-149c-44f1-bc1b-90635e314fab</name>
+      <name>419e74cd-64ad-472d-915e-cff50aa293da</name>
       <tableName>RELATION</tableName>
       <primaryKey>RELATIONID</primaryKey>
+      <isUIDTable v="true" />
     </linkInformation>
   </linkInformation>
 </entity>
diff --git a/entity/Org_entity/entityfields/relationid/valueProcess.js b/entity/Org_entity/entityfields/orgid/valueProcess.js
similarity index 100%
rename from entity/Org_entity/entityfields/relationid/valueProcess.js
rename to entity/Org_entity/entityfields/orgid/valueProcess.js
diff --git a/entity/Pers_entity/Pers_entity.aod b/entity/Pers_entity/Pers_entity.aod
index 651f045ef310b1a4d323d916d7c61350c4cef607..bbef94d586725593302110edba48ba29850db03a 100644
--- a/entity/Pers_entity/Pers_entity.aod
+++ b/entity/Pers_entity/Pers_entity.aod
@@ -67,6 +67,7 @@
       <name>PERSID</name>
       <tableName>PERS</tableName>
       <columnName>PERSID</columnName>
+      <valueProcess>%aditoprj%/entity/Pers_entity/entityfields/persid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>SALUTATION</name>
@@ -143,7 +144,6 @@
       <name>RELATIONID</name>
       <tableName>RELATION</tableName>
       <columnName>RELATIONID</columnName>
-      <valueProcess>%aditoprj%/entity/Pers_entity/entityfields/relationid/valueProcess.js</valueProcess>
     </entityField>
     <entityIncomingField>
       <name>PersOrg_dfi</name>
@@ -243,15 +243,15 @@
   </entityFields>
   <linkInformation>
     <linkInformation>
-      <name>1a8da51e-5630-46af-bc83-0928d534ff4c</name>
+      <name>449dc321-de5a-40da-a96e-23784d830745</name>
       <tableName>PERS</tableName>
       <primaryKey>PERSID</primaryKey>
-      <isUIDTable v="true" />
     </linkInformation>
     <linkInformation>
-      <name>5989cdc1-54c8-4b98-a571-6fefe5980e2a</name>
+      <name>724cb303-ea72-4207-9fc4-52aec17e0c31</name>
       <tableName>RELATION</tableName>
       <primaryKey>RELATIONID</primaryKey>
+      <isUIDTable v="true" />
     </linkInformation>
   </linkInformation>
 </entity>
diff --git a/entity/Pers_entity/entityfields/relationid/valueProcess.js b/entity/Pers_entity/entityfields/persid/valueProcess.js
similarity index 100%
rename from entity/Pers_entity/entityfields/relationid/valueProcess.js
rename to entity/Pers_entity/entityfields/persid/valueProcess.js
diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
index 2e9d98b454f5cd5169906b7d1af461aa3ebc223f..8fcbb815aad5cead7402f24d249fc968f7af9e89 100644
--- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
+++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
@@ -7,7 +7,7 @@
   <clientSearchOptimizedForSpeed v="true" />
   <clientSearchExcludeForIgnorecase v="true" />
   <blobHandlingMethod>DATABASE</blobHandlingMethod>
-  <databaseAuditGetOldValueLobs v="true" />
+  <databaseAuditGetOldValueLobs v="false" />
   <indexsearchFullIndexerEnabled v="true" />
   <indexsearchFullIndexerInterval v="0" />
   <indexsearchIncrementingIndexerEnabled v="true" />
diff --git a/process/IndexSearch_lib/IndexSearch_lib.aod b/process/IndexSearch_lib/IndexSearch_lib.aod
new file mode 100644
index 0000000000000000000000000000000000000000..a019eaf85a888b94f584905bedf2d48a47b83286
--- /dev/null
+++ b/process/IndexSearch_lib/IndexSearch_lib.aod
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7">
+  <name>IndexSearch_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/IndexSearch_lib/process.js</process>
+</process>
diff --git a/process/IndexSearch_lib/process.js b/process/IndexSearch_lib/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..afef388c81f632b9704dc7fcc8c4444f2c5542f9
--- /dev/null
+++ b/process/IndexSearch_lib/process.js
@@ -0,0 +1,61 @@
+function IndexsearchUtils(){
+    this.getAffectedIdValues = function(fieldname, affectedInfoContainer, updateFn){
+        var affectedIds;
+        switch (affectedInfoContainer.action){
+            case "I":  
+                affectedIds = [affectedInfoContainer.newValues[affectedInfoContainer.columns.indexOf(fieldname)]];
+                break;
+            case "U":
+                affectedIds = updateFn.call(null, changedIdValue);
+                break;
+            case "D":
+                affectedIds = [affectedInfoContainer.oldValues[affectedInfoContainer.columns.indexOf(fieldname)]];
+                break;
+        }
+        return affectedIds || [];
+    }
+    
+    this.createAffectedInfoContainer = function(changedIdValue, changedTable, action, columnsFn, oldValueFn, newValueFn){
+        var res, internalStorage;
+        internalStorage = {};
+        res = {
+             id: changedIdValue
+            ,table: changedTable
+            ,action: action
+            ,columns: null //null for autocomplete in the ADITO-designer
+            ,oldValues: null 
+            ,newValues: null
+        };
+        Object.defineProperty(res, "columns", {
+            get: function(){
+                if (internalStorage["columns"] == undefined)
+                    internalStorage["columns"] = columnsFn.call(null);
+                return internalStorage["columns"];
+            }
+            ,set: function (v){
+                internalStorage["columns"] = v;
+            }
+        });
+        Object.defineProperty(res, "oldValues", {
+            get: function(){
+                if (internalStorage["oldValues"] == undefined)
+                    internalStorage["oldValues"] = oldValueFn.call(null);
+                return internalStorage["oldValues"];
+            }
+            ,set: function (v){
+                internalStorage["oldValues"] = v;
+            }
+        });
+        Object.defineProperty(res, "newValues", {
+            get: function(){
+                if (internalStorage["newValues"] == undefined)
+                    internalStorage["newValues"] = newValueFn.call(null);
+                return internalStorage["newValues"];
+            }
+            ,set: function (v){
+                internalStorage["newValues"] = v;
+            }
+        });
+        return res;
+    }
+}
\ No newline at end of file
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 4ab390756ec5e5e39fe246e801f4509ba45c24d2..a29b85a638e5f669c5e6f459e2849b09a36f5bbc 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -342,8 +342,8 @@ function SqlUtils()
             if(retstr != "")  
                 retstr += concat_string;
             if ( i < pFields.length - 1 ) //Check if another value follows, if not separator is not needed
-                retstr += " case when " + pFields[i] + isNotEmpty + " then case when " + trimSQL(pFields[i+1], pAlias) + isNotEmpty + " and "
-                + trimSQL(pFields[i+1], pAlias) + isNotNull + " then " + pFields[i] + pSeparator + " else " + pFields[i] + " end" + " else " + blank + " end ";
+                retstr += " case when " + pFields[i] + isNotEmpty + " then case when " + this.trimSql(pFields[i+1], pAlias) + isNotEmpty + " and "
+                + this.trimSql(pFields[i+1], pAlias) + isNotNull + " then " + pFields[i] + pSeparator + " else " + pFields[i] + " end" + " else " + blank + " end ";
             else
                 retstr += " case when " + pFields[i] + isNotEmpty + " then " + pFields[i] + " else " + blank + " end ";
         }
diff --git a/process/indexsearch_patternextension/indexsearch_patternextension.aod b/process/indexsearch_patternextension/indexsearch_patternextension.aod
new file mode 100644
index 0000000000000000000000000000000000000000..22933191c0ebb0edc6826919080acc9f7e2041c8
--- /dev/null
+++ b/process/indexsearch_patternextension/indexsearch_patternextension.aod
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7">
+  <name>indexsearch_patternextension</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/indexsearch_patternextension/process.js</process>
+</process>
diff --git a/process/indexsearch_patternextension/process.js b/process/indexsearch_patternextension/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/process/runIndexer_ws/process.js b/process/runIndexer_ws/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..e9d5f5e85953705e13bbb1ebcb3a0dbf4cba2b00
--- /dev/null
+++ b/process/runIndexer_ws/process.js
@@ -0,0 +1,13 @@
+import("system.indexsearch");
+
+function restget(obj) {
+    obj = JSON.parse(obj);
+    var index = obj.query.index.split(",");
+    index = typeof(index) == "string" ? [index] : index;
+    indexsearch.runIndexer(index);
+    obj.response.body = "index(es) requested for rebuild:\n" + index.reduce(function (l, r){
+        return l + "\n    > " + r;
+    }, "");
+    obj = JSON.stringify(obj);
+    return obj;
+}
diff --git a/process/runIndexer_ws/runIndexer_ws.aod b/process/runIndexer_ws/runIndexer_ws.aod
new file mode 100644
index 0000000000000000000000000000000000000000..e26f6a137d78c35b7c8e89b82e4539101d562297
--- /dev/null
+++ b/process/runIndexer_ws/runIndexer_ws.aod
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7">
+  <name>runIndexer_ws</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/runIndexer_ws/process.js</process>
+  <publishAsWebservice v="true" />
+  <style>REST</style>
+  <loginTypeId>internal.none</loginTypeId>
+  <restrictedRoles />
+</process>