diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod
index 4af02845d6b88a7b1f7554e453cf73a34ff78202..937eccc7ec75f72f9b5cc003c0bab88f90f1ece1 100644
--- a/entity/Address_entity/Address_entity.aod
+++ b/entity/Address_entity/Address_entity.aod
@@ -488,5 +488,39 @@
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+    <indexRecordContainer>
+      <name>childGroup</name>
+      <configMode>CHILD_INDEXGROUP</configMode>
+      <isGlobal v="false" />
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <query>%aditoprj%/entity/Address_entity/recordcontainers/childgroup/query.js</query>
+      <affectedTables>
+        <element>RELATION</element>
+        <element>ADDRESS</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Address_entity/recordcontainers/childgroup/affectedIds.js</affectedIds>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>ADDRESS.value</name>
+          <indexFieldType>ADDRESS</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>BUILDINGNO.value</name>
+          <indexFieldType>ADDRESS</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>ZIP.value</name>
+          <indexFieldType>ADDRESS</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>COUNTRY.value</name>
+          <indexFieldType>TEXT_PLAIN</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CITY.value</name>
+          <indexFieldType>ADDRESS</indexFieldType>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Address_entity/recordcontainers/childgroup/affectedIds.js b/entity/Address_entity/recordcontainers/childgroup/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ce4eca596f562519fd3e40d69d57afad64c62
--- /dev/null
+++ b/entity/Address_entity/recordcontainers/childgroup/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/entity/Address_entity/recordcontainers/childgroup/query.js b/entity/Address_entity/recordcontainers/childgroup/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7e85c89077c7be4cf8f6de6928ea8def442e611
--- /dev/null
+++ b/entity/Address_entity/recordcontainers/childgroup/query.js
@@ -0,0 +1,23 @@
+import("system.result");
+import("system.vars");
+import("system.db");
+
+var sqlQuery, queryCondition, affectedIds;
+
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = " where ADDRESS.ADDRESSID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+
+sqlQuery = "select ADDRESS.ADDRESSID as uid" 
+    + ', ADDRESS.ZIP as "ZIP.value"' 
+    + ', ADDRESS.CITY as CITY' 
+    + ', ADDRESS.COUNTRY' 
+    + ', ADDRESS.ADDRESS' 
+    + ', ADDRESS.BUILDINGNO'
+    + " from ADDRESS"
+    + (queryCondition || "") 
+    + " order by ADDRESS.ADDRESSID ";
+
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Communication_entity/Communication_entity.aod b/entity/Communication_entity/Communication_entity.aod
index c982f10eed1e31afadb2e2221a9554e9f65cd2d8..2d656be4813383a884480f13dc93096c7e82f328 100644
--- a/entity/Communication_entity/Communication_entity.aod
+++ b/entity/Communication_entity/Communication_entity.aod
@@ -278,5 +278,24 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	 <indexRecordContainer>
+      <name>groupExtension</name>
+      <configMode>INDEXGROUP_EXTENSION</configMode>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <idColumn>COMMUNICATIONID</idColumn>
+      <query>%aditoprj%/entity/Communication_entity/recordcontainers/groupextension/query.js</query>
+      <affectedTables>
+        <element>COMMUNICATION</element>
+        <element>AB_KEYWORD_ENTRY</element>
+      </affectedTables>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>ADDR.value</name>
+          <indexFieldType>COMM</indexFieldType>
+          <isMultiValued v="true" />
+          <dbColumn>ADDR</dbColumn>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Communication_entity/recordcontainers/groupextension/query.js b/entity/Communication_entity/recordcontainers/groupextension/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..7faad202b023540b228df7dd410c24573ce8d755
--- /dev/null
+++ b/entity/Communication_entity/recordcontainers/groupextension/query.js
@@ -0,0 +1,17 @@
+import("system.result");
+import("system.vars");
+import("system.db");
+
+var sqlQuery, queryCondition, affectedIds;
+
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = " where COMMUNICATION.COMMUNICATIONID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+
+sqlQuery = "select COMMUNICATION.COMMUNICATIONID, COMMUNICATION.ADDR from COMMUNICATION "
+ + (queryCondition || "") 
+ + " order by COMMUNICATION.COMMUNICATIONID ";
+
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index 298a23b16fb53517a9ab1fba04202755c05b95cf..8b65868b9baafdb3bc55f34400559afdb48bcb28 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -485,5 +485,44 @@
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	 <indexRecordContainer>
+      <name>index</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <global v="true" />
+      <query>%aditoprj%/entity/Contract_entity/recordcontainers/index/query.js</query>
+      <affectedTables>
+        <element>CONTRACT</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Contract_entity/recordcontainers/index/affectedIds.js</affectedIds>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>CONTRACTCODE</name>
+          <indexFieldType>TEXT_PLAIN</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CUSTOMERCODE</name>
+          <indexFieldType>TEXT_PLAIN</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ORG_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+          <additionalFieldNameAliases>
+            <element>ORGANISATION_ID</element>
+          </additionalFieldNameAliases>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ORG_ID.displayValue</name>
+          <indexFieldType>PROPER_NAME</indexFieldType>
+          <additionalFieldNameAliases>
+            <element>NAME</element>
+          </additionalFieldNameAliases>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Contract_entity/recordcontainers/index/affectedIds.js b/entity/Contract_entity/recordcontainers/index/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ce4eca596f562519fd3e40d69d57afad64c62
--- /dev/null
+++ b/entity/Contract_entity/recordcontainers/index/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/entity/Contract_entity/recordcontainers/index/query.js b/entity/Contract_entity/recordcontainers/index/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..3a7783950d4c3e1f8c1222d963e3f468a4dd100d
--- /dev/null
+++ b/entity/Contract_entity/recordcontainers/index/query.js
@@ -0,0 +1,33 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Keyword_lib");
+import("Sql_lib");
+import("KeywordRegistry_basic");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+queryCondition = "";
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where CONTRACTID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select CONTRACTID as uid, " 
+    + sqlHelper.concat(["CONTRACTCODE", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.contractStatus(), "CONTRACTSTATUS")], " | ")
+    + " as title, " 
+    + sqlHelper.concat(["ORGANISATION.NAME", "'| " + translate.text("Type of contract") + ":'", 
+            KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.contractType(), "CONTRACTTYPE")]) 
+    + " as description" 
+    + ", CONTRACTCODE "
+    + ", CUSTOMERCODE " 
+    + ", CONTRACT.CONTACT_ID"
+    + ", CONTACT.ORGANISATION_ID as CONTACT_ORG_ID"
+    + ', ORGANISATION.NAME as "CONTACT_ORG_ID.displayValue"' 
+    + " from CONTRACT "
+    + " join CONTACT on CONTRACT.CONTACT_ID = CONTACTID "
+    + " join ORGANISATION on ORGANISATIONID = CONTACT.ORGANISATION_ID "
+    + queryCondition + " order by CONTRACTCODE ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index dcd3bc7164d1a5760ae3b3b45997505d9f6d594b..f21573ee73d15c5dc6f7e2c599eb7c51f1043392 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -1080,5 +1080,40 @@
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	<indexRecordContainer>
+      <name>index</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <query>%aditoprj%/entity/Offer_entity/recordcontainers/index/query.js</query>
+      <affectedTables>
+        <element>OFFER</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Offer_entity/recordcontainers/index/affectedIds.js</affectedIds>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>OFFERCODE.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CUSTOMERCODE.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ORG_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ORG_ID.displayValue</name>
+          <indexFieldType>PROPER_NAME</indexFieldType>
+          <additionalFieldNameAliases>
+            <element>name</element>
+          </additionalFieldNameAliases>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Offer_entity/recordcontainers/index/affectedIds.js b/entity/Offer_entity/recordcontainers/index/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ce4eca596f562519fd3e40d69d57afad64c62
--- /dev/null
+++ b/entity/Offer_entity/recordcontainers/index/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/index/query.js b/entity/Offer_entity/recordcontainers/index/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..7aed701b0b543ac1c93e7a932efec19bac353581
--- /dev/null
+++ b/entity/Offer_entity/recordcontainers/index/query.js
@@ -0,0 +1,33 @@
+import("system.SQLTYPES");
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Keyword_lib");
+import("Sql_lib");
+import("KeywordRegistry_basic");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+queryCondition = "";
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where OFFERID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select OFFERID as uid, " 
+    + sqlHelper.concat([sqlHelper.cast("OFFERCODE", SQLTYPES.CHAR, 10), KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.offerStatus(), "OFFER.STATUS")], " | ")
+    + " as title, " 
+    + sqlHelper.concat(["ORGANISATION.NAME", "'| " + translate.text("Description") + ":'", sqlHelper.castLob("OFFER.INFO", 250)])  
+    + " as description" 
+    + ", OFFERCODE"
+    + ", CUSTOMERCODE " 
+    + ", OFFER.CONTACT_ID "
+    + ", CONTACT.ORGANISATION_ID as CONTACT_ORG_ID"
+    + ', ORGANISATION.NAME as "CONTACT_ORG_ID.displayValue"'
+    + " from OFFER "
+    + " join CONTACT on OFFER.CONTACT_ID = CONTACTID "
+    + " join ORGANISATION on ORGANISATIONID = CONTACT.ORGANISATION_ID "
+    + queryCondition + " order by OFFERCODE ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 6181f04db534cb2ab56c6985c2a03d8dc579df9e..aeae02eb78096d2527f99673d4a0d7cdfc752f10 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -621,5 +621,40 @@
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	<indexRecordContainer>
+      <name>index</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <query>%aditoprj%/entity/Order_entity/recordcontainers/index/query.js</query>
+      <affectedTables>
+        <element>SALESORDER</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Order_entity/recordcontainers/index/affectedIds.js</affectedIds>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>SALESORDERCODE.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CUSTOMERCODE.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ORG_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACT_ORG_ID.displayValue</name>
+          <indexFieldType>PROPER_NAME</indexFieldType>
+          <additionalFieldNameAliases>
+            <element>name</element>
+          </additionalFieldNameAliases>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Order_entity/recordcontainers/index/affectedIds.js b/entity/Order_entity/recordcontainers/index/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ce4eca596f562519fd3e40d69d57afad64c62
--- /dev/null
+++ b/entity/Order_entity/recordcontainers/index/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/index/query.js b/entity/Order_entity/recordcontainers/index/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..57bca0642de68d859f09012c034d5edc33139485
--- /dev/null
+++ b/entity/Order_entity/recordcontainers/index/query.js
@@ -0,0 +1,32 @@
+import("system.SQLTYPES");
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Sql_lib");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+queryCondition = "";
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where SALESORDERID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select SALESORDERID as uid, " 
+    + sqlHelper.concat([sqlHelper.cast("SALESORDERCODE", SQLTYPES.CHAR, 10), KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesorderState(), "SALESORDER.STATUS")], " | ")
+    + " as title, " 
+    + sqlHelper.concat(["ORGANISATION.NAME"], " | ") 
+    + " as description" 
+    + ", SALESORDERCODE" 
+    + ", CUSTOMERCODE"
+    + ", SALESORDER.CONTACT_ID"
+    + ', CONTACT.ORGANISATION_ID as CONTACT_ORG_ID'
+    + ', ORGANISATION.NAME  as "CONTACT_ORG_ID.displayValue"'
+    + " from SALESORDER "
+    + " join CONTACT on SALESORDER.CONTACT_ID = CONTACTID "
+    + " join ORGANISATION on ORGANISATIONID = CONTACT.ORGANISATION_ID "
+    + queryCondition + " order by SALESORDERCODE ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index 924c7ba3d2b3a1824d007cf4999c7d825855cce8..399d17d57dbff851797d2a5c11b6a9679799b13f 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -969,5 +969,52 @@
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	<indexRecordContainer>
+      <name>index</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <query>%aditoprj%/entity/Organisation_entity/recordcontainers/index/query.js</query>
+      <affectedTables>
+        <element>ADDRESS</element>
+        <element>COMMUNICATION</element>
+        <element>CONTACT</element>
+        <element>ORGANISATION</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Organisation_entity/recordcontainers/index/affectedIds.js</affectedIds>
+      <includedConsumers>
+        <element>Addresses</element>
+        <element>Communications</element>
+      </includedConsumers>
+      <affectedConsumerIds>%aditoprj%/entity/Organisation_entity/recordcontainers/index/affectedConsumerIds.js</affectedConsumerIds>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>NAME.value</name>
+          <indexFieldType>PROPER_NAME</indexFieldType>
+          <isKeyword v="true" />
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>ORGANISATIONID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>STANDARD_EMAIL_COMMUNICATION.value</name>
+          <indexFieldType>COMM</indexFieldType>
+          <additionalFieldNameAliases>
+            <element>comm</element>
+          </additionalFieldNameAliases>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>STANDARD_PHONE_COMMUNICATION.value</name>
+          <indexFieldType>COMM</indexFieldType>
+          <additionalFieldNameAliases>
+            <element>comm</element>
+          </additionalFieldNameAliases>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACTID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Organisation_entity/recordcontainers/index/affectedConsumerIds.js b/entity/Organisation_entity/recordcontainers/index/affectedConsumerIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..7919d22f394b5bc96cda226f0c2b309c9d4e8296
--- /dev/null
+++ b/entity/Organisation_entity/recordcontainers/index/affectedConsumerIds.js
@@ -0,0 +1,60 @@
+import("system.datetime");
+import("system.result");
+import("system.vars");
+import("system.entities");
+import("system.db");
+import("system.logging");
+import("system.util");
+import("Util_lib");
+
+var res = [];
+
+var currId = null;
+var alias = vars.get("$local.indexgroupAlias");
+if(vars.exists("$local.idvalue"))
+{
+    
+    currId = vars.get("$local.idvalue");
+    
+    addAddressIds(res, currId);
+    addCommunicationIds(res, currId);
+ 
+}
+
+result.object(res);
+
+function addIds(pRes, pConsumerName, pIds)
+{
+   var elem = [];
+   elem[0]=pConsumerName;
+   
+   if(pIds == undefined || pIds == null || pIds.length <= 0) {
+       elem[1] = "";
+   }
+   else {
+       elem[1] = StringUtils.concat(",", pIds);
+   }
+   
+   logging.log(elem);
+   pRes.push(elem);
+}
+
+function addAddressIds(pRes, pCurrId)
+{
+    var sql, ids;
+    sql = "select ADDRESS.ADDRESSID from ADDRESS left join CONTACT on CONTACT.CONTACTID = ADDRESS.CONTACT_ID where CONTACT.ORGANISATION_ID = '" + pCurrId + "'";
+    ids = db.array(db.COLUMN, sql, alias, 0 , 1 * datetime.ONE_MINUTE);
+    
+    logging.log("Addresses: " + ids);
+    addIds(pRes, "Addresses", ids);
+}
+
+function addCommunicationIds(pRes, pCurrId)
+{
+    var sql, ids;
+    sql = "select COMMUNICATION.COMMUNICATIONID from COMMUNICATION left join CONTACT on CONTACT.CONTACTID = COMMUNICATION.CONTACT_ID where CONTACT.ORGANISATION_ID = '" + pCurrId + "'";
+    ids = db.array(db.COLUMN, sql, alias, 0 , 1 * datetime.ONE_MINUTE);
+    
+    logging.log("Communications: " + ids);
+    addIds(pRes, "Communications", ids);
+}
diff --git a/entity/Organisation_entity/recordcontainers/index/affectedIds.js b/entity/Organisation_entity/recordcontainers/index/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..a218f2371431421b67c3978abc8c3f31ae34602f
--- /dev/null
+++ b/entity/Organisation_entity/recordcontainers/index/affectedIds.js
@@ -0,0 +1,66 @@
+import("system.db");
+import("system.result");
+import("system.vars");
+import("IndexSearch_lib");
+import("Sql_lib");
+
+var infoContainer, onUpdFn, tableName, res;
+
+tableName = vars.get("$local.table");
+idValue = vars.get("$local.idvalue");
+infoContainer =  IndexsearchUtils.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 "CONTACT":
+        res = [idValue];
+        break;    
+    case "ORGANISATION":
+        res = db.array(db.COLUMN, "select CONTACT.CONTACTID from CONTACT where CONTACT.PERSON_ID is null and CONTACT.ORGANISATION_ID = '" + idValue + "'");
+        break;
+    case "ADDRESS":
+        res = IndexsearchUtils.getAffectedIdValues("CONTACT_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select ADDRESS.CONTACT_ID from ADDRESS where ADDRESS.ADDRESSID = ?", [
+                    [id, SqlUtils.getSingleColumnType("ADDRESS", "ADDRESSID")]
+            ]]);
+        });
+        break;
+    case "COMMUNICATION":
+        res = IndexsearchUtils.getAffectedIdValues("CONTACT_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select COMMUNICATION.CONTACT_ID from COMMUNICATION where COMMUNICATIONID = ?", [
+                    [id, SqlUtils.getSingleColumnType("COMMUNICATION", "COMMUNICATIONID")]
+            ]]);
+        });
+        break;
+}
+
+switch (tableName)
+{
+    case "ORGANISATION":
+        res = [idValue];
+        break;    
+    case "CONTACT":
+        res = db.array(db.COLUMN, "select CONTACT.ORGANISATION_ID from CONTACT where CONTACT.PERSON_ID is null and CONTACT.CONTACTID = '" + idValue + "'");
+        break;
+    case "ADDRESS":
+        res = IndexsearchUtils.getAffectedIdValues("CONTACT_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select CONTACT.ORGANISATION_ID from ADDRESS left join CONTACT on CONTACT.CONTACTID = ADDRESS.CONTACT_ID where CONTACT.PERSON_ID is null and ADDRESS.ADDRESSID = ?", [
+                    [id, SqlUtils.getSingleColumnType("ADDRESS", "ADDRESSID")]
+            ]]);
+        });
+        break;
+    case "COMMUNICATION":
+        res = IndexsearchUtils.getAffectedIdValues("CONTACT_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select CONTACT.ORGANISATION_ID from COMMUNICATION left join CONTACT on CONTACT.CONTACTID = COMMUNICATION.CONTACT_ID where CONTACT.PERSON_ID is null and where COMMUNICATIONID = ?", [
+                    [id, SqlUtils.getSingleColumnType("COMMUNICATION", "COMMUNICATIONID")]
+            ]]);
+        });
+        break;
+}
+
+if (res) {
+    result.object(res);
+}
\ No newline at end of file
diff --git a/entity/Organisation_entity/recordcontainers/index/query.js b/entity/Organisation_entity/recordcontainers/index/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..37f5ff41f9b08d524593737395b9dd4874c68477
--- /dev/null
+++ b/entity/Organisation_entity/recordcontainers/index/query.js
@@ -0,0 +1,37 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Sql_lib");
+import("Communication_lib");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where CONTACT.CONTACTID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select ORGANISATION.ORGANISATIONID as uid"
+    + ", " + sqlHelper.concat(["ORGANISATION.NAME", "'|'", "ORGANISATION.CUSTOMERCODE"]) 
+    + " as title "
+    + ", " + sqlHelper.concat([
+         sqlHelper.concat(["defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO", "'-'"
+            ,"defaultAddress.COUNTRY", "defaultAddress.ZIP", "defaultAddress.CITY"])
+        ,sqlHelper.concat(["'" + translate.text("Phone") + ":'", "(" + CommUtil.getStandardSubSqlPhone() + ")"])
+        ,sqlHelper.concat(["'" + translate.text("Email") + ":'", "(" + CommUtil.getStandardSubSqlMail() + ")"])
+        ], " | ") + " as description "
+    //additional indexed fields
+    + ", ORGANISATION.ORGANISATIONID"
+    + ", ORGANISATION.NAME"
+    + ", CONTACT.CONTACTID"
+    + ", (" + CommUtil.getStandardSubSqlPhone() + ') as "STANDARD_PHONE_COMMUNICATION.value"'
+    + ", (" + CommUtil.getStandardSubSqlMail() + ') as "STANDARD_EMAIL_COMMUNICATION.value"'
+    + " from ORGANISATION "
+    + " join CONTACT on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID and CONTACT.PERSON_ID is null "
+    + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = CONTACT.ADDRESS_ID "
+    + " left join COMMUNICATION on COMMUNICATION.CONTACT_ID = CONTACT.CONTACTID "
+    + (queryCondition || "") 
+    + " order by CONTACT.CONTACTID ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index b985f968bb922b3d3389c4c70bbd2025e27ca82a..0d86874b8e6a0636c068a0b5de45049163320cce 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -1086,5 +1086,62 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	<indexRecordContainer>
+      <name>index</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <patternExtensionProcess>%aditoprj%/entity/Person_entity/recordcontainers/index/patternExtensionProcess.js</patternExtensionProcess>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <query>%aditoprj%/entity/Person_entity/recordcontainers/index/query.js</query>
+      <affectedTables>
+        <element>ADDRESS</element>
+        <element>COMMUNICATION</element>
+        <element>PERSON</element>
+        <element>CONTACT</element>
+        <element>ORGANISATION</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Person_entity/recordcontainers/index/affectedIds.js</affectedIds>
+      <includedConsumers>
+        <element>PersAddresses</element>
+        <element>OrgAddresses</element>
+        <element>Communications</element>
+      </includedConsumers>
+      <affectedConsumerIds>%aditoprj%/entity/Person_entity/recordcontainers/index/affectedConsumerIds.js</affectedConsumerIds>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>FIRSTNAME.value</name>
+          <indexFieldType>PERS_NAME</indexFieldType>
+          <isKeyword v="true" />
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>LASTNAME.value</name>
+          <indexFieldType>PERS_NAME</indexFieldType>
+          <isKeyword v="true" />
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>SALUTATION.value</name>
+          <indexFieldType>PERS_NAME</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>TITLE.value</name>
+          <indexFieldType>PERS_NAME</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>ORGANISATION_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>ORGGANISATION_NAME.value</name>
+          <indexFieldType>PROPER_NAME</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>PERSON_ID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTACTID.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Person_entity/recordcontainers/index/affectedConsumerIds.js b/entity/Person_entity/recordcontainers/index/affectedConsumerIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c9ac195cdd862ef4739db4c045114bcba2139b0
--- /dev/null
+++ b/entity/Person_entity/recordcontainers/index/affectedConsumerIds.js
@@ -0,0 +1,70 @@
+import("system.datetime");
+import("system.result");
+import("system.vars");
+import("system.entities");
+import("system.db");
+import("system.logging");
+import("system.util");
+import("Util_lib");
+
+var res = [];
+
+var currId = null;
+var alias = vars.get("$local.indexgroupAlias");
+if(vars.exists("$local.idvalue"))
+{
+    
+    currId = vars.get("$local.idvalue");
+    
+    addPersAddressIds(res, currId);
+    addOrgAddressIds(res, currId);
+    addCommunicationIds(res, currId);
+ 
+}
+
+result.object(res);
+
+function addIds(pRes, pConsumerName, pIds)
+{
+   var elem = [];
+   elem[0]=pConsumerName;
+   
+   if(pIds == undefined || pIds == null || pIds.length <= 0) {
+       elem[1] = "";
+   }
+   else {
+       elem[1] = StringUtils.concat(",", pIds);
+   }
+   
+   logging.log(elem);
+   pRes.push(elem);
+}
+
+function addPersAddressIds(pRes, pCurrId)
+{
+    var sql, ids;
+    sql = "select ADDRESS.ADDRESSID from ADDRESS left join CONTACT on CONTACT.CONTACTID = ADDRESS.CONTACT_ID where CONTACT.PERSON_ID = '" + pCurrId + "'";
+    ids = db.array(db.COLUMN, sql, alias, 0 , 1 * datetime.ONE_MINUTE);
+    addIds(pRes, "PersAddresses", ids);
+}
+
+function addOrgAddressIds(pRes, pCurrId)
+{
+    var sql, ids;
+    sql = "select CONTACT.ADDRESS_ID from ORGANISATION " 
+        + "join CONTACT on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID and CONTACT.PERSON_ID is null " 
+        + "where ORGANISATION.ORGANISATIONID  = ( " 
+        + "select c.ORGANISATION_ID FROM CONTACT as c where c.PERSON_ID = '" + pCurrId 
+        + "')";
+    
+    ids = db.array(db.COLUMN, sql, alias, 0 , 1 * datetime.ONE_MINUTE);
+    addIds(pRes, "OrgAddresses", ids);
+}
+
+function addCommunicationIds(pRes, pCurrId)
+{
+    var sql, ids;
+    sql = "select COMMUNICATION.COMMUNICATIONID from COMMUNICATION left join CONTACT on CONTACT.CONTACTID = COMMUNICATION.CONTACT_ID where CONTACT.PERSON_ID = '" + pCurrId + "'";
+    ids = db.array(db.COLUMN, sql, alias, 0 , 1 * datetime.ONE_MINUTE);
+    addIds(pRes, "Communications", ids);
+}
diff --git a/entity/Person_entity/recordcontainers/index/affectedIds.js b/entity/Person_entity/recordcontainers/index/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..e1040dbf0112d86358cb87e1a3ab7b40f8ec60f3
--- /dev/null
+++ b/entity/Person_entity/recordcontainers/index/affectedIds.js
@@ -0,0 +1,73 @@
+import("system.db");
+import("system.result");
+import("system.vars");
+import("IndexSearch_lib");
+import("Sql_lib");
+
+var infoContainer, onUpdFn, tableName, res;
+
+tableName = vars.get("$local.table");
+idValue = vars.get("$local.idvalue");
+infoContainer =  IndexsearchUtils.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 "CONTACT":
+//        res = [idValue];
+//        break;    
+//    case "PERSON":
+//        res = db.array(db.COLUMN, "select CONTACT.CONTACTID from CONTACT where CONTACT.PERSON_ID = '" + idValue + "'");
+//        break;
+//    case "ORGANISATION":
+//        res = db.array(db.COLUMN, "select CONTACT.CONTACTID from CONTACT where CONTACT.PERSON_ID is not null and CONTACT.ORGANISATION_ID = '" + idValue + "'");
+//        break;
+//    case "ADDRESS":
+//        res = IndexsearchUtils.getAffectedIdValues("CONTACT_ID", infoContainer, function (id){
+//            return db.array(db.COLUMN, ["select ADDRESS.CONTACT_ID from ADDRESS where ADDRESS.ADDRESSID = ?", [
+//                    [id, SqlUtils.getSingleColumnType("ADDRESS", "ADDRESSID")]
+//            ]]);
+//        });
+//        break;
+//    case "COMMUNICATION":
+//        res = IndexsearchUtils.getAffectedIdValues("CONTACT_ID", infoContainer, function (id){
+//            return db.array(db.COLUMN, ["select COMMUNICATION.CONTACT_ID from COMMUNICATION where COMMUNICATIONID = ?", [
+//                    [id, SqlUtils.getSingleColumnType("COMMUNICATION", "COMMUNICATIONID")]
+//            ]]);
+//        });
+//        break;
+//}
+
+switch (tableName)
+{
+    case "PERSON":
+        res = [idValue];
+        break;    
+    case "CONTACT":
+        res = db.array(db.COLUMN, "select CONTACT.PERSON_ID from CONTACT where CONTACT.CONTACTID = '" + idValue + "'");
+        break;
+    case "ORGANISATION":
+        res = db.array(db.COLUMN, "select CONTACT.PERSON_ID from CONTACT where CONTACT.PERSON_ID is not null and CONTACT.ORGANISATION_ID = '" + idValue + "'");
+        break;
+    case "ADDRESS":
+        res = IndexsearchUtils.getAffectedIdValues("PERSON_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select CONTACT.PERSON_ID from ADDRESS left join CONTACT on CONTACT.CONTACTID = ADDRESS.CONTACT_ID where CONTACT.PERSON_ID is not null and ADDRESS.ADDRESSID = ?", [
+                    [id, SqlUtils.getSingleColumnType("ADDRESS", "ADDRESSID")]
+            ]]);
+        });
+        break;
+    case "COMMUNICATION":
+        res = IndexsearchUtils.getAffectedIdValues("PERSON_ID", infoContainer, function (id){
+            return db.array(db.COLUMN, ["select CONTACT.PERSON_ID from COMMUNICATION left join CONTACT on CONTACT.CONTACTID = COMMUNICATION.CONTACT_ID where CONTACT.PERSON_ID is not null and where COMMUNICATIONID = ?", [
+                    [id, SqlUtils.getSingleColumnType("COMMUNICATION", "COMMUNICATIONID")]
+            ]]);
+        });
+        break;
+}
+
+if (res) {
+    result.object(res);
+}
+    
\ No newline at end of file
diff --git a/entity/Person_entity/recordcontainers/index/patternExtensionProcess.js b/entity/Person_entity/recordcontainers/index/patternExtensionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e1de697d7b7cdca5d450f2061da1154906517734
--- /dev/null
+++ b/entity/Person_entity/recordcontainers/index/patternExtensionProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+
+var pattern = vars.get("$local.pattern");
+
+var extension = "";
+
+if(pattern.search("AG") != -1 || pattern.search("ag") != -1){
+    extension += "-firstname:anja";
+}
+
+result.string(extension);
\ No newline at end of file
diff --git a/entity/Person_entity/recordcontainers/index/query.js b/entity/Person_entity/recordcontainers/index/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..c77a81ee093b2331180c133e7f1274af2169f1a7
--- /dev/null
+++ b/entity/Person_entity/recordcontainers/index/query.js
@@ -0,0 +1,41 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Sql_lib");
+import("Communication_lib");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where CONTACT.CONTACTID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select PERSON.PERSONID as uid "
+    + "," + sqlHelper.concat(["PERSON.SALUTATION", "PERSON.FIRSTNAME", "PERSON.LASTNAME", "'|'", "ORGANISATION.NAME"]) 
+    + ' as "_title_" '
+    + "," + sqlHelper.concat([
+         sqlHelper.concat(["defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO", "'-'"
+            ,"defaultAddress.COUNTRY", "defaultAddress.ZIP", "defaultAddress.CITY"])
+        ,sqlHelper.concat(["'" + translate.text("Phone") + ":'", "(" + CommUtil.getStandardSubSqlPhone() + ")"])
+        ,sqlHelper.concat(["'" + translate.text("Email") + ":'", "(" + CommUtil.getStandardSubSqlMail() + ")"])
+        ], " | ") + " as description "
+    //additional indexed fields
+    + ", PERSON.PERSONID "
+    + ", PERSON.FIRSTNAME "
+    + ", PERSON.LASTNAME "
+    + ", PERSON.SALUTATION "
+    + ', PERSON.TITLE as "TITLE.value"'
+    + ", CONTACT.CONTACTID "
+    + ", CONTACT.ORGANISATION_ID "
+    + ", ORGANISATION.NAME "
+    + " from PERSON "
+    + " join CONTACT on CONTACT.PERSON_ID = PERSON.PERSONID "
+    + " join ORGANISATION on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID "
+    + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = CONTACT.ADDRESS_ID "
+    + " left join COMMUNICATION on COMMUNICATION.CONTACT_ID = CONTACT.CONTACTID "
+    + (queryCondition || "") 
+    + " order by CONTACT.CONTACTID ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index 631c68ce9e7dd046284afa113fa6150eb5c92f60..365a3107032ee563963a3fbc1e0df1ed1d733f59 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -554,5 +554,21 @@
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	<indexRecordContainer>
+      <name>index</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <query>%aditoprj%/entity/Product_entity/recordcontainers/index/query.js</query>
+      <affectedTables>
+        <element>PRODUCT</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Product_entity/recordcontainers/index/affectedIds.js</affectedIds>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>PRODUCTCODE.value</name>
+          <indexFieldType>TEXT_PLAIN</indexFieldType>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Product_entity/recordcontainers/index/affectedIds.js b/entity/Product_entity/recordcontainers/index/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ce4eca596f562519fd3e40d69d57afad64c62
--- /dev/null
+++ b/entity/Product_entity/recordcontainers/index/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/entity/Product_entity/recordcontainers/index/query.js b/entity/Product_entity/recordcontainers/index/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..34a9a7a3beae0a79423a22b105e737b178717dde
--- /dev/null
+++ b/entity/Product_entity/recordcontainers/index/query.js
@@ -0,0 +1,25 @@
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Keyword_lib");
+import("Sql_lib");
+import("KeywordRegistry_basic");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+queryCondition = "";
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where PRODUCTID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select PRODUCTID as uid, " 
+    + sqlHelper.concat(["PRODUCTCODE", "PRODUCTNAME"], " | ")
+    + " as title, " 
+    + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "GROUPCODEID")
+    + " as description" 
+    + ", PRODUCTCODE " 
+    + " from PRODUCT "
+    + queryCondition + " order by PRODUCTCODE ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 5c578e6b4e209390e615d38e56f2d3f1827dd0d6..e70eed207f42d9e41ab41586bf8e2f4baef598c4 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -772,5 +772,42 @@
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
+	<indexRecordContainer>
+      <name>index</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <query>%aditoprj%/entity/Salesproject_entity/recordcontainers/index/query.js</query>
+      <affectedTables>
+        <element>SALESPROJECT</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/Salesproject_entity/recordcontainers/index/affectedIds.js</affectedIds>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <indexFieldMappings>
+        <indexRecordFieldMapping>
+          <name>PROJECTCODE.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>PROJECTTITLE.value</name>
+          <indexFieldType>TEXT</indexFieldType>
+          <stored v="false" />
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>STATE.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>STATE.displayValue</name>
+          <indexFieldType>TEXT_PLAIN</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>PHASE.value</name>
+          <indexFieldType>STRING</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>PHASE.displayValue</name>
+          <indexFieldType>TEXT_PLAIN</indexFieldType>
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Salesproject_entity/recordcontainers/index/affectedIds.js b/entity/Salesproject_entity/recordcontainers/index/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ce4eca596f562519fd3e40d69d57afad64c62
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/index/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/index/query.js b/entity/Salesproject_entity/recordcontainers/index/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..ae0bd2e48c708ed1828ef89fbaf737d7100c8236
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/index/query.js
@@ -0,0 +1,33 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Keyword_lib");
+import("Sql_lib");
+import("KeywordRegistry_basic");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+queryCondition = "";
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where SALESPROJECTID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select SALESPROJECTID as uid" 
+    + ", PROJECTTITLE as title, " 
+    + sqlHelper.concat([
+        "'" + translate.text("Status") + ":'",  KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesprojectState(), "STATE"),
+        "'| " + translate.text("Phase") + ":'",  KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesprojectPhase(), "PHASE")
+      ]) 
+    + " as description" 
+    + ", PROJECTCODE"
+    + ", PROJECTTITLE"
+    + ", STATE" 
+    + ', ' + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesprojectState(), "STATE") + ' as "STATE.displayValue"'
+    + ", PHASE"
+    + ', ' + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesprojectState(), "PHASE") + ' as "PHASE.displayValue"'
+    + " from SALESPROJECT "
+    + queryCondition + " order by PROJECTCODE ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
index 13d39a2e6f4aef208ef318d0cdbc2f12adb829c2..1ab5cd880dcba51eb38567a90c86f655cc0dbe6d 100644
--- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
+++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
@@ -32,12 +32,14 @@
   <blobHandlingMethod>DATABASE</blobHandlingMethod>
   <databaseAuditGetOldValueLobs v="false" />
   <indexsearchGlobalEnabled v="true" />
+  <indexsearchUseLegacyConfiguration v="false" />
   <indexsearchFullIndexerEnabled v="true" />
   <indexsearchFullIndexerInterval v="0" />
   <indexsearchIncrementingIndexerEnabled v="true" />
   <indexsearchIncrementingIndexerInterval v="1000" />
   <indexsearchIncrementingIndexerBunchSize v="250" />
   <indexsearchMaximumHits v="50000" />
+  <indexsearchEnableChildDocSearches v="true" />
   <customProperties>
     <customBooleanProperty>
       <name>phoneValidation.enable</name>
diff --git a/process/indexsearch_patternextension/indexsearch_patternextension.aod b/process/indexsearch_patternextension/indexsearch_patternextension.aod
deleted file mode 100644
index 3917e2a4e1335e8771643089fff4e1457d43e447..0000000000000000000000000000000000000000
--- a/process/indexsearch_patternextension/indexsearch_patternextension.aod
+++ /dev/null
@@ -1,5 +0,0 @@
-<?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.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
-  <name>indexsearch_patternextension</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-</process>