diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java
index c46c4ba9a46476f373e4e32a94d0a6589577b41a..1e3fc1ba614dfa7935c9723ee6d8b5e3f1508758 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java
@@ -191,6 +191,9 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
     @JsonProperty
     private Date accessDate;
 
+    @JsonProperty
+    private Map<String, String> metaData;
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     public DataSetFetchOptions getFetchOptions()
@@ -1164,6 +1167,17 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         setProperty(propertyName, propertyValue);
     }
 
+    @JsonIgnore
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
+
     // Method automatically generated with DtoGenerator
     @Override
     public String toString()
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java
index 7e0442b7e04b9b8b9b9e4c443f82b1f6ead98c95..1f12bbb646a39bc04d2a6a74ac46862bce6f8a56 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSetType.java
@@ -32,6 +32,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /*
  * Class automatically generated with DtoGenerator
@@ -71,6 +72,9 @@ public class DataSetType implements Serializable, ICodeHolder, IDescriptionHolde
     @JsonProperty
     private Plugin validationPlugin;
 
+    @JsonProperty
+    private Map<String, String> metaData;
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     public DataSetTypeFetchOptions getFetchOptions()
@@ -218,6 +222,17 @@ public class DataSetType implements Serializable, ICodeHolder, IDescriptionHolde
         this.validationPlugin = validationPlugin;
     }
 
+    @JsonIgnore
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
+
     // Method automatically generated with DtoGenerator
     @Override
     public String toString()
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java
index 50c9fcddd0745dc23113117243cb84570411f63f..99894d689de90064e27897b2d21924f1a83d5a12 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java
@@ -81,6 +81,8 @@ public class DataSetCreation implements ICreation, ICreationIdHolder, IObjectCre
 
     private boolean autoGeneratedCode;
 
+    private Map<String, String> metaData;
+
     public IEntityTypeId getTypeId()
     {
         return typeId;
@@ -241,6 +243,16 @@ public class DataSetCreation implements ICreation, ICreationIdHolder, IObjectCre
         this.childIds = childIds;
     }
 
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
+
     @Override
     public void setProperty(String propertyName, String propertyValue)
     {
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java
index a954271daf87887a05760652f85b9bff1b1cf47a..3b53a7650785b6ea114a8ada6435898c6b28c3cd 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetTypeCreation.java
@@ -16,6 +16,7 @@
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create;
 
 import java.util.List;
+import java.util.Map;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.ObjectToString;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.create.IEntityTypeCreation;
@@ -46,6 +47,8 @@ public class DataSetTypeCreation implements IEntityTypeCreation
 
     private List<PropertyAssignmentCreation> propertyAssignments;
 
+    private Map<String, String> metaData;
+
     @Override
     public String getCode()
     {
@@ -124,6 +127,17 @@ public class DataSetTypeCreation implements IEntityTypeCreation
         this.propertyAssignments = propertyAssignments;
     }
 
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
+
+
     @Override
     public String toString()
     {
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java
index 37a6901b2c1e6d7047e0cdf963d9f1b89b4c1261..0f616c8c65e0a5e5386ebc1955bd426e911a585d 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetTypeUpdate.java
@@ -17,6 +17,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update;
 
 import java.util.List;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateMapValues;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
@@ -58,6 +59,9 @@ public class DataSetTypeUpdate implements IEntityTypeUpdate
     @JsonProperty
     private PropertyAssignmentListUpdateValue propertyAssignments = new PropertyAssignmentListUpdateValue();
 
+    @JsonProperty
+    private ListUpdateMapValues metaData = new ListUpdateMapValues();
+
     @Override
     @JsonIgnore
     public IEntityTypeId getObjectId()
@@ -157,6 +161,18 @@ public class DataSetTypeUpdate implements IEntityTypeUpdate
         propertyAssignments.setActions(actions);
     }
 
+    @JsonIgnore
+    public ListUpdateMapValues getMetaData()
+    {
+        return metaData;
+    }
+
+    @JsonIgnore
+    public void setMetaDataActions(List<ListUpdateAction<Object>> actions)
+    {
+        metaData.setActions(actions);
+    }
+
     @Override
     public String toString()
     {
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java
index 9671f970b68b1d86ae900998c86e5a108e0224af..6a9fa9351c7bab3b0a6acaf97674059b5463a6c4 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java
@@ -19,16 +19,13 @@ import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.*;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.ObjectToString;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IObjectUpdate;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
@@ -92,6 +89,9 @@ public class DataSetUpdate implements IUpdate, IObjectUpdate<IDataSetId>, IPrope
     @JsonProperty
     private IdListUpdateValue<IDataSetId> childIds = new IdListUpdateValue<IDataSetId>();
 
+    @JsonProperty
+    private ListUpdateMapValues metaData = new ListUpdateMapValues();
+
     @Override
     @JsonIgnore
     public IDataSetId getObjectId()
@@ -501,6 +501,18 @@ public class DataSetUpdate implements IUpdate, IObjectUpdate<IDataSetId>, IPrope
         setProperty(propertyName, propertyValue);
     }
 
+    @JsonIgnore
+    public ListUpdateMapValues getMetaData()
+    {
+        return metaData;
+    }
+
+    @JsonIgnore
+    public void setMetaDataActions(List<ListUpdateAction<Object>> actions)
+    {
+        metaData.setActions(actions);
+    }
+
     @Override
     public String toString()
     {
diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js b/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js
index 532f7d576d97f04dec4356824d10bca0db0c6813..9c02e60514ad019a42a2370c313c47d830118687 100644
--- a/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js
+++ b/api-openbis-javascript/src/v3/as/dto/dataset/DataSet.js
@@ -50,6 +50,7 @@ define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) {
 		prototype.sampleProperties = null;
 		prototype.dataProducer = null;
 		prototype.dataProductionDate = null;
+		prototype.metaData = null;
 
 		prototype.getFetchOptions = function() {
 			return this.fetchOptions;
@@ -527,6 +528,12 @@ define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) {
 		prototype.setDataProductionDate = function(dataProductionDate) {
 			this.dataProductionDate = dataProductionDate;
 		};
+		prototype.getMetaData = function() {
+            return this.metaData;
+        };
+        prototype.setMetaData = function(metaData) {
+            this.metaData = metaData;
+        };
 	}, {
 		fetchOptions : "DataSetFetchOptions",
 		permId : "DataSetPermId",
@@ -614,7 +621,11 @@ define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) {
 			name : "Map",
 			arguments : [ "String", "Sample" ]
 		},
-		dataProductionDate : "Date"
+		dataProductionDate : "Date",
+		metaData: {
+            name: "Map",
+            arguments: ["String", "String"]
+        }
 	});
 	return DataSet;
 })
\ No newline at end of file
diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js b/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js
index 64d64cf4c25525ce062b191a336dad9f7788b067..88a4176a16d9b405739a33dabeb20a6f8aa3f9af 100644
--- a/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js
+++ b/api-openbis-javascript/src/v3/as/dto/dataset/DataSetType.js
@@ -21,6 +21,8 @@ define(['stjs'], function (stjs) {
       prototype.modificationDate = null
       prototype.propertyAssignments = null
       prototype.validationPlugin = null
+      prototype.metaData = null;
+
       prototype.getPropertyAssignments = function () {
         if (
           this.getFetchOptions() &&
@@ -99,6 +101,12 @@ define(['stjs'], function (stjs) {
       prototype.setModificationDate = function (modificationDate) {
         this.modificationDate = modificationDate
       }
+      prototype.getMetaData = function() {
+        return this.metaData;
+      }
+      prototype.setMetaData = function(metaData) {
+        this.metaData = metaData;
+      };
       prototype.toString = function () {
         return this.getCode()
       }
@@ -111,7 +119,11 @@ define(['stjs'], function (stjs) {
         name: 'List',
         arguments: ['PropertyAssignment']
       },
-      validationPlugin: 'Plugin'
+      validationPlugin: 'Plugin',
+      metaData: {
+        name: "Map",
+        arguments: ["String", "String"]
+      }
     }
   )
   return DataSetType
diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js
index 032716b1d8cc3e3333280b0e651d005935ed0878..d3cc1b251a084057dedc761a0a7caa3d73039393 100644
--- a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js
+++ b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetCreation.js
@@ -23,6 +23,7 @@ define([ "stjs" ], function(stjs) {
 		prototype.childIds = null;
 		prototype.creationId = null;
 		prototype.autoGeneratedCode = null;
+		prototype.metaData = null;
 
         prototype.getTypeId = function() {
             return this.typeId;
@@ -228,6 +229,12 @@ define([ "stjs" ], function(stjs) {
 		prototype.setAutoGeneratedCode = function(autoGeneratedCode) {
 			this.autoGeneratedCode = autoGeneratedCode;
 		};
+		prototype.getMetaData = function() {
+            return this.metaData;
+        };
+        prototype.setMetaData = function(metaData) {
+            this.metaData = metaData;
+        };
 	}, {
 		typeId : "IEntityTypeId",
 		dataSetKind : "DataSetKind",
@@ -260,7 +267,11 @@ define([ "stjs" ], function(stjs) {
 			name : "List",
 			arguments : [ "Object" ]
 		},
-		creationId : "CreationId"
+		creationId : "CreationId",
+        metaData: {
+            name: "Map",
+            arguments: ["String", "String"]
+        }
 	});
 	return DataSetCreation;
 })
\ No newline at end of file
diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js
index 63cedbf59ed1e4802d70e088590d65c3b697328f..52379e316ebbf26d3cd28c20735854477540806e 100644
--- a/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js
+++ b/api-openbis-javascript/src/v3/as/dto/dataset/create/DataSetTypeCreation.js
@@ -14,6 +14,7 @@ define([ "stjs" ], function(stjs) {
 		prototype.disallowDeletion = false;
 		prototype.validationPluginId = null;
 		prototype.propertyAssignments = null;
+		prototype.metaData = null;
 
 		prototype.getCode = function() {
 			return this.code;
@@ -57,13 +58,23 @@ define([ "stjs" ], function(stjs) {
 		prototype.setPropertyAssignments = function(propertyAssignments) {
 			this.propertyAssignments = propertyAssignments;
 		};
+		prototype.getMetaData = function() {
+            return this.metaData;
+        };
+        prototype.setMetaData = function(metaData) {
+            this.metaData = metaData;
+        };
 
 	}, {
 		validationPluginId : "IPluginId",
 		propertyAssignments : {
 			name : "List",
 			arguments : [ "PropertyAssignmentCreation" ]
-		}
+		},
+        metaData: {
+            name: "Map",
+            arguments: ["String", "String"]
+        }
 	});
 	return DataSetTypeCreation;
 })
\ No newline at end of file
diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js
index c29a77474ce3b7cd43423eaa3d17164c325bd7ce..c55a95eb1c168b744082b621b5e215dbd535102c 100644
--- a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js
+++ b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetTypeUpdate.js
@@ -1,5 +1,6 @@
-define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/update/PropertyAssignmentListUpdateValue" ], function(stjs, FieldUpdateValue, 
-		PropertyAssignmentListUpdateValue) {
+define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/update/PropertyAssignmentListUpdateValue",
+ "as/dto/common/update/ListUpdateMapValues"], function(stjs, FieldUpdateValue,
+		PropertyAssignmentListUpdateValue, ListUpdateMapValues) {
 	var DataSetTypeUpdate = function() {
 		this.description = new FieldUpdateValue();
 		this.mainDataSetPattern = new FieldUpdateValue();
@@ -7,6 +8,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd
 		this.disallowDeletion = new FieldUpdateValue();
 		this.validationPluginId = new FieldUpdateValue();
 		this.propertyAssignments = new PropertyAssignmentListUpdateValue();
+		this.metaData = new ListUpdateMapValues();
 	};
 	stjs.extend(DataSetTypeUpdate, null, [], function(constructor, prototype) {
 		prototype['@type'] = 'as.dto.dataset.update.DataSetTypeUpdate';
@@ -18,6 +20,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd
 		prototype.disallowDeletion = null;
 		prototype.validationPluginId = null;
 		prototype.propertyAssignments = null;
+		prototype.metaData = null;
 
 		prototype.getObjectId = function() {
 			return this.getTypeId();
@@ -64,6 +67,12 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd
 		prototype.setPropertyAssignmentActions = function(actions) {
 			this.propertyAssignments.setActions(actions);
 		};
+		prototype.getMetaData = function() {
+            return this.metaData;
+        };
+        prototype.setMetaDataActions = function(actions) {
+            this.metaData.setActions(actions);
+        };
 	}, {
 		typeId : "IEntityTypeId",
 		description : {
@@ -86,7 +95,8 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/entitytype/upd
 			name : "FieldUpdateValue",
 			arguments : [ "IPluginId" ]
 		},
-		propertyAssignments : "PropertyAssignmentListUpdateValue"
+		propertyAssignments : "PropertyAssignmentListUpdateValue",
+		metaData : "ListUpdateMapValues"
 	});
 	return DataSetTypeUpdate;
 })
\ No newline at end of file
diff --git a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js
index bfd89ec147ee7e890e5f478197445f5c6406e5c5..407cb565d4f9ab9679d2e91c68d0db952680a36a 100644
--- a/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js
+++ b/api-openbis-javascript/src/v3/as/dto/dataset/update/DataSetUpdate.js
@@ -1,7 +1,9 @@
 /**
  * @author pkupczyk
  */
-define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/IdListUpdateValue" ], function(stjs, FieldUpdateValue, IdListUpdateValue) {
+define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/IdListUpdateValue",
+    "as/dto/common/update/ListUpdateMapValues"],
+    function(stjs, FieldUpdateValue, IdListUpdateValue, ListUpdateMapValues) {
 	var DataSetUpdate = function() {
 		this.experimentId = new FieldUpdateValue();
 		this.sampleId = new FieldUpdateValue();
@@ -13,6 +15,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/
 		this.componentIds = new IdListUpdateValue();
 		this.parentIds = new IdListUpdateValue();
 		this.childIds = new IdListUpdateValue();
+		this.metaData = new ListUpdateMapValues();
 	};
 	stjs.extend(DataSetUpdate, null, [], function(constructor, prototype) {
 		prototype['@type'] = 'as.dto.dataset.update.DataSetUpdate';
@@ -33,6 +36,7 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/
 		prototype.componentIds = null;
 		prototype.parentIds = null;
 		prototype.childIds = null;
+		prototype.metaData = null;
 
 		prototype.getObjectId = function() {
 			return this.getDataSetId();
@@ -233,6 +237,12 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/
 		prototype.setChildActions = function(actions) {
 			this.childIds.setActions(actions);
 		};
+		prototype.getMetaData = function() {
+            return this.metaData;
+        };
+        prototype.setMetaDataActions = function(actions) {
+            this.metaData.setActions(actions);
+        };
 	}, {
 		dataSetId : "IDataSetId",
 		experimentId : {
@@ -274,7 +284,8 @@ define([ "stjs", "as/dto/common/update/FieldUpdateValue", "as/dto/common/update/
 		childIds : {
 			name : "IdListUpdateValue",
 			arguments : [ "IDataSetId" ]
-		}
+		},
+        metaData : "ListUpdateMapValues"
 	});
 	return DataSetUpdate;
 })
\ No newline at end of file
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java
index 393143ced889d4cb7933f54b2ad06845f2864168..6c787bc13d2b6a6555918076d51a2dbb9a37a539 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java
@@ -152,6 +152,7 @@ public class CreateDataSetExecutor extends AbstractCreateEntityExecutor<DataSetC
                     dataSet.setDerived(false == creation.isMeasured());
                     dataSet.setDataProducerCode(creation.getDataProducer());
                     dataSet.setProductionDate(creation.getDataProductionDate());
+                    dataSet.setMetaData(creation.getMetaData());
 
                     PersonPE person = context.getSession().tryGetPerson();
                     dataSet.setRegistrator(person);
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java
index c4ed4ce65ddacc7757ddfcecfa50395b0ff5d718..2d163fca390f88267e1aa33f5e7f0ba02a0508d1 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetTypesExecutor.java
@@ -76,6 +76,7 @@ public class CreateDataSetTypesExecutor extends AbstractCreateEntityTypeExecutor
         type.setMainDataSetPattern(creation.getMainDataSetPattern());
         type.setMainDataSetPath(creation.getMainDataSetPath());
         type.setDeletionDisallow(creation.isDisallowDeletion());
+        type.setMetaData(creation.getMetaData());
     }
 
     @Override
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java
index da5f2a314746e99c02d8eba0c658606b277ab0f2..85f3fce4bb7774c11617c9657918c3de086c21aa 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java
@@ -15,13 +15,11 @@
  */
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 import org.springframework.stereotype.Component;
@@ -125,6 +123,7 @@ public class UpdateDataSetExecutor extends AbstractUpdateEntityExecutor<DataSetU
         updateDataSetSampleExecutor.update(context, batch);
         updateDataSetPropertyExecutor.update(context, batch);
         updateTags(context, batch);
+        updateMetaData(context, batch);
 
         PersonPE person = context.getSession().tryGetPerson();
         Date timeStamp = daoFactory.getTransactionTimestamp();
@@ -201,6 +200,69 @@ public class UpdateDataSetExecutor extends AbstractUpdateEntityExecutor<DataSetU
             };
     }
 
+    private void updateMetaData(final IOperationContext context, final MapBatch<DataSetUpdate, DataPE> batch)
+    {
+        new MapBatchProcessor<DataSetUpdate, DataPE>(context, batch)
+        {
+            @Override
+            public void process(DataSetUpdate update, DataPE entity)
+            {
+                Map<String, String> metaData = new HashMap<>();
+                if(entity.getMetaData() != null) {
+                    metaData.putAll(entity.getMetaData());
+                }
+                ListUpdateValue.ListUpdateActionSet<?> lastSetAction = null;
+                AtomicBoolean metaDataChanged = new AtomicBoolean(false);
+                for (ListUpdateValue.ListUpdateAction<Object> action : update.getMetaData().getActions())
+                {
+                    if (action instanceof ListUpdateValue.ListUpdateActionAdd<?>)
+                    {
+                        addTo(metaData, action, metaDataChanged);
+                    } else if (action instanceof ListUpdateValue.ListUpdateActionRemove<?>)
+                    {
+                        for (String key : (Collection<String>) action.getItems())
+                        {
+                            metaDataChanged.set(true);
+                            metaData.remove(key);
+                        }
+                    } else if (action instanceof ListUpdateValue.ListUpdateActionSet<?>)
+                    {
+                        lastSetAction = (ListUpdateValue.ListUpdateActionSet<?>) action;
+                    }
+                }
+                if (lastSetAction != null)
+                {
+                    metaData.clear();
+                    addTo(metaData, lastSetAction, metaDataChanged);
+                }
+                if (metaDataChanged.get())
+                {
+                    entity.setMetaData(metaData.isEmpty() ? null : metaData);
+                }
+            }
+
+            @Override
+            public IProgress createProgress(DataSetUpdate key, DataPE value, int objectIndex, int totalObjectCount)
+            {
+                return new UpdateRelationProgress(key, value, "dataset-metadata", objectIndex, totalObjectCount);
+            }
+
+            @SuppressWarnings("unchecked")
+            private void addTo(Map<String, String> metaData, ListUpdateValue.ListUpdateAction<?> lastSetAction, AtomicBoolean metaDataChanged)
+            {
+                Collection<Map<String, String>> maps = (Collection<Map<String, String>>) lastSetAction.getItems();
+                for (Map<String, String> map : maps)
+                {
+                    if (!map.isEmpty())
+                    {
+                        metaDataChanged.set(true);
+                        metaData.putAll(map);
+                    }
+                }
+            }
+        };
+    }
+
     @Override
     protected void updateAll(IOperationContext context, MapBatch<DataSetUpdate, DataPE> batch)
     {
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java
index 32c7a891cf9371dafedfeb25080de038e5f495a9..1847ba7440a9970d08398e7a25c75ac4aac9f040 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetTypeExecutor.java
@@ -15,6 +15,7 @@
  */
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -26,6 +27,11 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IUpdateEntity
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 /**
  * @author Franz-Josef Elmer
  */
@@ -57,6 +63,7 @@ public class UpdateDataSetTypeExecutor
         type.setMainDataSetPattern(getNewValue(update.getMainDataSetPattern(), type.getMainDataSetPattern()));
         type.setMainDataSetPath(getNewValue(update.getMainDataSetPath(), type.getMainDataSetPath()));
         type.setDeletionDisallow(getNewValue(update.isDisallowDeletion(), type.isDeletionDisallow()));
+        updateMetaData(type, update);
     }
 
     @Override
@@ -71,4 +78,53 @@ public class UpdateDataSetTypeExecutor
         authorizationExecutor.canUpdate(context);
     }
 
+    private void updateMetaData(DataSetTypePE type, DataSetTypeUpdate update)
+    {
+        Map<String, String> metaData = new HashMap<>();
+        if(type.getMetaData() != null) {
+            metaData.putAll(type.getMetaData());
+        }
+        ListUpdateValue.ListUpdateActionSet<?> lastSetAction = null;
+        AtomicBoolean metaDataChanged = new AtomicBoolean(false);
+        for (ListUpdateValue.ListUpdateAction<Object> action : update.getMetaData().getActions())
+        {
+            if (action instanceof ListUpdateValue.ListUpdateActionAdd<?>)
+            {
+                addTo(metaData, action, metaDataChanged);
+            } else if (action instanceof ListUpdateValue.ListUpdateActionRemove<?>)
+            {
+                for (String key : (Collection<String>) action.getItems())
+                {
+                    metaDataChanged.set(true);
+                    metaData.remove(key);
+                }
+            } else if (action instanceof ListUpdateValue.ListUpdateActionSet<?>)
+            {
+                lastSetAction = (ListUpdateValue.ListUpdateActionSet<?>) action;
+            }
+        }
+        if (lastSetAction != null)
+        {
+            metaData.clear();
+            addTo(metaData, lastSetAction, metaDataChanged);
+        }
+        if (metaDataChanged.get())
+        {
+            type.setMetaData(metaData.isEmpty() ? null : metaData);
+        }
+    }
+
+    private void addTo(Map<String, String> metaData, ListUpdateValue.ListUpdateAction<?> lastSetAction, AtomicBoolean metaDataChanged)
+    {
+        Collection<Map<String, String>> maps = (Collection<Map<String, String>>) lastSetAction.getItems();
+        for (Map<String, String> map : maps)
+        {
+            if (!map.isEmpty())
+            {
+                metaDataChanged.set(true);
+                metaData.putAll(map);
+            }
+        }
+    }
+
 }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java
index af3397f4c99e829072871d20d14ac2d0aaca4931..cbb46df8247974df8ba475c38234a048d8f6a42b 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java
@@ -199,7 +199,7 @@ public class UpdateExperimentExecutor extends AbstractUpdateEntityExecutor<Exper
             @Override
             public IProgress createProgress(ExperimentUpdate update, ExperimentPE entity, int objectIndex, int totalObjectCount)
             {
-                return new UpdateRelationProgress(update, entity, "experiment-tag", objectIndex, totalObjectCount);
+                return new UpdateRelationProgress(update, entity, "experiment-metadata", objectIndex, totalObjectCount);
             }
 
             @SuppressWarnings("unchecked")
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java
index ba929dd1517b4205c178545aa0df67a6ebfb59bf..0e3199685d15b4f4d8fecfe0368cbb97da32fb60 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java
@@ -391,6 +391,7 @@ public class Generator extends AbstractGenerator
         addExperiment(gen);
         addSample(gen);
         addProperties(gen);
+        addMetaData(gen);
 
         gen.addPluralFetchedField("List<DataSet>", List.class.getName(), "parents", "Parents", DataSetFetchOptions.class)
                 .withInterfaceReflexive(IParentChildrenHolder.class);
@@ -448,6 +449,7 @@ public class Generator extends AbstractGenerator
         gen.addStringField("mainDataSetPath");
         gen.addBooleanField("disallowDeletion");
         addModificationDate(gen);
+        addMetaData(gen);
 
         gen.setToStringMethod("\"DataSetType \" + code");
         addPropertyAssignments(gen);
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java
index 1fe8d1ae2a5367e881213a1bf4bc82442a85a2b6..c6fd9caceaa904b1255d71ff57fbedfd705e7c91 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java
@@ -50,4 +50,6 @@ public class DataSetBaseRecord extends ObjectBaseRecord
     public boolean frozenForComponents;
 
     public boolean frozenForContainers;
+
+    public String metaData;
 }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
index c5075af93378afc6459535564b27e5c200788844..2a03c904b0139f183ef9490680bd2464555f9bec 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
@@ -43,7 +43,7 @@ public interface DataSetQuery extends ObjectQuery
             + "d.modification_timestamp as modificationDate, d.registration_timestamp as registrationDate, "
             + "d.data_set_kind as dataSetKind, d.frozen as frozen, d.frozen_for_children as frozenForChildren, "
             + "d.frozen_for_parents as frozenForParents, d.frozen_for_comps as frozenForComponents, "
-            + "d.frozen_for_conts as frozenForContainers "
+            + "d.frozen_for_conts as frozenForContainers, d.meta_data as metaData "
             + "from data d where d.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<DataSetBaseRecord> getDataSets(LongSet dataSetIds);
 
@@ -93,7 +93,7 @@ public interface DataSetQuery extends ObjectQuery
     public List<ObjectRelationRecord> getTypeIds(LongSet dataSetIds);
 
     @Select(sql = "select dt.id, dt.code, dt.description, dt.main_ds_pattern as mainDataSetPattern, dt.main_ds_path as mainDataSetPath, "
-            + "dt.deletion_disallow as disallowDeletion, dt.modification_timestamp as modificationDate from data_set_types dt where dt.id = any(?{1})", parameterBindings = {
+            + "dt.deletion_disallow as disallowDeletion, dt.modification_timestamp as modificationDate, dt.meta_data as metaData from data_set_types dt where dt.id = any(?{1})", parameterBindings = {
             LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<DataSetTypeBaseRecord> getTypes(LongSet dataSetTypeIds);
 
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java
index 0b445c9863daa5ec1fe710b3b8b854123cf1ce53..e84509df81bf8e85d4634cf0a92d834e70050c74 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java
@@ -19,6 +19,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.CommonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -315,6 +316,7 @@ public class DataSetTranslator extends AbstractCachingTranslator<Long, DataSet,
         result.setFrozenForParents(baseRecord.frozenForParents);
         result.setFrozenForComponents(baseRecord.frozenForComponents);
         result.setFrozenForContainers(baseRecord.frozenForContainers);
+        result.setMetaData(CommonUtils.asMap(baseRecord.metaData));
 
         if (fetchOptions.hasType())
         {
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java
index 963194c71d95bdddcd9beb9a5dca797613f86465..663796881bbf9c3fb6379bdad93602804b0a1c5f 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeBaseRecord.java
@@ -37,4 +37,6 @@ public class DataSetTypeBaseRecord extends ObjectBaseRecord
 
     public Date modificationDate;
 
+    public String metaData;
+
 }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java
index 49d07c7cdaa2c1b96921d7ad1af0d8b2aac370cb..7661e8ca66f076565191e180f596ae86f561041d 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTypeTranslator.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.dataset;
 import java.util.Collection;
 import java.util.List;
 
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.CommonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -89,6 +90,7 @@ public class DataSetTypeTranslator extends AbstractCachingTranslator<Long, DataS
         result.setDisallowDeletion(baseRecord.disallowDeletion);
         result.setDescription(baseRecord.description);
         result.setModificationDate(baseRecord.modificationDate);
+        result.setMetaData(CommonUtils.asMap(baseRecord.metaData));
 
         if (fetchOptions.hasPropertyAssignments())
         {
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
index 6384050bff4f16893fd1ff4d36749ece46fbe2a6..dada1aac933be41cbad8844c67c44a9bec50f4f3 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
@@ -123,6 +123,8 @@ public abstract class AbstractExternalData extends
 
     private Date accessTimestamp;
 
+    private Map<String, String> metaData;
+
     public AbstractExternalData(boolean isStub)
     {
         this.isStub = isStub;
@@ -519,6 +521,16 @@ public abstract class AbstractExternalData extends
         return null;
     }
 
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
+
     /**
      * {@link Comparator} for data sets contained in a (virtual) container which uses ascending order in container.
      */
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java
index ddf555f56bb62dc6bdf720b738bb7f71b21d1efd..dc08ef2a2b6955bf417ea13b2d3465c72acc597c 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetType.java
@@ -16,6 +16,7 @@
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * The <i>GWT</i> equivalent to DataSetTypePE.
@@ -34,6 +35,8 @@ public class DataSetType extends EntityType
 
     private boolean deletionDisallow;
 
+    private Map<String, String> metaData;
+
     public void setMainDataSetPattern(String mainDataSetPattern)
     {
         this.mainDataSetPattern = mainDataSetPattern;
@@ -95,4 +98,14 @@ public class DataSetType extends EntityType
     {
         return EntityKind.DATA_SET;
     }
+
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
 }
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
index 2e876d2da1a01d563315194c931b10756c1bc1fa..5ad52f1501e8c6060b3c8f73a3934a598829ed21 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
@@ -15,15 +15,7 @@
  */
 package ch.systemsx.cisd.openbis.generic.shared.dto;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
+import java.util.*;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
@@ -45,14 +37,8 @@ import javax.persistence.Version;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 
-import org.hibernate.annotations.BatchSize;
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.FetchMode;
-import org.hibernate.annotations.Generated;
-import org.hibernate.annotations.GenerationTime;
-import org.hibernate.annotations.OptimisticLock;
+import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.JsonMapUserType;
+import org.hibernate.annotations.*;
 import org.hibernate.validator.constraints.Length;
 
 import ch.systemsx.cisd.common.collection.UnmodifiableSetDecorator;
@@ -73,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
  */
 @Entity
 @Table(name = TableNames.DATA_VIEW, uniqueConstraints = @UniqueConstraint(columnNames = ColumnNames.CODE_COLUMN))
+@TypeDefs({ @TypeDef(name = "JsonMap", typeClass = JsonMapUserType.class) })
 @Inheritance(strategy = InheritanceType.JOINED)
 public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         IEntityInformationWithPropertiesHolder, IMatchingEntity, IIdentifierHolder, IDeletablePE,
@@ -155,6 +142,8 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
 
     private Set<DataSetRelationshipPE> childRelationships = new LinkedHashSet<DataSetRelationshipPE>();
 
+    private Map<String, String> metaData;
+
     @OptimisticLock(excluded = true)
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentDataSet")
     @Fetch(FetchMode.SUBSELECT)
@@ -1050,4 +1039,16 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         this.postRegistration = postRegistration;
     }
 
+    @Column(name = "meta_data")
+    @Type(type = "JsonMap")
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
+
 }
\ No newline at end of file
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java
index 67f3b188293a580ac2958b9226113adbf479acef..80ccb8de14b0efcc49884c22ec82c1598d937ca7 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetTypePE.java
@@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.shared.dto;
 
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import javax.persistence.CascadeType;
@@ -32,6 +33,10 @@ import javax.persistence.Table;
 import javax.persistence.Transient;
 import javax.persistence.UniqueConstraint;
 
+import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.JsonMapUserType;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+import org.hibernate.annotations.TypeDefs;
 import org.hibernate.validator.constraints.Length;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericConstants;
@@ -45,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
  */
 @Entity
 @Table(name = TableNames.DATA_SET_TYPES_TABLE, uniqueConstraints = { @UniqueConstraint(columnNames = { ColumnNames.CODE_COLUMN }) })
+@TypeDefs({ @TypeDef(name = "JsonMap", typeClass = JsonMapUserType.class) })
 public class DataSetTypePE extends EntityTypePE
 {
     private static final long serialVersionUID = IServer.VERSION;
@@ -58,6 +64,8 @@ public class DataSetTypePE extends EntityTypePE
 
     private boolean deletionDisallow;
 
+    private Map<String, String> metaData;
+
     @Override
     @SequenceGenerator(name = SequenceNames.DATA_SET_TYPE_SEQUENCE, sequenceName = SequenceNames.DATA_SET_TYPE_SEQUENCE, allocationSize = 1)
     @Id
@@ -163,4 +171,17 @@ public class DataSetTypePE extends EntityTypePE
         this.deletionDisallow = deletionDisallow;
     }
 
+    @Column(name = "meta_data")
+    @Type(type = "JsonMap")
+    public Map<String, String> getMetaData()
+    {
+        return metaData;
+    }
+
+    public void setMetaData(Map<String, String> metaData)
+    {
+        this.metaData = metaData;
+    }
+
+
 }
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
index 35186d452f5c4a2133d122f9fe9f5cfb18dbfc9c..fa1f662a2a477e7a6660ef846df243c7dc0311f3 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
@@ -295,6 +295,7 @@ public class DataSetTranslator
             externalData.setMetaprojects(metaprojects);
         }
         externalData.setDeletion(DeletionTranslator.translate(dataPE.getDeletion()));
+        externalData.setMetaData(dataPE.getMetaData());
         return externalData;
     }
 
@@ -401,6 +402,7 @@ public class DataSetTranslator
         dataSet.setH5Folders(externalDataPE.isH5Folders());
         dataSet.setH5arFolders(externalDataPE.isH5arFolders());
         dataSet.setArchivingRequested(externalDataPE.isArchivingRequested());
+        dataSet.setMetaData(externalDataPE.getMetaData());
         return dataSet;
     }
 
@@ -436,6 +438,7 @@ public class DataSetTranslator
         sample.setSpace(SpaceTranslator.translate(samplePE.getSpace()));
         sample.setProject(ProjectTranslator.translate(samplePE.getProject()));
         sample.setExperiment(experiment);
+        sample.setMetaData(samplePE.getMetaData());
         if (loadSampleProperties)
         {
             sample.setProperties(EntityPropertyTranslator.translate(samplePE.getProperties(),
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java
index 8c1afbcc0ee0d63e145311d1c9081a4394bb45ff..b01a3e0a98aa838369891f7df49ceb8474be2996 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTypeTranslator.java
@@ -61,6 +61,7 @@ public class DataSetTypeTranslator
         result.setModificationDate(entityTypeOrNull.getModificationDate());
         result.setValidationScript(ScriptTranslator.translate(entityTypeOrNull
                 .getValidationScript()));
+        result.setMetaData(entityTypeOrNull.getMetaData());
         return result;
     }
 
diff --git a/server-application-server/source/sql/generic/192/schema-192.sql b/server-application-server/source/sql/generic/192/schema-192.sql
index a36235c47cf8fd5c3e03bec2193a5f60e944dac7..0b60665ebf8179d79eaa2180c9a4a9d2d6b42e77 100644
--- a/server-application-server/source/sql/generic/192/schema-192.sql
+++ b/server-application-server/source/sql/generic/192/schema-192.sql
@@ -2,7 +2,7 @@
 
 CREATE TABLE CONTROLLED_VOCABULARIES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_CHOSEN_FROM_LIST BOOLEAN_CHAR NOT NULL DEFAULT TRUE, SOURCE_URI CHARACTER VARYING(250));
 CREATE TABLE CONTROLLED_VOCABULARY_TERMS (ID TECH_ID NOT NULL,CODE OBJECT_NAME NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,COVO_ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,LABEL COLUMN_LABEL, DESCRIPTION DESCRIPTION_2000, ORDINAL ORDINAL_INT NOT NULL, IS_OFFICIAL BOOLEAN_CHAR NOT NULL DEFAULT 'T');
-CREATE TABLE DATA_ALL (ID TECH_ID NOT NULL,CODE CODE,DATA_SET_KIND DATA_SET_KIND DEFAULT 'PHYSICAL' NOT NULL,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID,IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, ACCESS_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL, DEL_ID TECH_ID, ORIG_DEL TECH_ID, PERS_ID_MODIFIER TECH_ID, VERSION INTEGER DEFAULT 0, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CHILDREN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_PARENTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_COMPS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CONTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', SAMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL);
+CREATE TABLE DATA_ALL (ID TECH_ID NOT NULL,CODE CODE,DATA_SET_KIND DATA_SET_KIND DEFAULT 'PHYSICAL' NOT NULL,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID,IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, ACCESS_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL, DEL_ID TECH_ID, ORIG_DEL TECH_ID, PERS_ID_MODIFIER TECH_ID, VERSION INTEGER DEFAULT 0, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CHILDREN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_PARENTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_COMPS BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_CONTS BOOLEAN_CHAR NOT NULL DEFAULT 'F', EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', SAMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, META_DATA JSONB);
 CREATE TABLE DATA_SET_RELATIONSHIPS_ALL (DATA_ID_PARENT TECH_ID NOT NULL,DATA_ID_CHILD TECH_ID NOT NULL, RELATIONSHIP_ID TECH_ID NOT NULL, ORDINAL INTEGER, DEL_ID TECH_ID, PERS_ID_AUTHOR TECH_ID, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PARENT_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', CHILD_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', COMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', CONT_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F');
 CREATE TABLE DATA_STORES (ID TECH_ID NOT NULL,UUID CODE NOT NULL,CODE CODE NOT NULL,DOWNLOAD_URL VARCHAR(1024) NOT NULL,REMOTE_URL VARCHAR(250) NOT NULL,SESSION_TOKEN VARCHAR(50) NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_ARCHIVER_CONFIGURED BOOLEAN_CHAR NOT NULL DEFAULT 'F', DATA_SOURCE_DEFINITIONS TEXT_VALUE);
 CREATE TABLE DATA_STORE_SERVICES  (ID TECH_ID NOT NULL, KEY VARCHAR(256) NOT NULL, LABEL VARCHAR(256) NOT NULL, KIND DATA_STORE_SERVICE_KIND NOT NULL, DATA_STORE_ID TECH_ID NOT NULL, REPORTING_PLUGIN_TYPE DATA_STORE_SERVICE_REPORTING_PLUGIN_TYPE);
@@ -28,7 +28,7 @@ CREATE TABLE MATERIAL_PROPERTIES (ID TECH_ID NOT NULL,MATE_ID TECH_ID NOT NULL,M
 CREATE TABLE MATERIAL_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, MATE_ID TECH_ID NOT NULL, MTPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, PERS_ID_AUTHOR TECH_ID NOT NULL, VALID_FROM_TIMESTAMP TIME_STAMP NOT NULL, VALID_UNTIL_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, INTEGER_ARRAY_VALUE LONG_VALUE[], REAL_ARRAY_VALUE DOUBLE_VALUE[], STRING_ARRAY_VALUE TEXT_VALUE[], TIMESTAMP_ARRAY_VALUE TIME_STAMP[], JSON_VALUE JSONB);
 CREATE TABLE MATERIAL_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, VALIDATION_SCRIPT_ID TECH_ID);
 CREATE TABLE MATERIAL_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,MATY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000,SCRIPT_ID TECH_ID,IS_SHOWN_EDIT BOOLEAN_CHAR NOT NULL DEFAULT 'T',SHOW_RAW_VALUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F');
-CREATE TABLE DATA_SET_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, MAIN_DS_PATTERN VARCHAR(300), MAIN_DS_PATH VARCHAR(1000), DELETION_DISALLOW BOOLEAN_CHAR DEFAULT 'F', VALIDATION_SCRIPT_ID TECH_ID);
+CREATE TABLE DATA_SET_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, MAIN_DS_PATTERN VARCHAR(300), MAIN_DS_PATH VARCHAR(1000), DELETION_DISALLOW BOOLEAN_CHAR DEFAULT 'F', VALIDATION_SCRIPT_ID TECH_ID, META_DATA JSONB);
 CREATE TABLE PERSONS (ID TECH_ID NOT NULL,FIRST_NAME VARCHAR(30),LAST_NAME VARCHAR(30),USER_ID USER_ID NOT NULL,EMAIL OBJECT_NAME,SPACE_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID, DISPLAY_SETTINGS FILE, IS_ACTIVE BOOLEAN DEFAULT TRUE);
 CREATE TABLE PROJECTS (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL,CODE CODE NOT NULL,SPACE_ID TECH_ID NOT NULL,PERS_ID_LEADER TECH_ID,DESCRIPTION TEXT_VALUE,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PERS_ID_MODIFIER TECH_ID, VERSION INTEGER DEFAULT 0, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_EXP BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_SAMP BOOLEAN_CHAR NOT NULL DEFAULT 'F', SPACE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F');
 CREATE TABLE PROPERTY_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000 NOT NULL,LABEL COLUMN_LABEL NOT NULL,DATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,COVO_ID TECH_ID,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F', MATY_PROP_ID TECH_ID, SATY_PROP_ID TECH_ID, SCHEMA TEXT_VALUE, TRANSFORMATION TEXT_VALUE, META_DATA JSONB);
@@ -131,7 +131,7 @@ CREATE VIEW data AS
      SELECT id, code, dsty_id, dast_id, expe_id, expe_frozen, data_producer_code, production_timestamp, samp_id, samp_frozen, 
             registration_timestamp, access_timestamp, pers_id_registerer, pers_id_modifier, is_valid, modification_timestamp, 
             is_derived, del_id, orig_del, version, data_set_kind, 
-            frozen, frozen_for_children, frozen_for_parents, frozen_for_comps, frozen_for_conts, tsvector_document
+            frozen, frozen_for_children, frozen_for_parents, frozen_for_comps, frozen_for_conts, tsvector_document, meta_data
        FROM data_all 
       WHERE del_id IS NULL;
 
diff --git a/server-application-server/source/sql/postgresql/192/function-192.sql b/server-application-server/source/sql/postgresql/192/function-192.sql
index 4245d2128177b4bcc83de68ca78d562873cb5dd5..329fe70b2405f79871050a369d1c36bb74a4120d 100644
--- a/server-application-server/source/sql/postgresql/192/function-192.sql
+++ b/server-application-server/source/sql/postgresql/192/function-192.sql
@@ -811,7 +811,8 @@ CREATE OR REPLACE RULE data_insert AS
        samp_id,
        samp_frozen,
        version,
-       data_set_kind
+       data_set_kind,
+       meta_data
      ) VALUES (
        NEW.id,
        NEW.frozen,
@@ -838,7 +839,8 @@ CREATE OR REPLACE RULE data_insert AS
        NEW.samp_id,
        NEW.samp_frozen,
        NEW.version,
-       NEW.data_set_kind
+       NEW.data_set_kind,
+       NEW.meta_data
      );
 
 CREATE OR REPLACE RULE data_update AS
@@ -868,7 +870,8 @@ CREATE OR REPLACE RULE data_update AS
               samp_id = NEW.samp_id,
               samp_frozen = NEW.samp_frozen,
               version = NEW.version,
-              data_set_kind = NEW.data_set_kind
+              data_set_kind = NEW.data_set_kind,
+              meta_data = NEW.meta_data
        WHERE id = NEW.id;
 
 CREATE OR REPLACE RULE data_all AS
diff --git a/server-application-server/source/sql/postgresql/migration/migration-191-192.sql b/server-application-server/source/sql/postgresql/migration/migration-191-192.sql
index e3d5e405e95a7d1ef35b705f39d21dfdb4055983..48999d1968d8135d557bf68efa7b04c8b557344a 100644
--- a/server-application-server/source/sql/postgresql/migration/migration-191-192.sql
+++ b/server-application-server/source/sql/postgresql/migration/migration-191-192.sql
@@ -29,6 +29,21 @@ CREATE OR REPLACE VIEW experiments AS
       WHERE del_id IS NULL;
 
 
+ALTER TABLE IF EXISTS DATA_ALL
+    ADD COLUMN META_DATA jsonb;
+
+ALTER TABLE IF EXISTS DATA_SET_TYPES
+    ADD COLUMN META_DATA jsonb;
+
+CREATE OR REPLACE VIEW data AS
+   SELECT id, code, dsty_id, dast_id, expe_id, expe_frozen, data_producer_code, production_timestamp, samp_id, samp_frozen,
+          registration_timestamp, access_timestamp, pers_id_registerer, pers_id_modifier, is_valid, modification_timestamp,
+          is_derived, del_id, orig_del, version, data_set_kind,
+          frozen, frozen_for_children, frozen_for_parents, frozen_for_comps, frozen_for_conts, tsvector_document, meta_data
+     FROM data_all
+    WHERE del_id IS NULL;
+
+
 -- function
 
 CREATE OR REPLACE RULE sample_insert AS
@@ -180,3 +195,95 @@ CREATE OR REPLACE RULE experiment_update AS
               version = NEW.version,
               meta_data = NEW.meta_data
           WHERE id = NEW.id;
+
+
+CREATE OR REPLACE RULE data_insert AS
+  ON INSERT TO data DO INSTEAD
+     INSERT INTO data_all (
+       id,
+       frozen,
+       frozen_for_children,
+       frozen_for_parents,
+       frozen_for_comps,
+       frozen_for_conts,
+       code,
+       del_id,
+       orig_del,
+       expe_id,
+       expe_frozen,
+       dast_id,
+       data_producer_code,
+       dsty_id,
+       is_derived,
+       is_valid,
+       modification_timestamp,
+       access_timestamp,
+       pers_id_registerer,
+       pers_id_modifier,
+       production_timestamp,
+       registration_timestamp,
+       samp_id,
+       samp_frozen,
+       version,
+       data_set_kind,
+       meta_data
+     ) VALUES (
+       NEW.id,
+       NEW.frozen,
+       NEW.frozen_for_children,
+       NEW.frozen_for_parents,
+       NEW.frozen_for_comps,
+       NEW.frozen_for_conts,
+       NEW.code,
+       NEW.del_id,
+       NEW.orig_del,
+       NEW.expe_id,
+       NEW.expe_frozen,
+       NEW.dast_id,
+       NEW.data_producer_code,
+       NEW.dsty_id,
+       NEW.is_derived,
+       NEW.is_valid,
+       NEW.modification_timestamp,
+       NEW.access_timestamp,
+       NEW.pers_id_registerer,
+       NEW.pers_id_modifier,
+       NEW.production_timestamp,
+       NEW.registration_timestamp,
+       NEW.samp_id,
+       NEW.samp_frozen,
+       NEW.version,
+       NEW.data_set_kind,
+       NEW.meta_data
+     );
+
+CREATE OR REPLACE RULE data_update AS
+    ON UPDATE TO data DO INSTEAD
+       UPDATE data_all
+          SET code = NEW.code,
+              frozen = NEW.frozen,
+              frozen_for_children = NEW.frozen_for_children,
+              frozen_for_parents = NEW.frozen_for_parents,
+              frozen_for_comps = NEW.frozen_for_comps,
+              frozen_for_conts = NEW.frozen_for_conts,
+              del_id = NEW.del_id,
+              orig_del = NEW.orig_del,
+              expe_id = NEW.expe_id,
+              expe_frozen = NEW.expe_frozen,
+              dast_id = NEW.dast_id,
+              data_producer_code = NEW.data_producer_code,
+              dsty_id = NEW.dsty_id,
+              is_derived = NEW.is_derived,
+              is_valid = NEW.is_valid,
+              modification_timestamp = NEW.modification_timestamp,
+              access_timestamp = NEW.access_timestamp,
+              pers_id_registerer = NEW.pers_id_registerer,
+              pers_id_modifier = NEW.pers_id_modifier,
+              production_timestamp = NEW.production_timestamp,
+              registration_timestamp = NEW.registration_timestamp,
+              samp_id = NEW.samp_id,
+              samp_frozen = NEW.samp_frozen,
+              version = NEW.version,
+              data_set_kind = NEW.data_set_kind,
+              meta_data = NEW.meta_data
+       WHERE id = NEW.id;
\ No newline at end of file