From bf947c59c15fcdcfb3983d46f8e1985f1e37e80a Mon Sep 17 00:00:00 2001
From: alaskowski <alaskowski@ethz.ch>
Date: Fri, 31 May 2024 15:00:13 +0200
Subject: [PATCH] BIS-1024: Moved pattern from property type to property
 assignment

---
 .../v3/dto/property/PropertyAssignment.java   | 28 ++++++++++
 .../asapi/v3/dto/property/PropertyType.java   | 28 ----------
 .../create/PropertyAssignmentCreation.java    | 24 +++++++++
 .../property/create/PropertyTypeCreation.java | 28 ----------
 .../property/update/PropertyTypeUpdate.java   | 30 -----------
 .../CreatePropertyAssignmentsExecutor.java    | 14 +++++
 .../IPatternCompiler.java                     |  2 +-
 .../{property => entity}/PatternCompiler.java |  5 +-
 .../property/CreatePropertyTypeExecutor.java  | 11 +---
 .../property/UpdatePropertyTypeExecutor.java  | 12 +----
 .../property/PropertyAssignmentRecord.java    |  6 +++
 .../PropertyAssignmentTranslator.java         |  2 +
 .../property/PropertyTypeRecord.java          |  6 ---
 .../property/PropertyTypeTranslator.java      |  2 -
 .../AbstractXLSEntityTypeExportHelper.java    |  4 +-
 .../PropertyAssignmentImportHelper.java       |  4 ++
 .../helper/PropertyTypeImportHelper.java      | 15 ------
 .../business/bo/EntityTypePropertyTypeBO.java | 14 ++++-
 .../server/business/bo/PropertyTypeBO.java    |  5 --
 .../bo/common/IPropertyListingQuery.java      |  3 +-
 .../common/PropertyTypeDataObjectBinding.java |  2 -
 .../basic/dto/EntityTypePropertyType.java     | 48 +++++++++++++++++
 .../shared/basic/dto/NewETPTAssignment.java   | 36 +++++++++++++
 .../shared/dto/EntityTypePropertyTypePE.java  | 39 ++++++++++++++
 .../generic/shared/dto/PropertyTypePE.java    | 37 --------------
 .../dto/hibernate/PatternValueValidator.java  | 27 ++++------
 ...tractEntityTypePropertyTypeTranslator.java |  4 ++
 .../translator/PropertyTypeTranslator.java    |  2 -
 .../source/sql/generic/195/schema-195.sql     | 24 ++++++---
 .../source/sql/generic/196/schema-196.sql     | 22 +++++---
 .../migration/migration-194-195.sql           | 34 +++++++++++--
 .../property/PatternCompilerTest.java         | 19 +++++++
 .../asapi/v3/CreateEntityTypeTest.java        | 48 +++++++++++++++++
 .../asapi/v3/CreatePropertyTypeTest.java      | 20 --------
 .../asapi/v3/UpdateEntityTypeTest.java        | 51 +++++++++++++++++++
 .../asapi/v3/UpdatePropertyTypesTest.java     | 42 ---------------
 .../hibernate/PatternValueValidatorTest.java  |  4 +-
 .../195/015=data_set_type_property_types.tsv  | 22 ++++----
 .../029=experiment_type_property_types.tsv    | 18 +++----
 .../195/041=material_type_property_types.tsv  | 50 +++++++++---------
 .../sql/postgresql/195/051=property_types.tsv | 38 +++++++-------
 .../195/059=sample_type_property_types.tsv    | 36 ++++++-------
 .../sql/postgresql/195/schema-195.sql         | 29 +++++++----
 .../196/015=data_set_type_property_types.tsv  | 22 ++++----
 .../029=experiment_type_property_types.tsv    | 18 +++----
 .../196/041=material_type_property_types.tsv  | 50 +++++++++---------
 .../sql/postgresql/196/051=property_types.tsv | 38 +++++++-------
 .../196/059=sample_type_property_types.tsv    | 36 ++++++-------
 .../sql/postgresql/196/schema-196.sql         | 27 +++++++---
 49 files changed, 624 insertions(+), 462 deletions(-)
 rename server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/{property => entity}/IPatternCompiler.java (91%)
 rename server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/{property => entity}/PatternCompiler.java (97%)

diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/PropertyAssignment.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/PropertyAssignment.java
index d209647f2d7..b6ef6e7551d 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/PropertyAssignment.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/PropertyAssignment.java
@@ -93,6 +93,12 @@ public class PropertyAssignment
     @JsonProperty
     private boolean managedInternally;
 
+    @JsonProperty
+    private String pattern;
+
+    @JsonProperty
+    private String patternType;
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     public PropertyAssignmentFetchOptions getFetchOptions()
@@ -336,6 +342,28 @@ public class PropertyAssignment
         this.managedInternally = managedInternally;
     }
 
+    @JsonIgnore
+    public String getPattern()
+    {
+        return pattern;
+    }
+
+    public void setPattern(String pattern)
+    {
+        this.pattern = pattern;
+    }
+
+    @JsonIgnore
+    public String getPatternType()
+    {
+        return patternType;
+    }
+
+    public void setPatternType(String patternType)
+    {
+        this.patternType = patternType;
+    }
+
     // 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/property/PropertyType.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/PropertyType.java
index 5bd3ada1f5d..19d0a956bfc 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/PropertyType.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/PropertyType.java
@@ -99,12 +99,6 @@ public class PropertyType implements Serializable, ICodeHolder, IDescriptionHold
     @JsonProperty
     private Boolean multiValue;
 
-    @JsonProperty
-    private String pattern;
-
-    @JsonProperty
-    private String patternType;
-
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     public PropertyTypeFetchOptions getFetchOptions()
@@ -379,28 +373,6 @@ public class PropertyType implements Serializable, ICodeHolder, IDescriptionHold
         this.multiValue = multiValue;
     }
 
-    @JsonIgnore
-    public String getPattern()
-    {
-        return pattern;
-    }
-
-    public void setPattern(String pattern)
-    {
-        this.pattern = pattern;
-    }
-
-    @JsonIgnore
-    public String getPatternType()
-    {
-        return patternType;
-    }
-
-    public void setPatternType(String patternType)
-    {
-        this.patternType = patternType;
-    }
-
     // 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/property/create/PropertyAssignmentCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/create/PropertyAssignmentCreation.java
index 28dcf5f9b27..b62cfb13a61 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/create/PropertyAssignmentCreation.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/create/PropertyAssignmentCreation.java
@@ -49,6 +49,10 @@ public class PropertyAssignmentCreation implements ICreation
 
     private boolean managedInternally = false;
 
+    private String patternType;
+
+    private String pattern;
+
     public String getSection()
     {
         return section;
@@ -149,6 +153,26 @@ public class PropertyAssignmentCreation implements ICreation
         this.managedInternally = managedInternally;
     }
 
+    public String getPattern()
+    {
+        return pattern;
+    }
+
+    public void setPattern(String pattern)
+    {
+        this.pattern = pattern;
+    }
+
+    public String getPatternType()
+    {
+        return patternType;
+    }
+
+    public void setPatternType(String patternType)
+    {
+        this.patternType = patternType;
+    }
+
     @Override
     public String toString()
     {
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/create/PropertyTypeCreation.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/create/PropertyTypeCreation.java
index 00d7f5d61a0..d9f466647de 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/create/PropertyTypeCreation.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/create/PropertyTypeCreation.java
@@ -72,12 +72,6 @@ public class PropertyTypeCreation implements ICreation, IObjectCreation
     @JsonProperty
     private Boolean multiValue;
 
-    @JsonProperty
-    private String pattern;
-
-    @JsonProperty
-    private String patternType;
-
     @JsonIgnore
     public String getCode()
     {
@@ -231,28 +225,6 @@ public class PropertyTypeCreation implements ICreation, IObjectCreation
         this.multiValue = multiValue;
     }
 
-    @JsonIgnore
-    public String getPattern()
-    {
-        return pattern;
-    }
-
-    public void setPattern(String pattern)
-    {
-        this.pattern = pattern;
-    }
-
-    @JsonIgnore
-    public String getPatternType()
-    {
-        return patternType;
-    }
-
-    public void setPatternType(String patternType)
-    {
-        this.patternType = patternType;
-    }
-
     @Override
     public String toString()
     {
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/update/PropertyTypeUpdate.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/update/PropertyTypeUpdate.java
index 9cef0418312..4d6fdbb1214 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/update/PropertyTypeUpdate.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/property/update/PropertyTypeUpdate.java
@@ -59,12 +59,6 @@ public class PropertyTypeUpdate implements IUpdate, IObjectUpdate<IPropertyTypeI
     @JsonProperty
     private ListUpdateMapValues metaData = new ListUpdateMapValues();
 
-    @JsonProperty
-    private FieldUpdateValue<String> pattern = new FieldUpdateValue<String>();
-
-    @JsonProperty
-    private FieldUpdateValue<String> patternType = new FieldUpdateValue<String>();
-
     @Override
     @JsonIgnore
     public IPropertyTypeId getObjectId()
@@ -144,30 +138,6 @@ public class PropertyTypeUpdate implements IUpdate, IObjectUpdate<IPropertyTypeI
         this.transformation.setValue(transformation);
     }
 
-    @JsonIgnore
-    public FieldUpdateValue<String> getPattern()
-    {
-        return pattern;
-    }
-
-    @JsonIgnore
-    public void setPattern(String pattern)
-    {
-        this.pattern.setValue(pattern);
-    }
-
-    @JsonIgnore
-    public FieldUpdateValue<String> getPatternType()
-    {
-        return patternType;
-    }
-
-    @JsonIgnore
-    public void setPatternType(String patternType)
-    {
-        this.patternType.setValue(patternType);
-    }
-
     @JsonIgnore
     public ListUpdateMapValues getMetaData()
     {
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/CreatePropertyAssignmentsExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/CreatePropertyAssignmentsExecutor.java
index 69619b747ae..20db102bb7c 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/CreatePropertyAssignmentsExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/CreatePropertyAssignmentsExecutor.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import javax.annotation.Resource;
 
@@ -61,6 +62,9 @@ public class CreatePropertyAssignmentsExecutor
 
     @Autowired
     private IMapPluginByIdExecutor mapPluginByIdExecutor;
+
+    @Autowired
+    private IPatternCompiler patternCompiler;
     
     public void createPropertyAssignments(final IOperationContext context, String entityTypeCode,
             Collection<? extends PropertyAssignmentCreation> propertyAssignments, ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind entityKind)
@@ -144,6 +148,16 @@ public class CreatePropertyAssignmentsExecutor
         assignment.setShowRawValue(assignmentCreation.isShowRawValueInForms());
         assignment.setUnique(assignmentCreation.isUnique());
         assignment.setManagedInternally(assignmentCreation.isManagedInternally());
+        //if only one element out of pair (pattern, patternType) is empty, throw exception
+        if(((assignmentCreation.getPattern() == null || assignmentCreation.getPattern().trim().isEmpty()) && (assignmentCreation.getPatternType() != null && !assignmentCreation.getPatternType().trim().isEmpty()))
+                || ((assignmentCreation.getPattern() != null && !assignmentCreation.getPattern().trim().isEmpty()) && (assignmentCreation.getPatternType() == null || assignmentCreation.getPatternType().trim().isEmpty())))
+        {
+            throw new UserFailureException("Pattern and Pattern Type must be both either empty or non-empty!");
+        }
+        assignment.setPatternType(assignmentCreation.getPatternType());
+        assignment.setPattern(assignmentCreation.getPattern());
+        Pattern pattern = patternCompiler.compilePattern(assignmentCreation.getPattern(), assignmentCreation.getPatternType());
+        assignment.setPatternRegex(pattern == null ? null : pattern.pattern());
         return assignment;
     }
 
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/IPatternCompiler.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/IPatternCompiler.java
similarity index 91%
rename from server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/IPatternCompiler.java
rename to server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/IPatternCompiler.java
index 7fc882646f9..00b93cb0634 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/IPatternCompiler.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/IPatternCompiler.java
@@ -15,7 +15,7 @@
  *
  */
 
-package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.property;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity;
 
 import java.util.regex.Pattern;
 
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/PatternCompiler.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/PatternCompiler.java
similarity index 97%
rename from server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/PatternCompiler.java
rename to server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/PatternCompiler.java
index f24c9b458e5..69de0218369 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/PatternCompiler.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/PatternCompiler.java
@@ -15,7 +15,7 @@
  *
  */
 
-package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.property;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import org.springframework.stereotype.Component;
@@ -65,7 +65,8 @@ public final class PatternCompiler implements IPatternCompiler
     private String prepareValue(String value)
     {
         String result = value.strip();
-        if(result.charAt(0) != '"' || result.charAt(result.length()-1) != '"')
+        if((result.charAt(0) != '"' && result.charAt(0) != '“')
+                || (result.charAt(result.length()-1) != '"' && result.charAt(result.length()-1) != '”'))
         {
             throw new UserFailureException("Wrong value format: '" + value + "'");
         }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/CreatePropertyTypeExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/CreatePropertyTypeExecutor.java
index 14d222a663f..d21545ec4e3 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/CreatePropertyTypeExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/CreatePropertyTypeExecutor.java
@@ -23,6 +23,7 @@ import java.util.function.Function;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IPatternCompiler;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
@@ -129,12 +130,6 @@ public class CreatePropertyTypeExecutor
         {
             throw new UserFailureException("Vocabulary id has been specified but data type is " + dataType + ".");
         }
-        //if only one element out of pair (pattern, patternType) is empty, throw exception
-        if(((creation.getPattern() == null || creation.getPattern().trim().isEmpty()) && (creation.getPatternType() != null && !creation.getPatternType().trim().isEmpty()))
-        || ((creation.getPattern() != null && !creation.getPattern().trim().isEmpty()) && (creation.getPatternType() == null || creation.getPatternType().trim().isEmpty())))
-        {
-            throw new UserFailureException("Pattern and Pattern Type must be both either empty or non-empty!");
-        }
         validateMaterialType(creation, dataType);
         validateSampleType(creation, dataType);
         validateSchemaAndDataType(dataType.name(), creation.getSchema());
@@ -219,10 +214,6 @@ public class CreatePropertyTypeExecutor
                     propertyType.setMetaData(creation.getMetaData());
                     propertyType.setMultiValue(
                             creation.isMultiValue() != null && creation.isMultiValue());
-                    propertyType.setPattern(creation.getPattern());
-                    propertyType.setPatternType(creation.getPatternType());
-                    Pattern pattern = patternCompiler.compilePattern(creation.getPattern(), creation.getPatternType());
-                    propertyType.setPatternRegex(pattern == null ? null : pattern.pattern());
                     propertyTypes.add(propertyType);
                 }
 
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdatePropertyTypeExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdatePropertyTypeExecutor.java
index dabb244c0b4..e2ef79c29bc 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdatePropertyTypeExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdatePropertyTypeExecutor.java
@@ -23,7 +23,7 @@ import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.regex.Pattern;
 
-import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IPatternCompiler;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
@@ -100,11 +100,6 @@ public class UpdatePropertyTypeExecutor
         {
             throw new UserFailureException("Description cannot be empty.");
         }
-        if(update.getPattern().isModified() && update.getPatternType().isModified() && ((StringUtils.isEmpty(update.getPattern().getValue()) && !StringUtils.isEmpty(update.getPatternType().getValue()))
-        || (!StringUtils.isEmpty(update.getPattern().getValue()) && StringUtils.isEmpty(update.getPatternType().getValue()))))
-        {
-            throw new UserFailureException("Pattern and Pattern Type must be both either empty or non-empty!");
-        }
     }
 
     @Override
@@ -143,11 +138,6 @@ public class UpdatePropertyTypeExecutor
                     CreatePropertyTypeExecutor.validateTransformationAndDataType(dataType, update.getTransformation().getValue());
                     propertyType.setTransformation(getNewValue(update.getTransformation(), propertyType.getTransformation()));
                     updateMetaData(propertyType, update);
-                    propertyType.setPattern(getNewValue(update.getPattern(), propertyType.getPattern()));
-                    propertyType.setPatternType(getNewValue(update.getPatternType(), propertyType.getPatternType()));
-
-                    Pattern updateRegex = patternCompiler.compilePattern(propertyType.getPattern(), propertyType.getPatternType());
-                    propertyType.setPatternRegex(updateRegex == null ? null : updateRegex.pattern());
 
                 }
 
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentRecord.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentRecord.java
index b4eddd18f65..28825633124 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentRecord.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentRecord.java
@@ -55,6 +55,12 @@ public class PropertyAssignmentRecord extends ObjectBaseRecord
 
     public Boolean is_unique;
 
+    public String pattern;
+
+    public String pattern_type;
+
+    public String pattern_regex;
+
     // IS_MANAGED_INTERNALLY_NAMESPACE
     public Boolean is_managed_internally_assignment;
 }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentTranslator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentTranslator.java
index 8413daee189..d1d198e9814 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentTranslator.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyAssignmentTranslator.java
@@ -129,6 +129,8 @@ public class PropertyAssignmentTranslator implements IPropertyAssignmentTranslat
             assignment.setRegistrationDate(assignmentRecord.registration_timestamp);
             assignment.setUnique(assignmentRecord.is_unique);
             assignment.setFetchOptions(assignmentFetchOptions);
+            assignment.setPattern(assignmentRecord.pattern);
+            assignment.setPatternType(assignmentRecord.pattern_type);
             assignment.setManagedInternally(assignmentRecord.is_managed_internally_assignment);
 
             PropertyAssignmentKey key = new PropertyAssignmentKey(assignmentRecord.id, entityKind);
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeRecord.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeRecord.java
index 18821d0092a..260daa965c7 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeRecord.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeRecord.java
@@ -44,10 +44,4 @@ public class PropertyTypeRecord extends ObjectBaseRecord
 
     public Boolean is_multi_value;
 
-    public String pattern;
-
-    public String pattern_type;
-
-    public String pattern_regex;
-
 }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeTranslator.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeTranslator.java
index 6e9cce45fcd..b104b707a1a 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeTranslator.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/property/PropertyTypeTranslator.java
@@ -127,8 +127,6 @@ public class PropertyTypeTranslator extends AbstractCachingTranslator<Long, Prop
         result.setRegistrationDate(baseRecord.registration_timestamp);
         result.setMetaData(CommonUtils.asMap(baseRecord.meta_data));
         result.setMultiValue(baseRecord.is_multi_value);
-        result.setPattern(baseRecord.pattern);
-        result.setPatternType(baseRecord.pattern_type);
 
         if (fetchOptions.hasVocabulary())
         {
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java
index 8bbb8c69d4f..b40b4711d42 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java
@@ -190,8 +190,8 @@ public abstract class AbstractXLSEntityTypeExportHelper<ENTITY_TYPE extends IEnt
                     plugin != null ? (plugin.getName() != null ? plugin.getName() + ".py" : "") : "",
                     String.valueOf(propertyType.isMultiValue() != null && propertyType.isMultiValue()).toUpperCase(),
                     String.valueOf(propertyAssignment.isUnique() != null && propertyAssignment.isUnique()).toUpperCase(),
-                    String.valueOf(propertyType.getPattern() != null ? propertyType.getPattern() : ""),
-                    String.valueOf(propertyType.getPatternType() != null ? propertyType.getPatternType() : ""),
+                    String.valueOf(propertyAssignment.getPattern() != null ? propertyAssignment.getPattern() : ""),
+                    String.valueOf(propertyAssignment.getPatternType() != null ? propertyAssignment.getPatternType() : ""),
                     String.valueOf(propertyAssignment.isManagedInternally() != null && propertyAssignment.isManagedInternally()).toUpperCase()
             };
             addRow(rowNumber++, false, exportableKind, permId, warnings, valueFiles, values);
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyAssignmentImportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyAssignmentImportHelper.java
index 5eba0433083..3df6ecc3f32 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyAssignmentImportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyAssignmentImportHelper.java
@@ -154,6 +154,8 @@ public class PropertyAssignmentImportHelper extends BasicImportHelper
         String section = getValueByColumnName(headers, values, Attribute.Section);
         String script = getValueByColumnName(headers, values, Attribute.DynamicScript);
         String unique = getValueByColumnName(headers, values, Attribute.Unique);
+        String pattern = getValueByColumnName(headers, values, Attribute.Pattern);
+        String patternType = getValueByColumnName(headers, values, Attribute.PatternType);
         String internalAssignment = getValueByColumnName(headers, values, Attribute.InternalAssignment);
 
         PropertyAssignmentCreation creation = new PropertyAssignmentCreation();
@@ -163,6 +165,8 @@ public class PropertyAssignmentImportHelper extends BasicImportHelper
         creation.setShowInEditView(Boolean.parseBoolean(showInEditViews));
         creation.setSection(section);
         creation.setUnique(Boolean.parseBoolean(unique));
+        creation.setPattern(pattern);
+        creation.setPatternType(patternType);
         creation.setManagedInternally(Boolean.parseBoolean(internalAssignment));
 
         if (script != null && !script.isEmpty())
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyTypeImportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyTypeImportHelper.java
index 7f7ebd0b6d5..36a2146da37 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyTypeImportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/importer/helper/PropertyTypeImportHelper.java
@@ -205,8 +205,6 @@ public class PropertyTypeImportHelper extends BasicImportHelper
         String vocabularyCode = getValueByColumnName(header, values, Attribute.VocabularyCode);
         String metadata = getValueByColumnName(header, values, Attribute.Metadata);
         String multiValued = getValueByColumnName(header, values, Attribute.MultiValued);
-        String pattern = getValueByColumnName(header, values, Attribute.Pattern);
-        String patternType = getValueByColumnName(header, values, Attribute.PatternType);
 
         PropertyTypeCreation creation = new PropertyTypeCreation();
         creation.setCode(code);
@@ -244,11 +242,6 @@ public class PropertyTypeImportHelper extends BasicImportHelper
             creation.setMultiValue(false);
         }
 
-        if(pattern != null && !pattern.isEmpty() && patternType != null && !patternType.isEmpty())
-        {
-            creation.setPattern(pattern);
-            creation.setPatternType(patternType);
-        }
 
         delayedExecutor.createPropertyType(creation, page, line);
     }
@@ -263,8 +256,6 @@ public class PropertyTypeImportHelper extends BasicImportHelper
         String dataType = getValueByColumnName(header, values, Attribute.DataType);
         String vocabularyCode = getValueByColumnName(header, values, Attribute.VocabularyCode);
         String metadata = getValueByColumnName(header, values, Attribute.Metadata);
-        String pattern = getValueByColumnName(header, values, Attribute.Pattern);
-        String patternType = getValueByColumnName(header, values, Attribute.PatternType);
 
         PropertyTypePermId propertyTypePermId = new PropertyTypePermId(code);
 
@@ -324,12 +315,6 @@ public class PropertyTypeImportHelper extends BasicImportHelper
             update.getMetaData().add(JSONHandler.parseMetaData(metadata));
         }
 
-        if(pattern != null && !pattern.isEmpty() && patternType != null && !patternType.isEmpty())
-        {
-            update.getPattern().setValue(pattern);
-            update.getPatternType().setValue(patternType);
-        }
-
         delayedExecutor.updatePropertyType(update, page, line);
     }
 
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
index 0dfdc1a83a6..5551c9605e5 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
@@ -138,7 +138,9 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
                 createAssignment(newAssignment.isMandatory(), newAssignment.getSection(),
                         newAssignment.getOrdinal(), entityType, propertyType, scriptOrNull,
                         newAssignment.isShownInEditView(), newAssignment.getShowRawValue(),
-                        newAssignment.isUnique(), newAssignment.isManagedInternally());
+                        newAssignment.isUnique(), newAssignment.isManagedInternally(),
+                        newAssignment.getPatternType(), newAssignment.getPattern(),
+                        newAssignment.getPatternRegex());
         String defaultValue = newAssignment.getDefaultValue();
         if (newAssignment.isDynamic())
         {
@@ -290,6 +292,10 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
         assignment.setShownInEditView(assignmentUpdates.isShownInEditView());
         assignment.setShowRawValue(assignmentUpdates.getShowRawValue());
 
+        assignment.setPattern(assignmentUpdates.getPattern());
+        assignment.setPatternType(assignmentUpdates.getPatternType());
+        assignment.setPatternRegex(assignmentUpdates.getPatternRegex());
+
         UpdateAuthorizationSnapshot snapshotAfter = new UpdateAuthorizationSnapshot(assignment);
 
         if (snapshotBefore.equals(snapshotAfter) == false)
@@ -323,7 +329,8 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
     private EntityTypePropertyTypePE createAssignment(final boolean mandatory,
             final String section, final Long previousETPTOrdinal, final EntityTypePE entityType,
             final PropertyTypePE propertyType, ScriptPE scriptOrNull, boolean shownInEditView,
-            boolean showRawValue, boolean unique, boolean isManagedInternally)
+            boolean showRawValue, boolean unique, boolean isManagedInternally, String patternType,
+            String pattern, String patternRegex)
     {
         checkAssignmentDoesNotExist(entityType, propertyType);
         Long previousOrdinal =
@@ -346,6 +353,9 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
         etpt.setShowRawValue(showRawValue);
         etpt.setUnique(unique);
         etpt.setManagedInternallyNamespace(isManagedInternally);
+        etpt.setPatternType(patternType);
+        etpt.setPattern(pattern);
+        etpt.setPatternRegex(patternRegex);
 
         new InternalPropertyTypeAuthorization().canCreatePropertyAssignment(session, etpt.getPropertyType(), etpt);
 
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java
index 8a89507b546..4bab9c83ce1 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyTypeBO.java
@@ -87,11 +87,6 @@ public final class PropertyTypeBO extends VocabularyBO implements IPropertyTypeB
         propertyTypePE.setRegistrator(findPerson());
         propertyTypePE.setManagedInternally(propertyType.isManagedInternally());
         propertyTypePE.setMultiValue(propertyType.isMultiValue());
-        propertyTypePE.setPattern(propertyType.getPattern());
-        propertyTypePE.setPatternType(propertyType.getPatternType());
-        propertyTypePE.setPatternRegex(propertyType.getPattern() != null
-                ? "REGEX:" + propertyType.getPattern()
-                : null);
 
         if (DataTypeCode.CONTROLLEDVOCABULARY.equals(dataTypePE.getCode()))
         {
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IPropertyListingQuery.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IPropertyListingQuery.java
index 3380ee3d537..52836a00ebf 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IPropertyListingQuery.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/IPropertyListingQuery.java
@@ -37,8 +37,7 @@ public interface IPropertyListingQuery
      * label are already HTML escaped.
      */
     @Select(sql = "select pt.id as pt_id, pt.code as pt_code, dt.code as dt_code,"
-            + "      pt.label as pt_label, pt.is_managed_internally, pt.schema, pt.transformation,"
-            + "      pt.pattern, pt.pattern_type"
+            + "      pt.label as pt_label, pt.is_managed_internally, pt.schema, pt.transformation"
             + "    from property_types pt join data_types dt on pt.daty_id=dt.id", resultSetBinding = PropertyTypeDataObjectBinding.class)
     public PropertyType[] getPropertyTypes();
 
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertyTypeDataObjectBinding.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertyTypeDataObjectBinding.java
index 5420e211142..73590d87a96 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertyTypeDataObjectBinding.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/PropertyTypeDataObjectBinding.java
@@ -44,7 +44,5 @@ public class PropertyTypeDataObjectBinding extends NonUpdateCapableDataObjectBin
         final DataType dataType = new DataType();
         dataType.setCode(DataTypeCode.valueOf(row.getString("dt_code")));
         into.setDataType(dataType);
-        into.setPattern(row.getString("pattern"));
-        into.setPatternType(row.getString("pattern_type"));
     }
 }
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTypePropertyType.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTypePropertyType.java
index 721705de8a7..446febae871 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTypePropertyType.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EntityTypePropertyType.java
@@ -54,6 +54,14 @@ public abstract class EntityTypePropertyType<T extends EntityType> implements Se
 
     private Date modificationDate;
 
+    private String pattern;
+
+    private String patternType;
+
+    private String patternRegex;
+
+    private boolean managedInternallyNamespace;
+
     public Date getModificationDate()
     {
         return modificationDate;
@@ -209,6 +217,46 @@ public abstract class EntityTypePropertyType<T extends EntityType> implements Se
         this.section = section;
     }
 
+    public String getPattern()
+    {
+        return pattern;
+    }
+
+    public void setPattern(String pattern)
+    {
+        this.pattern = pattern;
+    }
+
+    public String getPatternType()
+    {
+        return patternType;
+    }
+
+    public void setPatternType(String patternType)
+    {
+        this.patternType = patternType;
+    }
+
+    public String getPatternRegex()
+    {
+        return patternRegex;
+    }
+
+    public void setPatternRegex(String patternRegex)
+    {
+        this.patternRegex = patternRegex;
+    }
+
+    public boolean isManagedInternallyNamespace()
+    {
+        return managedInternallyNamespace;
+    }
+
+    public void setManagedInternallyNamespace(boolean managedInternallyNamespace)
+    {
+        this.managedInternallyNamespace = managedInternallyNamespace;
+    }
+
     //
     // Object
     //
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewETPTAssignment.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewETPTAssignment.java
index ae37bfbd955..ddcd6d5fd6f 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewETPTAssignment.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewETPTAssignment.java
@@ -59,6 +59,12 @@ public class NewETPTAssignment implements Serializable
     // IS_MANAGED_INTERNALLY_NAMESPACE
     private boolean isManagedInternally;
 
+    private String patternType;
+
+    private String pattern;
+
+    private String patternRegex;
+
     public NewETPTAssignment()
     {
     }
@@ -247,4 +253,34 @@ public class NewETPTAssignment implements Serializable
     {
         isManagedInternally = managedInternally;
     }
+
+    public String getPatternType()
+    {
+        return patternType;
+    }
+
+    public void setPatternType(String patternType)
+    {
+        this.patternType = patternType;
+    }
+
+    public String getPattern()
+    {
+        return pattern;
+    }
+
+    public void setPattern(String pattern)
+    {
+        this.pattern = pattern;
+    }
+
+    public String getPatternRegex()
+    {
+        return patternRegex;
+    }
+
+    public void setPatternRegex(String patternRegex)
+    {
+        this.patternRegex = patternRegex;
+    }
 }
\ No newline at end of file
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java
index 13ae2e3e8ed..e7aa0f8e02a 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityTypePropertyTypePE.java
@@ -79,6 +79,12 @@ public abstract class EntityTypePropertyTypePE extends HibernateAbstractRegistra
     private boolean unique;
     private boolean managedInternallyNamespace;
 
+    private String pattern;
+
+    private String patternType;
+
+    private String patternRegex;
+
     final public static <T extends EntityTypePropertyTypePE> T createEntityTypePropertyType(
             final EntityKind entityKind)
     {
@@ -239,6 +245,39 @@ public abstract class EntityTypePropertyTypePE extends HibernateAbstractRegistra
         this.unique = unique;
     }
 
+    @Column(name = ColumnNames.PATTERN)
+    public String getPattern()
+    {
+        return pattern;
+    }
+
+    public void setPattern(String pattern)
+    {
+        this.pattern = pattern;
+    }
+
+    @Column(name = ColumnNames.PATTERN_TYPE)
+    public String getPatternType()
+    {
+        return patternType;
+    }
+
+    public void setPatternType(String patternType)
+    {
+        this.patternType = patternType;
+    }
+
+    @Column(name = ColumnNames.PATTERN_REGEX)
+    public String getPatternRegex()
+    {
+        return patternRegex;
+    }
+
+    public void setPatternRegex(String patternRegex)
+    {
+        this.patternRegex = patternRegex;
+    }
+
     public void setSection(String section)
     {
         this.section = section;
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PropertyTypePE.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PropertyTypePE.java
index 803b8953869..e278bf639a5 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PropertyTypePE.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PropertyTypePE.java
@@ -127,12 +127,6 @@ public final class PropertyTypePE extends HibernateAbstractRegistrationHolder im
 
     private boolean multiValue;
 
-    private String pattern;
-
-    private String patternType;
-
-    private String patternRegex;
-
     @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = ColumnNames.CONTROLLED_VOCABULARY_COLUMN, updatable = true)
     public VocabularyPE getVocabulary()
@@ -334,38 +328,7 @@ public final class PropertyTypePE extends HibernateAbstractRegistrationHolder im
         this.multiValue = multiValue;
     }
 
-    @Column(name = ColumnNames.PATTERN)
-    public String getPattern()
-    {
-        return pattern;
-    }
-
-    public void setPattern(String pattern)
-    {
-        this.pattern = pattern;
-    }
 
-    @Column(name = ColumnNames.PATTERN_TYPE)
-    public String getPatternType()
-    {
-        return patternType;
-    }
-
-    public void setPatternType(String patternType)
-    {
-        this.patternType = patternType;
-    }
-
-    @Column(name = ColumnNames.PATTERN_REGEX)
-    public String getPatternRegex()
-    {
-        return patternRegex;
-    }
-
-    public void setPatternRegex(String patternRegex)
-    {
-        this.patternRegex = patternRegex;
-    }
 
     @Override
     @SequenceGenerator(name = SequenceNames.PROPERTY_TYPES_SEQUENCE, sequenceName = SequenceNames.PROPERTY_TYPES_SEQUENCE, allocationSize = 1)
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidator.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidator.java
index 9c33fe9da5a..93dd2c3fa5c 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidator.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidator.java
@@ -17,11 +17,10 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.dto.hibernate;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.property.IPatternCompiler;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.property.PatternCompiler;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IPatternCompiler;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.PatternCompiler;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
@@ -32,7 +31,7 @@ import java.util.regex.Pattern;
 public class PatternValueValidator implements ConstraintValidator<PatternValue, EntityPropertyPE>
 {
 
-    private Map<String, Pattern> propertyTypeToPatternMap;
+    private Map<Long, Pattern> propertyTypeToPatternMap;
     private IPatternCompiler compiler;
 
     @Override
@@ -47,17 +46,15 @@ public class PatternValueValidator implements ConstraintValidator<PatternValue,
     {
         if(entityPropertyPE.getValue() != null && entityPropertyPE.getEntityTypePropertyType() != null) {
             EntityTypePropertyTypePE etpt = entityPropertyPE.getEntityTypePropertyType();
-            if(etpt.getPropertyType() != null) {
-                PropertyTypePE pt = etpt.getPropertyType();
-                if(pt.getPatternType() != null) {
+                if(etpt.getPatternType() != null) {
                     Pattern pattern;
-                    if(propertyTypeToPatternMap.containsKey(pt.getCode())) {
-                        pattern = propertyTypeToPatternMap.get(pt.getCode());
-                        if(!pt.getPatternRegex().equals(pattern.pattern())) {
-                            pattern = updatePattern(pt.getCode(), pt.getPattern(), pt.getPatternType());
+                    if(propertyTypeToPatternMap.containsKey(etpt.getId())) {
+                        pattern = propertyTypeToPatternMap.get(etpt.getId());
+                        if(!etpt.getPatternRegex().equals(pattern.pattern())) {
+                            pattern = updatePattern(etpt.getId(), etpt.getPattern(), etpt.getPatternType());
                         }
                     } else {
-                        pattern = updatePattern(pt.getCode(), pt.getPattern(), pt.getPatternType());
+                        pattern = updatePattern(etpt.getId(), etpt.getPattern(), etpt.getPatternType());
                     }
                     boolean valid = pattern.matcher(entityPropertyPE.getValue()).matches();
                     if(!valid) {
@@ -68,16 +65,14 @@ public class PatternValueValidator implements ConstraintValidator<PatternValue,
                         return false;
                     }
                 }
-            }
-
         }
         return true;
     }
 
-    private Pattern updatePattern(String propertyTypeCode, String pattern, String patternType)
+    private Pattern updatePattern(Long etptId, String pattern, String patternType)
     {
         Pattern compiledPattern = compiler.compilePattern(pattern, patternType);
-        propertyTypeToPatternMap.put(propertyTypeCode, compiledPattern);
+        propertyTypeToPatternMap.put(etptId, compiledPattern);
         return compiledPattern;
     }
 
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/AbstractEntityTypePropertyTypeTranslator.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/AbstractEntityTypePropertyTypeTranslator.java
index c483786d85b..ac0ea3bc481 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/AbstractEntityTypePropertyTypeTranslator.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/AbstractEntityTypePropertyTypeTranslator.java
@@ -106,6 +106,10 @@ abstract public class AbstractEntityTypePropertyTypeTranslator<ET extends Entity
             result.setShowRawValue(etptPE.getShowRawValue());
         }
         result.setScript(script);
+        result.setManagedInternallyNamespace(etptPE.isManagedInternallyNamespace());
+        result.setPattern(etptPE.getPattern());
+        result.setPatternType(etptPE.getPatternType());
+        result.setPatternRegex(etptPE.getPatternRegex());
         return result;
     }
 
diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTypeTranslator.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTypeTranslator.java
index bc47ff8926c..c067f43f0aa 100644
--- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTypeTranslator.java
+++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PropertyTypeTranslator.java
@@ -89,8 +89,6 @@ public final class PropertyTypeTranslator
         result.setSchema(propertyType.getSchema());
         result.setTransformation(propertyType.getTransformation());
         result.setMultiValue(propertyType.isMultiValue());
-        result.setPattern(propertyType.getPattern());
-        result.setPatternType(propertyType.getPatternType());
 
         return result;
     }
diff --git a/server-application-server/source/sql/generic/195/schema-195.sql b/server-application-server/source/sql/generic/195/schema-195.sql
index 03fb37bc1e1..3852adf87f3 100644
--- a/server-application-server/source/sql/generic/195/schema-195.sql
+++ b/server-application-server/source/sql/generic/195/schema-195.sql
@@ -16,7 +16,7 @@ CREATE TABLE ATTACHMENT_CONTENTS (ID TECH_ID NOT NULL,VALUE FILE NOT NULL);
 CREATE TABLE EXPERIMENT_PROPERTIES (ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,ETPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE, CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, SAMP_PROP_ID TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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 EXPERIMENT_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, EXPE_ID TECH_ID NOT NULL, ETPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, SAMPLE 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 EXPERIMENT_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, META_DATA JSONB);
-CREATE TABLE EXPERIMENT_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,EXTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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 EXPERIMENT_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,EXTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 CREATE TABLE EXTERNAL_DATA (ID TECH_ID NOT NULL,SHARE_ID CODE,SIZE ORDINAL_INT,LOCATION VARCHAR(1024) NOT NULL,FFTY_ID TECH_ID NOT NULL,LOTY_ID TECH_ID NOT NULL,CVTE_ID_STOR_FMT TECH_ID NOT NULL,IS_COMPLETE BOOLEAN_CHAR_OR_UNKNOWN NOT NULL DEFAULT 'U',CVTE_ID_STORE TECH_ID, STATUS ARCHIVING_STATUS NOT NULL DEFAULT 'AVAILABLE', PRESENT_IN_ARCHIVE BOOLEAN_CHAR DEFAULT 'F', SPEED_HINT INTEGER NOT NULL DEFAULT -50, STORAGE_CONFIRMATION BOOLEAN_CHAR NOT NULL DEFAULT 'F', H5_FOLDERS BOOLEAN_CHAR NOT NULL, H5AR_FOLDERS BOOLEAN_CHAR NOT NULL, ARCHIVING_REQUESTED BOOLEAN_CHAR NOT NULL DEFAULT 'F');
 CREATE TABLE FILE_FORMAT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000);
 CREATE TABLE GRID_CUSTOM_COLUMNS (ID TECH_ID NOT NULL, CODE VARCHAR(200) NOT NULL, LABEL column_label NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION GRID_EXPRESSION NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, GRID_ID GRID_ID NOT NULL);
@@ -27,21 +27,21 @@ CREATE TABLE MATERIALS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,MATY_ID TECH_ID N
 CREATE TABLE MATERIAL_PROPERTIES (ID TECH_ID NOT NULL,MATE_ID TECH_ID NOT NULL,MTPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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_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 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', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 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 TEXT,LAST_NAME TEXT,USER_ID USER_ID NOT NULL,EMAIL EMAIL_VALUE,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, IS_MULTI_VALUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
+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, IS_MULTI_VALUE BOOLEAN_CHAR NOT NULL DEFAULT 'F');
 CREATE TABLE ROLE_ASSIGNMENTS (ID TECH_ID NOT NULL,ROLE_CODE AUTHORIZATION_ROLE NOT NULL,SPACE_ID TECH_ID, PROJECT_ID TECH_ID, PERS_ID_GRANTEE TECH_ID, AG_ID_GRANTEE TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);
 CREATE TABLE SAMPLES_ALL (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL, sample_identifier sample_identifier, CODE CODE NOT NULL, EXPE_ID TECH_ID,SATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,DEL_ID TECH_ID, ORIG_DEL TECH_ID, SPACE_ID TECH_ID, SAMP_ID_PART_OF TECH_ID, PERS_ID_MODIFIER TECH_ID, code_unique_check character varying(300), subcode_unique_check character varying(300), VERSION INTEGER DEFAULT 0, PROJ_ID TECH_ID, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_COMP 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_DATA BOOLEAN_CHAR NOT NULL DEFAULT 'F', SPACE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', PROJ_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', CONT_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, META_DATA JSONB);
 CREATE TABLE SAMPLE_PROPERTIES (ID TECH_ID NOT NULL,SAMP_ID TECH_ID NOT NULL,STPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE,CVTE_ID TECH_ID,MATE_PROP_ID TECH_ID,SAMP_PROP_ID TECH_ID,PERS_ID_REGISTERER TECH_ID NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, SAMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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 SAMPLE_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, SAMP_ID TECH_ID NOT NULL, STPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, SAMPLE 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 SAMPLE_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, IS_LISTABLE BOOLEAN_CHAR NOT NULL DEFAULT 'T', GENERATED_FROM_DEPTH INTEGER NOT NULL DEFAULT 0, PART_OF_DEPTH INTEGER NOT NULL DEFAULT 0, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, is_auto_generated_code BOOLEAN_CHAR NOT NULL DEFAULT 'F', generated_code_prefix CODE NOT NULL DEFAULT 'S', is_subcode_unique BOOLEAN_CHAR NOT NULL DEFAULT 'F', INHERIT_PROPERTIES BOOLEAN_CHAR NOT NULL DEFAULT 'F', VALIDATION_SCRIPT_ID TECH_ID, SHOW_PARENT_METADATA BOOLEAN_CHAR NOT NULL DEFAULT 'F', META_DATA JSONB);
-CREATE TABLE SAMPLE_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,SATY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T', 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 SAMPLE_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,SATY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T', 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', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 
 CREATE TABLE DATA_SET_PROPERTIES (ID TECH_ID NOT NULL,DS_ID TECH_ID NOT NULL,DSTPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, SAMP_PROP_ID TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, DASE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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 DATA_SET_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, DS_ID TECH_ID NOT NULL, DSTPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, SAMPLE 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 DATA_SET_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,DSTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,DSTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 
 CREATE TABLE AUTHORIZATION_GROUPS (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, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);
 CREATE TABLE AUTHORIZATION_GROUP_PERSONS (AG_ID TECH_ID NOT NULL, PERS_ID TECH_ID NOT NULL);
@@ -907,11 +907,21 @@ ALTER TABLE SEMANTIC_ANNOTATIONS ADD CONSTRAINT SEMANTIC_ANNOTATIONS_SSP_CK CHEC
 	 (SATY_ID IS NULL AND STPT_ID IS NULL AND PRTY_ID IS NOT NULL)
 	);
 
-ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
 	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
 	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
 	);
-  
+
+ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
+	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
+	);
+
+ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
+	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
+	);
+
 -- Creating indices
 
 CREATE INDEX COVO_PERS_FK_I ON CONTROLLED_VOCABULARIES (PERS_ID_REGISTERER);
diff --git a/server-application-server/source/sql/generic/196/schema-196.sql b/server-application-server/source/sql/generic/196/schema-196.sql
index ddf87cc2ea1..4ceb0d54665 100644
--- a/server-application-server/source/sql/generic/196/schema-196.sql
+++ b/server-application-server/source/sql/generic/196/schema-196.sql
@@ -16,7 +16,7 @@ CREATE TABLE ATTACHMENT_CONTENTS (ID TECH_ID NOT NULL,VALUE FILE NOT NULL);
 CREATE TABLE EXPERIMENT_PROPERTIES (ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,ETPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE, CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, SAMP_PROP_ID TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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 EXPERIMENT_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, EXPE_ID TECH_ID NOT NULL, ETPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, SAMPLE 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 EXPERIMENT_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, META_DATA JSONB, IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F');
-CREATE TABLE EXPERIMENT_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,EXTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F');
+CREATE TABLE EXPERIMENT_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,EXTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 CREATE TABLE EXTERNAL_DATA (ID TECH_ID NOT NULL,SHARE_ID CODE,SIZE ORDINAL_INT,LOCATION VARCHAR(1024) NOT NULL,FFTY_ID TECH_ID NOT NULL,LOTY_ID TECH_ID NOT NULL,CVTE_ID_STOR_FMT TECH_ID NOT NULL,IS_COMPLETE BOOLEAN_CHAR_OR_UNKNOWN NOT NULL DEFAULT 'U',CVTE_ID_STORE TECH_ID, STATUS ARCHIVING_STATUS NOT NULL DEFAULT 'AVAILABLE', PRESENT_IN_ARCHIVE BOOLEAN_CHAR DEFAULT 'F', SPEED_HINT INTEGER NOT NULL DEFAULT -50, STORAGE_CONFIRMATION BOOLEAN_CHAR NOT NULL DEFAULT 'F', H5_FOLDERS BOOLEAN_CHAR NOT NULL, H5AR_FOLDERS BOOLEAN_CHAR NOT NULL, ARCHIVING_REQUESTED BOOLEAN_CHAR NOT NULL DEFAULT 'F');
 CREATE TABLE FILE_FORMAT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000);
 CREATE TABLE GRID_CUSTOM_COLUMNS (ID TECH_ID NOT NULL, CODE VARCHAR(200) NOT NULL, LABEL column_label NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION GRID_EXPRESSION NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, GRID_ID GRID_ID NOT NULL);
@@ -27,21 +27,21 @@ CREATE TABLE MATERIALS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,MATY_ID TECH_ID N
 CREATE TABLE MATERIAL_PROPERTIES (ID TECH_ID NOT NULL,MATE_ID TECH_ID NOT NULL,MTPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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_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, IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F');
-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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F');
+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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 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, IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F');
 CREATE TABLE PERSONS (ID TECH_ID NOT NULL,FIRST_NAME TEXT,LAST_NAME TEXT,USER_ID USER_ID NOT NULL,EMAIL EMAIL_VALUE,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, IS_MULTI_VALUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
+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, IS_MULTI_VALUE BOOLEAN_CHAR NOT NULL DEFAULT 'F');
 CREATE TABLE ROLE_ASSIGNMENTS (ID TECH_ID NOT NULL,ROLE_CODE AUTHORIZATION_ROLE NOT NULL,SPACE_ID TECH_ID, PROJECT_ID TECH_ID, PERS_ID_GRANTEE TECH_ID, AG_ID_GRANTEE TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);
 CREATE TABLE SAMPLES_ALL (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL, sample_identifier sample_identifier, CODE CODE NOT NULL, EXPE_ID TECH_ID,SATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,DEL_ID TECH_ID, ORIG_DEL TECH_ID, SPACE_ID TECH_ID, SAMP_ID_PART_OF TECH_ID, PERS_ID_MODIFIER TECH_ID, code_unique_check character varying(300), subcode_unique_check character varying(300), VERSION INTEGER DEFAULT 0, PROJ_ID TECH_ID, FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', FROZEN_FOR_COMP 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_DATA BOOLEAN_CHAR NOT NULL DEFAULT 'F', SPACE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', PROJ_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', EXPE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', CONT_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, META_DATA JSONB);
 CREATE TABLE SAMPLE_PROPERTIES (ID TECH_ID NOT NULL,SAMP_ID TECH_ID NOT NULL,STPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE,CVTE_ID TECH_ID,MATE_PROP_ID TECH_ID,SAMP_PROP_ID TECH_ID,PERS_ID_REGISTERER TECH_ID NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, SAMP_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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 SAMPLE_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, SAMP_ID TECH_ID NOT NULL, STPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, SAMPLE 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 SAMPLE_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000, IS_LISTABLE BOOLEAN_CHAR NOT NULL DEFAULT 'T', GENERATED_FROM_DEPTH INTEGER NOT NULL DEFAULT 0, PART_OF_DEPTH INTEGER NOT NULL DEFAULT 0, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, is_auto_generated_code BOOLEAN_CHAR NOT NULL DEFAULT 'F', generated_code_prefix CODE NOT NULL DEFAULT 'S', is_subcode_unique BOOLEAN_CHAR NOT NULL DEFAULT 'F', INHERIT_PROPERTIES BOOLEAN_CHAR NOT NULL DEFAULT 'F', VALIDATION_SCRIPT_ID TECH_ID, SHOW_PARENT_METADATA BOOLEAN_CHAR NOT NULL DEFAULT 'F', META_DATA JSONB, IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F');
-CREATE TABLE SAMPLE_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,SATY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T', 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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F');
+CREATE TABLE SAMPLE_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,SATY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T', 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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 
 CREATE TABLE DATA_SET_PROPERTIES (ID TECH_ID NOT NULL,DS_ID TECH_ID NOT NULL,DSTPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, SAMP_PROP_ID TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_AUTHOR TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, DASE_FROZEN BOOLEAN_CHAR NOT NULL DEFAULT 'F', TSVECTOR_DOCUMENT TSVECTOR NOT NULL, IS_UNIQUE BOOLEAN_CHAR NOT NULL DEFAULT 'F', 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 DATA_SET_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, DS_ID TECH_ID NOT NULL, DSTPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, VOCABULARY_TERM IDENTIFIER, MATERIAL IDENTIFIER, SAMPLE 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 DATA_SET_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,DSTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F');
+CREATE TABLE DATA_SET_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,DSTY_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',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, 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', IS_MANAGED_INTERNALLY_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F', PATTERN TEXT_VALUE, PATTERN_TYPE PATTERN_TYPE, PATTERN_REGEX TEXT_VALUE);
 
 CREATE TABLE AUTHORIZATION_GROUPS (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, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);
 CREATE TABLE AUTHORIZATION_GROUP_PERSONS (AG_ID TECH_ID NOT NULL, PERS_ID TECH_ID NOT NULL);
@@ -907,7 +907,17 @@ ALTER TABLE SEMANTIC_ANNOTATIONS ADD CONSTRAINT SEMANTIC_ANNOTATIONS_SSP_CK CHEC
 	 (SATY_ID IS NULL AND STPT_ID IS NULL AND PRTY_ID IS NOT NULL)
 	);
 
-ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
+	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
+	);
+
+ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
+	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
+	);
+
+ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
 	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
 	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
 	);
diff --git a/server-application-server/source/sql/postgresql/migration/migration-194-195.sql b/server-application-server/source/sql/postgresql/migration/migration-194-195.sql
index 65ddaa2f04f..b40c8a5ce7f 100644
--- a/server-application-server/source/sql/postgresql/migration/migration-194-195.sql
+++ b/server-application-server/source/sql/postgresql/migration/migration-194-195.sql
@@ -2,12 +2,40 @@
 
 CREATE DOMAIN PATTERN_TYPE AS VARCHAR(40) CHECK (VALUE IN ('PATTERN', 'VALUES', 'RANGES'));
 
-ALTER TABLE IF EXISTS PROPERTY_TYPES
+ALTER TABLE IF EXISTS EXPERIMENT_TYPE_PROPERTY_TYPES
     ADD COLUMN PATTERN TEXT_VALUE,
     ADD COLUMN PATTERN_TYPE PATTERN_TYPE,
     ADD COLUMN PATTERN_REGEX TEXT_VALUE;
 
-ALTER TABLE IF EXISTS PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+-- Adding columns for ETPT compatibility
+ALTER TABLE IF EXISTS MATERIAL_TYPE_PROPERTY_TYPES
+    ADD COLUMN PATTERN TEXT_VALUE,
+    ADD COLUMN PATTERN_TYPE PATTERN_TYPE,
+    ADD COLUMN PATTERN_REGEX TEXT_VALUE;
+
+ALTER TABLE IF EXISTS SAMPLE_TYPE_PROPERTY_TYPES
+    ADD COLUMN PATTERN TEXT_VALUE,
+    ADD COLUMN PATTERN_TYPE PATTERN_TYPE,
+    ADD COLUMN PATTERN_REGEX TEXT_VALUE;
+
+ALTER TABLE IF EXISTS DATA_SET_TYPE_PROPERTY_TYPES
+    ADD COLUMN PATTERN TEXT_VALUE,
+    ADD COLUMN PATTERN_TYPE PATTERN_TYPE,
+    ADD COLUMN PATTERN_REGEX TEXT_VALUE;
+
+ALTER TABLE IF EXISTS EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
+	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
+	);
+
+ALTER TABLE IF EXISTS SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
 	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
 	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
-	);
\ No newline at end of file
+	);
+
+ALTER TABLE IF EXISTS DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT PROPERTY_TYPES_PATTERN_CK CHECK
+	((PATTERN IS NULL AND PATTERN_TYPE IS NULL AND PATTERN_REGEX IS NULL) OR
+	 (PATTERN IS NOT NULL AND PATTERN_TYPE IS NOT NULL AND PATTERN_REGEX IS NOT NULL)
+	);
+
+-- Materials are deprecated, no need to add constraint for compatibility reasons
\ No newline at end of file
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/PatternCompilerTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/PatternCompilerTest.java
index a465b3a5bba..a68e5bb7b70 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/PatternCompilerTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/PatternCompilerTest.java
@@ -17,6 +17,8 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.property;
 
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IPatternCompiler;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.PatternCompiler;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -86,6 +88,23 @@ public class PatternCompilerTest
         assertFalse(pattern.matcher("Cynthia").matches());
     }
 
+    @Test
+    public void testValues_withDifferentQuotes()
+    {
+        Pattern pattern = compiler.compilePattern("“Alice”,  “B o b”   ,    “ Cynthia ”", "VALUES");
+        assertTrue(pattern.matcher("Alice").matches());
+        assertFalse(pattern.matcher(" Alice ").matches());
+        assertFalse(pattern.matcher(" Alice").matches());
+
+        assertTrue(pattern.matcher("B o b").matches());
+        assertFalse(pattern.matcher("Bob").matches());
+        assertFalse(pattern.matcher("Bo b").matches());
+
+        assertTrue(pattern.matcher(" Cynthia ").matches());
+        assertFalse(pattern.matcher(" Cynthia").matches());
+        assertFalse(pattern.matcher("Cynthia").matches());
+    }
+
     @Test
     public void testValues_specialCharacters()
     {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateEntityTypeTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateEntityTypeTest.java
index e643fd97087..151ba1632e8 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateEntityTypeTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateEntityTypeTest.java
@@ -266,6 +266,54 @@ public abstract class CreateEntityTypeTest<CREATION extends IEntityTypeCreation,
         assertEquals(assignment.getOrdinal(), Integer.valueOf(1));
     }
 
+    @Test
+    public void testCreateWithPropertyAssignmentsWithOnlyPatternTypeFilled_throwsException()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        PropertyAssignmentCreation assignmentCreation = new PropertyAssignmentCreation();
+        assignmentCreation.setPropertyTypeId(new PropertyTypePermId("DESCRIPTION"));
+        assignmentCreation.setPatternType("PATTERN");
+
+        final CREATION typeCreation = newTypeCreation();
+        typeCreation.setCode("NEW_ENITTY_TYPE");
+        typeCreation.setPropertyAssignments(Arrays.asList(assignmentCreation));
+
+        assertUserFailureException(new IDelegatedAction()
+        {
+            @Override
+            public void execute()
+            {
+                createTypes(sessionToken, Arrays.asList(typeCreation));
+            }
+        }, "Pattern and Pattern Type must be both either empty or non-empty!");
+
+    }
+
+    @Test
+    public void testCreateWithPropertyAssignmentsWithOnlyPatternFilled_throwsException()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        PropertyAssignmentCreation assignmentCreation = new PropertyAssignmentCreation();
+        assignmentCreation.setPropertyTypeId(new PropertyTypePermId("DESCRIPTION"));
+        assignmentCreation.setPattern("SomePattern");
+
+        final CREATION typeCreation = newTypeCreation();
+        typeCreation.setCode("NEW_ENITTY_TYPE");
+        typeCreation.setPropertyAssignments(Arrays.asList(assignmentCreation));
+
+        assertUserFailureException(new IDelegatedAction()
+        {
+            @Override
+            public void execute()
+            {
+                createTypes(sessionToken, Arrays.asList(typeCreation));
+            }
+        }, "Pattern and Pattern Type must be both either empty or non-empty!");
+
+    }
+
     @Test
     public void testCreateWithPropertyAssignmentsWithIncorrectOrdinal()
     {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePropertyTypeTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePropertyTypeTest.java
index 3a5c94b2b4f..852502dfc61 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePropertyTypeTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreatePropertyTypeTest.java
@@ -464,26 +464,6 @@ public class CreatePropertyTypeTest extends AbstractTest
         assertUserFailureException(creation, "Data type not specified.");
     }
 
-    @Test
-    public void testMissingPatternWithPatternTypeFilled()
-    {
-        PropertyTypeCreation creation = createBasic();
-        creation.setPatternType("PATTERN");
-
-
-        assertUserFailureException(creation, "Pattern and Pattern Type must be both either empty or non-empty!");
-    }
-
-    @Test
-    public void testMissingPatternTypeWithPatternFilled()
-    {
-        PropertyTypeCreation creation = createBasic();
-        creation.setPattern("SomePattern");
-
-
-        assertUserFailureException(creation, "Pattern and Pattern Type must be both either empty or non-empty!");
-    }
-
     @Test
     public void testVocabularyTypeMissingVocabulary()
     {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateEntityTypeTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateEntityTypeTest.java
index 8248ec5f295..d390291a55a 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateEntityTypeTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateEntityTypeTest.java
@@ -934,6 +934,57 @@ public abstract class UpdateEntityTypeTest<CREATION extends IEntityTypeCreation,
             }, typeId, patternContains("checking access"));
     }
 
+    @Test
+    public void testUpdatePatternForEntity()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        // Given
+        PropertyTypeCreation propertyTypeCreation = new PropertyTypeCreation();
+        propertyTypeCreation.setCode("PATTERN_ASSIGNMENT_TYPE_TEST");
+        propertyTypeCreation.setManagedInternally(false);
+        propertyTypeCreation.setDataType(DataType.VARCHAR);
+        propertyTypeCreation.setLabel("some property type");
+        propertyTypeCreation.setDescription("some property type");
+        v3api.createPropertyTypes(sessionToken, Arrays.asList(propertyTypeCreation));
+
+
+        final CREATION typeCreation = newTypeCreation();
+        typeCreation.setCode("PATTERN_ASSIGNMENT_ENTITY_TYPE");
+        typeCreation.setManagedInternally(false);
+
+        PropertyAssignmentCreation assignmentCreation = new PropertyAssignmentCreation();
+        assignmentCreation.setPropertyTypeId(new PropertyTypePermId("DESCRIPTION"));
+        assignmentCreation.setPatternType("PATTERN");
+        assignmentCreation.setPattern(".*");
+
+        typeCreation.setPropertyAssignments(Arrays.asList(assignmentCreation));
+
+        EntityTypePermId typeId = createTypes(sessionToken, Arrays.asList(typeCreation)).get(0);
+        TYPE type = getType(sessionToken, typeId);
+        assertNotNull(type);
+        assertEquals(type.getPropertyAssignments().size(), 1);
+        assertEquals(type.getPropertyAssignments().get(0).getPatternType(), "PATTERN");
+        assertEquals(type.getPropertyAssignments().get(0).getPattern(), ".*");
+
+        // When
+        UPDATE update = newTypeUpdate();
+        update.setTypeId(typeId);
+        update.setDescription("New description");
+
+        assignmentCreation.setPatternType("RANGES");
+        assignmentCreation.setPattern("(-3)-(-1), 1-10, 100-200");
+        update.getPropertyAssignments().set(assignmentCreation);
+
+        updateTypes(sessionToken, Arrays.asList(update));
+
+        type = getType(sessionToken, typeId);
+        assertEquals(type.getDescription(), "New description");
+        assertEquals(type.getPropertyAssignments().size(), 1);
+        assertEquals(type.getPropertyAssignments().get(0).getPatternType(), "RANGES");
+        assertEquals(type.getPropertyAssignments().get(0).getPattern(), "(-3)-(-1), 1-10, 100-200");
+    }
+
     @DataProvider
     Object[][] usersNotAllowedToUpdate()
     {
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdatePropertyTypesTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdatePropertyTypesTest.java
index 853e02cd43a..2d8b57d8deb 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdatePropertyTypesTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdatePropertyTypesTest.java
@@ -225,48 +225,6 @@ public class UpdatePropertyTypesTest extends AbstractTest
         v3api.logout(sessionToken);
     }
 
-    @Test
-    public void testPattern()
-    {
-        // Given
-        String sessionToken = v3api.login(TEST_USER, PASSWORD);
-        PropertyTypePermId id = new PropertyTypePermId("COMMENT");
-        PropertyTypeUpdate update = new PropertyTypeUpdate();
-        update.setTypeId(id);
-        update.getPattern().setValue("SOME_PATTERN");
-        update.getPatternType().setValue("PATTERN");
-
-        // When
-        v3api.updatePropertyTypes(sessionToken, Arrays.asList(update));
-
-        // Then
-        PropertyTypeFetchOptions fetchOptions = new PropertyTypeFetchOptions();
-        PropertyType propertyType = v3api.getPropertyTypes(sessionToken, Arrays.asList(id), fetchOptions).get(id);
-        assertEquals(propertyType.getDescription(), "Any other comments");
-        assertEquals(propertyType.getLabel(), "Comment");
-        assertEquals(propertyType.isManagedInternally().booleanValue(), false);
-        assertEquals(propertyType.getPattern(), "SOME_PATTERN");
-        assertEquals(propertyType.getPatternType(), "PATTERN");
-
-        update.getPattern().setValue("1-3");
-        update.getPatternType().setValue("RANGES");
-        v3api.updatePropertyTypes(sessionToken, Arrays.asList(update));
-        fetchOptions = new PropertyTypeFetchOptions();
-        propertyType = v3api.getPropertyTypes(sessionToken, Arrays.asList(id), fetchOptions).get(id);
-        assertEquals(propertyType.getPattern(), "1-3");
-        assertEquals(propertyType.getPatternType(), "RANGES");
-
-        update.getPattern().setValue("\"a\",\"b\",\"c\"");
-        update.getPatternType().setValue("VALUES");
-        v3api.updatePropertyTypes(sessionToken, Arrays.asList(update));
-        fetchOptions = new PropertyTypeFetchOptions();
-        propertyType = v3api.getPropertyTypes(sessionToken, Arrays.asList(id), fetchOptions).get(id);
-        assertEquals(propertyType.getPattern(), "\"a\",\"b\",\"c\"");
-        assertEquals(propertyType.getPatternType(), "VALUES");
-
-        v3api.logout(sessionToken);
-    }
-
     @DataProvider
     Object[][] dataTypeConversion()
     {
diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidatorTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidatorTest.java
index e8d821feb35..0db5f30d492 100644
--- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidatorTest.java
+++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/PatternValueValidatorTest.java
@@ -75,13 +75,13 @@ public class PatternValueValidatorTest
 
         EntityTypePropertyTypePE etpt = new SampleTypePropertyTypePE();
         etpt.setPropertyType(pt);
+        etpt.setPattern(pattern);
+        etpt.setPatternType(patternType);
 
         EntityPropertyPE propertyPE = new SamplePropertyPE();
         propertyPE.setEntityTypePropertyType(etpt);
 
         propertyPE.setValue(value);
-        pt.setPattern(pattern);
-        pt.setPatternType(patternType);
 
         return propertyPE;
     }
diff --git a/server-application-server/sourceTest/sql/postgresql/195/015=data_set_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/195/015=data_set_type_property_types.tsv
index 6324d044899..fdff18bc8fe 100644
--- a/server-application-server/sourceTest/sql/postgresql/195/015=data_set_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/195/015=data_set_type_property_types.tsv
@@ -1,11 +1,11 @@
-1	2	14	t	f	2	2009-04-24 14:45:06.348563+02	\N	1	\N	t	f	f
-2	2	26	f	f	2	2009-09-15 08:44:10.351183+02	\N	2	\N	t	f	f
-3	2	25	f	f	2	2009-09-15 08:44:16.365221+02	\N	3	\N	t	f	f
-4	2	13	f	f	2	2009-09-15 08:44:36.342115+02	\N	4	\N	t	f	f
-5	10	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-6	10	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-7	10	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-8	11	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-9	11	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-10	11	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-11	12	29	t	t	2	2009-02-09 12:12:05.238758+01	\N	1	\N	t	f	f
+1	2	14	t	f	2	2009-04-24 14:45:06.348563+02	\N	1	\N	t	f	f	\N	\N	\N
+2	2	26	f	f	2	2009-09-15 08:44:10.351183+02	\N	2	\N	t	f	f	\N	\N	\N
+3	2	25	f	f	2	2009-09-15 08:44:16.365221+02	\N	3	\N	t	f	f	\N	\N	\N
+4	2	13	f	f	2	2009-09-15 08:44:36.342115+02	\N	4	\N	t	f	f	\N	\N	\N
+5	10	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+6	10	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+7	10	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+8	11	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+9	11	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+10	11	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+11	12	29	t	t	2	2009-02-09 12:12:05.238758+01	\N	1	\N	t	f	f	\N	\N	\N
diff --git a/server-application-server/sourceTest/sql/postgresql/195/029=experiment_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/195/029=experiment_type_property_types.tsv
index 451deff7be6..e08e2a63e0b 100644
--- a/server-application-server/sourceTest/sql/postgresql/195/029=experiment_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/195/029=experiment_type_property_types.tsv
@@ -1,9 +1,9 @@
-1	1	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f
-2	2	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f
-3	1	11	f	f	2	2008-11-05 09:18:24.239+01	\N	2	\N	t	f	f
-5	1	13	f	f	2	2008-11-05 09:21:53.256+01	\N	3	\N	t	f	f
-7	2	14	f	f	2	2009-02-09 12:12:05.238758+01	\N	2	\N	t	f	f
-8	2	26	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-9	3	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-10	3	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
-11	3	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f
+1	1	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f	\N	\N	\N
+2	2	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f	\N	\N	\N
+3	1	11	f	f	2	2008-11-05 09:18:24.239+01	\N	2	\N	t	f	f	\N	\N	\N
+5	1	13	f	f	2	2008-11-05 09:21:53.256+01	\N	3	\N	t	f	f	\N	\N	\N
+7	2	14	f	f	2	2009-02-09 12:12:05.238758+01	\N	2	\N	t	f	f	\N	\N	\N
+8	2	26	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+9	3	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+10	3	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
+11	3	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N
diff --git a/server-application-server/sourceTest/sql/postgresql/195/041=material_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/195/041=material_type_property_types.tsv
index 05353c10132..fe36bfe497c 100644
--- a/server-application-server/sourceTest/sql/postgresql/195/041=material_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/195/041=material_type_property_types.tsv
@@ -1,25 +1,25 @@
-1	1	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f
-2	6	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f
-3	7	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f
-4	3	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f
-5	3	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f
-6	4	3	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f
-7	4	5	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f
-8	4	1	f	t	2008-11-05 09:18:00.622+01	1	\N	3	\N	t	f	f
-9	5	1	f	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f
-10	4	4	t	f	2008-11-05 09:18:16.435+01	2	\N	4	\N	t	f	f
-11	5	10	f	f	2008-11-05 09:18:16.903+01	2	\N	2	\N	t	f	f
-12	5	11	f	f	2008-11-05 09:18:17.106+01	2	\N	3	\N	t	f	f
-17	5	7	f	f	2008-11-05 09:18:28.391+01	2	\N	4	\N	t	f	f
-18	5	9	f	f	2008-11-05 09:18:28.86+01	2	\N	5	\N	t	f	f
-19	5	8	f	f	2008-11-05 09:18:29+01	2	\N	6	\N	t	f	f
-22	6	15	f	f	2008-11-05 09:18:32.512+01	2	\N	2	\N	t	f	f
-23	8	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f
-24	8	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f
-25	9	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f
-26	9	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f
-27	10	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f
-28	10	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f
-29	11	1	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f
-30	11	15	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f
-31	11	25	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f
+1	1	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N
+2	6	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N
+3	7	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N
+4	3	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N
+5	3	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	\N	\N	\N
+6	4	3	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N
+7	4	5	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	\N	\N	\N
+8	4	1	f	t	2008-11-05 09:18:00.622+01	1	\N	3	\N	t	f	f	\N	\N	\N
+9	5	1	f	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N
+10	4	4	t	f	2008-11-05 09:18:16.435+01	2	\N	4	\N	t	f	f	\N	\N	\N
+11	5	10	f	f	2008-11-05 09:18:16.903+01	2	\N	2	\N	t	f	f	\N	\N	\N
+12	5	11	f	f	2008-11-05 09:18:17.106+01	2	\N	3	\N	t	f	f	\N	\N	\N
+17	5	7	f	f	2008-11-05 09:18:28.391+01	2	\N	4	\N	t	f	f	\N	\N	\N
+18	5	9	f	f	2008-11-05 09:18:28.86+01	2	\N	5	\N	t	f	f	\N	\N	\N
+19	5	8	f	f	2008-11-05 09:18:29+01	2	\N	6	\N	t	f	f	\N	\N	\N
+22	6	15	f	f	2008-11-05 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N
+23	8	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f	\N	\N	\N
+24	8	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N
+25	9	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N
+26	9	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	\N	\N	\N
+27	10	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f	\N	\N	\N
+28	10	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N
+29	11	1	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N
+30	11	15	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N
+31	11	25	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N
diff --git a/server-application-server/sourceTest/sql/postgresql/195/051=property_types.tsv b/server-application-server/sourceTest/sql/postgresql/195/051=property_types.tsv
index cd97b5e5971..cdefea1af0c 100644
--- a/server-application-server/sourceTest/sql/postgresql/195/051=property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/195/051=property_types.tsv
@@ -1,19 +1,19 @@
-1	DESCRIPTION	A Description	Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-2	GENE_SYMBOL	Gene Symbol, e.g. BMP15	Gene Symbol	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-3	NUCLEOTIDE_SEQUENCE	A sequence of nucleotides	Nucleotide Sequence	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-4	REFSEQ	NCBI Reference Sequence code, applicable to sequences of type: DNA, RNA, protein	RefSeq	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-5	OFFSET	Offset from the start of the sequence	Offset	2	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-6	PLATE_GEOMETRY	Plate Geometry	Plate Geometry	6	2008-11-05 09:18:00.622+01	1	1	t	\N	\N	\N	\N	\N	f	\N	\N	\N
-7	EYE_COLOR	The color of the eyes	Eye color	1	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-8	SIZE	The size of the object	Size	2	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-9	VOLUME	The volume of this person	Volume	3	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-10	IS_VALID	Can the material be used?	Valid?	4	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-11	PURCHASE_DATE	When material has been bought	Purchased	5	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-13	GENDER	The gender of the living organism	Gender	6	2008-11-05 09:18:31.545+01	2	4	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-14	COMMENT	Any other comments	Comment	1	2008-11-05 09:18:31.545+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-15	ORGANISM	The organism from which cells come	Organism	6	2008-11-05 09:18:31.545+01	2	3	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-25	BACTERIUM	bacterium	bacterium	7	2009-08-18 17:52:05.435021+02	2	\N	f	6	\N	\N	\N	\N	f	\N	\N	\N
-26	ANY_MATERIAL	any_material	any_material	7	2009-08-18 17:52:47.771005+02	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-27	DYNAMIC_DESCRIPTION	A Dynamic	Dynamic_Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-28	TEST_VOCABULARY	The test controlled vocabulary property	Organism	6	2008-11-05 09:18:31.545+01	2	6	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-29	IMAGING_DATA_CONFIG	The test imaging data property	Imaging_Data_Config	17	2008-11-05 09:18:31.545+01	2	\N	t	\N	\N	\N	\N	\N	f	\N	\N	\N
+1	DESCRIPTION	A Description	Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+2	GENE_SYMBOL	Gene Symbol, e.g. BMP15	Gene Symbol	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+3	NUCLEOTIDE_SEQUENCE	A sequence of nucleotides	Nucleotide Sequence	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+4	REFSEQ	NCBI Reference Sequence code, applicable to sequences of type: DNA, RNA, protein	RefSeq	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+5	OFFSET	Offset from the start of the sequence	Offset	2	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+6	PLATE_GEOMETRY	Plate Geometry	Plate Geometry	6	2008-11-05 09:18:00.622+01	1	1	t	\N	\N	\N	\N	\N	f
+7	EYE_COLOR	The color of the eyes	Eye color	1	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+8	SIZE	The size of the object	Size	2	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+9	VOLUME	The volume of this person	Volume	3	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+10	IS_VALID	Can the material be used?	Valid?	4	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+11	PURCHASE_DATE	When material has been bought	Purchased	5	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+13	GENDER	The gender of the living organism	Gender	6	2008-11-05 09:18:31.545+01	2	4	f	\N	\N	\N	\N	\N	f
+14	COMMENT	Any other comments	Comment	1	2008-11-05 09:18:31.545+01	2	\N	f	\N	\N	\N	\N	\N	f
+15	ORGANISM	The organism from which cells come	Organism	6	2008-11-05 09:18:31.545+01	2	3	f	\N	\N	\N	\N	\N	f
+25	BACTERIUM	bacterium	bacterium	7	2009-08-18 17:52:05.435021+02	2	\N	f	6	\N	\N	\N	\N	f
+26	ANY_MATERIAL	any_material	any_material	7	2009-08-18 17:52:47.771005+02	2	\N	f	\N	\N	\N	\N	\N	f
+27	DYNAMIC_DESCRIPTION	A Dynamic	Dynamic_Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+28	TEST_VOCABULARY	The test controlled vocabulary property	Organism	6	2008-11-05 09:18:31.545+01	2	6	f	\N	\N	\N	\N	\N	f
+29	IMAGING_DATA_CONFIG	The test imaging data property	Imaging_Data_Config	17	2008-11-05 09:18:31.545+01	2	\N	t	\N	\N	\N	\N	\N	f
diff --git a/server-application-server/sourceTest/sql/postgresql/195/059=sample_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/195/059=sample_type_property_types.tsv
index 81985230071..612feb8253d 100644
--- a/server-application-server/sourceTest/sql/postgresql/195/059=sample_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/195/059=sample_type_property_types.tsv
@@ -1,18 +1,18 @@
-14	7	27	f	f	2	2012-04-16 14:49:35.990096+02	t	\N	1	2	t	f	f
-1	1	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f
-2	5	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f
-3	1	1	f	f	2	2008-11-05 09:18:18.183+01	f	\N	2	\N	t	f	f
-4	5	1	f	f	2	2008-11-05 09:18:19.432+01	f	\N	2	\N	t	f	f
-7	3	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f
-8	3	15	f	f	2	2009-02-09 12:07:26.839487+01	f	\N	2	\N	t	f	f
-9	3	8	f	f	2	2009-02-09 12:07:34.437531+01	f	\N	3	\N	t	f	f
-11	3	26	f	f	2	2009-08-18 17:53:21.362126+02	f	\N	4	\N	t	f	f
-12	3	25	f	f	2	2009-08-18 17:53:26.884669+02	f	\N	5	\N	t	f	f
-13	2	5	f	f	2	2010-10-25 14:49:35.990096+02	t	\N	1	\N	t	f	f
-15	7	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	2	\N	t	f	f
-16	11	28	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f
-17	12	1	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f
-18	12	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f
-19	12	25	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f
-20	10	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f
-21	11	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f
+14	7	27	f	f	2	2012-04-16 14:49:35.990096+02	t	\N	1	2	t	f	f	\N	\N	\N
+1	1	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f	\N	\N	\N
+2	5	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f	\N	\N	\N
+3	1	1	f	f	2	2008-11-05 09:18:18.183+01	f	\N	2	\N	t	f	f	\N	\N	\N
+4	5	1	f	f	2	2008-11-05 09:18:19.432+01	f	\N	2	\N	t	f	f	\N	\N	\N
+7	3	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	\N	\N	\N
+8	3	15	f	f	2	2009-02-09 12:07:26.839487+01	f	\N	2	\N	t	f	f	\N	\N	\N
+9	3	8	f	f	2	2009-02-09 12:07:34.437531+01	f	\N	3	\N	t	f	f	\N	\N	\N
+11	3	26	f	f	2	2009-08-18 17:53:21.362126+02	f	\N	4	\N	t	f	f	\N	\N	\N
+12	3	25	f	f	2	2009-08-18 17:53:26.884669+02	f	\N	5	\N	t	f	f	\N	\N	\N
+13	2	5	f	f	2	2010-10-25 14:49:35.990096+02	t	\N	1	\N	t	f	f	\N	\N	\N
+15	7	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	2	\N	t	f	f	\N	\N	\N
+16	11	28	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	\N	\N	\N
+17	12	1	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N
+18	12	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N
+19	12	25	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N
+20	10	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	\N	\N	\N
+21	11	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N
diff --git a/server-application-server/sourceTest/sql/postgresql/195/schema-195.sql b/server-application-server/sourceTest/sql/postgresql/195/schema-195.sql
index 6032ef37eab..14dd4d7a21b 100644
--- a/server-application-server/sourceTest/sql/postgresql/195/schema-195.sql
+++ b/server-application-server/sourceTest/sql/postgresql/195/schema-195.sql
@@ -1483,7 +1483,11 @@ CREATE TABLE data_set_type_property_types (
     script_id tech_id,
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
-    is_unique boolean_char DEFAULT false NOT NULL
+    is_unique boolean_char DEFAULT false NOT NULL,
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value,
+    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
 );
 CREATE TABLE data_set_types (
     id tech_id NOT NULL,
@@ -1798,7 +1802,11 @@ CREATE TABLE experiment_type_property_types (
     script_id tech_id,
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
-    is_unique boolean_char DEFAULT false NOT NULL
+    is_unique boolean_char DEFAULT false NOT NULL,
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value,
+    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
 );
 CREATE TABLE experiment_types (
     id tech_id NOT NULL,
@@ -2045,7 +2053,10 @@ CREATE TABLE material_type_property_types (
     script_id tech_id,
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
-    is_unique boolean_char DEFAULT false NOT NULL
+    is_unique boolean_char DEFAULT false NOT NULL,
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value
 );
 CREATE TABLE material_types (
     id tech_id NOT NULL,
@@ -2238,11 +2249,7 @@ CREATE TABLE property_types (
     transformation text_value,
     meta_data jsonb,
     saty_prop_id tech_id,
-    is_multi_value boolean_char DEFAULT false NOT NULL,
-    pattern text_value,
-    pattern_type pattern_type,
-    pattern_regex text_value,
-    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
+    is_multi_value boolean_char DEFAULT false NOT NULL
 );
 CREATE TABLE queries (
     id tech_id NOT NULL,
@@ -2506,7 +2513,11 @@ CREATE TABLE sample_type_property_types (
     script_id tech_id,
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
-    is_unique boolean_char DEFAULT false NOT NULL
+    is_unique boolean_char DEFAULT false NOT NULL,
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value,
+    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
 );
 CREATE TABLE sample_types (
     id tech_id NOT NULL,
diff --git a/server-application-server/sourceTest/sql/postgresql/196/015=data_set_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/196/015=data_set_type_property_types.tsv
index c299c38a736..19aace5f975 100644
--- a/server-application-server/sourceTest/sql/postgresql/196/015=data_set_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/196/015=data_set_type_property_types.tsv
@@ -1,11 +1,11 @@
-1	2	14	t	f	2	2009-04-24 14:45:06.348563+02	\N	1	\N	t	f	f	f
-2	2	26	f	f	2	2009-09-15 08:44:10.351183+02	\N	2	\N	t	f	f	f
-3	2	25	f	f	2	2009-09-15 08:44:16.365221+02	\N	3	\N	t	f	f	f
-4	2	13	f	f	2	2009-09-15 08:44:36.342115+02	\N	4	\N	t	f	f	f
-5	10	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-6	10	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-7	10	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-8	11	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-9	11	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-10	11	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-11	12	29	t	t	2	2009-02-09 12:12:05.238758+01	\N	1	\N	t	f	f	f
+1	2	14	t	f	2	2009-04-24 14:45:06.348563+02	\N	1	\N	t	f	f	\N	\N	\N	f
+2	2	26	f	f	2	2009-09-15 08:44:10.351183+02	\N	2	\N	t	f	f	\N	\N	\N	f
+3	2	25	f	f	2	2009-09-15 08:44:16.365221+02	\N	3	\N	t	f	f	\N	\N	\N	f
+4	2	13	f	f	2	2009-09-15 08:44:36.342115+02	\N	4	\N	t	f	f	\N	\N	\N	f
+5	10	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+6	10	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+7	10	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+8	11	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+9	11	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+10	11	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+11	12	29	t	t	2	2009-02-09 12:12:05.238758+01	\N	1	\N	t	f	f	\N	\N	\N	f
diff --git a/server-application-server/sourceTest/sql/postgresql/196/029=experiment_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/196/029=experiment_type_property_types.tsv
index 65ac1b2c9e1..67cd6ce13b9 100644
--- a/server-application-server/sourceTest/sql/postgresql/196/029=experiment_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/196/029=experiment_type_property_types.tsv
@@ -1,9 +1,9 @@
-1	1	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f	f
-2	2	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f	f
-3	1	11	f	f	2	2008-11-05 09:18:24.239+01	\N	2	\N	t	f	f	f
-5	1	13	f	f	2	2008-11-05 09:21:53.256+01	\N	3	\N	t	f	f	f
-7	2	14	f	f	2	2009-02-09 12:12:05.238758+01	\N	2	\N	t	f	f	f
-8	2	26	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-9	3	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-10	3	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
-11	3	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	f
+1	1	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f	\N	\N	\N	f
+2	2	1	t	t	1	2008-11-05 09:18:00.622+01	\N	1	\N	t	f	f	\N	\N	\N	f
+3	1	11	f	f	2	2008-11-05 09:18:24.239+01	\N	2	\N	t	f	f	\N	\N	\N	f
+5	1	13	f	f	2	2008-11-05 09:21:53.256+01	\N	3	\N	t	f	f	\N	\N	\N	f
+7	2	14	f	f	2	2009-02-09 12:12:05.238758+01	\N	2	\N	t	f	f	\N	\N	\N	f
+8	2	26	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+9	3	1	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+10	3	15	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
+11	3	25	f	f	2	2009-02-09 12:12:05.238758+01	\N	3	\N	t	f	f	\N	\N	\N	f
diff --git a/server-application-server/sourceTest/sql/postgresql/196/041=material_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/196/041=material_type_property_types.tsv
index 0ef971dec21..f7378062c96 100644
--- a/server-application-server/sourceTest/sql/postgresql/196/041=material_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/196/041=material_type_property_types.tsv
@@ -1,25 +1,25 @@
-1	1	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	f
-2	6	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	f
-3	7	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	f
-4	3	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	f
-5	3	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	f
-6	4	3	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	f
-7	4	5	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	f
-8	4	1	f	t	2008-11-05 09:18:00.622+01	1	\N	3	\N	t	f	f	f
-9	5	1	f	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	f
-10	4	4	t	f	2008-11-05 09:18:16.435+01	2	\N	4	\N	t	f	f	f
-11	5	10	f	f	2008-11-05 09:18:16.903+01	2	\N	2	\N	t	f	f	f
-12	5	11	f	f	2008-11-05 09:18:17.106+01	2	\N	3	\N	t	f	f	f
-17	5	7	f	f	2008-11-05 09:18:28.391+01	2	\N	4	\N	t	f	f	f
-18	5	9	f	f	2008-11-05 09:18:28.86+01	2	\N	5	\N	t	f	f	f
-19	5	8	f	f	2008-11-05 09:18:29+01	2	\N	6	\N	t	f	f	f
-22	6	15	f	f	2008-11-05 09:18:32.512+01	2	\N	2	\N	t	f	f	f
-23	8	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f	f
-24	8	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	f
-25	9	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	f
-26	9	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	f
-27	10	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f	f
-28	10	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	f
-29	11	1	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	f
-30	11	15	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	f
-31	11	25	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	f
+1	1	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N	f
+2	6	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N	f
+3	7	1	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N	f
+4	3	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N	f
+5	3	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	\N	\N	\N	f
+6	4	3	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N	f
+7	4	5	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	\N	\N	\N	f
+8	4	1	f	t	2008-11-05 09:18:00.622+01	1	\N	3	\N	t	f	f	\N	\N	\N	f
+9	5	1	f	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N	f
+10	4	4	t	f	2008-11-05 09:18:16.435+01	2	\N	4	\N	t	f	f	\N	\N	\N	f
+11	5	10	f	f	2008-11-05 09:18:16.903+01	2	\N	2	\N	t	f	f	\N	\N	\N	f
+12	5	11	f	f	2008-11-05 09:18:17.106+01	2	\N	3	\N	t	f	f	\N	\N	\N	f
+17	5	7	f	f	2008-11-05 09:18:28.391+01	2	\N	4	\N	t	f	f	\N	\N	\N	f
+18	5	9	f	f	2008-11-05 09:18:28.86+01	2	\N	5	\N	t	f	f	\N	\N	\N	f
+19	5	8	f	f	2008-11-05 09:18:29+01	2	\N	6	\N	t	f	f	\N	\N	\N	f
+22	6	15	f	f	2008-11-05 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N	f
+23	8	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f	\N	\N	\N	f
+24	8	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N	f
+25	9	2	t	t	2008-11-05 09:18:00.622+01	1	\N	1	\N	t	f	f	\N	\N	\N	f
+26	9	1	f	t	2008-11-05 09:18:00.622+01	1	\N	2	\N	t	f	f	\N	\N	\N	f
+27	10	1	t	t	2008-11-05 09:18:32.512+01	2	\N	1	\N	t	f	f	\N	\N	\N	f
+28	10	26	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N	f
+29	11	1	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N	f
+30	11	15	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N	f
+31	11	25	f	f	2012-03-13 09:18:32.512+01	2	\N	2	\N	t	f	f	\N	\N	\N	f
diff --git a/server-application-server/sourceTest/sql/postgresql/196/051=property_types.tsv b/server-application-server/sourceTest/sql/postgresql/196/051=property_types.tsv
index cd97b5e5971..cdefea1af0c 100644
--- a/server-application-server/sourceTest/sql/postgresql/196/051=property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/196/051=property_types.tsv
@@ -1,19 +1,19 @@
-1	DESCRIPTION	A Description	Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-2	GENE_SYMBOL	Gene Symbol, e.g. BMP15	Gene Symbol	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-3	NUCLEOTIDE_SEQUENCE	A sequence of nucleotides	Nucleotide Sequence	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-4	REFSEQ	NCBI Reference Sequence code, applicable to sequences of type: DNA, RNA, protein	RefSeq	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-5	OFFSET	Offset from the start of the sequence	Offset	2	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-6	PLATE_GEOMETRY	Plate Geometry	Plate Geometry	6	2008-11-05 09:18:00.622+01	1	1	t	\N	\N	\N	\N	\N	f	\N	\N	\N
-7	EYE_COLOR	The color of the eyes	Eye color	1	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-8	SIZE	The size of the object	Size	2	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-9	VOLUME	The volume of this person	Volume	3	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-10	IS_VALID	Can the material be used?	Valid?	4	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-11	PURCHASE_DATE	When material has been bought	Purchased	5	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-13	GENDER	The gender of the living organism	Gender	6	2008-11-05 09:18:31.545+01	2	4	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-14	COMMENT	Any other comments	Comment	1	2008-11-05 09:18:31.545+01	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-15	ORGANISM	The organism from which cells come	Organism	6	2008-11-05 09:18:31.545+01	2	3	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-25	BACTERIUM	bacterium	bacterium	7	2009-08-18 17:52:05.435021+02	2	\N	f	6	\N	\N	\N	\N	f	\N	\N	\N
-26	ANY_MATERIAL	any_material	any_material	7	2009-08-18 17:52:47.771005+02	2	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-27	DYNAMIC_DESCRIPTION	A Dynamic	Dynamic_Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-28	TEST_VOCABULARY	The test controlled vocabulary property	Organism	6	2008-11-05 09:18:31.545+01	2	6	f	\N	\N	\N	\N	\N	f	\N	\N	\N
-29	IMAGING_DATA_CONFIG	The test imaging data property	Imaging_Data_Config	17	2008-11-05 09:18:31.545+01	2	\N	t	\N	\N	\N	\N	\N	f	\N	\N	\N
+1	DESCRIPTION	A Description	Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+2	GENE_SYMBOL	Gene Symbol, e.g. BMP15	Gene Symbol	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+3	NUCLEOTIDE_SEQUENCE	A sequence of nucleotides	Nucleotide Sequence	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+4	REFSEQ	NCBI Reference Sequence code, applicable to sequences of type: DNA, RNA, protein	RefSeq	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+5	OFFSET	Offset from the start of the sequence	Offset	2	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+6	PLATE_GEOMETRY	Plate Geometry	Plate Geometry	6	2008-11-05 09:18:00.622+01	1	1	t	\N	\N	\N	\N	\N	f
+7	EYE_COLOR	The color of the eyes	Eye color	1	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+8	SIZE	The size of the object	Size	2	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+9	VOLUME	The volume of this person	Volume	3	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+10	IS_VALID	Can the material be used?	Valid?	4	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+11	PURCHASE_DATE	When material has been bought	Purchased	5	2008-11-05 09:18:16.559+01	2	\N	f	\N	\N	\N	\N	\N	f
+13	GENDER	The gender of the living organism	Gender	6	2008-11-05 09:18:31.545+01	2	4	f	\N	\N	\N	\N	\N	f
+14	COMMENT	Any other comments	Comment	1	2008-11-05 09:18:31.545+01	2	\N	f	\N	\N	\N	\N	\N	f
+15	ORGANISM	The organism from which cells come	Organism	6	2008-11-05 09:18:31.545+01	2	3	f	\N	\N	\N	\N	\N	f
+25	BACTERIUM	bacterium	bacterium	7	2009-08-18 17:52:05.435021+02	2	\N	f	6	\N	\N	\N	\N	f
+26	ANY_MATERIAL	any_material	any_material	7	2009-08-18 17:52:47.771005+02	2	\N	f	\N	\N	\N	\N	\N	f
+27	DYNAMIC_DESCRIPTION	A Dynamic	Dynamic_Description	1	2008-11-05 09:18:00.622+01	1	\N	f	\N	\N	\N	\N	\N	f
+28	TEST_VOCABULARY	The test controlled vocabulary property	Organism	6	2008-11-05 09:18:31.545+01	2	6	f	\N	\N	\N	\N	\N	f
+29	IMAGING_DATA_CONFIG	The test imaging data property	Imaging_Data_Config	17	2008-11-05 09:18:31.545+01	2	\N	t	\N	\N	\N	\N	\N	f
diff --git a/server-application-server/sourceTest/sql/postgresql/196/059=sample_type_property_types.tsv b/server-application-server/sourceTest/sql/postgresql/196/059=sample_type_property_types.tsv
index cfa33ffcd3c..e76042fac48 100644
--- a/server-application-server/sourceTest/sql/postgresql/196/059=sample_type_property_types.tsv
+++ b/server-application-server/sourceTest/sql/postgresql/196/059=sample_type_property_types.tsv
@@ -1,18 +1,18 @@
-14	7	27	f	f	2	2012-04-16 14:49:35.990096+02	t	\N	1	2	t	f	f	f
-1	1	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f	f
-2	5	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f	f
-3	1	1	f	f	2	2008-11-05 09:18:18.183+01	f	\N	2	\N	t	f	f	f
-4	5	1	f	f	2	2008-11-05 09:18:19.432+01	f	\N	2	\N	t	f	f	f
-7	3	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	f
-8	3	15	f	f	2	2009-02-09 12:07:26.839487+01	f	\N	2	\N	t	f	f	f
-9	3	8	f	f	2	2009-02-09 12:07:34.437531+01	f	\N	3	\N	t	f	f	f
-11	3	26	f	f	2	2009-08-18 17:53:21.362126+02	f	\N	4	\N	t	f	f	f
-12	3	25	f	f	2	2009-08-18 17:53:26.884669+02	f	\N	5	\N	t	f	f	f
-13	2	5	f	f	2	2010-10-25 14:49:35.990096+02	t	\N	1	\N	t	f	f	f
-15	7	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	2	\N	t	f	f	f
-16	11	28	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	f
-17	12	1	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	f
-18	12	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	f
-19	12	25	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	f
-20	10	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	f
-21	11	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	f
+14	7	27	f	f	2	2012-04-16 14:49:35.990096+02	t	\N	1	2	t	f	f	\N	\N	\N	f
+1	1	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f	\N	\N	\N	f
+2	5	6	t	t	1	2008-11-05 09:18:00.622+01	t	\N	1	\N	t	f	f	\N	\N	\N	f
+3	1	1	f	f	2	2008-11-05 09:18:18.183+01	f	\N	2	\N	t	f	f	\N	\N	\N	f
+4	5	1	f	f	2	2008-11-05 09:18:19.432+01	f	\N	2	\N	t	f	f	\N	\N	\N	f
+7	3	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	\N	\N	\N	f
+8	3	15	f	f	2	2009-02-09 12:07:26.839487+01	f	\N	2	\N	t	f	f	\N	\N	\N	f
+9	3	8	f	f	2	2009-02-09 12:07:34.437531+01	f	\N	3	\N	t	f	f	\N	\N	\N	f
+11	3	26	f	f	2	2009-08-18 17:53:21.362126+02	f	\N	4	\N	t	f	f	\N	\N	\N	f
+12	3	25	f	f	2	2009-08-18 17:53:26.884669+02	f	\N	5	\N	t	f	f	\N	\N	\N	f
+13	2	5	f	f	2	2010-10-25 14:49:35.990096+02	t	\N	1	\N	t	f	f	\N	\N	\N	f
+15	7	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	2	\N	t	f	f	\N	\N	\N	f
+16	11	28	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	\N	\N	\N	f
+17	12	1	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N	f
+18	12	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N	f
+19	12	25	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N	f
+20	10	14	f	f	2	2009-02-09 12:07:19.107679+01	f	\N	1	\N	t	f	f	\N	\N	\N	f
+21	11	15	f	f	2	2009-02-09 12:12:05.238758+01	f	\N	1	\N	t	f	f	\N	\N	\N	f
diff --git a/server-application-server/sourceTest/sql/postgresql/196/schema-196.sql b/server-application-server/sourceTest/sql/postgresql/196/schema-196.sql
index 5e70adedda4..310a7a2b0a6 100644
--- a/server-application-server/sourceTest/sql/postgresql/196/schema-196.sql
+++ b/server-application-server/sourceTest/sql/postgresql/196/schema-196.sql
@@ -1485,7 +1485,11 @@ CREATE TABLE data_set_type_property_types (
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
     is_unique boolean_char DEFAULT false NOT NULL,
-    is_managed_internally_namespace boolean_char DEFAULT false NOT NULL
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value,
+    is_managed_internally_namespace boolean_char DEFAULT false NOT NULL,
+    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
 );
 CREATE TABLE data_set_types (
     id tech_id NOT NULL,
@@ -1802,7 +1806,11 @@ CREATE TABLE experiment_type_property_types (
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
     is_unique boolean_char DEFAULT false NOT NULL,
-    is_managed_internally_namespace boolean_char DEFAULT false NOT NULL
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value,
+    is_managed_internally_namespace boolean_char DEFAULT false NOT NULL,
+    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
 );
 CREATE TABLE experiment_types (
     id tech_id NOT NULL,
@@ -2051,6 +2059,9 @@ CREATE TABLE material_type_property_types (
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
     is_unique boolean_char DEFAULT false NOT NULL,
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value,
     is_managed_internally_namespace boolean_char DEFAULT false NOT NULL
 );
 CREATE TABLE material_types (
@@ -2245,11 +2256,7 @@ CREATE TABLE property_types (
     transformation text_value,
     meta_data jsonb,
     saty_prop_id tech_id,
-    is_multi_value boolean_char DEFAULT false NOT NULL,
-    pattern text_value,
-    pattern_type pattern_type,
-    pattern_regex text_value,
-    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
+    is_multi_value boolean_char DEFAULT false NOT NULL
 );
 CREATE TABLE queries (
     id tech_id NOT NULL,
@@ -2514,7 +2521,11 @@ CREATE TABLE sample_type_property_types (
     is_shown_edit boolean_char DEFAULT true NOT NULL,
     show_raw_value boolean_char DEFAULT false NOT NULL,
     is_unique boolean_char DEFAULT false NOT NULL,
-    is_managed_internally_namespace boolean_char DEFAULT false NOT NULL
+    pattern text_value,
+    pattern_type pattern_type,
+    pattern_regex text_value,
+    is_managed_internally_namespace boolean_char DEFAULT false NOT NULL,
+    CONSTRAINT property_types_pattern_ck CHECK ((pattern IS NULL AND pattern_type IS NULL AND pattern_regex IS NULL) OR (pattern IS NOT NULL AND pattern_type IS NOT NULL AND pattern_regex IS NOT NULL))
 );
 CREATE TABLE sample_types (
     id tech_id NOT NULL,
-- 
GitLab