diff --git a/entity/AddressValidation_entity/AddressValidation_entity.aod b/entity/AddressValidation_entity/AddressValidation_entity.aod
index 2f0920361f2a176bce413f95eb4144e859a111d7..90c7e6edcbb75846dde3ce3580f4c29cde8798f4 100644
--- a/entity/AddressValidation_entity/AddressValidation_entity.aod
+++ b/entity/AddressValidation_entity/AddressValidation_entity.aod
@@ -115,14 +115,6 @@
       <name>STREET</name>
       <title>Street</title>
     </entityField>
-    <entityField>
-      <name>FROM_BN</name>
-      <title>From buildingnumber</title>
-    </entityField>
-    <entityField>
-      <name>TO_BN</name>
-      <title>To buildingnumber</title>
-    </entityField>
     <entityField>
       <name>LON</name>
     </entityField>
@@ -132,12 +124,17 @@
     <entityField>
       <name>CITYEXT</name>
     </entityField>
+    <entityField>
+      <name>BUILDINGNO</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
+      <jDitoRecordAlias></jDitoRecordAlias>
       <isFilterable v="true" />
       <isRequireContainerFiltering v="true" />
+      <isSortable v="true" />
       <contentProcess>%aditoprj%/entity/AddressValidation_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
@@ -171,10 +168,7 @@
           <name>STREET.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>FROM_BN.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>TO_BN.value</name>
+          <name>BUILDINGNO.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>LON.value</name>
@@ -182,9 +176,6 @@
         <jDitoRecordFieldMapping>
           <name>LAT.value</name>
         </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>VALUE.value</name>
-        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js b/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js
index 084f00d1815908c3c4241fc03c680834e03fc8d5..e8560045975cb9faf78db1adaa945d7db5a940fe 100644
--- a/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js
+++ b/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js
@@ -1,4 +1,4 @@
-import("WsValidation_lib");
-import("system.result");
-
-result.string(WsValidationType.get().TYPE_CITY.key);
\ No newline at end of file
+import("WsValidation_lib");
+import("system.result");
+
+result.string(WsValidationType.get().TYPE_CITY_NOMINATIM.key);
\ No newline at end of file
diff --git a/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js b/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js
index a6cfed5664099791a5129bacf8e86b3949a9a2db..daa9b19deddee5a66d9ccbb09e6675cbfba2473c 100644
--- a/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js
+++ b/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js
@@ -1,4 +1,5 @@
 import("WsValidation_lib");
 import("system.result");
 
-result.string(WsValidationType.get().TYPE_ADDRESS.key);
\ No newline at end of file
+// result.string(WsValidationType.get().TYPE_ADDRESS.key);
+result.string(WsValidationType.get().TYPE_ADDRESS_NOMINATIM.key);
\ No newline at end of file
diff --git a/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js b/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js
index 93426dc98cda1bfc555d22dcbac1929ad4872919..6ab3539198339ca785870777ce0642f0c4e6ba9f 100644
--- a/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js
+++ b/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js
@@ -1,4 +1,4 @@
-import("WsValidation_lib");
-import("system.result");
-
-result.string(WsValidationType.get().TYPE_ZIP.key);
\ No newline at end of file
+import("WsValidation_lib");
+import("system.result");
+
+result.string(WsValidationType.get().TYPE_ZIP_NOMINATIM.key);
\ No newline at end of file
diff --git a/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js b/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js
index b51e1bdca25fd6259183417a6a823361750f2188..3312d2f2f01c895d6887c0cdc653a4246ba1f173 100644
--- a/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js
+++ b/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.result");
 import("system.vars");
 
-    result.string(vars.get("$field.AddressSearch"));
\ No newline at end of file
+result.string(vars.get("$field.AddressSearch"));
\ No newline at end of file
diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
index ee8627ef2298007f8266808aec8649c414a1ca9b..7cad7fda51be949fa5472fba40013dc7e371e9d9 100644
--- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
+++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
@@ -39,46 +39,6 @@
   <indexsearchIncrementingIndexerBunchSize v="250" />
   <indexsearchMaximumHits v="50000" />
   <customProperties>
-    <customBooleanProperty>
-      <name>addressValidation.enable</name>
-      <property v="true" />
-    </customBooleanProperty>
-    <customStringProperty>
-      <name>addressValidation.url</name>
-      <property>https://services.aditosoftware.local/services/rest/ws_checkAddress</property>
-    </customStringProperty>
-    <customStringProperty>
-      <name>addressValidation.user</name>
-      <property>Admin</property>
-    </customStringProperty>
-    <customStringProperty>
-      <name>addressValidation.pw</name>
-      <property>a</property>
-    </customStringProperty>
-    <customStringProperty>
-      <name>addressValidation.countryParamName</name>
-      <property>country</property>
-    </customStringProperty>
-    <customBooleanProperty>
-      <name>zipCityValidation.enable</name>
-      <property v="true" />
-    </customBooleanProperty>
-    <customStringProperty>
-      <name>zipCityValidation.url</name>
-      <property>https://services.aditosoftware.local/services/rest/ws_checkZipCity</property>
-    </customStringProperty>
-    <customStringProperty>
-      <name>zipCityValidation.user</name>
-      <property>Admin</property>
-    </customStringProperty>
-    <customStringProperty>
-      <name>zipCityValidation.pw</name>
-      <property>a</property>
-    </customStringProperty>
-    <customStringProperty>
-      <name>zipCityValidation.countryParamName</name>
-      <property>country</property>
-    </customStringProperty>
     <customBooleanProperty>
       <name>phoneValidation.enable</name>
       <description></description>
@@ -102,11 +62,11 @@
       <property>Country</property>
     </customStringProperty>
     <customBooleanProperty>
-      <name>osm.enable</name>
-      <property v="true" />
+      <name>nominatim.enable</name>
+      <property v="false" />
     </customBooleanProperty>
     <customStringProperty>
-      <name>osm.url</name>
+      <name>nominatim.url</name>
       <property>https://nominatim.openstreetmap.org/search</property>
     </customStringProperty>
   </customProperties>
diff --git a/process/DSGVO_lib/process.js b/process/DSGVO_lib/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e7b8df70ea110892c5b043df6b2059da835b4cf
--- /dev/null
+++ b/process/DSGVO_lib/process.js
@@ -0,0 +1,374 @@
+import("Attribute_lib");
+import("system.logging");
+import("Keyword_lib")
+import("KeywordRegistry_basic");
+import("system.translate");
+import("Sql_lib");
+import("system.util");
+import("system.vars");
+import("system.db");
+import("system.neon");
+import("system.result");
+import("Report_lib");
+
+// TODO Funktionen aus Adito5 übernehmen und anpassen
+
+
+function getDSGVOTypes (pPerson, pTablename)
+{
+    var res = [];
+    
+    var tablename = KeywordUtils.getViewValue($KeywordRegistry.DSGVOTablename(), pTablename);
+    
+    if (tablename == "Adressen")
+    {
+        // TODO liefert aktuell nur eine Privatadresse, wenn mehrere Vorhanden und keine Firmenadresse
+        // Bsp Birgit Leicht
+
+        var addr = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select ADDR_TYPE from ADDRESS join CONTACT on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID ", 
+                "1 = 1", "group by ADDR_TYPE"));
+
+        addr.forEach(function (row)
+        {
+            res.push([row[0], KeywordUtils.getViewValue($KeywordRegistry.addressType(), row)]);
+        });
+        return res;
+    } else if(tablename == "Kommunikationsdaten")
+    {
+        var comm = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select MEDIUM_ID from COMMUNICATION join CONTACT on COMMUNICATION.CONTACT_ID = CONTACTID", 
+                "1 = 1", "group by MEDIUM_ID"));
+
+        comm.forEach(function (row)
+        {
+            res.push([row[0], KeywordUtils.getViewValue($KeywordRegistry.communicationMedium(), row)]);
+        });
+        return res;
+    }else if(tablename == "Eigenschaft")
+    {
+        res.push(["34c2ddb4-97ce-4683-a067-89a38643ecae", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "34c2ddb4-97ce-4683-a067-89a38643ecae")]);
+        return res;
+    }else if(tablename == "Persönliche Daten")
+    {
+        res.push(["dcc34a11-c86b-4acd-9987-e88c98b5b4c5", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "dcc34a11-c86b-4acd-9987-e88c98b5b4c5")]);
+        res.push(["c626726a-a696-4926-9b0f-c320c410463e", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "c626726a-a696-4926-9b0f-c320c410463e")]);
+        return res;
+    }
+    
+    return res;
+}
+
+function getDSGVOValues(pPerson, pTablename, pType)
+{
+    var res = [];
+    var tablename = KeywordUtils.getViewValue($KeywordRegistry.DSGVOTablename(), pTablename);
+
+    if (tablename == "Adressen")
+    {
+        var addr = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select ADDRESSID, ADDRESS, ADDRESSADDITION, ADDRIDENTIFIER, " 
+                + "BUILDINGNO, CITY, COUNTRY, DISTRICT, REGION, STATE, ZIP, ADDR_TYPE " 
+                + "from ADDRESS join CONTACT on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID", "1 = 1"));
+        
+        var addrVal = "";
+        
+        addr.forEach(function (addrRow)
+        {
+            if(pType == addrRow[11])
+                    addrVal = addrRow[1] + " " + addrRow[2] + " " + addrRow[3] + " "+ addrRow[4] + " " + 
+                        addrRow[5] + " " + addrRow[6] + " " + addrRow[7] + " " + 
+                        addrRow[8] + " " + addrRow[9] + " " + addrRow[10];
+                    res.push([addrRow[0], addrVal]);
+        });
+        return res;
+    }else if(tablename == "Kommunikationsdaten")
+    {
+        var comm = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select COMMUNICATIONID, ADDR, MEDIUM_ID " 
+                + "from COMMUNICATION join CONTACT on COMMUNICATION.CONTACT_ID = CONTACTID", "1 = 1"));
+
+        comm.forEach(function (entry)
+        {
+            if(pType == entry[2])
+                res.push([entry[2], entry[1]]);
+        });
+    }else if(tablename == "Eigenschaft")
+    {
+        var attr = AttributeRelationUtils.getAllAttributes(pPerson, "Person");
+        logging.log(attr);
+        /*attr.forEach(function (entry)
+        {
+            // TODO muss erst attr was liefern, --> leer
+            res.push(["", ""]);
+        })*/
+        
+          // Keyword KeyId: ["34c2ddb4-97ce-4683-a067-89a38643ecae", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "34c2ddb4-97ce-4683-a067-89a38643ecae")]);
+
+        return res;
+    }else if(tablename == "Persönliche Daten")
+    {
+        
+        var pers = db.table(SqlCondition.begin()
+            .andPrepare("PERSON.PERSONID", pPerson)
+            .buildSql("select PERSONID, DATEOFBIRTH, FIRSTNAME, MIDDLENAME, LASTNAME, " 
+                + "GENDER, SALUTATION, TITLE, TITLESUFFIX, PICTURE "
+            + "from PERSON", "1 = 1"));
+        
+        switch (pType)
+        {
+            case "dcc34a11-c86b-4acd-9987-e88c98b5b4c5": // names
+                res.push(["dcc34a11-c86b-4acd-9987-e88c98b5b4c5", (pers[0][6] + " " + pers[0][7] + " " + pers[0][8] + " " + pers[0][2] + " " + pers[0][3] + " " + pers[0][4])]);
+                return res;
+            case "c626726a-a696-4926-9b0f-c320c410463e": // Sonstige Persönliche Daten
+                res.push(["c626726a-a696-4926-9b0f-c320c410463e", (pers[0][9] + pers[0][1] + ", " + pers[0][5])]);
+                return res;
+        }
+    }
+    return res;
+    
+}
+
+function getSpecificRowId(pPerson, pTablename)
+{
+    var tablename = KeywordUtils.getViewValue($KeywordRegistry.DSGVOTablename(), pTablename);
+
+    if (tablename == "Adressen")
+    {
+        return db.cell(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select ADDRESSID from ADDRESS join CONTACT on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID", "1 = 1"));
+    }else if(tablename == "Kommunikationsdaten")
+    {
+        return db.cell(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select COMMUNICATIONID from COMMUNICATION join CONTACT on COMMUNICATION.CONTACT_ID = CONTACTID", "1 = 1"));
+    }else if(tablename == "Eigenschaft")
+    {
+        // TODO attribute
+        return "";
+    }else if(tablename == "Persönliche Daten")
+    {
+        return pPerson;
+    }
+    else 
+        return null;
+}
+
+function openDSGVOReport(pPerson, pReportName)
+{
+    var DSGVOReport = new Report(pReportName);
+    
+    // TODO: get Images implementieren
+    var imgData = ["meineFirma | Konrad-Zuse-Straße 4  |  DE 84144 Geisenhausen",
+    "base64:iVBORw0KGgoAAAANSUhEUgAAAM4AAABRCAYAAACaL5lSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDA4QzAyM0IwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDA4QzAyM0MwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDhDMDIzOTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDhDMDIzQTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhF3nYoAAAlvSURBVHja7J1fjBXV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"]
+    
+    var dsgvo = SQLCondition.begin().andPrepareValue("DSGVO.CONTACT_ID", pPerson)
+                .buildSql("select DSGVOID, ROW_ID, STATUORITYSOURCE, PURPOSE, TABLENAME, VALID_TO, CONTACT_ID " 
+                    + "from DSGVO", "1 = 1")
+                // getDSGVOTypes / -Values
+    
+    // TODO Parameter und Felder
+    // params: adito.image.myLogo, myAddress, address, salutation, dateRequest, deadline, dateSaveTill, transmission, fromOther
+    // Felder PURPOSE, STATUORITYSOURCE, VALID_TO, TYPE, VALUE
+    
+    var params = {
+        "adito.image.myLogo" : "", 
+        "myAddress" : "", 
+        "address" : "", 
+        "salutation" : "", // ggf. lettersalutation -> Contact
+        "dateRequest" : "", 
+        "deadline" : "",
+        "dateSaveTill" : "",
+        "transmission" : "", 
+        "fromOther" : ""        
+    };
+
+    DSGVOReport.setReportData(ReportData.begin([
+        "PURPOSE",
+        "STATUORITYSOURCE",
+        "VALID_TO",
+        "TYPE",
+        "VALUE"
+        ]));
+    DSGVOReport.addImage("myLogo", imgData[1]);
+    DSGVOReport.addReportParams(params);
+    DSGVOReport.openReport();
+}
+
+
+/**
+ * makes selected data from a private contact anonymous
+ * 
+ * @param pPersId 
+ * @param pContactId 
+ */
+function dsgvoMkDataAnonymous(pPersId, pContactId)
+{       
+    // TODO Only Data that comes from private contacts
+    // TODO ggf. nur ein Param notwendig? oder pRowId statt pPersId
+
+    //Hat die Privat-Person auch eine Funktion an einer Firma
+    var hasFunction         = db.cell(SqlCondition.begin()
+        .andPrepare("CONTACT.PERSON_ID", pPersId)
+        .andPrepare("CONTACT.ORGANISATION_ID", "0",  "# != ?") // TODO ungleich 0, stimmt das so?
+        .build(" select count(*) from CONTACT", "1=2"));
+    // db.cell(" select count(*) from RELATION where PERS_ID = '" + pPersId + "' and ORGANISATION != '0' ");
+    
+    var prompts             = new Array();
+    prompts["PERSREL"]      = hasFunction;
+    var jsonResult          = openOkCancelDialog("DLG_CHOOSE_DATA_PRIVACY_ANONYMISATION", prompts);
+    var newAnonymCategories = new Array();
+    var updArray            = [];
+    
+    if (jsonResult["button"] != "ok")
+        return;
+  
+    var data, values, columns, columnTypes, condition;
+    
+    //Namen
+    if ((jsonResult["comp.chb_Names"] == "true"))
+    {
+        data                = db.array(db.ROW, SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPersId)
+            .build("select SALUTATION, TITLE, FIRSTNAME, MIDDLENAME, LASTNAME from PERS ", "1=2")
+            );
+        /*data = db.array(db.ROW, "select SALUTATION, TITLE, FIRSTNAME, MIDDLENAME, LASTNAME "
+            + " from PERS "
+            + " where PERSID = '" + pPersId + "'");*/
+        
+        values  = [dsgvoMkTextAnonymous(data[0]), dsgvoMkTextAnonymous(data[1]), dsgvoMkTextAnonymous(data[2]), dsgvoMkTextAnonymous(data[3]), dsgvoMkTextAnonymous(data[4])];
+        columns = ["SALUTATION", "TITLE", "FIRSTNAME", "MIDDLENAME", "LASTNAME"];
+        columnTypes = db.getColumnTypes("PERSON", columns);
+        condition = SqlCondition.andPrepare("PERSONID", pPersId)
+        .and("1=2");        
+        //condition = "PERSONID = '" + pPersId + "'";
+        updArray.push(["PERSON", columns, columnTypes, values, condition])
+        
+        newAnonymCategories.push(translate.text("Namen"));
+    }
+    
+    //sonstige personenbezogene Daten
+    if (jsonResult["comp.chb_others"] == "true") 
+    {
+        data                = db.array(db.ROW, SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPersId)
+            .build("select DOB, GENDER, SUFFIX, PERSINFO from PERS ", "1=2"));
+        
+        /*, "select DOB, GENDER, SUFFIX, PERSINFO "
+            + " from PERS "
+            + " where PERSID = '" + pPersId + "' ")
+        */
+        values  = ["", "", "", ""];
+        columns = ["DOB", "GENDER", "SUFFIX", "PERSINFO"];
+        columnTypes = db.getColumnTypes("PERS", columns);
+        condition = SqlCondition.andPrepare("PERSONID", pPersId)
+        .and("1=2");
+        //condition = "PERSID = '" + pPersId + "'";        
+        updArray.push(["PERS", columns, columnTypes, values, condition])
+        
+        newAnonymCategories.push(translate.text("Sonstige personenbezogene Daten"));
+    }
+
+    //Addressen
+    if(jsonResult["comp.chb_Address"] == "true")
+    {
+        data                = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT_ID", pContactId)
+            .build("select ADDRESS, STATE, CITY, COUNTRY, REGION, BUILDINGNO, ADDRESSADDITION, ZIP, DISTRICT, ADDRESSID "
+                + " from ADDRESS ", "1=2" ));
+        
+        /*" select ADDRESS, STATE, CITY, COUNTRY, REGION, BUILDINGNO, ADDRESSADDITION, ZIP, DISTRICT, ADDRESSID "
+            + " from ADDRESS " 
+            + " where RELATION_ID = '" + pContactId + "' ");
+*/
+        columns = ["ADDRESS", "STATE", "CITY", "COUNTRY", "REGION", "BUILDINGNO", "ADDRESSADDITION", "ZIP", "DISTRICT"];
+        columnTypes = db.getColumnTypes("ADDRESS", columns);
+
+        //Jede Addresse muss separat anonymisiert werden
+        for (let i = 0; i < data.length; i++) {
+            values = [dsgvoMkTextAnonymous(data[i][0]), dsgvoMkTextAnonymous(data[i][1]), 
+            dsgvoMkTextAnonymous(data[i][2]), dsgvoMkTextAnonymous(data[i][3]), 
+            dsgvoMkTextAnonymous(data[i][4]), dsgvoMkTextAnonymous(data[i][5]), 
+            dsgvoMkTextAnonymous(data[i][6]), dsgvoMkTextAnonymous(data[i][7]),
+            dsgvoMkTextAnonymous(data[i][8])];
+            
+            // TODO prüfen
+            condition = SqlCondition.andPrepare("CONTACT_ID", pContactId)
+            .andPrepare("ADDRESSID", data[i][9])
+            .and("1=2");
+            //condition = " CONTACT_ID = '" + pContactId + "' and ADDRESSID = '" + data[i][9] + "' ";
+            updArray.push(["ADDRESS", columns, columnTypes, values, condition]);
+        }
+        newAnonymCategories.push(translate.text("Adressdaten"));
+    }
+    
+    //Kommunikationsdaten
+    if (jsonResult["comp.chb_Comm"] == "true")
+    {
+        data                = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT_ID", pContactId)
+            .build("select ADDRESS, SEARCHADDR, COMMUNICATIONID from COMMUNICATION", "1=2"));
+        //data = db.table("select ADDR, SEARCHADDR, COMMID from COMM where RELATION_ID = '" + pContactId + "'");
+        
+        columns = ["ADDR", "SEARCHADDR"];        
+        columnTypes = db.getColumnTypes("COMM", columns);
+        
+        for (let i = 0; i < data.length; i++) {
+            values = [dsgvoMkTextAnonymous(data[i][0]), dsgvoMkTextAnonymous(data[i][1])];
+
+            condition       = SqlCondition.andPrepare("CONTACT_ID", pContactId)
+            .andPrepare("COMMUNICATIONID", data[i][2]).and("1=2"); 
+            // TODO prüfen
+            //"RELATION_ID = '" + pContactId + "' and COMMID = '" + data[i][2] + "' ";
+            
+            updArray.push(["COMM", columns, columnTypes, values, condition]);            
+        }
+        newAnonymCategories.push(translate.text("Kommunikationsdaten"));
+    }
+    
+    if (updArray.length > 0)
+        db.updates(updArray);
+
+    if(newAnonymCategories.length > 0)
+    {        
+        subject = translate.text("DSGVO Anonymisierung");
+        info    = translate.text("Folgende Daten wurden anonymisiert: " + newAnonymCategories.join(", "));
+        // TODO UX Abwarten
+        question.showMessage(info);
+        newHistory(vars.get("$global.user").relationid, getKeyValue("Intern", "HistoryMedium"), "o", subject, info, [[pContactId, 2]]);
+    }
+    else
+        question.showMessage(translate.text("Es wurden keine Daten anonymisiert."));
+}
+
+/**
+ * utility function to make a String anonymous. Replaces all letters between the first an last one with *
+ * 
+ * @param {String} pText Text to be made anonymous
+ * @return {String} first and last letter from pText with (pText.length-2) stars(*) between them
+ * 
+ * @example dsgvoMkTextAnonymous("Buchstabe")
+ * @exampleresult B*******e
+ */
+function dsgvoMkTextAnonymous(pText)
+{
+    if (pText == null) 
+        return null;
+    if (pText.length <= 2) 
+        return "**";
+    
+    var res = pText.charAt(0);
+    
+    for(i = 0; i < pText.length - 2; i++)
+    {
+        res += "*";
+    }
+    
+    return res += pText.charAt(pText.length - 1);
+}
+
diff --git a/process/DataCaching_lib/process.js b/process/DataCaching_lib/process.js
index 5eee5316c78bcd96d5fcb1f63316cac3d1e2ef34..03cb0d54a4410f6b78a5c339bba7534f0687b1c1 100644
--- a/process/DataCaching_lib/process.js
+++ b/process/DataCaching_lib/process.js
@@ -11,7 +11,7 @@ import("system.project");
  * @class 
  * 
  * @param {String} pIdentifiyingName name to identify the DataCache. This MUST be unique for one data representation (e.g. key-value pair for all Languages with key ISO2-code and value the ISO3-Code). this will affect the storage-name (=name of the global variable on the client for example)
- * @param {bool} [pKeepPerLanguage=false] if true the data is kept per locale (different storing for each requested language), false when not (every language is sharin the same stoarge because only untranslated data is kept)
+ * @param {bool} [pKeepPerLanguage=false] if true the data is kept per locale (different storing for each requested language), false when not (every language is sharing the same stoarge because only untranslated data is kept)
  * @param {String} [pLocaleOverride=current language] sometimes a special locale is required, use this parameter to specify it
  * 
  */
@@ -37,7 +37,7 @@ function CachedData(pIdentifiyingName, pKeepPerLanguage, pLocaleOverride)
  * @param {String} [pLocaleOverride=current language] sometimes a special locale is required, use this parameter to specify it
  * @param {Function} pDataCallbackFunction function that is called to load the data. this functions gets 2 params: 1. if the data has to be translated 2. the locale to translate
  * 
- * @return {Object} returns the data you wanted (of the pDataCallbackFunction)
+ * @return {CachedData} returns the data you wanted (of the pDataCallbackFunction)
  * 
  * @static
  */
diff --git a/process/WsValidation_lib/process.js b/process/WsValidation_lib/process.js
index e59e0829e23ab23e0b294600c8ee1fa69db19bc9..0f34bcf034364414e9877eb649cb7608060926e7 100644
--- a/process/WsValidation_lib/process.js
+++ b/process/WsValidation_lib/process.js
@@ -5,6 +5,8 @@ import("system.vars");
 import("system.neon");
 import("system.net");
 import("system.util");
+import("system.auth");
+import("DataCaching_lib");
 
 /**
  * Class used for the webservice validation types.
@@ -12,18 +14,18 @@ import("system.util");
  * Do not create new instances anywhere else than inside of the get-function!
  * 
  * @param {String} pKey the key-name
- * @param {String} pParamName name used by the webservice
  * @param {String} pWebserviceName name of the webservice. Used to find the correct webservice configuraation
  * @param {Function} pProcessResultCallback function for processing Webservice-result to the return value
  * @param {Function} pProcessRequestCallback function for processing Webservice-request
+ * @param {Object} pAdditionalInfo additional Info. Can be an object or something else. (callback specific)
  */
-function WsValidationType(pKey, pParamName, pWebserviceName, pProcessResultCallback, pProcessRequestCallback) 
+function WsValidationType(pKey, pWebserviceName, pProcessResultCallback, pProcessRequestCallback, pAdditionalInfo) 
 {
     this.key = pKey;
-    this.paramName = pParamName;
     this.processResultCallback = pProcessResultCallback;
     this.processRequestCallback = pProcessRequestCallback;
     this.webserviceName = pWebserviceName;
+    this.additionalInfo = pAdditionalInfo;
 }
 
 /**
@@ -37,12 +39,12 @@ WsValidationType.get = function(pKey)
     if (!this._cache)
         this._cache = {
             // Address lookups
-            TYPE_ADDRESS: new WsValidationType("TYPE_ADDRESS", "search", "addressValidation", _processAllAddressLookup, _customRequest),
-            TYPE_ZIP: new WsValidationType("TYPE_ZIP", "zip", "zipCityValidation", _processAddressLookup, _customRequest),
-            TYPE_CITY: new WsValidationType("TYPE_CITY", "city", "zipCityValidation", _processAddressLookup, _customRequest),
+            TYPE_ADDRESS_NOMINATIM: new WsValidationType("TYPE_ADDRESS_NOMINATIM", "nominatim", _processNominatimAddressLookup, _nominatimRequest, "q"),
+            TYPE_ZIP_NOMINATIM: new WsValidationType("TYPE_ZIP_NOMINATIM", "nominatim", _processNominatimAddressLookup, _nominatimRequest, "postalcode"),
+            TYPE_CITY_NOMINATIM: new WsValidationType("TYPE_CITY_NOMINATIM", "nominatim", _processNominatimAddressLookup, _nominatimRequest, "city"),
             
             // Communication validation
-            TYPE_PHONE: new WsValidationType("TYPE_PHONE", "Number", "phoneValidation", _processCommunicationValidation, _customRequest)
+            TYPE_PHONE: new WsValidationType("TYPE_PHONE", "phoneValidation", _processCommunicationValidation, _customRequest, "Number")
         }
     
     if (pKey)
@@ -50,131 +52,76 @@ WsValidationType.get = function(pKey)
     
     return this._cache;
     
-    /**
-    *   [UID,
-    *    displayName,
-    *    zip,
-    *    city,
-    *    cityext,
-    *    country,
-    *    district,
-    *    region,
-    *    state,
-    *    street,
-    *    from_bn, // building number
-    *    to_bn,   // building number
-    *    lon,
-    *    lat,
-    *    value // pValue
-    */                       
-    function _processAllAddressLookup(pWsResult, pValue)
+    function _processCommunicationValidation(pWsResult, pValue)
     {
-        var resultAddresses = [];
-        
-        // if error, only add the default value else parse the body
         if (!WsValidationUtils._isError(pWsResult))
         {
-            resultAddresses = JSON.parse(pWsResult.body);
+            return pWsResult.body;
+        }
+        else
+        {
+            return pValue;
         }
-        
-        return resultAddresses.map(function(pAddress, pIndex)
-                    {
-                        pAddress[0].value = pValue;
-                        pAddress[0].index = pIndex;
-                        var data = pAddress[0];
-                        
-                        return [
-                            JSON.stringify(data),
-                            pAddress[1],
-                            data.zip,
-                            data.city,
-                            data.cityext,
-                            data.country,
-                            data.district,
-                            data.region,
-                            data.state,
-                            data.streat,
-                            data.from_bn,
-                            data.to_bn,
-                            data.lon,
-                            data.lat,
-                            pValue]
-                    }, this);
     }
     
-    /**
-    *   [UID,
-    *    displayName,
-    *    zip,
-    *    city,
-    *    cityext,
-    *    country,
-    *    district,
-    *    region,
-    *    state,
-    *    street,
-    *    from_bn, // building number
-    *    to_bn,   // building number
-    *    lon,
-    *    lat,
-    *    value // (the result. e.g. if pType was ZIP, the value is the found zip)
-    */     
-    function _processAddressLookup(pWsResult, pValue)
+    function _processNominatimAddressLookup(pWsResult, pValue)
     {
         var resultAddresses = [];
         
-        // if error, only add the default value else parse the body
-        if (!WsValidationUtils._isError(pWsResult))
+        if (pWsResult != null)
         {
-            resultAddresses = JSON.parse(pWsResult.body);
+            logging.log(JSON.stringify(pWsResult, null, "\t"))
+            pWsResult.forEach(function(pPlaceData) {
+                if (pPlaceData.address == undefined)
+                    pPlaceData.address = {};
+                
+                var city = pPlaceData.address.town;
+                if (!city)
+                    city = pPlaceData.address.city;
+                if (!city)
+                    city = pPlaceData.address.village;
+                if (!city)
+                    city = pPlaceData.address.hamlet;
+                
+                var cityext = pPlaceData.address.suburb;
+                if (!cityext)
+                    cityext = pPlaceData.address.city_district;
+                
+                var addrData = [
+                    pPlaceData.display_name,
+                    pPlaceData.address.postcode,
+                    city,
+                    cityext,
+                    pPlaceData.address.country_code.toUpperCase(),
+                    pPlaceData.address.district,
+                    pPlaceData.address.state_district,
+                    pPlaceData.address.state,
+                    pPlaceData.address.road,
+                    pPlaceData.address.house_number,
+                    pPlaceData.lon,
+                    pPlaceData.lat
+                ];
+                
+                resultAddresses.push([JSON.stringify(addrData.concat([pValue, pPlaceData.place_id]))].concat(addrData));
+            })
         }
-                        
-        return resultAddresses.map(function(pAddress, pIndex)
-                    {
-                        pAddress[0].index = pIndex;
-                        var data = pAddress[0];
-                        return [
-                            JSON.stringify(data),
-                            pAddress[1],
-                            data.zip,
-                            data.city,
-                            data.cityext,
-                            data.country,
-                            data.district,
-                            data.region,
-                            data.state,
-                            data.streat,
-                            data.from_bn,
-                            data.to_bn,
-                            data.lon,
-                            data.lat,
-                            data[this.paramName]]
-                    }, this);
-    }
 
-    function _processCommunicationValidation(pWsResult, pValue)
-    {
-        if (!WsValidationUtils._isError(pWsResult))
-        {
-            return pWsResult.body;
-        }
-        else
-        {
-            return pValue;
-        }
+        return resultAddresses;
     }
     
     /**
      * request using a custom webservice
      */
-    function _customRequest(pValue, pCountry) {
+    function _customRequest(pValue, pCountry)
+    {
         if (WsValidationUtils.isWsEnabled(this))
         {
             var userName = project.getPreferenceValue("custom." + this.webserviceName + ".user");
             var pw = project.getPreferenceValue("custom." + this.webserviceName + ".pw");
             var url = project.getPreferenceValue("custom." + this.webserviceName + ".url");
             var countryParamName = project.getPreferenceValue("custom." + this.webserviceName + ".countryParamName");
-
+            var parameterName = this.additionalInfo;
+            
             if (!userName || !pw || !url || !countryParamName)
             {
                 throw new Error("if the webservice " + this.key + " is enabled, you have to provide also userName, pw, url and countryParamName")
@@ -190,7 +137,7 @@ WsValidationType.get = function(pKey)
                 {
                     parameters[countryParamName] = pCountry;
                 }
-                parameters[this.paramName] = pValue;
+                parameters[parameterName] = pValue;
 
                 // call webservice
                 var ret = JSON.parse(net.callRestWebserviceBasicAuth(url, actionType, parameters, null, null, "text/plain", "text/plain", util.DATA_TEXT, util.DATA_TEXT, userName, pw, true));
@@ -208,6 +155,83 @@ WsValidationType.get = function(pKey)
         }
         return this.processResultCallback.call(this, null, pValue);
     }
+    
+    function _nominatimRequest(pValue, pCountry)
+    {
+        var nominatimCache;
+        if (WsValidationUtils.isWsEnabled(this))
+        {
+            var parameterName = this.additionalInfo;
+            
+            if (!vars.exists("$context.nominatim"))
+            {
+                nominatimCache = {
+                    last: ""
+                }
+            } 
+            else 
+            {
+                nominatimCache = JSON.parse(vars.getString("$context.nominatim"));
+            }
+            
+            if (nominatimCache.last == parameterName + pValue + (pCountry ? pCountry : ""))
+            {
+                return nominatimCache.data;
+            }
+            else
+            {
+                nominatimCache.last = parameterName + pValue + (pCountry ? pCountry : "")
+
+                var url = project.getPreferenceValue("custom." + this.webserviceName + ".url");
+
+
+                if (!url)
+                {
+                    throw new Error("if the webservice " + this.key + " is enabled, you have to provide also the url")
+                }
+
+                if (pValue)
+                {
+                    var restConf = net.createConfigForRestWebserviceCall()
+                                    .url(url)
+                                    .actionType("GET")
+                                    .dataTypeAccept("application/json")
+                                    .dataTypeJDitoAccept(util.DATA_TEXT)
+                                    .dataTypeJDitoSend(util.DATA_TEXT)
+                                    .addQueryParameter("format", "json")
+                                    .addQueryParameter("addressdetails", "1");
+
+                    // add user input params
+                    if (pCountry)
+                    {
+                        restConf.addQueryParameter("countrycodes", pCountry)
+                    }
+
+                    restConf.addQueryParameter(parameterName, pValue)
+
+
+                    // call webservice
+                    var ret = JSON.parse(net.callRestWebservice(restConf, auth.createConfigForNoAuth()));
+
+                    // if error, log the error. But also process the result and let the callback generate the correct default value
+                    if (ret == null)
+                    {
+                        logging.log("error")
+                        logging.log(translate.withArguments("${WEBSERVICE_ERROR} url:%0 status:%1", [url, (ret.hasHttpSuccessStatusCode ? " StatusCode: " + ret.httpStatusCode : "")]));
+                    }
+
+                    // different handling of the result per type
+                    nominatimCache.data = this.processResultCallback.call(this, ret, pValue);
+                    vars.set("$context.nominatim", JSON.stringify(nominatimCache))
+                    return nominatimCache.data;
+                }
+            }
+        }
+        nominatimCache = {}
+        nominatimCache.data = this.processResultCallback.call(this, null, pValue);
+        vars.set("$context.nominatim", JSON.stringify(nominatimCache)) 
+        return nominatimCache.data;
+    }
 }
 
 /**
@@ -242,7 +266,7 @@ WsValidationUtils.validate = function(pValue, pType, pCountry)
  */
 WsValidationUtils.setAddressFields = function(pFieldToSetToValue)
 {
-    try 
+    try
     {
         var data = JSON.parse(vars.getString("$this.value"));
     } catch (exception) { 
@@ -251,17 +275,17 @@ WsValidationUtils.setAddressFields = function(pFieldToSetToValue)
         return
     }
      
-    _setField("$field.ZIP", data.zip);
-    _setField("$field.COUNTRY", data.country);
-    _setField("$field.CITY", data.city);
-    //_setField("$field.DISTRICT", data.district); not needed currently
-    _setField("$field.REGION", data.region);
-    _setField("$field.STATE", data.state);
-    _setField("$field.ADDRESS", data.streat);
+    _setField("$field.ZIP", data[1]);
+    _setField("$field.CITY", data[2]);
+    _setField("$field.COUNTRY", data[4]);
+    //_setField("$field.DISTRICT",  data[5]); not needed currently
+    _setField("$field.REGION", data[6]);
+    _setField("$field.STATE", data[7]);
+    _setField("$field.ADDRESS", data[8]);
     
     if (pFieldToSetToValue)
     {
-        _setField(pFieldToSetToValue, data.value)
+        _setField(pFieldToSetToValue, data[12])
     }
     
     function _setField(pField, pValue)