diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java
index 1c4477875125b0b878d9c0af1abdb72f8e7c6163..5280214356e372428d15ec3897a3d1fede40cf35 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PropertyValidator.java
@@ -16,33 +16,23 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess;
 
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
 import java.util.EnumMap;
-import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateFormatUtils;
-import org.apache.commons.lang.time.DateUtils;
 import org.w3c.dom.Document;
 
 import ch.systemsx.cisd.common.collections.CollectionUtils;
 import ch.systemsx.cisd.common.collections.IToStringConverter;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
-import ch.systemsx.cisd.common.utilities.PropertyUtils;
-import ch.systemsx.cisd.common.utilities.PropertyUtils.Boolean;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
-import ch.systemsx.cisd.openbis.generic.shared.basic.ValidationUtilities.HyperlinkValidationHelper;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
+import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator;
 import ch.systemsx.cisd.openbis.generic.shared.util.XmlUtils;
 
 /**
@@ -52,74 +42,22 @@ import ch.systemsx.cisd.openbis.generic.shared.util.XmlUtils;
  */
 public final class PropertyValidator implements IPropertyValueValidator
 {
-    public enum SupportedDatePattern
-    {
-        DAYS_DATE_PATTERN("yyyy-MM-dd"),
-
-        MINUTES_DATE_PATTERN("yyyy-MM-dd HH:mm"),
-
-        SECONDS_DATE_PATTERN("yyyy-MM-dd HH:mm:ss"),
-
-        US_DATE_PATTERN("M/d/yy"),
-
-        US_DATE_TIME_PATTERN("M/d/yy h:mm a"),
-
-        US_DATE_TIME_24_PATTERN("M/d/yy HH:mm"),
-
-        CANONICAL_DATE_PATTERN(BasicConstant.CANONICAL_DATE_FORMAT_PATTERN),
-
-        RENDERED_CANONICAL_DATE_PATTERN(BasicConstant.RENDERED_CANONICAL_DATE_FORMAT_PATTERN);
-
-        private final String pattern;
-
-        SupportedDatePattern(String pattern)
-        {
-            this.pattern = pattern;
-        }
-
-        public String getPattern()
-        {
-            return pattern;
-        }
-    }
-
-    private final static String[] DATE_PATTERNS = createDatePatterns();
-
     private final static Map<DataTypeCode, IDataTypeValidator> dataTypeValidators =
             createDataTypeValidators();
 
+    private final static SimplePropertyValidator simplePropertyValidator =
+            new SimplePropertyValidator();
+
     private final static Map<DataTypeCode, IDataTypeValidator> createDataTypeValidators()
     {
         final Map<DataTypeCode, IDataTypeValidator> map =
                 new EnumMap<DataTypeCode, IDataTypeValidator>(DataTypeCode.class);
-        map.put(DataTypeCode.BOOLEAN, new BooleanValidator());
-        map.put(DataTypeCode.VARCHAR, new VarcharValidator());
-        map.put(DataTypeCode.TIMESTAMP, new TimestampValidator());
-        map.put(DataTypeCode.INTEGER, new IntegerValidator());
-        map.put(DataTypeCode.REAL, new RealValidator());
         map.put(DataTypeCode.CONTROLLEDVOCABULARY, new ControlledVocabularyValidator());
         map.put(DataTypeCode.MATERIAL, new MaterialValidator());
-        map.put(DataTypeCode.HYPERLINK, new HyperlinkValidator());
-        map.put(DataTypeCode.MULTILINE_VARCHAR, new VarcharValidator());
         map.put(DataTypeCode.XML, new XmlValidator());
         return map;
     }
 
-    private final static String[] createDatePatterns()
-    {
-        final List<String> datePatterns = new ArrayList<String>();
-        // Order does not matter due to DateUtils implementation used.
-        for (SupportedDatePattern supportedPattern : SupportedDatePattern.values())
-        {
-            datePatterns.add(supportedPattern.getPattern());
-        }
-        return datePatterns.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
-    }
-
-    //
-    // IPropertyValidator
-    //
-
     public final String validatePropertyValue(final PropertyTypePE propertyType, final String value)
             throws UserFailureException
     {
@@ -132,6 +70,11 @@ public final class PropertyValidator implements IPropertyValueValidator
             return value;
         }
         final DataTypeCode entityDataType = propertyType.getType().getCode();
+        // If the simplePropertyValidator can handle this, use it. .
+        if (simplePropertyValidator.canValidate(entityDataType))
+        {
+            return simplePropertyValidator.validatePropertyValue(entityDataType, value);
+        }
         final IDataTypeValidator dataTypeValidator = dataTypeValidators.get(entityDataType);
         assert dataTypeValidator != null : String.format("No IDataTypeValidator implementation "
                 + "specified for '%s'.", entityDataType);
@@ -170,109 +113,6 @@ public final class PropertyValidator implements IPropertyValueValidator
         public String validate(final String value) throws UserFailureException;
     }
 
-    private final static class BooleanValidator implements IDataTypeValidator
-    {
-
-        //
-        // IDataTypeValidator
-        //
-
-        public final String validate(final String value) throws UserFailureException
-        {
-            assert value != null : "Unspecified value.";
-            final Boolean bool = PropertyUtils.Boolean.getBoolean(value);
-            if (bool == null)
-            {
-                throw UserFailureException.fromTemplate("Boolean value '%s' has improper format. "
-                        + "It should be either 'true' or 'false'.", value);
-            }
-            return java.lang.Boolean.toString(bool.toBoolean());
-        }
-    }
-
-    private final static class VarcharValidator implements IDataTypeValidator
-    {
-
-        //
-        // IDataTypeValidator
-        //
-
-        public final String validate(final String value) throws UserFailureException
-        {
-            assert value != null : "Unspecified value.";
-            return value;
-        }
-    }
-
-    public final static class TimestampValidator implements IDataTypeValidator
-    {
-
-        //
-        // IDataTypeValidator
-        //
-
-        public final String validate(final String value) throws UserFailureException
-        {
-            assert value != null : "Unspecified value.";
-            try
-            {
-                Date date = DateUtils.parseDate(value, DATE_PATTERNS);
-                // we store date in CANONICAL_DATE_PATTERN
-                return DateFormatUtils.format(date,
-                        SupportedDatePattern.CANONICAL_DATE_PATTERN.getPattern());
-            } catch (final ParseException ex)
-            {
-                throw UserFailureException.fromTemplate(
-                        "Date value '%s' has improper format. It must be one of '%s'.", value,
-                        Arrays.toString(DATE_PATTERNS));
-            }
-        }
-    }
-
-    private final static class IntegerValidator implements IDataTypeValidator
-    {
-
-        //
-        // IDataTypeValidator
-        //
-
-        public final String validate(final String value) throws UserFailureException
-        {
-            assert value != null : "Unspecified value.";
-            try
-            {
-                Integer.parseInt(value);
-                return value;
-            } catch (final NumberFormatException ex)
-            {
-                throw UserFailureException.fromTemplate("Integer value '%s' has improper format.",
-                        value);
-            }
-        }
-    }
-
-    private final static class RealValidator implements IDataTypeValidator
-    {
-
-        //
-        // IDataTypeValidator
-        //
-
-        public final String validate(final String value) throws UserFailureException
-        {
-            assert value != null : "Unspecified value.";
-            try
-            {
-                Double.parseDouble(value);
-                return value;
-            } catch (final NumberFormatException ex)
-            {
-                throw UserFailureException.fromTemplate("Double value '%s' has improper format.",
-                        value);
-            }
-        }
-    }
-
     private final static class ControlledVocabularyValidator implements IDataTypeValidator
     {
 
@@ -380,35 +220,6 @@ public final class PropertyValidator implements IPropertyValueValidator
         }
     }
 
-    private final static class HyperlinkValidator implements IDataTypeValidator
-    {
-
-        //
-        // IDataTypeValidator
-        //
-
-        public final String validate(final String value) throws UserFailureException
-        {
-            assert value != null : "Unspecified value.";
-
-            // validate protocols and format
-            if (HyperlinkValidationHelper.isProtocolValid(value) == false)
-            {
-                throw UserFailureException.fromTemplate(
-                        "Hyperlink '%s' should start with one of the following protocols: '%s'",
-                        value, HyperlinkValidationHelper.getValidProtocolsAsString());
-            }
-            if (HyperlinkValidationHelper.isFormatValid(value) == false)
-            {
-                throw UserFailureException.fromTemplate(
-                        "Hyperlink value '%s' has improper format.", value);
-            }
-
-            // validated value is valid
-            return value;
-        }
-    }
-
     private final static class XmlValidator implements IDataTypeValidator
     {
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java
index efdc36603636d2e1a5999eafcaef3266f60e8fc3..b3daa696e068914dc06cd274c59f57778c96414d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom036To037.java
@@ -35,7 +35,7 @@ import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.utilities.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.dbmigration.java.MigrationStepAdapter;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator.TimestampValidator;
+import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.TimestampValidator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
@@ -51,8 +51,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
 public final class MigrationStepFrom036To037 extends MigrationStepAdapter
 {
 
-    private static final Logger operationLog =
-            LogFactory.getLogger(LogCategory.OPERATION, MigrationStepFrom036To037.class);
+    private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
+            MigrationStepFrom036To037.class);
 
     private static final String SELECT_ENTITY_PROPERTIES_QUERY =
             "SELECT id, value FROM %s WHERE %s IN (" + "SELECT id FROM %s WHERE prty_id IN ("
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java
index 8c804766a5cfe50074f7e86149bed714e7f17c6d..29a898e015a1c9b91882baaf62d93b177b421528 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/migration/MigrationStepFrom046To047.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.common.collections.CollectionUtils;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.dbmigration.java.MigrationStepAdapter;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator.TimestampValidator;
+import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.TimestampValidator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
@@ -50,8 +50,8 @@ import ch.systemsx.cisd.openbis.generic.shared.util.DisplaySettingsSerialization
 public final class MigrationStepFrom046To047 extends MigrationStepAdapter
 {
 
-    private static final Logger operationLog =
-            LogFactory.getLogger(LogCategory.OPERATION, MigrationStepFrom046To047.class);
+    private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
+            MigrationStepFrom046To047.class);
 
     private static final String SELECT_PERSON_WITH_DISPLAY_SETTINGS_QUERY =
             "SELECT id, user_id, display_settings FROM %s;";
@@ -74,7 +74,7 @@ public final class MigrationStepFrom046To047 extends MigrationStepAdapter
         return new TimestampValidator().validate(oldDateValue); // returns canonical format
     }
 
-    // 
+    //
     // MigrationStepAdapter
     //
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java
index 2af19bbf8efb89f003b71959db0f50ab9062c7e1..71b56cecb41eb0d51ce3b3a1c10702664c55748a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PropertyValidatorTest.java
@@ -27,7 +27,7 @@ import org.testng.annotations.Test;
 import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator.SupportedDatePattern;
+import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.SupportedDatePattern;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE;