diff --git a/src/core/js/edit_mode.js b/src/core/js/edit_mode.js
index fda1547727395b79083c41c3126ab7f6cf03c836..7e74c4248661768602d7055f765b5e3f1cb3bc5e 100644
--- a/src/core/js/edit_mode.js
+++ b/src/core/js/edit_mode.js
@@ -313,6 +313,18 @@ var edit_mode = new function() {
     }
 
 
+    this.get_datatype_str = function (atomic, refid, list) {
+        var result = atomic;
+        if (typeof refid !== "undefined") {
+            result = refid;
+        }
+        if (list === "on" || list === true) {
+            result = `LIST<${result}>`;
+        }
+        return result;
+    }
+
+
     /**
      * Insert entities.
      *
@@ -324,21 +336,28 @@ var edit_mode = new function() {
         ent_elements = caosdb_utils.assert_array(ent_elements, "param `ent_elements`", true);
         var xmls = [];
         for ( const ent_element of ent_elements ) {
-            xmls.push(createEntityXML(
-                getEntityRole(ent_element),
-                getEntityName(ent_element),
-                undefined,
-                edit_mode.getProperties(ent_element),
-                getParents(ent_element),
-                true,
-                getEntityDatatype(ent_element),
-                getEntityDescription(ent_element),
-                getEntityUnit(ent_element),
-            ));
+            xmls.push(edit_mode.form_to_xml(ent_element));
         }
         return await insert(xmls);
     }
 
+    this.form_to_xml = function(ent_element) {
+        const obj = form_elements.form_to_object($(ent_element).find("form")[0]);
+        return createEntityXML(
+            getEntityRole(ent_element),
+            getEntityName(ent_element),
+            getEntityID(ent_element),
+            edit_mode.getProperties(ent_element),
+            getParents(ent_element),
+            true,
+            edit_mode.get_datatype_str(
+                obj.atomic_datatype,
+                obj.reference_target,
+                obj.is_list),
+            getEntityDescription(ent_element),
+            obj.unit,
+        );
+    }
 
     /**
      * TODO merge with getPropertyFromElement in caosdb.js
@@ -415,17 +434,7 @@ var edit_mode = new function() {
     }
 
     this.update_entity = async function(ent_element) {
-        var xml = createEntityXML(
-            getEntityRole(ent_element),
-            getEntityName(ent_element),
-            getEntityID(ent_element),
-            edit_mode.getProperties(ent_element),
-            getParents(ent_element),
-            true,
-            getEntityDatatype(ent_element),
-            getEntityDescription(ent_element),
-            getEntityUnit(ent_element),
-        );
+        var xml = edit_mode.form_to_xml(ent_element);
         return await edit_mode.update(xml);
     }
 
@@ -556,9 +565,10 @@ var edit_mode = new function() {
         }
         // remove other stuff
         header.children().remove();
-        header.append($('<form class="form-horizontal"></form>').append(inputs));
-        edit_mode.make_dataype_input_logic(header);
+        const form = $('<form class="form-horizontal"></form>').append(inputs);
+        header.append(form);
 
+        edit_mode.make_dataype_input_logic(form[0]);
         edit_mode.add_parent_delete_buttons(header[0]);
     }
 
@@ -570,30 +580,55 @@ var edit_mode = new function() {
         return datatype.substring(5, datatype.length - 1);
     }
 
-    this.make_dataype_input_logic = function(header) {
-        var unitLabel = $(header).find(".caosdb-f-entity-unit-label");
-        var unitInput = $(header).find(".caosdb-f-entity-unit");
-        var isListLabel = $(header).find(".caosdb-f-entity-is-list-label");
-        var isListInput = $(header).find(".caosdb-f-entity-is-list");
-        var referenceLabel = $(header).find(".caosdb-f-entity-reference-label");
-        var referenceInput = $(header).find(".caosdb-f-entity-reference");
+    this.make_dataype_input_logic = function(form) {
+        const datatype = form_elements.get_fields(form, "atomic_datatype");
 
-        // TODO show on reference
-        referenceInput.hide();
-        referenceLabel.hide();
+        $(datatype).find("select").change(function () {
+            const new_type = $(this).val();
+            edit_mode.on_datatype_change(form, new_type);
+        });
 
-        // TODO show unit for double and integer
+        // trigger for the first time
+        edit_mode.on_datatype_change(form, $(datatype).find("select").val());
     }
 
+    this.on_datatype_change = function (form, new_type) {
+        console.log(`datatype changed to ${new_type}.`);
 
-    this.make_datatype_input = function(datatype, unit) {
-        var is_list = edit_mode.isListDatatype(datatype);
-        if (is_list) {
-            datatype = edit_mode.unListDatatype(datatype);
+        if (new_type === "REFERENCE") {
+            console.log("datatype is REFERENCE");
+            form_elements.enable_name(form, "reference_target");
+        } else {
+            console.log("datatype is not REFERENCE");
+            form_elements.disable_name(form, "reference_target");
         }
 
-        // datatypes {name: has_unit?}
-        var datatypes = {
+        if (new_type === "DOUBLE" || new_type === "INTEGER") {
+            console.log("show unit");
+            form_elements.enable_name(form, "unit");
+        } else {
+            console.log("hide unit");
+            form_elements.disable_name(form, "unit");
+        }
+
+    }
+
+
+    this.make_unit_input = function(unit) {
+        const unit_input = $('<div class="form-group"/>')
+            .append(form_elements
+                .make_text_input({
+                    name: "unit",
+                    label: "unit",
+                    value: unit,
+                }));
+        return unit_input;
+    }
+
+    /**
+     * { name: has_unit? }
+     */
+    this._known_atomic_datatypes = {
             "TEXT": false,
             "DOUBLE": true,
             "INTEGER": true,
@@ -601,30 +636,66 @@ var edit_mode = new function() {
             "BOOLEAN": false,
             "FILE": false,
             "REFERENCE":false,
+        };
+
+
+    this.make_datatype_input = function(datatype, unit) {
+        const is_list = edit_mode.isListDatatype(datatype);
+        if (is_list) {
+            datatype = edit_mode.unListDatatype(datatype);
         }
-        var select = $('<select></select>');
+
+        const datatypes = edit_mode._known_atomic_datatypes;
+
+        // is reference?
+        var reference = undefined;
+        if (typeof datatype !== undefined &&
+                typeof datatypes[datatype] === undefined) {
+            reference = datatype;
+            datatype = "REFERENCE";
+        }
+
+        var select = $('<select class="form-control"></select>');
         for (const dt of Object.keys(datatypes)) {
             select.append('<option data-has-refid="' + (dt == "REFERENCE") + '" data-has-unit="' + datatypes[dt] + '"  value="' + dt + '" ' + (dt == datatype ? 'selected="true"' : '') + '>' + dt + '</option>');
         }
 
-        const datatype_input = $(`
-<div class="form-group">
-  <label class="col-sm-2 control-label caosdb-f-entity-datatype-label">datatype</label>
-  <div class="col-sm-3">
-    <select class="form-control caosdb-f-entity-datatype">${select.html()}</select>
-  </div>
-  <label class="col-sm-2 control-label caosdb-f-entity-reference-label">reference</label>
-  <div class="col-sm-3">
-    <input readonly="true" class="form-control caosdb-f-entity-reference" value="" placeholder="Drop a RT"></input>
-  </div>
-  <label class="col-sm-1 control-label caosdb-f-entity-is-list-label">list</label>
-  <div class="col-sm-1">
-    <input class="caosdb-f-entity-is-list" type="checkbox" ${(is_list ? 'checked="true" ' : "")}/>
-  </div>
-</div>`)[0];
-
-        const unit_input = $('<div class="form-group"><label class="col-sm-2 control-label caosdb-f-entity-unit-label">unit</label><div class="col-sm-2"><input type="text" class="form-control caosdb-f-entity-unit" value="' + (typeof unit == 'undefined' ? "" : unit) + '"></input></div></div>')[0],
-        return [ datatype_input, unit_input ];
+        const datatype_config = {
+            name: "atomic_datatype",
+            label: "datatype",
+        };
+        const datatype_selector = $(form_elements
+                ._make_field_wrapper(datatype_config.name))
+            .append(form_elements._make_input_label_str(datatype_config))
+            .append($('<div class="col-sm-9"/>').append(select));
+
+        const reference_config = {
+            name: "reference_target",
+            label: "reference to",
+            query: "SELECT name FROM RECORDTYPE",
+            make_desc: getEntityName,
+            required: true,
+        };
+        const refid_selector = $(form_elements
+                .make_reference_drop_down(reference_config));
+
+        const list_checkbox_config = {
+            name: "is_list",
+            label: "list",
+            checked: is_list,
+        }
+        const list_checkbox = $(form_elements
+                .make_checkbox_input(list_checkbox_config));
+
+        //const datatype_input = $(`<div class="form-group"></div>`)
+            //.append(datatype_selector)
+            //.append(refid_selector)
+            //.append(list_checkbox);
+
+        return [datatype_selector, refid_selector, list_checkbox,
+            edit_mode.make_unit_input(unit)];
+
+        //return [datatype_input, edit_mode.make_unit_input(unit)];
     }
 
     this.make_input = function(label, value) {
diff --git a/src/core/js/form_elements.js b/src/core/js/form_elements.js
index 5c29058f532dc30daa98b6354b60e3caab88a7a6..31c608912f023b85a069d6ac623b45aaa1591aac 100644
--- a/src/core/js/form_elements.js
+++ b/src/core/js/form_elements.js
@@ -238,10 +238,8 @@ var form_elements = new function () {
          *
          * @param {object} config
          * @returns {HTMLElement} SELECT element.
-         *
-         * TODO make syncronous
          */
-        this.make_reference_drop_down = async function (config) {
+        this.make_reference_drop_down = function (config) {
             let ret = $(this._make_field_wrapper(config.name));
             let label = this._make_input_label_str(config);
             let loading = $('<div class="caosdb-f-field-not-ready">loading...</div>');
@@ -486,7 +484,7 @@ var form_elements = new function () {
             } else if (type === "range") {
                 field = await this.make_range_input(config);
             } else if (type === "reference_drop_down") {
-                field = await this.make_reference_drop_down(config);
+                field = this.make_reference_drop_down(config);
             } else if (type === "subform") {
                 // TODO handle cache and required for subforms
                 return await this.make_subform(config);
@@ -664,11 +662,11 @@ var form_elements = new function () {
         }
 
         this.enable_name = function (form, name) {
-            this.enable_fields(form.find(".caosdb-f-field[data-field-name='" + name + "']").toArray());
+            this.enable_fields($(form).find(".caosdb-f-field[data-field-name='" + name + "']").toArray());
         }
 
         this.disable_name = function (form, name) {
-            this.disable_fields(form.find(".caosdb-f-field[data-field-name='" + name + "']").toArray());
+            this.disable_fields($(form).find(".caosdb-f-field[data-field-name='" + name + "']").toArray());
         }
 
         this.make_script_form = async function (config, script) {
@@ -963,7 +961,8 @@ var form_elements = new function () {
          */
         this._make_field_wrapper = function (name) {
             caosdb_utils.assert_string(name, "param `name`");
-            return $('<div class="form-group caosdb-f-field caosdb-f-entity-property" data-field-name="' + name + '" />')
+            // TODO check where caosdb-f-entity-property class was used
+            return $('<div class="form-group caosdb-f-field" data-field-name="' + name + '" />')
                 .css({"padding": "0"})[0];
         }