diff --git a/.liquibase/Data_alias/basic/2021.2.0/Mosaico/alter_bulkMailAddISOLanguage.xml b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/alter_bulkMailAddISOLanguage.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9101534c1ec90d5fc206e3f43b57f48a0455c013
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/alter_bulkMailAddISOLanguage.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="m.groppe" id="14703c1c-8052-42dd-8ec5-4b9e828a3c28">
+    <addColumn tableName="BULKMAIL">
+          <column name="ISOLANGUAGE" type="CHAR(3)"/>
+    </addColumn>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.0/Mosaico/alter_bulkMailAddMosaicoTemplateId.xml b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/alter_bulkMailAddMosaicoTemplateId.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ebafc4e9602273e2d1f4326c3acea357bebbdbc2
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/alter_bulkMailAddMosaicoTemplateId.xml
@@ -0,0 +1,15 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="m.groppe" id="76e38ecb-a7f9-4c63-8089-e14296fb5f09">
+    <preConditions onFail="MARK_RAN">
+            <not>
+                <columnExists tableName="BULKMAIL" columnName="MOSAICOTEMPLATE_ID" />
+            </not>
+    </preConditions>
+    <addColumn tableName="BULKMAIL">
+          <column name="MOSAICOTEMPLATE_ID" type="CHAR(36)"/>
+    </addColumn>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.0/Mosaico/changelog.xml b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bbcceb5f18df46196be33f56058f50b70ae349d2
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/changelog.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="create_mosaicoTemplate.xml"/>
+    <include relativeToChangelogFile="true" file="insert_mosaicoBaseTemplate.xml"/>
+    <include relativeToChangelogFile="true" file="alter_bulkMailAddMosaicoTemplateId.xml"/>
+    <include relativeToChangelogFile="true" file="insert_mosaicoTemplateCategory.xml"/>
+    <include relativeToChangelogFile="true" file="alter_bulkMailAddISOLanguage.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.0/Mosaico/create_mosaicoTemplate.xml b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/create_mosaicoTemplate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4a47e94f4abf4d4e7c38eaee361cfd9ab4287e5d
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/create_mosaicoTemplate.xml
@@ -0,0 +1,28 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="m.groppe" id="7c12f422-7d10-4c08-b5ee-11e166e71ba0">
+      <createTable tableName="MOSAICOTEMPLATE">
+          <column name="MOSAICOTEMPLATEID" type="CHAR(36)">
+              <constraints nullable="false" primaryKey="true" primaryKeyName="PK_MOSAICOTEMPLATEID"/>
+          </column>
+          <column name="NAME" type="NVARCHAR(250)">
+              <constraints nullable="false"/>
+          </column>
+          <column name="CATEGORY" type="varchar(36)"/>
+          <column name="ISOLANGUAGE" type="CHAR(3)"/>
+          <column name="METADATA" type="NCLOB"/>
+          <column name="CONTENT" type="NCLOB"/>
+          <column name="USER_NEW" type="NVARCHAR(50)">
+              <constraints nullable="false"/>
+          </column>
+          <column name="DATE_NEW" type="DATETIME">
+              <constraints nullable="false"/>
+          </column>
+          <column name="USER_EDIT" type="NVARCHAR(50)" />
+          <column name="DATE_EDIT" type="DATETIME" />
+          <column name="BASETEMPLATE" type="VARCHAR(36)"/>
+      </createTable>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.0/Mosaico/insert_mosaicoBaseTemplate.xml b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/insert_mosaicoBaseTemplate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94baa2ba9eb684d740d054d98fcce8d86cb573eb
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/insert_mosaicoBaseTemplate.xml
@@ -0,0 +1,23 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="m.groppe" id="d5e4eec9-d3df-4557-bdbe-39b84c9a000a">
+    <insert tableName="AB_KEYWORD_CATEGORY">
+      <column name="AB_KEYWORD_CATEGORYID" value="ed4e3c0d-e0ed-4476-b2b9-76b821f03c2f"/>
+      <column name="NAME" value="MosaicoBaseTemplate"/>
+      <column name="SORTINGBY" valueNumeric="0"/>
+      <column name="SORTINGDIRECTION" value="ASC"/>
+    </insert>
+    <insert tableName="AB_KEYWORD_ENTRY">
+        <column name="AB_KEYWORD_ENTRYID" value="e42140fe-7df3-4452-80b7-f914d8c03d0e"/>
+        <column name="AB_KEYWORD_CATEGORY_ID" value="ed4e3c0d-e0ed-4476-b2b9-76b821f03c2f"/>
+        <column name="KEYID" value="adito-versafix-1"/>
+        <column name="TITLE" value="Adito Versafix"/>
+        <column name="CONTAINER" value="MosaicoBaseTemplate"/>
+        <column name="SORTING" valueNumeric="1"/>
+        <column name="ISACTIVE" valueNumeric="1"/>
+        <column name="ISESSENTIAL" valueNumeric="0"/>
+    </insert>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.0/Mosaico/insert_mosaicoTemplateCategory.xml b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/insert_mosaicoTemplateCategory.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a89513576d48effc9b0f31daad1865586a2aac41
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.0/Mosaico/insert_mosaicoTemplateCategory.xml
@@ -0,0 +1,53 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="m.groppe" id="b45ae681-b484-4815-a953-4c8ba5375363">
+    <insert tableName="AB_KEYWORD_CATEGORY">
+      <column name="AB_KEYWORD_CATEGORYID" value="be28e8a4-08d4-4697-b248-8b97b4e6e749"/>
+      <column name="NAME" value="MosaicoTemplateCategory"/>
+      <column name="SORTINGBY" valueNumeric="0"/>
+      <column name="SORTINGDIRECTION" value="ASC"/>
+    </insert>
+    <insert tableName="AB_KEYWORD_ENTRY">
+        <column name="AB_KEYWORD_ENTRYID" value="f4831eb4-276d-4625-ac38-d3238a306f4d"/>
+        <column name="AB_KEYWORD_CATEGORY_ID" value="be28e8a4-08d4-4697-b248-8b97b4e6e749"/>
+        <column name="KEYID" value="NEWSLETTER"/>
+        <column name="TITLE" value="Newsletter"/>
+        <column name="CONTAINER" value="MosaicoTemplateCategory"/>
+        <column name="SORTING" valueNumeric="1"/>
+        <column name="ISACTIVE" valueNumeric="1"/>
+        <column name="ISESSENTIAL" valueNumeric="0"/>
+    </insert>
+    <insert tableName="AB_KEYWORD_ENTRY">
+        <column name="AB_KEYWORD_ENTRYID" value="b5353b07-248f-4818-96d8-171f7bac18d9"/>
+        <column name="AB_KEYWORD_CATEGORY_ID" value="be28e8a4-08d4-4697-b248-8b97b4e6e749"/>
+        <column name="KEYID" value="INVITATION"/>
+        <column name="TITLE" value="Invitation"/>
+        <column name="CONTAINER" value="MosaicoTemplateCategory"/>
+        <column name="SORTING" valueNumeric="2"/>
+        <column name="ISACTIVE" valueNumeric="1"/>
+        <column name="ISESSENTIAL" valueNumeric="0"/>
+    </insert>
+    <insert tableName="AB_KEYWORD_ENTRY">
+        <column name="AB_KEYWORD_ENTRYID" value="71a04a08-e1e1-4512-ae61-a51a3de9a645"/>
+        <column name="AB_KEYWORD_CATEGORY_ID" value="be28e8a4-08d4-4697-b248-8b97b4e6e749"/>
+        <column name="KEYID" value="ACTIONMAIL"/>
+        <column name="TITLE" value="Action mail"/>
+        <column name="CONTAINER" value="MosaicoTemplateCategory"/>
+        <column name="SORTING" valueNumeric="3"/>
+        <column name="ISACTIVE" valueNumeric="1"/>
+        <column name="ISESSENTIAL" valueNumeric="0"/>
+    </insert>
+    <insert tableName="AB_KEYWORD_ENTRY">
+        <column name="AB_KEYWORD_ENTRYID" value="6c6a9e60-e72e-4f38-8d51-b01674f9953f"/>
+        <column name="AB_KEYWORD_CATEGORY_ID" value="be28e8a4-08d4-4697-b248-8b97b4e6e749"/>
+        <column name="KEYID" value="TECHNICALEMAIL"/>
+        <column name="TITLE" value="Technical email"/>
+        <column name="CONTAINER" value="MosaicoTemplateCategory"/>
+        <column name="SORTING" valueNumeric="4"/>
+        <column name="ISACTIVE" valueNumeric="1"/>
+        <column name="ISESSENTIAL" valueNumeric="0"/>
+    </insert>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.0/changelog.xml b/.liquibase/Data_alias/basic/2021.2.0/changelog.xml
index 3cf8852332e10ba851a2d4374b71ed11a9e3f86e..e4951320a59b1f9461b41a5f8d144e94b0864391 100644
--- a/.liquibase/Data_alias/basic/2021.2.0/changelog.xml
+++ b/.liquibase/Data_alias/basic/2021.2.0/changelog.xml
@@ -4,4 +4,5 @@
     <include relativeToChangelogFile="true" file="TopicTree/changelog.xml"/>
     <include relativeToChangelogFile="true" file="CampaignStep/changelog.xml"/>
     <include relativeToChangelogFile="true" file="xRM-Service/changelog.xml"/>
-</databaseChangeLog>
\ No newline at end of file
+    <include relativeToChangelogFile="true" file="Mosaico/changelog.xml"/>
+</databaseChangeLog>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 437beffcdfb17c34d3f4b0f578a9e891d58ca6ab..0f9089f43bf57ecf9259f0810d9547cf94df4be6 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -5515,8 +5515,8 @@
                 <dbName></dbName>
                 <primaryKey v="false" />
                 <columnType v="93" />
-                <size v="19" />
-                <scale v="0" />
+                <size v="29" />
+                <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
@@ -5608,7 +5608,7 @@
                 <name>DESCRIPTION</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="-1" />
+                <columnType v="2005" />
                 <size v="2147483647" />
                 <scale v="0" />
                 <notNull v="false" />
@@ -5710,8 +5710,8 @@
                 <dbName></dbName>
                 <primaryKey v="false" />
                 <columnType v="93" />
-                <size v="19" />
-                <scale v="0" />
+                <size v="29" />
+                <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
@@ -11219,6 +11219,34 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>MOSAICOTEMPLATE_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ISOLANGUAGE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="3" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -27400,6 +27428,180 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>MOSAICOTEMPLATE</name>
+            <dbName></dbName>
+            <idColumn>MOSAICOTEMPLATEID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="19" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MOSAICOTEMPLATEID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTENT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="-1" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="19" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>METADATA</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="-1" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>NAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="250" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>BASETEMPLATE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ISOLANGUAGE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="3" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CATEGORY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index da2c65876c69db5150138a5436bdf162eb6f48b3..6163debccb9b8f4f6450c1b8709e0bdc84c7deec 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -230,6 +230,10 @@
                 <name>EmailFilterHandling</name>
                 <kind v="10077" />
               </entityNode>
+              <entityNode>
+                <name>MosaicoTemplate</name>
+                <kind v="10077" />
+              </entityNode>
             </childNodes>
           </entityNode>
           <entityNode>
diff --git a/entity/BulkMailAddMosaico_entity/BulkMailAddMosaico_entity.aod b/entity/BulkMailAddMosaico_entity/BulkMailAddMosaico_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..060d3e16f7181a02024785e4d96ddccf246828cb
--- /dev/null
+++ b/entity/BulkMailAddMosaico_entity/BulkMailAddMosaico_entity.aod
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.22" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.22">
+  <name>BulkMailAddMosaico_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>recordContainer</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+    <entityField>
+      <name>BASETEMPLATE</name>
+      <documentation>%aditoprj%/entity/BulkMailAddMosaico_entity/entityfields/basetemplate/documentation.adoc</documentation>
+      <title>Base Template</title>
+      <consumer>BaseTemplates</consumer>
+      <mandatory v="true" />
+      <state>EDITABLE</state>
+    </entityField>
+    <entityField>
+      <name>MOSAICOTEMPLATE_ID</name>
+      <title>Copy template</title>
+      <consumer>MosaicoTemplates</consumer>
+      <state>EDITABLE</state>
+      <onValueChange>%aditoprj%/entity/BulkMailAddMosaico_entity/entityfields/mosaicotemplate_id/onValueChange.js</onValueChange>
+    </entityField>
+    <entityConsumer>
+      <name>BaseTemplates</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/BulkMailAddMosaico_entity/entityfields/basetemplates/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MosaicoTemplates</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MosaicoTemplate_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityField>
+      <name>NAME</name>
+      <title>Name</title>
+      <mandatory v="true" />
+      <state>EDITABLE</state>
+    </entityField>
+    <entityActionField>
+      <name>createAndOpen</name>
+      <title>Create and open in editor</title>
+      <onActionProcess>%aditoprj%/entity/BulkMailAddMosaico_entity/entityfields/createandopen/onActionProcess.js</onActionProcess>
+      <stateProcess>%aditoprj%/entity/BulkMailAddMosaico_entity/entityfields/createandopen/stateProcess.js</stateProcess>
+    </entityActionField>
+    <entityParameter>
+      <name>BulkMailId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>ISOLANGUAGE</name>
+      <title>Language</title>
+      <consumer>Languages</consumer>
+      <mandatory v="true" />
+      <state>EDITABLE</state>
+    </entityField>
+    <entityField>
+      <name>CATEGORY</name>
+      <title>Classification</title>
+      <consumer>KeywordMosaicoTemplateCategory</consumer>
+      <mandatory v="true" />
+      <state>EDITABLE</state>
+    </entityField>
+    <entityConsumer>
+      <name>KeywordMosaicoTemplateCategory</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/BulkMailAddMosaico_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Languages</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Language_entity</entityName>
+        <fieldName>ISO3Name</fieldName>
+      </dependency>
+    </entityConsumer>
+  </entityFields>
+  <recordContainers>
+    <datalessRecordContainer>
+      <name>recordContainer</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/BulkMailAddMosaico_entity/entityfields/basetemplate/documentation.adoc b/entity/BulkMailAddMosaico_entity/entityfields/basetemplate/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/entity/BulkMailAddMosaico_entity/entityfields/basetemplates/children/containername_param/valueProcess.js b/entity/BulkMailAddMosaico_entity/entityfields/basetemplates/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e3d579ca46672ae7f9dfe93246ecb85864fcb9c
--- /dev/null
+++ b/entity/BulkMailAddMosaico_entity/entityfields/basetemplates/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("KeywordRegistry_basic");
+import("system.result");
+
+result.string($KeywordRegistry.mosaicoBaseTemplate());
\ No newline at end of file
diff --git a/entity/BulkMailAddMosaico_entity/entityfields/createandopen/onActionProcess.js b/entity/BulkMailAddMosaico_entity/entityfields/createandopen/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0709ded0849ad413fc7bfa78c087534fe0dc16b
--- /dev/null
+++ b/entity/BulkMailAddMosaico_entity/entityfields/createandopen/onActionProcess.js
@@ -0,0 +1,42 @@
+import("MosaicoTemplate_lib");
+import("system.neon");
+import("system.util");
+import("system.vars");
+import("system.entities")
+
+var fieldValues = {};
+if (vars.get("$field.MOSAICOTEMPLATE_ID"))
+{
+    var loadConfig = entities.createConfigForLoadingRows()
+    .entity("MosaicoTemplate_entity")
+    .fields(["CONTENT","METADATA"])
+    .uid(vars.get("$field.MOSAICOTEMPLATE_ID"));
+    
+    fieldValues = entities.getRow(loadConfig);    
+}
+
+var createdMosaicoTemplateId = util.getNewUUID();
+
+fieldValues.BASETEMPLATE = vars.get("$field.BASETEMPLATE");
+fieldValues.NAME = vars.get("$field.NAME");
+fieldValues.MOSAICOTEMPLATEID = createdMosaicoTemplateId;
+fieldValues.ISOLANGUAGE = vars.get("$field.ISOLANGUAGE");
+fieldValues.CATEGORY = vars.get("$field.CATEGORY");
+
+var createConfig = entities.createConfigForAddingRows()
+                    .entity("MOSAICOTEMPLATE_ENTITY")
+                    .fieldValues(fieldValues)
+                    .addParameter("CopyMosaicoTemplateIdParam", vars.get("$field.MOSAICOTEMPLATE_ID"));
+
+entities.createRow(createConfig);
+
+var updateConfig = entities.createConfigForUpdatingRows()
+                    .entity("Bulkmail_entity")
+                    .fieldValues({"MOSAICOTEMPLATE_ID": createdMosaicoTemplateId})
+                    .uid(vars.get("$param.BulkMailId_param"));
+                    
+entities.updateRow(updateConfig);
+
+MosaicoUtils.openInMosaico(createdMosaicoTemplateId);
+
+neon.closeImage(vars.get("$sys.currentimage"), true);
\ No newline at end of file
diff --git a/entity/BulkMailAddMosaico_entity/entityfields/createandopen/stateProcess.js b/entity/BulkMailAddMosaico_entity/entityfields/createandopen/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa49d9532a683bbab8c926963027e8d4efede54a
--- /dev/null
+++ b/entity/BulkMailAddMosaico_entity/entityfields/createandopen/stateProcess.js
@@ -0,0 +1,12 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if (vars.get("$sys.validationerrors"))
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
diff --git a/entity/BulkMailAddMosaico_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js b/entity/BulkMailAddMosaico_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f95e6c4ea55b82158002c3d64e2dba7e95db01a0
--- /dev/null
+++ b/entity/BulkMailAddMosaico_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("KeywordRegistry_basic")
+
+result.string($KeywordRegistry.mosaicoTemplateCategory());
\ No newline at end of file
diff --git a/entity/BulkMailAddMosaico_entity/entityfields/mosaicotemplate_id/onValueChange.js b/entity/BulkMailAddMosaico_entity/entityfields/mosaicotemplate_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..514bef6b806f52c1f5851bbb6d4cfcb716ff9472
--- /dev/null
+++ b/entity/BulkMailAddMosaico_entity/entityfields/mosaicotemplate_id/onValueChange.js
@@ -0,0 +1,21 @@
+import("system.neon");
+import("system.vars");
+import("system.entities");
+
+if (vars.get("$this.value"))
+{
+    var config = entities.createConfigForLoadingRows()
+                .entity("MosaicoTemplate_entity")
+                .fields(["BASETEMPLATE","BASETEMPLATE.displayValue","ISOLANGUAGE","ISOLANGUAGE.displayValue","CATEGORY","CATEGORY.displayValue"])
+                .uid(vars.get("$this.value"));
+
+    var fieldValues = entities.getRow(config);
+    
+    fieldValues = Object.keys(fieldValues).reduce(function (pAccumulator, pFieldName)
+    {
+        pAccumulator["$field."+pFieldName] = fieldValues[pFieldName];
+        return pAccumulator;
+    },{});
+
+    neon.setFieldValues(fieldValues);
+}
\ No newline at end of file
diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
index a8044bd0acb8b04888990811895b89911ce77f6b..19f43ebcb586a085f8f43e823fd2d4dace177c97 100644
--- a/entity/BulkMail_entity/BulkMail_entity.aod
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -42,6 +42,7 @@
       <title>Document Template</title>
       <consumer>Templates</consumer>
       <mandatory v="false" />
+      <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/documenttemplate_id/stateProcess.js</stateProcess>
       <onValueChange>%aditoprj%/entity/BulkMail_entity/entityfields/documenttemplate_id/onValueChange.js</onValueChange>
       <onValueChangeTypes>
         <element>MASK</element>
@@ -364,14 +365,12 @@
     </entityField>
     <entityField>
       <name>DATE_NEW</name>
-      <title>Created on</title>
       <contentType>DATE</contentType>
       <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/date_new/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>recipientCount</name>
       <title>Recipients</title>
-      <contentType>NUMBER</contentType>
     </entityField>
     <entityField>
       <name>deliveredMailCount</name>
@@ -385,7 +384,6 @@
       <name>EMPLOYEE_CONTACT_ID</name>
       <title>Person in charge</title>
       <consumer>Employees</consumer>
-      <groupable v="true" />
       <linkedContext>Person</linkedContext>
       <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/employee_contact_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/employee_contact_id/displayValueProcess.js</displayValueProcess>
@@ -482,6 +480,58 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <title>Edited on</title>
+      <contentType>DATE</contentType>
+      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <title>Creator</title>
+      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <title>Editor</title>
+      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>PresetRecipientsContext_param</name>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/BulkMail_entity/entityfields/presetrecipientscontext_param/documentation.adoc</documentation>
+    </entityParameter>
+    <entityParameter>
+      <name>PresetRecipientsFilter_param</name>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/BulkMail_entity/entityfields/presetrecipientsfilter_param/documentation.adoc</documentation>
+    </entityParameter>
+    <entityField>
+      <name>firstSendDate</name>
+      <title>Send Date</title>
+      <contentType>DATE</contentType>
+    </entityField>
+    <entityParameter>
+      <name>CreateFromMosaicoTemplateId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>MOSAICOTEMPLATE_ID</name>
+      <title>Mosaico template</title>
+      <consumer>MosaicoTemplates</consumer>
+      <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/mosaicotemplate_id/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/mosaicotemplate_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/mosaicotemplate_id/displayValueProcess.js</displayValueProcess>
+      <onValueChange>%aditoprj%/entity/BulkMail_entity/entityfields/mosaicotemplate_id/onValueChange.js</onValueChange>
+    </entityField>
+    <entityConsumer>
+      <name>MosaicoTemplates</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MosaicoTemplate_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
     <entityActionGroup>
       <name>observeActionoGroup</name>
       <children>
@@ -529,6 +579,20 @@
       <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/copybulkmail/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:COPY</iconId>
     </entityActionField>
+    <entityActionField>
+      <name>openInMosaico</name>
+      <title>Open in mosaico</title>
+      <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openinmosaico/onActionProcess.js</onActionProcess>
+      <iconId>NEON:WRENCH</iconId>
+      <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openinmosaico/stateProcess.js</stateProcess>
+    </entityActionField>
+    <entityActionField>
+      <name>newMosaicoTemplate</name>
+      <title>Open new mosaico template</title>
+      <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/newmosaicotemplate/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:TOOLS</iconId>
+      <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/newmosaicotemplate/stateProcess.js</stateProcess>
+    </entityActionField>
     <entityActionField>
       <name>openAdminView</name>
       <title>Open admin view</title>
@@ -536,43 +600,12 @@
       <iconId>VAADIN:CURLY_BRACKETS</iconId>
       <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js</stateProcess>
     </entityActionField>
-    <entityActionField>
-      <name>openMosaico</name>
-      <title>Open Mosaico</title>
-      <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openmosaico/onActionProcess.js</onActionProcess>
-      <iconId>NEON:WRENCH</iconId>
-      <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openmosaico/stateProcess.js</stateProcess>
-    </entityActionField>
     <entityField>
-      <name>DATE_EDIT</name>
-      <title>Edited on</title>
-      <contentType>DATE</contentType>
-      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/date_edit/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>USER_NEW</name>
-      <title>Creator</title>
-      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/user_new/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>USER_EDIT</name>
-      <title>Editor</title>
-      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/user_edit/valueProcess.js</valueProcess>
-    </entityField>
-    <entityParameter>
-      <name>PresetRecipientsContext_param</name>
-      <expose v="true" />
-      <documentation>%aditoprj%/entity/BulkMail_entity/entityfields/presetrecipientscontext_param/documentation.adoc</documentation>
-    </entityParameter>
-    <entityParameter>
-      <name>PresetRecipientsFilter_param</name>
-      <expose v="true" />
-      <documentation>%aditoprj%/entity/BulkMail_entity/entityfields/presetrecipientsfilter_param/documentation.adoc</documentation>
-    </entityParameter>
-    <entityField>
-      <name>firstSendDate</name>
-      <title>Send Date</title>
-      <contentType>DATE</contentType>
+      <name>ISOLANGUAGE</name>
+      <title>Language</title>
+      <consumer>Languages</consumer>
+      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/isolanguage/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/isolanguage/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>dateLastEdit</name>
@@ -589,6 +622,14 @@
       <name>BULKMAIL_OBJECTTYPE</name>
       <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/bulkmail_objecttype/valueProcess.js</valueProcess>
     </entityField>
+    <entityConsumer>
+      <name>Languages</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Language_entity</entityName>
+        <fieldName>ISO3Name</fieldName>
+      </dependency>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -687,7 +728,6 @@
         <dbRecordFieldMapping>
           <name>recipientCount.value</name>
           <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/recipientcount.value/expression.js</expression>
-          <isFilterable v="true" />
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>bounceCount.value</name>
@@ -724,6 +764,15 @@
           <name>USER_NEW.value</name>
           <recordfield>BULKMAIL.USER_NEW</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MOSAICOTEMPLATE_ID.value</name>
+          <recordfield>BULKMAIL.MOSAICOTEMPLATE_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MOSAICOTEMPLATE_ID.displayValue</name>
+          <recordfield>MOSAICOTEMPLATE.NAME</recordfield>
+          <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/mosaicotemplate_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>firstSendDate.value</name>
           <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/firstsenddate.value/expression.js</expression>
@@ -739,22 +788,38 @@
           <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/userlastedit.value/expression.js</expression>
           <isFilterable v="true" />
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ISOLANGUAGE.value</name>
+          <recordfield>BULKMAIL.ISOLANGUAGE</recordfield>
+          <isFilterable v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ISOLANGUAGE.displayValue</name>
+          <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
-          <name>6444866d-42ee-4b7b-8536-6dc8f6437c45</name>
+          <name>453f760a-71eb-45d4-bedd-f939d3f87f84</name>
           <tableName>BULKMAIL</tableName>
           <primaryKey>BULKMAILID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>914d6373-4409-44e5-882a-3f795b196d7b</name>
+          <name>ca336008-563a-4550-84b0-b812707cd3d0</name>
           <tableName>DOCUMENTTEMPLATE</tableName>
           <primaryKey>DOCUMENTTEMPLATEID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
+        <linkInformation>
+          <name>04b5f582-de36-43ab-bf2d-7b73a776772e</name>
+          <tableName>MOSAICOTEMPLATE</tableName>
+          <primaryKey>MOSAICOTEMPLATEID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
       </linkInformation>
       <filterExtensions>
         <filterExtension>
diff --git a/entity/BulkMail_entity/afterUiInit.js b/entity/BulkMail_entity/afterUiInit.js
index 1e0e4d5eef788e4b28c73de46dc13f41e2b05bfa..9683c9911488b527fa27d3c2460c228512091565 100644
--- a/entity/BulkMail_entity/afterUiInit.js
+++ b/entity/BulkMail_entity/afterUiInit.js
@@ -22,7 +22,9 @@ if (!vars.exists("$context.dataCopied") && vars.get("$param.CopyBulkMailId_param
                             "TESTING_CONTACT_ID",
                             "TESTING_EMAIL_ADDRESS",
                             "USE_TEMPLATE_ATTACHMENTS",
-                            "INTEREST_ID"
+                            "INTEREST_ID",
+                            "MOSAICOTEMPLATE_ID",
+                            "ISOLANGUAGE"
                        ])
                        .uid(vars.get("$param.CopyBulkMailId_param"));
                        
diff --git a/entity/BulkMail_entity/entityfields/bindata/valueProcess.js b/entity/BulkMail_entity/entityfields/bindata/valueProcess.js
index 52dbdae3a4809478e2dacaa68176bc37eade3fd9..449206cf2746bf3aefd027152050228451ba0395 100644
--- a/entity/BulkMail_entity/entityfields/bindata/valueProcess.js
+++ b/entity/BulkMail_entity/entityfields/bindata/valueProcess.js
@@ -2,9 +2,10 @@ import("system.result");
 import("Bulkmail_lib");
 import("system.vars");
 
+var template;
 if (vars.get("$param.CopyBulkMailId_param") && vars.get("$this.value") == null)
 {
-    var template = BulkMailUtils.getBulkMailTemplate(vars.get("$param.CopyBulkMailId_param"), "", false, false)    
+    template = BulkMailUtils.getBulkMailTemplate(vars.get("$param.CopyBulkMailId_param"), "", false, false)    
     
     result.string([template.filename, template.content, template.mimeType].join(";"));
 }
diff --git a/entity/BulkMail_entity/entityfields/content/valueProcess.js b/entity/BulkMail_entity/entityfields/content/valueProcess.js
index 5192b7dcfe71ab076752a059520149b1ce08baf6..d5d1db80974240bcac5caf614491d0a42023cc22 100644
--- a/entity/BulkMail_entity/entityfields/content/valueProcess.js
+++ b/entity/BulkMail_entity/entityfields/content/valueProcess.js
@@ -10,11 +10,12 @@ import("Bulkmail_lib");
 /* Processes that can also set the value of this field:
  * - bindata.onValueChange
  * - DOCUMENTTEMPLATE_ID.onValueChange
+ * - MOSAICOTEMPLATE_ID.onValueChange
  */
 
 if (vars.get("$sys.viewmode") == neon.FRAME_VIEWMODE_DATASET && vars.get("$this.value") == null)
 {
-    var template = BulkMailUtils.getBulkMailTemplate(vars.get("$field.BULKMAILID"), vars.get("$field.DOCUMENTTEMPLATE_ID"), false, false, new FileUpload(vars.get("$field.bindata")));
+    var template = BulkMailUtils.getBulkMailTemplate(vars.get("$field.BULKMAILID"), vars.get("$field.DOCUMENTTEMPLATE_ID"), false, false, new FileUpload(vars.get("$field.bindata")), vars.get("$field.MOSAICOTEMPLATE_ID"));
     if (template && template.type)
     {
         var content = util.decodeBase64String(template.content);
diff --git a/entity/BulkMail_entity/entityfields/documenttemplate_id/stateProcess.js b/entity/BulkMail_entity/entityfields/documenttemplate_id/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c13e7d9d548d02f1d33ccdadf1e55036299f9a71
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/documenttemplate_id/stateProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if (vars.get("$field.MOSAICOTEMPLATE_ID"))
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE)
+}
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/isolanguage/displayValueProcess.js b/entity/BulkMail_entity/entityfields/isolanguage/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9278f212a479bb0de19104a610f39e1de83cccf0
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/isolanguage/displayValueProcess.js
@@ -0,0 +1,11 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+
+var latinName = newSelect("NAME_LATIN")
+                    .from("AB_LANGUAGE")
+                    .whereIfSet("AB_LANGUAGE.ISO3", "$field.ISOLANGUAGE")
+                    .cell(true)
+
+result.string(translate.text(latinName));
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/isolanguage/valueProcess.js b/entity/BulkMail_entity/entityfields/isolanguage/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a23b1ac729496cd74e1b9c59801f610f98246d0
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/isolanguage/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+{
+    result.string("deu");
+}
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/mosaicotemplate_id/displayValueProcess.js b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c83829a68ffa67bc144e3731b0780ff1d7d947f
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/displayValueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("Sql_lib");
+
+
+result.string(newSelect("MOSAICOTEMPLATE.NAME")
+    .from("MOSAICOTEMPLATE")
+    .whereIfSet("MOSAICOTEMPLATE.MOSAICOTEMPLATEID", "$field.MOSAICOTEMPLATE_ID")
+    .cell(true));
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/mosaicotemplate_id/onValueChange.js b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..75ba2b3e5dbdfce827895489111c29cf60ed02ac
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/onValueChange.js
@@ -0,0 +1,42 @@
+import("system.vars");
+import("system.neon");
+import("system.util");
+import("system.mail");
+import("DocumentTemplate_lib");
+import("Entity_lib");
+import("EmailUtil_lib");
+import("Document_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{
+    // note: could not use only the valueProcess from $field.content because then it refreshed $field.content just before save.
+    // --> only set in $field.content.valueProcess if $field.content is null and set it from here only if MASK triggered change
+    var fileUpLoad = new FileUpload(vars.get("$field.bindata"));
+    var content,type,template;
+    if (fileUpLoad.isFilled())
+    {
+        type = DocumentTemplate.types.fromFileExtension(fileUpLoad.fileExtension);
+        if (type == DocumentTemplate.types.HTML || type == DocumentTemplate.types.TXT || type == DocumentTemplate.types.EML)
+        {
+            content = util.decodeBase64String(fileUpLoad.bindata);
+        }
+    }
+    else
+    {
+        var mosaicoTemplateId = vars.get("$local.value");
+        template = DocumentTemplate.loadTemplate(mosaicoTemplateId, "MOSAICOTEMPLATE", false);
+        if (template != null)
+        {
+            type = template.type;
+            if (type == DocumentTemplate.types.HTML || type == DocumentTemplate.types.TXT || type == DocumentTemplate.types.EML)
+            {
+                content = util.decodeBase64String(template.content);
+            }
+        }
+    }
+    if(content)
+    {
+        vars.set("$field.templateType", type);
+        vars.set("$field.content", content);
+    } 
+}
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/mosaicotemplate_id/stateProcess.js b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d2791e06b0f022d60b0fc439b58d867db4484c41
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/stateProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if (vars.get("$field.DOCUMENTTEMPLATE_ID"))
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE)
+}
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/mosaicotemplate_id/valueProcess.js b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b100c42c35a32d13a07b0555429e04b6eaefda2
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/mosaicotemplate_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("Util_lib");
+import("system.result");
+import("system.vars");
+
+if (vars.get("$param.CreateFromMosaicoTemplateId_param") && Utils.isNullOrEmptyString(vars.get("$this.value")))
+{
+    result.string(vars.get("$param.CreateFromMosaicoTemplateId_param"));
+}
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/name/valueProcess.js b/entity/BulkMail_entity/entityfields/name/valueProcess.js
index adb0f3d6b2fdf8627655ec017e6eba58491048a7..884964819da22c08dc0ca1a98c93e5ccd7c37859 100644
--- a/entity/BulkMail_entity/entityfields/name/valueProcess.js
+++ b/entity/BulkMail_entity/entityfields/name/valueProcess.js
@@ -21,7 +21,24 @@ if (!vars.get("$this.value") && vars.get("$sys.recordstate") == neon.OPERATINGST
         
         var name = entities.getRows(conf);
         if (name.length > 0)
+        {
             name = name[0].NAME;
+        }
+        
+        result.string(name);
+    }
+    else if (vars.get("$field.MOSAICOTEMPLATE_ID"))
+    {
+        let conf = entities.createConfigForLoadingRows();
+        conf.entity("MosaicoTemplate_entity")
+            .fields(["NAME"])
+            .uid(vars.get("$field.MOSAICOTEMPLATE_ID"));
+        
+        let name = entities.getRows(conf);
+        if (name.length > 0)
+        {
+            name = name[0].NAME;
+        }
         
         result.string(name);
     }
diff --git a/entity/BulkMail_entity/entityfields/newmosaicotemplate/onActionProcess.js b/entity/BulkMail_entity/entityfields/newmosaicotemplate/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..55e632ebbcdeb6bf790e5834e6df79e9fe6747a5
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/newmosaicotemplate/onActionProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.vars")
+
+var params = {
+    "BulkMailId_param": vars.get("$field.BULKMAILID")
+};
+
+neon.openContext("BulkMailAddMosaico", "BulkMailAddMosaicoEdit_view",null, neon.OPERATINGSTATE_VIEW, params, null);
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/newmosaicotemplate/stateProcess.js b/entity/BulkMail_entity/entityfields/newmosaicotemplate/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..507a146fc740e1b8115df769b626058227586c03
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/newmosaicotemplate/stateProcess.js
@@ -0,0 +1,13 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+
+if (vars.get("$field.MOSAICOTEMPLATE_ID" || vars.get("$field.DOCUMENTTEMPLATE_ID") || vars.get("$field.content")))
+{
+    result.string( neon.COMPONENTSTATE_INVISIBLE);
+}        
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}    
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/openinmosaico/onActionProcess.js b/entity/BulkMail_entity/entityfields/openinmosaico/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e4354fb35e2ac07a93048c0cc284700916d6ef3b
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/openinmosaico/onActionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.neon");
+import("MosaicoTemplate_lib")
+
+MosaicoUtils.openInMosaico(vars.get("$field.MOSAICOTEMPLATE_ID"));
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/openmosaico/stateProcess.js b/entity/BulkMail_entity/entityfields/openinmosaico/stateProcess.js
similarity index 66%
rename from entity/BulkMail_entity/entityfields/openmosaico/stateProcess.js
rename to entity/BulkMail_entity/entityfields/openinmosaico/stateProcess.js
index b046fb7ebf6d157125ef135fe4d1f1f7857ac98c..4756f0ef5428b776e137f8af2df88feacb82ddd2 100644
--- a/entity/BulkMail_entity/entityfields/openmosaico/stateProcess.js
+++ b/entity/BulkMail_entity/entityfields/openinmosaico/stateProcess.js
@@ -1,9 +1,9 @@
+import("system.vars");
 import("system.neon");
 import("system.result");
-import("system.project");
 
 
-if (project.getPreferenceValue("custom.mosaico.url") != "")
+if (vars.get("$field.MOSAICOTEMPLATE_ID"))
 {
     result.string( neon.COMPONENTSTATE_EDITABLE);
 }        
diff --git a/entity/BulkMail_entity/entityfields/openmosaico/onActionProcess.js b/entity/BulkMail_entity/entityfields/openmosaico/onActionProcess.js
deleted file mode 100644
index 151f3d8d61ea2c2acd6255a79fdf067a27002886..0000000000000000000000000000000000000000
--- a/entity/BulkMail_entity/entityfields/openmosaico/onActionProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.neon");
-import("system.project");
-
-neon.openUrl(project.getPreferenceValue("custom.mosaico.url"),true);
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/templatetype/valueProcess.js b/entity/BulkMail_entity/entityfields/templatetype/valueProcess.js
index 70e4f35af37e352ee5cb868c47e11d3700f8a33f..559b11282d5584c03ae2963b964729eeef87c511 100644
--- a/entity/BulkMail_entity/entityfields/templatetype/valueProcess.js
+++ b/entity/BulkMail_entity/entityfields/templatetype/valueProcess.js
@@ -6,6 +6,7 @@ import("system.vars");
 /* Processes that can also set the value of this field:
  * - bindata.onValueChange
  * - DOCUMENTTEMPLATE_ID.onValueChange
+ * - MOSAICOTEMPLATE_ID.onVAlueChange
  */
 
 if (vars.get("$sys.viewmode") == neon.FRAME_VIEWMODE_DATASET)
diff --git a/entity/BulkMail_entity/recordcontainers/db/fromClauseProcess.js b/entity/BulkMail_entity/recordcontainers/db/fromClauseProcess.js
index c25725ee94a7972130b141b36e34354b285a5619..1820a51b4973e9e143e89ef18739e26e3f5b276f 100644
--- a/entity/BulkMail_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/BulkMail_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,3 +1,8 @@
+import("Sql_lib");
 import("system.result");
 
-result.string("BULKMAIL left join DOCUMENTTEMPLATE on BULKMAIL.DOCUMENTTEMPLATE_ID = DOCUMENTTEMPLATE.DOCUMENTTEMPLATEID");
\ No newline at end of file
+var from = new SqlBuilder()
+    .from("BULKMAIL")
+    .leftJoin("DOCUMENTTEMPLATE", "BULKMAIL.DOCUMENTTEMPLATE_ID = DOCUMENTTEMPLATE.DOCUMENTTEMPLATEID")
+    .leftJoin("MOSAICOTEMPLATE", "BULKMAIL.MOSAICOTEMPLATE_ID = MOSAICOTEMPLATE.MOSAICOTEMPLATEID")
+result.string(from.toString());
\ No newline at end of file
diff --git a/entity/BulkMail_entity/recordcontainers/db/onDBUpdate.js b/entity/BulkMail_entity/recordcontainers/db/onDBUpdate.js
index 7626ea2ecbb54be6241b0f6d4214ac16388e7bb3..fe4b9f614916fffa60a24c75cb84e4450038ef7e 100644
--- a/entity/BulkMail_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/BulkMail_entity/recordcontainers/db/onDBUpdate.js
@@ -19,8 +19,9 @@ var rowdata = vars.get("$local.rowdata");
 var bulkMailId = rowdata["BULKMAIL.BULKMAILID"];
 var templateId = rowdata["BULKMAIL.DOCUMENTTEMPLATE_ID"];
 var bulkMailName = rowdata["BULKMAIL.NAME"];
+var mosaicoTemplateId = rowdata["BULKMAIL.MOSAICOTEMPLATE_ID"];
 
-var template = BulkMailUtils.getBulkMailTemplate(bulkMailId, templateId, false, false, new FileUpload(bindata));
+var template = BulkMailUtils.getBulkMailTemplate(bulkMailId, templateId, false, false, new FileUpload(bindata), mosaicoTemplateId);
 if (content)
     template.content = util.encodeBase64String(content);
 
diff --git a/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..ce72053235e7bf02ba59bccae083058fbaf02f73
--- /dev/null
+++ b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Keyword_lib");
+
+result.string(LanguageKeywordUtils.getResolvedTitleSqlPart("BULKMAIL.ISOLANGUAGE"));
\ No newline at end of file
diff --git a/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/mosaicotemplate_id.displayvalue/expression.js b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/mosaicotemplate_id.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..055bdb685e54dcd2422a823c29f97241ade8ff3a
--- /dev/null
+++ b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/mosaicotemplate_id.displayvalue/expression.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("Sql_lib");
+
+
+result.string(newSelect("MOSAICOTEMPLATE.NAME")
+                .from("MOSAICOTEMPLATE")
+                .whereIfSet("MOSAICOTEMPLATE.MOSAICOTEMPLATEID = BULKMAIL.MOSAICOTEMPLATE_ID")
+                .toString());
\ No newline at end of file
diff --git a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
index f9077535b3495a0a3a35a7b664ad654b7746a0af..17f075c645ad79860c201c3534a6310a24fd70a4 100644
--- a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
+++ b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
@@ -74,6 +74,7 @@
     <entityField>
       <name>BINDATA</name>
       <contentType>FILE</contentType>
+      <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/bindata/valueProcess.js</valueProcess>
       <onValueChange>%aditoprj%/entity/DocumentTemplate_entity/entityfields/bindata/onValueChange.js</onValueChange>
       <onValueChangeTypes>
         <element>MASK</element>
@@ -348,6 +349,10 @@
       <name>IncludeDocumentTemplateIds_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityParameter>
+      <name>CreateFromMosaicoTemplateId_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/DocumentTemplate_entity/entityfields/bindata/valueProcess.js b/entity/DocumentTemplate_entity/entityfields/bindata/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..161f999c1289aa42206799732d0714570b907507
--- /dev/null
+++ b/entity/DocumentTemplate_entity/entityfields/bindata/valueProcess.js
@@ -0,0 +1,10 @@
+import("Util_lib");
+import("system.result");
+import("DocumentTemplate_lib");
+import("system.vars");
+
+if (vars.get("$param.CreateFromMosaicoTemplateId_param") && Utils.isNullOrEmptyString(vars.get("$this.value")))
+{
+    template  = DocumentTemplate.loadTemplate(vars.get("$param.CreateFromMosaicoTemplateId_param"), "MOSAICOTEMPLATE", false)
+    result.string([template.filename, template.content, template.mimeType].join(";"));
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/MosaicoTemplate_entity.aod b/entity/MosaicoTemplate_entity/MosaicoTemplate_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..b62eb16a186dbf4fee0ccbbe1aa2a065c3764972
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/MosaicoTemplate_entity.aod
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.22" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.22">
+  <name>MosaicoTemplate_entity</name>
+  <title>Mosaico</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MosaicoTemplate_entity/documentation.adoc</documentation>
+  <icon>VAADIN:EXTERNAL_BROWSER</icon>
+  <contentTitleProcess>%aditoprj%/entity/MosaicoTemplate_entity/contentTitleProcess.js</contentTitleProcess>
+  <afterUiInit>%aditoprj%/entity/MosaicoTemplate_entity/afterUiInit.js</afterUiInit>
+  <imageProcess>%aditoprj%/entity/MosaicoTemplate_entity/imageProcess.js</imageProcess>
+  <titlePlural>Mosaico</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>CONTENT</name>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <contentType>DATE</contentType>
+      <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <title>DATE_NEW</title>
+      <contentType>DATE</contentType>
+      <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>METADATA</name>
+    </entityField>
+    <entityField>
+      <name>MOSAICOTEMPLATEID</name>
+    </entityField>
+    <entityField>
+      <name>NAME</name>
+      <title>Name</title>
+      <mandatory v="true" />
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <contentType>TEXT</contentType>
+      <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+    <entityField>
+      <name>BASETEMPLATE</name>
+      <title>Base Template</title>
+      <consumer>KeywordMosaicoBaseTemplate</consumer>
+      <mandatory v="true" />
+      <stateProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/basetemplate/stateProcess.js</stateProcess>
+    </entityField>
+    <entityConsumer>
+      <name>KeywordMosaicoBaseTemplate</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/keywordmosaicobasetemplate/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Documents</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>SingleDocument</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>AssignmentRowId_param</name>
+          <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>AssignmentTable_param</name>
+          <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityActionField>
+      <name>OpenInMosaico</name>
+      <title>Open in mosaico</title>
+      <onActionProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/openinmosaico/onActionProcess.js</onActionProcess>
+      <iconId>NEON:WRENCH</iconId>
+      <tooltipProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/openinmosaico/tooltipProcess.js</tooltipProcess>
+    </entityActionField>
+    <entityActionField>
+      <name>CopyTemplate</name>
+      <title>Copy template</title>
+      <onActionProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/copytemplate/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:COPY</iconId>
+    </entityActionField>
+    <entityActionField>
+      <name>newBulkMail</name>
+      <title>Write bulk mail</title>
+      <onActionProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/newbulkmail/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:AT</iconId>
+    </entityActionField>
+    <entityActionField>
+      <name>newDocumentTemplate</name>
+      <title>New document template</title>
+      <onActionProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/newdocumenttemplate/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:FILE_FONT</iconId>
+    </entityActionField>
+    <entityParameter>
+      <name>CopyMosaicoTemplateIdParam</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>ISOLANGUAGE</name>
+      <title>Language</title>
+      <consumer>Languages</consumer>
+      <groupable v="true" />
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/isolanguage/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/isolanguage/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>Languages</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Language_entity</entityName>
+        <fieldName>ISO3Name</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordMosaicoTemplateCategory</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>CATEGORY</name>
+      <title>Classification</title>
+      <consumer>KeywordMosaicoTemplateCategory</consumer>
+      <groupable v="true" />
+      <mandatory v="true" />
+    </entityField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <documentation>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/openadminview/documentation.adoc</documentation>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/MosaicoTemplate_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <orderClauseProcess>%aditoprj%/entity/MosaicoTemplate_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <onDBInsert>%aditoprj%/entity/MosaicoTemplate_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <onDBDelete>%aditoprj%/entity/MosaicoTemplate_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
+      <alias>Data_alias</alias>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>CONTENT.value</name>
+          <recordfield>MOSAICOTEMPLATE.CONTENT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>MOSAICOTEMPLATE.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>MOSAICOTEMPLATE.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>METADATA.value</name>
+          <recordfield>MOSAICOTEMPLATE.METADATA</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MOSAICOTEMPLATEID.value</name>
+          <recordfield>MOSAICOTEMPLATE.MOSAICOTEMPLATEID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>NAME.value</name>
+          <recordfield>MOSAICOTEMPLATE.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>MOSAICOTEMPLATE.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>MOSAICOTEMPLATE.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>BASETEMPLATE.value</name>
+          <recordfield>MOSAICOTEMPLATE.BASETEMPLATE</recordfield>
+          <isFilterable v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>BASETEMPLATE.displayValue</name>
+          <expression>%aditoprj%/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/basetemplate.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ISOLANGUAGE.value</name>
+          <recordfield>MOSAICOTEMPLATE.ISOLANGUAGE</recordfield>
+          <isFilterable v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CATEGORY.value</name>
+          <recordfield>MOSAICOTEMPLATE.CATEGORY</recordfield>
+          <isFilterable v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CATEGORY.displayValue</name>
+          <expression>%aditoprj%/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ISOLANGUAGE.displayValue</name>
+          <expression>%aditoprj%/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+      <linkInformation>
+        <linkInformation>
+          <name>79f97860-53dd-42ef-b636-76ba5710e1cb</name>
+          <tableName>MOSAICOTEMPLATE</tableName>
+          <primaryKey>MOSAICOTEMPLATEID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MosaicoTemplate_entity/afterUiInit.js b/entity/MosaicoTemplate_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..90ba6cee799560c0d554e80526f9a4e863ff7d86
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/afterUiInit.js
@@ -0,0 +1,19 @@
+import("system.vars");
+import("Sql_lib");
+import("system.neon")
+
+if (vars.get("$param.CopyMosaicoTemplateIdParam"))
+{
+    var [metadata,content,basetemplate,isolanguage,category] = newSelect(["METADATA","CONTENT","BASETEMPLATE","ISOLANGUAGE","CATEGORY"])
+                .from("MOSAICOTEMPLATE")
+                .whereIfSet("MOSAICOTEMPLATE.MOSAICOTEMPLATEID","$param.CopyMosaicoTemplateIdParam")
+                .arrayRow(true);
+                
+    neon.setFieldValues({
+        "$field.METADATA":metadata,
+         "$field.CONTENT":content,
+         "$field.BASETEMPLATE":basetemplate,
+         "$field.ISOLANGUAGE": isolanguage,
+         "$field.CATEGORY": category
+     });
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/contentTitleProcess.js b/entity/MosaicoTemplate_entity/contentTitleProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..33f139bb3d446b844820ecaf7443db266043bc13
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/contentTitleProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.getString("$field.NAME"));
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/documentation.adoc b/entity/MosaicoTemplate_entity/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..152357006a20dd5ee06b0024e7c56c9ff575a958
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/documentation.adoc
@@ -0,0 +1,5 @@
+= MosaicoTemplate_entity
+
+This entity is used to store templates used in the mosaico email editor and load them again in mosaico for changes.
+
+The datatransfer between mosaico and adito uses the mosaico_rest webservice.
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/basetemplate/stateProcess.js b/entity/MosaicoTemplate_entity/entityfields/basetemplate/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd8ec48607747ea4fc48e210ca30902fb8c793e8
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/basetemplate/stateProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+   result.string(neon.COMPONENTSTATE_EDITABLE) ;
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_READONLY);
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/copytemplate/onActionProcess.js b/entity/MosaicoTemplate_entity/entityfields/copytemplate/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e061b14e8a46cc29abe46e5b995675d68ddf9a2
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/copytemplate/onActionProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.neon");
+
+var params = {
+    "copyMosaicoTemplateIdParam" : vars.get("$field.MOSAICOTEMPLATEID")
+};
+neon.openContext("MosaicoTemplate", null, null, neon.OPERATINGSTATE_NEW, params);
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/date_edit/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/date_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1eefa316a133507629399cdfd701e7cd3b8f7e70
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{    
+    result.string(vars.get("$sys.date"));
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/date_new/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ca8db33b7f771c6904f01a7c445d110c6102d8e
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{    
+    result.string(vars.get("$sys.date"));
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ecf58a8f40423fac6f94a242679f7c7741c03e3
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.MOSAICOTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c4c2a344f6ed422e191694858a3b417ec630d69e
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("MOSAICOTEMPLATE");
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/isolanguage/displayValueProcess.js b/entity/MosaicoTemplate_entity/entityfields/isolanguage/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ebcc2d6c6b20ff5f13dba82f1108577ec1d162e
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/isolanguage/displayValueProcess.js
@@ -0,0 +1,11 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+
+var latinName = newSelect("NAME_LATIN")
+                    .from("AB_LANGUAGE")
+                    .whereIfSet("AB_LANGUAGE.ISO3", "$field.ISOLANGUAGE")
+                    .cell(true)
+
+result.string(translate.text(latinName));
diff --git a/entity/MosaicoTemplate_entity/entityfields/isolanguage/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/isolanguage/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a23b1ac729496cd74e1b9c59801f610f98246d0
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/isolanguage/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+{
+    result.string("deu");
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/keywordmosaicobasetemplate/children/containername_param/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/keywordmosaicobasetemplate/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..afa1a46098235f94b87fd177671c07a2ce27ce5d
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/keywordmosaicobasetemplate/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("KeywordRegistry_basic")
+
+result.string($KeywordRegistry.mosaicoBaseTemplate());
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f95e6c4ea55b82158002c3d64e2dba7e95db01a0
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/keywordmosaicotemplatecategory/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("KeywordRegistry_basic")
+
+result.string($KeywordRegistry.mosaicoTemplateCategory());
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/newbulkmail/onActionProcess.js b/entity/MosaicoTemplate_entity/entityfields/newbulkmail/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..121f8cd4ae685e6053f103feac3ebdc9d10e6410
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/newbulkmail/onActionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("Bulkmail_lib");
+
+
+BulkMailUtils.createFromMosaicoTemplate(vars.get("$field.MOSAICOTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/newdocumenttemplate/onActionProcess.js b/entity/MosaicoTemplate_entity/entityfields/newdocumenttemplate/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..83ccf0f0600933f88a9acef672285f3d705f648b
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/newdocumenttemplate/onActionProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.neon");
+
+var params = {
+    "CreateFromMosaicoTemplateId_param" : vars.get("$field.MOSAICOTEMPLATEID")
+};
+neon.openContext("DocumentTemplate", null, null, neon.OPERATINGSTATE_NEW, params);
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/openadminview/documentation.adoc b/entity/MosaicoTemplate_entity/entityfields/openadminview/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..e6005836e949835562ff919c0925e8ccda186dbf
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/openadminview/documentation.adoc
@@ -0,0 +1,3 @@
+= MosaicoTemplate_entity
+
+stores the data from the mosaico email editor in adito and provides basic functions for them.
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/openadminview/onActionProcess.js b/entity/MosaicoTemplate_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..dfbca24fd2fc6d23b1c643604bfed276bb359de2
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("Context_lib");
+
+
+
+AdminViewUtils.open("MOSAICOTEMPLATEID", [
+    ["DATE_NEW", vars.get("$field.DATE_NEW"), "DATE"],
+    ["DATE_EDIT", vars.get("$field.DATE_EDIT"), "DATE"],
+    ["USER_NEW", vars.get("$field.USER_NEW")],
+    ["USER_EDIT", vars.get("$field.USER_EDIT")]
+]);
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/openadminview/stateProcess.js b/entity/MosaicoTemplate_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/openadminview/stateProcess.js
@@ -0,0 +1,4 @@
+import("Context_lib");
+import("system.result");
+
+result.string(AdminViewUtils.getActionState());
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/openinmosaico/onActionProcess.js b/entity/MosaicoTemplate_entity/entityfields/openinmosaico/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c396089ac1347c82cd80aa603471b5c500f8139e
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/openinmosaico/onActionProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("MosaicoTemplate_lib");
+
+MosaicoUtils.openInMosaico(vars.get("$field.MOSAICOTEMPLATEID"));
diff --git a/entity/MosaicoTemplate_entity/entityfields/openinmosaico/tooltipProcess.js b/entity/MosaicoTemplate_entity/entityfields/openinmosaico/tooltipProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f34836b44cef2d2e75ac169393873dc2b91ed503
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/openinmosaico/tooltipProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("Open in mosaico"));
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/user_edit/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/user_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..80b1b2bff5e62c25b1dc95985b0863c5a59cdc90
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/user_edit/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{    
+    result.string(vars.get("$sys.user"));
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/entityfields/user_new/valueProcess.js b/entity/MosaicoTemplate_entity/entityfields/user_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2ed73474a25ad9b2ebe467da27c4695ec60c4bc4
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/entityfields/user_new/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{    
+    result.string(vars.get("$sys.user"));
+}
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/imageProcess.js b/entity/MosaicoTemplate_entity/imageProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c88b7ab04f19f1ebdbb7cfbd189709d3fcd9cbfe
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/imageProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string("TEXT:" + vars.getString("$field.NAME"));
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/recordcontainers/db/onDBDelete.js b/entity/MosaicoTemplate_entity/recordcontainers/db/onDBDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..39dec5b19549271cdc1673a77847b3e251def6e2
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/recordcontainers/db/onDBDelete.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("Binary_lib");
+
+SingleBinaryUtils.remove("MOSAICOTEMPLATE", "DOCUMENT", vars.get("$field.MOSAICOTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/recordcontainers/db/onDBInsert.js b/entity/MosaicoTemplate_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac3bf12b8cd51e3553194c51b9fbd95ae2f4ae96
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("Binary_lib");
+
+if (vars.get("$param.CopyMosaicoTemplateIdParam"))
+{
+    BinaryUtils.copyBinaries("MOSAICOTEMPLATE", vars.get("$param.CopyMosaicoTemplateIdParam"), "MOSAICOTEMPLATE", vars.get("$field.MOSAICOTEMPLATEID"), "DOCUMENT");
+}
diff --git a/entity/MosaicoTemplate_entity/recordcontainers/db/orderClauseProcess.js b/entity/MosaicoTemplate_entity/recordcontainers/db/orderClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..bff0dfb582fc9755f57024d572cf7e7b61dbac17
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/recordcontainers/db/orderClauseProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.db");
+
+result.object({"MOSAICOTEMPLATE.DATE_NEW": db.DESCENDING});
\ No newline at end of file
diff --git a/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/basetemplate.displayvalue/expression.js b/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/basetemplate.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..b06efea1f9f460632da3bed2a6db4b1b8b22a434
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/basetemplate.displayvalue/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.mosaicoBaseTemplate(), "MOSAICOTEMPLATE.BASETEMPLATE");
+result.string(sql);
diff --git a/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js b/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6431ba46f059d54579589c4c9d59814165ae84f
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.mosaicoTemplateCategory(), "MOSAICOTEMPLATE.CATEGORY");
+result.string(sql);
diff --git a/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js b/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..cc125ff72c2d2b0445cc9199a00860148799bf37
--- /dev/null
+++ b/entity/MosaicoTemplate_entity/recordcontainers/db/recordfieldmappings/isolanguage.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Keyword_lib");
+
+result.string(LanguageKeywordUtils.getResolvedTitleSqlPart("MOSAICOTEMPLATE.ISOLANGUAGE"));
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 61e20fbe57b27f4494d5634ae972ad0d39a86bc1..82e8891993439553f731341e1745980c2d51d724 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -10501,12 +10501,21 @@
     <entry>
       <key>Should a test email be sent to you instead?</key>
     </entry>
+    <entry>
+      <key>Open in mosaico</key>
+    </entry>
     <entry>
       <key>Copy Recipients</key>
     </entry>
     <entry>
       <key>copy</key>
     </entry>
+    <entry>
+      <key>New document template</key>
+    </entry>
+    <entry>
+      <key>Copy template</key>
+    </entry>
     <entry>
       <key>There are no test recipients.</key>
     </entry>
@@ -10654,21 +10663,12 @@
     <entry>
       <key>Saturday</key>
     </entry>
-    <entry>
-      <key>Processing of the given business card failed.\nReason: %0</key>
-    </entry>
-    <entry>
-      <key>Requested business card were already deleted.</key>
-    </entry>
     <entry>
       <key>Appointment Start</key>
     </entry>
     <entry>
       <key>Appointment End</key>
     </entry>
-    <entry>
-      <key>Contigent exhausted, please buy some new one to continue.</key>
-    </entry>
     <entry>
       <key>Appointment Subject</key>
     </entry>
@@ -10772,6 +10772,33 @@
     <entry>
       <key>Answer Address</key>
     </entry>
+    <entry>
+      <key>Open new mosaico template</key>
+    </entry>
+    <entry>
+      <key>Base Template</key>
+    </entry>
+    <entry>
+      <key>Action mail</key>
+    </entry>
+    <entry>
+      <key>Technical email</key>
+    </entry>
+    <entry>
+      <key>Create and open in editor</key>
+    </entry>
+    <entry>
+      <key>Create new mosaico template</key>
+    </entry>
+    <entry>
+      <key>Processing of the given business card failed.\nReason: %0</key>
+    </entry>
+    <entry>
+      <key>Requested business card were already deleted.</key>
+    </entry>
+    <entry>
+      <key>Contigent exhausted, please buy some new one to continue.</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 892c48776cf4bbc2a0e350d480deb13bd2fc047e..15fdd1a08fb1f8d40dbf30fff1faa433d58cd864 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -10,6 +10,14 @@
       <key>Create new campaign step</key>
       <value>Neue Kampagnenstufe erstellen</value>
     </entry>
+    <entry>
+      <key>Base Template</key>
+      <value>Ursprungsvorlage</value>
+    </entry>
+    <entry>
+      <key>Open in mosaico</key>
+      <value>In Mosaico öffnen</value>
+    </entry>
     <entry>
       <key>Single (Service/Internal)</key>
       <value>Einzel (Service/Intern)</value>
@@ -1020,6 +1028,10 @@
       <key>%0 responsilbe/s was/were changed</key>
       <value>%0 Verantwortliche/r wurde/n geändert</value>
     </entry>
+    <entry>
+      <key>Technical email</key>
+      <value>Technische E-Mail</value>
+    </entry>
     <entry>
       <key>Please check if the following fields are filled correctly</key>
       <value>Bitte überprüfen Sie ob folgende Felder richtig befüllt sind</value>
@@ -1891,6 +1903,10 @@
       <key>Descriptions</key>
       <value>Beschreibungen</value>
     </entry>
+    <entry>
+      <key>Create new mosaico template</key>
+      <value>Neue Mosaicovorlage erstellen</value>
+    </entry>
     <entry>
       <key>Free</key>
       <value>Frei</value>
@@ -3273,6 +3289,10 @@
       <key>Public Hand</key>
       <value>Öffentliche Hand</value>
     </entry>
+    <entry>
+      <key>Create and open in editor</key>
+      <value>Erstellen und im Editor öffnen</value>
+    </entry>
     <entry>
       <key>Producing and Processing Industry</key>
       <value>Produzierende und verarbeitende Industrie</value>
@@ -6037,6 +6057,10 @@
       <key>Trade</key>
       <value>Handel</value>
     </entry>
+    <entry>
+      <key>Action mail</key>
+      <value>Aktionsmail</value>
+    </entry>
     <entry>
       <key>Consultation</key>
       <value>Beratung</value>
@@ -7188,6 +7212,10 @@
       <key>CONTRACTID (UID)</key>
       <value>CONTRACTID (UID)</value>
     </entry>
+    <entry>
+      <key>Copy template</key>
+      <value>Vorlage kopieren</value>
+    </entry>
     <entry>
       <key>[%0]it was necessary to create a file from a blob-field but no lob-file-path was specified.</key>
       <value>[%0]es war Notwendig eine Datei von einem blob-Feld zu erstellen aber es wurde kein lob-Dateipfad angegeben.</value>
@@ -7881,6 +7909,10 @@
       <key>Only .odt files are supported for bulkletters.</key>
       <value>Für Serienbriefe werden nur .odt Dateien unterstützt</value>
     </entry>
+    <entry>
+      <key>New document template</key>
+      <value>Neue Dokumentvorlage</value>
+    </entry>
     <entry>
       <key>Show tickets where I am the editor</key>
     </entry>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index efd7d08eb48d3324502df9c3041a0446aa713727..61e063af63ac21f49795468123e9313a228207bb 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -9772,19 +9772,19 @@
       <key>Saturday</key>
     </entry>
     <entry>
-      <key>Processing of the given business card failed.\nReason: %0</key>
+      <key>Appointment Start</key>
     </entry>
     <entry>
-      <key>Requested business card were already deleted.</key>
+      <key>Open in mosaico</key>
     </entry>
     <entry>
-      <key>Appointment Start</key>
+      <key>Appointment End</key>
     </entry>
     <entry>
-      <key>Appointment End</key>
+      <key>New document template</key>
     </entry>
     <entry>
-      <key>Contigent exhausted, please buy some new one to continue.</key>
+      <key>Copy template</key>
     </entry>
     <entry>
       <key>Appointment Subject</key>
@@ -10861,6 +10861,33 @@
     <entry>
       <key>Answer Address</key>
     </entry>
+    <entry>
+      <key>Open new mosaico template</key>
+    </entry>
+    <entry>
+      <key>Base Template</key>
+    </entry>
+    <entry>
+      <key>Action mail</key>
+    </entry>
+    <entry>
+      <key>Technical email</key>
+    </entry>
+    <entry>
+      <key>Create and open in editor</key>
+    </entry>
+    <entry>
+      <key>Create new mosaico template</key>
+    </entry>
+    <entry>
+      <key>Processing of the given business card failed.\nReason: %0</key>
+    </entry>
+    <entry>
+      <key>Requested business card were already deleted.</key>
+    </entry>
+    <entry>
+      <key>Contigent exhausted, please buy some new one to continue.</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/BulkMailAddMosaico/BulkMailAddMosaico.aod b/neonContext/BulkMailAddMosaico/BulkMailAddMosaico.aod
new file mode 100644
index 0000000000000000000000000000000000000000..1b4ec4b48ef0eaa13cbd2f3eb524afb8d32ad47d
--- /dev/null
+++ b/neonContext/BulkMailAddMosaico/BulkMailAddMosaico.aod
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
+  <name>BulkMailAddMosaico</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>BulkMailAddMosaicoEdit_view</editView>
+  <entity>BulkMailAddMosaico_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>8f951f6b-ae65-46b2-8adc-6a82b1a23385</name>
+      <view>BulkMailAddMosaicoEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MosaicoTemplate/MosaicoTemplate.aod b/neonContext/MosaicoTemplate/MosaicoTemplate.aod
new file mode 100644
index 0000000000000000000000000000000000000000..1e8b630290ee3c7d0ac976713d896fa80dc051bc
--- /dev/null
+++ b/neonContext/MosaicoTemplate/MosaicoTemplate.aod
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
+  <name>MosaicoTemplate</name>
+  <title>Mosaico</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:EXTERNAL_BROWSER</icon>
+  <filterView>MosaicoTemplateFilter_view</filterView>
+  <editView>MosaicoTemplateEdit_view</editView>
+  <previewView>MosaicoTemplatePreview_view</previewView>
+  <entity>MosaicoTemplate_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>81ee2f8b-752d-4cc0-ae77-762795944d06</name>
+      <view>MosaicoTemplateEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>0bb791be-3de8-4692-a015-b918b77389ff</name>
+      <view>MosaicoTemplateFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>e5337161-3eda-4adb-a11b-5ee4f9c40e9d</name>
+      <view>MosaicoTemplatePreview_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonView/BulkMailAddMosaicoEdit_view/BulkMailAddMosaicoEdit_view.aod b/neonView/BulkMailAddMosaicoEdit_view/BulkMailAddMosaicoEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..f691d55b36c9418017defbc8e9a1132e424a6d43
--- /dev/null
+++ b/neonView/BulkMailAddMosaicoEdit_view/BulkMailAddMosaicoEdit_view.aod
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
+  <name>BulkMailAddMosaicoEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <fields>
+        <entityFieldLink>
+          <name>ffaee3b9-bb62-40cd-9b32-994b4c276097</name>
+          <entityField>NAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>07938506-50e8-4151-bec5-ab090dc0b2e8</name>
+          <entityField>MOSAICOTEMPLATE_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>25e5868a-5fb2-4bca-af93-54b1dc605d83</name>
+          <entityField>BASETEMPLATE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>dc4f74b4-1099-406a-a2eb-9e3004849e0a</name>
+          <entityField>CATEGORY</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>5d214250-93ad-4b1a-9a63-30b3f1e2f288</name>
+          <entityField>ISOLANGUAGE</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <actionsViewTemplate>
+      <name>Actions</name>
+      <actions>
+        <element>createAndOpen</element>
+      </actions>
+    </actionsViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/BulkMailEdit_view/BulkMailEdit_view.aod b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
index f48012b8609f0d01551fb5e125487404c8c876d4..b6e0482043baf8a03862d8ec0a8f5da7dafd48db 100644
--- a/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
+++ b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
@@ -17,6 +17,10 @@
           <name>55842e88-7e2b-41ee-b564-3c2e3fb04125</name>
           <entityField>DOCUMENTTEMPLATE_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>34565ff5-e555-417a-a901-7f8d2b2372df</name>
+          <entityField>MOSAICOTEMPLATE_ID</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <actionsViewTemplate>
@@ -88,6 +92,10 @@
           <name>1891cd3a-34a5-4c7d-9e35-635640476c63</name>
           <entityField>INTEREST_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>cd711f0c-20b7-4f1a-8bca-2e1cf420bb6d</name>
+          <entityField>ISOLANGUAGE</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <genericViewTemplate>
diff --git a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
index 4c7fd9cab9dbdb9eb4223897a8f86ca476352ba2..f09be1f845aa3608b0740200cfe97b80efda05bc 100644
--- a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
+++ b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
@@ -52,6 +52,10 @@
           <name>edbeea4d-019f-4661-b0d7-c07468e747cc</name>
           <entityField>DOCUMENTTEMPLATE_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>1a99fef8-775e-48e2-b40c-fbe9c9b0f725</name>
+          <entityField>MOSAICOTEMPLATE_ID</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>514d0861-ad00-4d32-9c56-6be0443e03e3</name>
           <entityField>CREATEACTIVITIES</entityField>
@@ -72,6 +76,10 @@
           <name>9f3df668-6741-4faf-9afc-a0d761db990a</name>
           <entityField>INTEREST_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>c1a6bec9-5c06-4755-9eee-19b5636c143d</name>
+          <entityField>ISOLANGUAGE</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <neonViewReference>
diff --git a/neonView/MosaicoTemplateEdit_view/MosaicoTemplateEdit_view.aod b/neonView/MosaicoTemplateEdit_view/MosaicoTemplateEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..f04658a8d1c8b8866a20a56621166b77a1d8269a
--- /dev/null
+++ b/neonView/MosaicoTemplateEdit_view/MosaicoTemplateEdit_view.aod
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
+  <name>MosaicoTemplateEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>generic</name>
+      <editMode v="true" />
+      <fields>
+        <entityFieldLink>
+          <name>025859a7-e151-460c-83fe-87207b6712c1</name>
+          <entityField>NAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>b704117a-cbb3-4a26-948e-bb4a3b773ebd</name>
+          <entityField>BASETEMPLATE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>b41df2f0-aa59-469a-8242-5e889fff3853</name>
+          <entityField>ISOLANGUAGE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>a2537044-a300-46f2-85e2-35ac8d3eb018</name>
+          <entityField>CATEGORY</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MosaicoTemplateFilter_view/MosaicoTemplateFilter_view.aod b/neonView/MosaicoTemplateFilter_view/MosaicoTemplateFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..91f7176e1d63869f57715b7136c37b2abcd6242c
--- /dev/null
+++ b/neonView/MosaicoTemplateFilter_view/MosaicoTemplateFilter_view.aod
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
+  <name>MosaicoTemplateFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <groupLayout>
+      <name>layout</name>
+    </groupLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>table</name>
+      <columns>
+        <neonTableColumn>
+          <name>a36a289d-a8f0-400b-9423-77f594fafada</name>
+          <entityField>#IMAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>7c757f7e-0b46-489c-80eb-58c1413492a3</name>
+          <entityField>NAME</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>df065e6d-388a-4258-839f-8dafa206bd5c</name>
+          <entityField>BASETEMPLATE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>f35fc405-6c90-4f27-9c7d-28eba8518ae3</name>
+          <entityField>DATE_NEW</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>a1927d82-e243-4aed-acc1-dce9746ca1eb</name>
+          <entityField>ISOLANGUAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>4aa87d26-ac44-458d-b8ab-d9550caffb17</name>
+          <entityField>CATEGORY</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+    <treeTableViewTemplate>
+      <name>TreeTable</name>
+      <columns>
+        <neonTreeTableColumn>
+          <name>ed2cad46-4428-4e79-b944-86a479b545ce</name>
+          <entityField>#IMAGE</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>1f1a33eb-fe91-4eac-961d-fa91b48dcf23</name>
+          <entityField>NAME</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>d492493a-250a-4886-9da7-0808bb590709</name>
+          <entityField>BASETEMPLATE</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>19246444-ffbb-4ed3-aefd-44405ce5d8fc</name>
+          <entityField>DATE_NEW</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>02429f3d-3d1a-4fc3-82a6-b1e4195c4196</name>
+          <entityField>ISOLANGUAGE</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>8a3e0e78-0a7c-47c2-a994-0b53fa402d86</name>
+          <entityField>CATEGORY</entityField>
+        </neonTreeTableColumn>
+      </columns>
+    </treeTableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MosaicoTemplatePreview_view/MosaicoTemplatePreview_view.aod b/neonView/MosaicoTemplatePreview_view/MosaicoTemplatePreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..592993049d4312857d8b648ea2ed7c381cbc4e21
--- /dev/null
+++ b/neonView/MosaicoTemplatePreview_view/MosaicoTemplatePreview_view.aod
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
+  <name>MosaicoTemplatePreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>headerCard</header>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>headerCard</name>
+      <iconField>#IMAGE</iconField>
+      <titleField>NAME</titleField>
+      <subtitleField>BASETEMPLATE</subtitleField>
+      <favoriteAction1>OpenInMosaico</favoriteAction1>
+    </cardViewTemplate>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <fields>
+        <entityFieldLink>
+          <name>1f9bfdf0-50a4-4cd2-acd6-46927be7e03c</name>
+          <entityField>ISOLANGUAGE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>65e97a67-9ea4-4412-96be-3b46a2d1326f</name>
+          <entityField>CATEGORY</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>6dd3e8ef-9a94-400d-a8a6-d7cb660b4ec3</name>
+      <entityField>Documents</entityField>
+      <view>DocumentList_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js
index 75e83e1cbc915388df6142e5cdd2531f0ac2a785..01a0f46955c0e4a6d595f618bc57d77e84c92949 100644
--- a/process/Bulkmail_lib/process.js
+++ b/process/Bulkmail_lib/process.js
@@ -83,15 +83,15 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pIsTestRun, pUser)
     }
     var sendUserTitle = project.getPreferenceValue("custom.bulkmail.user");
     
-    var [templateId, subject, emailSender, createActivity, bulkMailName, useTemplateAttachments] = 
-                newSelect("DOCUMENTTEMPLATE_ID, SUBJECT, SENDER_EMAIL_ADDRESS, CREATEACTIVITIES, NAME, USE_TEMPLATE_ATTACHMENTS")
+    var [templateId, subject, emailSender, createActivity, bulkMailName, useTemplateAttachments, mosaicoTemplateId] = 
+                newSelect("DOCUMENTTEMPLATE_ID, SUBJECT, SENDER_EMAIL_ADDRESS, CREATEACTIVITIES, NAME, USE_TEMPLATE_ATTACHMENTS, MOSAICOTEMPLATE_ID")
                     .from("BULKMAIL")
                     .where("BULKMAIL.BULKMAILID", pBulkMailId)
                     .arrayRow();
 
     useTemplateAttachments = Utils.toBoolean(useTemplateAttachments);
         
-    var template = BulkMailUtils.getBulkMailTemplate(pBulkMailId, templateId, true, useTemplateAttachments);
+    var template = BulkMailUtils.getBulkMailTemplate(pBulkMailId, templateId, true, useTemplateAttachments, mosaicoTemplateId);
     var recipientData;
     var testRecipientData;
     
@@ -479,25 +479,38 @@ BulkMailUtils.addRecipients = function (pBulkMailId, pContactIds)
  *                                                              If true the attachments from the document template is always used
  * @param {FileUpload} pUpload (optional)                       <p>
  *                                                              The upload value if a custom template is used.<br>
+ * @param {String} pMosaicoTemplateId  (optional)               <p>
+ *                                                              The id of the mosaico template.<br>
  * @return {DocumentTemplate}                                   <p>
  *                                                              The document template, null if no content was found.<br>
  */
-BulkMailUtils.getBulkMailTemplate = function (pBulkMailId, pDocumentTemplateId, pResolveSubtemplates, pUseTemplateAttachments, pUpload)
+BulkMailUtils.getBulkMailTemplate = function (pBulkMailId, pDocumentTemplateId, pResolveSubtemplates, pUseTemplateAttachments, pUpload, pMosaicoTemplateId)
 {
     if (pUpload && pUpload.isFilled() && BulkMailUtils.isValidMimeType(pUpload.mimeType))
+    {
         return DocumentTemplate.fromUpload(pUpload);
+    }
         
     var bulkTemplate = DocumentTemplate.loadTemplate(pBulkMailId, "BULKMAIL", pResolveSubtemplates);
     var documentTemplate = DocumentTemplate.loadTemplate(pDocumentTemplateId, undefined, pResolveSubtemplates);
-
+    var mosaicoTemplate = DocumentTemplate.loadTemplate(pMosaicoTemplateId, "MOSAICOTEMPLATE", pResolveSubtemplates);
     if (!bulkTemplate.content)
     {
-        return documentTemplate;
+        if (pMosaicoTemplateId)
+        {    
+            return mosaicoTemplate;
+        }
+        else 
+        {    
+            return documentTemplate;
+        }
     }
     else
     {
         if (pUseTemplateAttachments)
+        {    
             bulkTemplate.setAttachments(documentTemplate.getAttachments());
+        }
         
         return bulkTemplate;
     }
@@ -698,6 +711,20 @@ BulkMailUtils.copy = function(pBulkMailId)
     };
     neon.openContext("BulkMail", null, null, neon.OPERATINGSTATE_NEW, params);
 }
+
+/**
+ * Opens BulkMail context in new mode, with the given template from MosaicoTemplate id.<br>
+ * 
+ * @param {String} pMosaicoTemplateId          <p>
+ *                                      The id of the bulk mail.<br>
+ */
+BulkMailUtils.createFromMosaicoTemplate = function(pMosaicoTemplateId)
+{
+    var params = {
+        "CreateFromMosaicoTemplateId_param" : pMosaicoTemplateId
+    };
+    neon.openContext("BulkMail", null, null, neon.OPERATINGSTATE_NEW, params);
+}
 /*
  *Stores the Eml file for a bulkmailrecipient in the Filesystem
  *
diff --git a/process/DocumentTemplate_lib/process.js b/process/DocumentTemplate_lib/process.js
index daf83b6b1573ceee181d1cb7218ffca1b6b7b36e..862ad205061423ccd4c0c7050a1abb928c5354e9 100644
--- a/process/DocumentTemplate_lib/process.js
+++ b/process/DocumentTemplate_lib/process.js
@@ -662,12 +662,24 @@ DocumentTemplate.prototype._getRequiredPlaceholders = function (pForcedPlacehold
  * @param {Array} pContactIds contact ids
  * @param {Placeholder[]} pAdditionalPlaceholders Additional placeholders that should be used. You can use placeholders with the 
  *      types FIXEDVALUE and CALLBACKFUNCTION if you want to calculate the replacement values yourself.
+ * @param  {boolean} pGetAllReplacements if true all Replacements get returned even if theyre not in the document.
  * 
  * @return {Object} Object containing the data. The structure is like {contactId : {placeholderName : replacementValue, ...}, ...}
  */
-DocumentTemplate.prototype.getReplacementsByContactIds = function (pContactIds, pAdditionalPlaceholders)
+DocumentTemplate.prototype.getReplacementsByContactIds = function (pContactIds, pAdditionalPlaceholders, pGetAllReplacements)
 { 
-    var placeholders = this._getRequiredPlaceholders(["{@firstname@}", "{@lastname@}"], pAdditionalPlaceholders);
+    var placeholders;
+    if(pGetAllReplacements)
+    {
+        placeholders = PlaceholderUtils.getPlaceholders();
+        if (pAdditionalPlaceholders)
+            placeholders = placeholders.concat(pAdditionalPlaceholders);
+    }
+    else
+    {
+       placeholders = this._getRequiredPlaceholders(["{@firstname@}", "{@lastname@}"], pAdditionalPlaceholders);
+    }
+    
     var contactPlaceholders = [];
     var additionalPlaceholders = {};
     var isUserRequired = false;
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index cad4add23feaf327961ba46ac1196bc0b169dd14..cc85d170a716afb3a5e352b754534ce5b5b93330 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -514,4 +514,8 @@ $KeywordRegistry.attributeFilterComparisonMethod$fix = function(){return "FIX";}
 $KeywordRegistry.linkEvaluationType = function(){return "LinkEvaluationType";};
 $KeywordRegistry.linkEvaluationType$default = function(){return "LINKEVALUATION_DEFAULT";};
 $KeywordRegistry.linkEvaluationType$ignore = function(){return "LINKEVALUATION_IGNORE";};
-$KeywordRegistry.linkEvaluationType$unsubscribe = function(){return "LINKEVALUATION_UNSUBSCRIBE";};
\ No newline at end of file
+$KeywordRegistry.linkEvaluationType$unsubscribe = function(){return "LINKEVALUATION_UNSUBSCRIBE";};
+
+$KeywordRegistry.mosaicoBaseTemplate = function(){return "MosaicoBaseTemplate";};
+
+$KeywordRegistry.mosaicoTemplateCategory = function(){return "MosaicoTemplateCategory";};
\ No newline at end of file
diff --git a/process/MosaicoTemplate_lib/MosaicoTemplate_lib.aod b/process/MosaicoTemplate_lib/MosaicoTemplate_lib.aod
new file mode 100644
index 0000000000000000000000000000000000000000..18f4ea2e9f4dd0459fcde69b8a5ef0be046ae90d
--- /dev/null
+++ b/process/MosaicoTemplate_lib/MosaicoTemplate_lib.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.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
+  <name>MosaicoTemplate_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/MosaicoTemplate_lib/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/MosaicoTemplate_lib/process.js b/process/MosaicoTemplate_lib/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..849855de8a1626632e7cd732482b5a69155b2b12
--- /dev/null
+++ b/process/MosaicoTemplate_lib/process.js
@@ -0,0 +1,52 @@
+import("Sql_lib");
+import("system.project");
+import("system.neon");
+import("Employee_lib");
+import("system.vars");
+
+
+/**
+ * Provides functions for Mosaico.
+ * 
+ * Do not create an instance of this!
+ * 
+ * @class
+ */
+function MosaicoUtils () {}
+
+
+/**
+ * Opens the mosaico email editor in a new tab with the provided mosaicotemplateid
+ * 
+ * @param {String} pMosaicoTemplateId the id of the mosaico template
+ * 
+ * @return {void} 
+ */
+MosaicoUtils.openInMosaico = function (pMosaicoTemplateId)
+{
+    var baseurl = project.getPreferenceValue("custom.mosaico.url");
+
+    var aditoWebserviceBaseUrl = vars.get("$sys.origin");
+
+    var baseTemplate = newSelect("BASETEMPLATE")
+                        .from("MOSAICOTEMPLATE")
+                        .where("MOSAICOTEMPLATE.MOSAICOTEMPLATEID",pMosaicoTemplateId)
+                        .cell()
+                        .trim();
+                        
+    if (baseurl && aditoWebserviceBaseUrl && pMosaicoTemplateId && baseTemplate)
+    {
+        var parameters = {
+            aditouser: EmployeeUtils.getCurrentUserId(),
+            aditourl: aditoWebserviceBaseUrl,
+            id: pMosaicoTemplateId
+            };
+
+
+        var parameterString = "?"+Object.keys(parameters).map(function(key){return key+"="+encodeURIComponent(parameters[key])}).join("&");
+
+        var hash = "#/templates/"+baseTemplate+"/template-"+baseTemplate+".html"
+
+        neon.openUrl(baseurl+"/editor.html"+parameterString+hash,true);
+    }
+}
\ No newline at end of file
diff --git a/process/Placeholder_lib/process.js b/process/Placeholder_lib/process.js
index f9d5255fa6724011b31a58996b059d949c979482..e96b202d0b755d65adbbc90123e4e5cf6867e129 100644
--- a/process/Placeholder_lib/process.js
+++ b/process/Placeholder_lib/process.js
@@ -39,12 +39,12 @@ PlaceholderUtils.getPlaceholders = function (pLocale, pIsExportTemplateField)
     _addAddressFormat("district", "{district}", null , translate.text("District", locale));
     _addAddressFormat("region", "{region}", null , translate.text("Region", locale));
     _addAddressFormat("country", "{country}", null , translate.text("Country", locale));
-    _addAddressFormat("letterSalutation", "{letter_salutation}", null);
+    _addAddressFormat("letterSalutation", "{letter_salutation}", null, translate.text("Letter salutation"));
     _addAddressFormat("fullAddress", "", null, translate.text("FullAddress", locale));//empty string is automatically transformed into the address format of the recrods country (the format is stored in the the db table AB_COUNTRYINFO)
-    _addAddressFormat("senderOrgname", "{organisation_name}", Placeholder.targets.SENDER);
-    _addAddressFormat("senderAddress", "{street} {buildingno}", Placeholder.targets.SENDER);
-    _addAddressFormat("senderZipCity", "{country} - {zip} {city}", Placeholder.targets.SENDER);
-    _addAddressFormat("senderFullAddress", "", Placeholder.targets.SENDER), translate.text("FullAddress", locale);
+    _addAddressFormat("senderOrgname", "{organisation_name}", Placeholder.targets.SENDER, translate.text("Sender organisation name"));
+    _addAddressFormat("senderAddress", "{street} {buildingno}", Placeholder.targets.SENDER, translate.text("Sender address"));
+    _addAddressFormat("senderZipCity", "{country} - {zip} {city}", Placeholder.targets.SENDER, translate.text("Sender country - zip - city"));
+    _addAddressFormat("senderFullAddress", "", Placeholder.targets.SENDER, translate.text("Sender full address", locale));
     
     _addSqlPart("orgname", "ORGANISATION.NAME", null , translate.text("Organisationname", locale));
     _addSqlPart("firstname", "PERSON.FIRSTNAME", null , translate.text("Firstname", locale));
@@ -55,10 +55,10 @@ PlaceholderUtils.getPlaceholders = function (pLocale, pIsExportTemplateField)
     _addSqlPart("phone", CommUtil.getStandardSubSqlPhone(), null , translate.text("Phone", locale));
     _addSqlPart("email", CommUtil.getStandardSubSqlMail(), null , translate.text("Email", locale));
     _addSqlPart("name", sqlUtil.concatWithSeparator(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), null , translate.text("Name", locale));
-    _addSqlPart("senderPhone", CommUtil.getStandardSubSqlPhone(), Placeholder.targets.SENDER, null);
-    _addSqlPart("senderEmail", CommUtil.getStandardSubSqlMail(), Placeholder.targets.SENDER, null);
-    _addSqlPart("senderName", sqlUtil.concatWithSeparator(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), Placeholder.targets.SENDER, null);
-    _addSqlPart("date", "'" + datetime.toDate(vars.get("sys.date"), translate.text("dd.MM.yyyy")) + "'", Placeholder.targets.SENDER, null);
+    _addSqlPart("senderPhone", CommUtil.getStandardSubSqlPhone(), Placeholder.targets.SENDER, translate.text("Sender phone"));
+    _addSqlPart("senderEmail", CommUtil.getStandardSubSqlMail(), Placeholder.targets.SENDER, translate.text("Sender email"));
+    _addSqlPart("senderName", sqlUtil.concatWithSeparator(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), Placeholder.targets.SENDER, translate.text("Sender name"));
+    _addSqlPart("date", "'" + datetime.toDate(vars.get("sys.date"), translate.text("dd.MM.yyyy")) + "'", Placeholder.targets.SENDER, translate.text("Date"));
     
     
     /***************************************************************************************************************/ 
diff --git a/process/mosaico_rest/documentation.adoc b/process/mosaico_rest/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..f8cb0af77a943f29c4f47bbaf9acd6d5076dedec
--- /dev/null
+++ b/process/mosaico_rest/documentation.adoc
@@ -0,0 +1,4 @@
+= mosaico_rest
+
+This webservice is used by the mosaico email editor to save and load templates from the adito server.
+The Templates get shown in the MosaicoTemplate_entity.
\ No newline at end of file
diff --git a/process/mosaico_rest/mosaico_rest.aod b/process/mosaico_rest/mosaico_rest.aod
new file mode 100644
index 0000000000000000000000000000000000000000..25ec4112454dff020788ab3953c797d1925c3a69
--- /dev/null
+++ b/process/mosaico_rest/mosaico_rest.aod
@@ -0,0 +1,19 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
+  <name>mosaico_rest</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/mosaico_rest/documentation.adoc</documentation>
+  <process>%aditoprj%/process/mosaico_rest/process.js</process>
+  <publishAsWebservice v="true" />
+  <style>REST</style>
+  <restAcceptedMimeType>application/json</restAcceptedMimeType>
+  <restDeliveredMimeType>application/json</restDeliveredMimeType>
+  <loginTypeId>
+    <element>internal.none</element>
+  </loginTypeId>
+  <jditoWebserviceUser>Admin</jditoWebserviceUser>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/mosaico_rest/process.js b/process/mosaico_rest/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..8674e22c97ce68f7f1f013c100f79cbd7ba2b990
--- /dev/null
+++ b/process/mosaico_rest/process.js
@@ -0,0 +1,132 @@
+import("system.vars");
+import("Placeholder_lib");
+import("Binary_lib");
+import("system.db");
+import("system.util");
+import("Sql_lib");
+import("KeywordRegistry_basic");
+import("system.tools");
+
+//saves a Mosaico Template
+function restpost(pRequest)
+{
+    var request = JSON.parse(pRequest);
+    var body = JSON.parse(util.decodeBase64String(request.body, "UTF-8"));
+    var mosaicoTemplateId = body.id;
+    var userId = body.user;
+    var employee = tools.getUserByAttribute(tools.NAME, userId, tools.PROFILE_DEFAULT);
+    if(mosaicoTemplateId)
+    {
+        //check if template exists in db
+        var name = newSelect("NAME")
+                .from("MOSAICOTEMPLATE")
+                .where("MOSAICOTEMPLATE.MOSAICOTEMPLATEID", mosaicoTemplateId)
+                .cell(true);  
+        
+        if (name)
+        {
+            newWhere("MOSAICOTEMPLATE.MOSAICOTEMPLATEID", mosaicoTemplateId)
+            .updateFields({
+                "METADATA": body.metadata,
+                "CONTENT": body.content,
+                "USER_EDIT":employee[tools.TITLE],
+                "DATE_EDIT":vars.get("$sys.date")
+            });  
+            
+            SingleBinaryUtils.set("MOSAICOTEMPLATE", "DOCUMENT", mosaicoTemplateId, util.encodeBase64String(body.html),name +".html","");
+            
+            var bulkMailsWithTemplate = newSelect(["BULKMAIL.BULKMAILID", "BULKMAIL.NAME"])
+                                    .from("BULKMAIL")
+                                    .where("BULKMAIL.MOSAICOTEMPLATE_ID", mosaicoTemplateId)
+                                    .table();
+            
+            //update all bulkmails which use the template with the new html  file
+            bulkMailsWithTemplate.forEach(function ([pBulkMailId, pBulkMailName])
+            {
+                var metaData = SingleBinaryUtils.getMetadata("BULKMAIL", "DOCUMENT", pBulkMailId);
+                SingleBinaryUtils.set("BULKMAIL", "DOCUMENT", pBulkMailId, util.encodeBase64String(body.html), metaData[db.BINARY_FILENAME] || (pBulkMailName+".html"));
+            });
+                                                          
+            request.response.httpStatusCode = 200;
+        }
+        else
+        {
+            request.response.httpStatusCode = 500;
+        }
+    }
+    else
+    {
+        request.response.httpStatusCode = 500;
+    }
+    return JSON.stringify(request);
+}
+
+//get information about the template, links and placeholders for use in the mosaico editor
+function restget(pRequest)
+{
+    var responseBody = {}
+    var request = JSON.parse(pRequest);
+    var mosaicoTemplateId = request.query.id;
+    var userName = request.query.user;
+    
+    if (mosaicoTemplateId && userName)
+    {   
+        var mosaicoTemplateData = newSelect(["METADATA","CONTENT"])
+            .from("MOSAICOTEMPLATE")
+            .where("MOSAICOTEMPLATE.MOSAICOTEMPLATEID", mosaicoTemplateId)
+            .arrayRow();
+        if (mosaicoTemplateData.length > 0)
+        {
+            responseBody = {"metadata": mosaicoTemplateData[0], "content": mosaicoTemplateData[1]};
+        }
+        
+        responseBody.links = _getMosaicoLinks();       
+        responseBody.placeholders = _getMosaicoPlaceholders(userName);
+
+        if(responseBody.hasOwnProperty("metadata"))
+        {
+            request.response.httpStatusCode = 200; //ok
+        }
+        else
+        {
+            request.response.httpStatusCode = 404; //not found
+        }
+    }
+    else
+    {
+        request.response.httpStatusCode = 400; //bad request
+    }
+     
+    request.response.body = JSON.stringify(responseBody);
+
+    return JSON.stringify(request);
+}
+
+
+function _getMosaicoLinks()
+{
+    return newSelect("PLACEHOLDER")
+            .from("WEBLINK")
+            .where("WEBLINK.PLACEHOLDER is not null")
+            .orderBy("PLACEHOLDER asc")
+            .arrayColumn();
+}
+
+function _getMosaicoPlaceholders(pUserName)
+{
+    var employee = tools.getUserByAttribute(tools.NAME, pUserName, tools.PROFILE_DEFAULT);
+    var employeeContactId = employee[tools.PARAMS][tools.CONTACTID];
+    var replacements = new DocumentTemplate().getReplacementsByContactIds([employeeContactId],null,true)
+
+
+    var mosaicoPlaceholders = PlaceholderUtils.getPlaceholders()
+    .map( function(pPlaceholder) 
+    {
+        return {title: pPlaceholder.title,
+                preview: replacements[employeeContactId][pPlaceholder.getFormattedName()],
+                placeholder: pPlaceholder.getFormattedName(),
+                variableName: pPlaceholder.placeholderName};
+    });
+        
+    return mosaicoPlaceholders 
+}
\ No newline at end of file