From ca66c15f2193eaf8eae183808c7c2dce9298e567 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Wed, 13 Jun 2012 06:48:07 +0000
Subject: [PATCH] SP-111 / BIS-49: JSON-RPC - properly handle circular
 dependencies

SVN: 25665
---
 datastore_server/.classpath                   |   7 +-
 .../generic/shared/api/v1/FileInfoDssDTO.java |   6 +-
 openbis-common/.classpath                     |   7 +-
 .../deserializer/JsonDeserializerFactory.java | 123 +++++++++---------
 .../JsonDeserializerProvider.java             |  33 -----
 .../JsonTypeAndClassDeserializer.java         |  91 ++++++++-----
 ...sonTypeAndClassAnnotationIntrospector.java |  11 +-
 .../IJsonBaseTypeToSubTypesMapping.java       |   2 +-
 ...nReflectionsBaseTypeToSubTypesMapping.java |   3 +-
 .../JsonReflectionsSubTypeResolver.java       |  12 +-
 .../JsonTypeAndClassResolverBuilder.java      |  22 ++--
 .../serializer/JsonSerializerFactory.java     |  86 +++++-------
 .../server/json/JsonDeserializationTest.java  |   5 +-
 .../server/json/JsonSerializationTest.java    |   3 +-
 .../api/server/json/JsonTestObjectMapper.java |  28 ++--
 .../object/ObjectWithIgnoredProperties.java   |   2 +-
 .../object/ObjectWithRenamedProperties.java   |   2 +-
 openbis/.classpath                            |   7 +-
 .../shared/api/json/GenericObjectMapper.java  |   9 +-
 .../customcolumn/CustomColumnJSONBuilder.java |   2 +-
 .../shared/api/v1/dto/QueryTableModel.java    |   4 +-
 openbis_api/.classpath                        |   4 +-
 .../generic/shared/api/v1/dto/DataSet.java    |   3 +-
 .../shared/api/v1/dto/MaterialIdentifier.java |   2 +-
 .../generic/shared/api/v1/dto/Project.java    |   3 +-
 .../generic/shared/api/v1/dto/Sample.java     |  16 ++-
 .../SpaceWithProjectsAndRoleAssignments.java  |   5 +-
 .../shared/basic/dto/VocabularyTerm.java      |   4 +-
 openbis_knime/.classpath                      |   4 +-
 screening/.classpath                          |   5 +-
 .../api/json/ScreeningObjectMapper.java       |  10 +-
 .../api/v1/dto/ExperimentIdentifier.java      |   2 +-
 .../shared/api/v1/dto/FeatureVector.java      |   2 +-
 .../screening/shared/api/v1/dto/Geometry.java |   2 +-
 .../shared/api/v1/dto/ImageChannel.java       |   2 +-
 .../api/v1/dto/ImageDatasetReference.java     |   4 -
 .../api/v1/dto/ImageTransformationInfo.java   |   2 +-
 .../shared/api/v1/dto/MaterialIdentifier.java |   2 +-
 .../api/v1/dto/PermanentIdentifier.java       |   4 -
 .../screening/shared/api/v1/dto/Plate.java    |   2 -
 .../shared/api/v1/dto/PlateIdentifier.java    |   4 +-
 .../api/v1/dto/PlateWellMaterialMapping.java  |   2 +-
 .../systemtests/JsonAnnotationTest.java       |  13 +-
 43 files changed, 273 insertions(+), 289 deletions(-)
 delete mode 100644 openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerProvider.java

diff --git a/datastore_server/.classpath b/datastore_server/.classpath
index 720dd545d69..6181d5782e0 100644
--- a/datastore_server/.classpath
+++ b/datastore_server/.classpath
@@ -67,9 +67,6 @@
 	<classpathentry kind="lib" path="/libraries/mina/mina-core.jar" sourcepath="/libraries/mina/mina-core-src.zip"/>
 	<classpathentry kind="lib" path="/libraries/jython/jython.jar" sourcepath="/libraries/jython/jython_src.zip"/>
 	<classpathentry kind="lib" path="/libraries/pngj/pngj.jar" sourcepath="/libraries/pngj/pngj_src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-core-asl.jar"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-mapper-asl.jar"/>
-	<classpathentry kind="lib" path="/libraries/jsonrpc4j/jsonrpc4j.jar" sourcepath="/libraries/jsonrpc4j/jsonrpc4j-sources.jar"/>
 	<classpathentry kind="lib" path="/libraries/gwt2.4/gwt-isserializable.jar"/>
 	<classpathentry kind="lib" path="/libraries/sshd/sshd-core.jar" sourcepath="/libraries/sshd/sshd-core-src.zip"/>
 	<classpathentry kind="lib" path="/libraries/spring/spring-core.jar"/>
@@ -80,6 +77,10 @@
 	<classpathentry kind="lib" path="/libraries/spring/webmvc/spring-webmvc.jar"/>
 	<classpathentry kind="lib" path="/libraries/hibernate-core/hibernate-core.jar"/>
 	<classpathentry kind="lib" path="/libraries/jmock/hamcrest/hamcrest-integration.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-annotations.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-core.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-databind.jar"/>
+	<classpathentry kind="lib" path="/libraries/jsonrpc4j/jsonrpc4j.jar" sourcepath="/libraries/jsonrpc4j/jsonrpc4j-sources.jar"/>
 	<classpathentry kind="lib" path="/libraries/cisd-jhdf5/cisd-jhdf5-core.jar"/>
 	<classpathentry kind="lib" path="/libraries/cisd-jhdf5/cisd-jhdf5-tools.jar"/>
 	<classpathentry kind="lib" path="/libraries/cisd-jhdf5/hdf5-linux-intel.jar"/>
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssDTO.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssDTO.java
index 912f996a067..6969699fa85 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssDTO.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssDTO.java
@@ -20,7 +20,8 @@ import java.io.Serializable;
 
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
-import org.codehaus.jackson.annotate.JsonProperty;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -73,7 +74,7 @@ public class FileInfoDssDTO implements Serializable
     /**
      * Return true if this FileInfo represents a folder.
      */
-    @JsonProperty(value = "isDirectory")
+    @JsonProperty("isDirectory")
     public boolean isDirectory()
     {
         return isDirectory;
@@ -116,6 +117,7 @@ public class FileInfoDssDTO implements Serializable
         this.pathInListing = pathInListing;
     }
 
+    @JsonProperty("isDirectory")
     private void setIsDirectory(boolean isDirectory)
     {
         this.isDirectory = isDirectory;
diff --git a/openbis-common/.classpath b/openbis-common/.classpath
index 7f99895192b..8dbf1601c92 100644
--- a/openbis-common/.classpath
+++ b/openbis-common/.classpath
@@ -21,9 +21,6 @@
 	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/servlet-api-2.5.jar"/>
 	<classpathentry kind="lib" path="/libraries/hibernate-search/jms.jar"/>
 	<classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar" sourcepath="/libraries/eodsql/eodsql_src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jsonrpc4j/jsonrpc4j.jar" sourcepath="/libraries/jsonrpc4j/jsonrpc4j-sources.jar"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-core-asl.jar"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-mapper-asl.jar"/>
 	<classpathentry kind="lib" path="/libraries/gwt2.4/gwt-servlet.jar"/>
 	<classpathentry exported="true" kind="lib" path="/libraries/hibernate-search/jsr250-api.jar"/>
 	<classpathentry kind="lib" path="/libraries/spring/spring-core.jar"/>
@@ -52,5 +49,9 @@
 	<classpathentry kind="lib" path="/libraries/reflections/lib/xml-apis-1.0.b2.jar"/>
 	<classpathentry kind="lib" path="/libraries/reflections/reflections.jar"/>
 	<classpathentry kind="lib" path="/libraries/slf4j/slf4j.jar" sourcepath="/libraries/slf4j/src.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-annotations.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-core.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-databind.jar"/>
+	<classpathentry kind="lib" path="/libraries/jsonrpc4j/jsonrpc4j.jar" sourcepath="/libraries/jsonrpc4j/jsonrpc4j-sources.jar"/>
 	<classpathentry kind="output" path="targets/classes"/>
 </classpath>
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerFactory.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerFactory.java
index 683565ab836..b4a1ed0a0f7 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerFactory.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerFactory.java
@@ -20,30 +20,30 @@ import java.io.IOException;
 import java.io.StringWriter;
 import java.util.Collection;
 
-import org.codehaus.jackson.JsonFactory;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.map.AnnotationIntrospector;
-import org.codehaus.jackson.map.BeanProperty;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.DeserializationContext;
-import org.codehaus.jackson.map.DeserializerProvider;
-import org.codehaus.jackson.map.JsonDeserializer;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.TypeDeserializer;
-import org.codehaus.jackson.map.deser.BeanDeserializerFactory;
-import org.codehaus.jackson.map.introspect.AnnotatedClass;
-import org.codehaus.jackson.map.introspect.BasicBeanDescription;
-import org.codehaus.jackson.map.jsontype.NamedType;
-import org.codehaus.jackson.map.jsontype.TypeIdResolver;
-import org.codehaus.jackson.map.jsontype.impl.TypeNameIdResolver;
-import org.codehaus.jackson.map.type.ArrayType;
-import org.codehaus.jackson.map.type.CollectionLikeType;
-import org.codehaus.jackson.map.type.CollectionType;
-import org.codehaus.jackson.map.type.MapLikeType;
-import org.codehaus.jackson.map.type.MapType;
-import org.codehaus.jackson.type.JavaType;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.BeanDescription;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.cfg.DeserializerFactoryConfig;
+import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
+import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
+import com.fasterxml.jackson.databind.jsontype.impl.TypeNameIdResolver;
+import com.fasterxml.jackson.databind.type.ArrayType;
+import com.fasterxml.jackson.databind.type.CollectionLikeType;
+import com.fasterxml.jackson.databind.type.CollectionType;
+import com.fasterxml.jackson.databind.type.MapLikeType;
+import com.fasterxml.jackson.databind.type.MapType;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 import ch.systemsx.cisd.common.api.server.json.common.JsonConstants;
@@ -62,62 +62,57 @@ public class JsonDeserializerFactory extends BeanDeserializerFactory
     public JsonDeserializerFactory(
             IJsonClassValueToClassObjectsMapping classValueToClassObjectsMapping)
     {
-        super(null);
+        super(new DeserializerFactoryConfig());
         this.classValueToClassObjectsMapping = classValueToClassObjectsMapping;
     }
 
     @Override
-    public JsonDeserializer<?> createArrayDeserializer(DeserializationConfig config,
-            DeserializerProvider p, ArrayType type, BeanProperty property)
-            throws JsonMappingException
+    public JsonDeserializer<?> createArrayDeserializer(DeserializationContext ctxt, ArrayType type,
+            BeanDescription beanDesc) throws JsonMappingException
     {
         ArrayType newType =
-                type.withContentTypeHandler(createContentTypeDeserializer(config, type, property));
-        return super.createArrayDeserializer(config, p, newType, property);
+                type.withContentTypeHandler(createContentTypeDeserializer(ctxt, type, beanDesc));
+        return super.createArrayDeserializer(ctxt, newType, beanDesc);
     }
 
     @Override
-    public JsonDeserializer<?> createCollectionDeserializer(DeserializationConfig config,
-            DeserializerProvider p, CollectionType type, BeanProperty property)
-            throws JsonMappingException
+    public JsonDeserializer<?> createCollectionDeserializer(DeserializationContext ctxt,
+            CollectionType type, BeanDescription beanDesc) throws JsonMappingException
     {
         CollectionType newType =
-                type.withContentTypeHandler(createContentTypeDeserializer(config, type, property));
-        return super.createCollectionDeserializer(config, p, newType, property);
+                type.withContentTypeHandler(createContentTypeDeserializer(ctxt, type, beanDesc));
+        return super.createCollectionDeserializer(ctxt, newType, beanDesc);
     }
 
     @Override
-    public JsonDeserializer<?> createCollectionLikeDeserializer(DeserializationConfig config,
-            DeserializerProvider p, CollectionLikeType type, BeanProperty property)
-            throws JsonMappingException
+    public JsonDeserializer<?> createCollectionLikeDeserializer(DeserializationContext ctxt,
+            CollectionLikeType type, BeanDescription beanDesc) throws JsonMappingException
     {
         CollectionLikeType newType =
-                type.withContentTypeHandler(createContentTypeDeserializer(config, type, property));
-        return super.createCollectionLikeDeserializer(config, p, newType, property);
+                type.withContentTypeHandler(createContentTypeDeserializer(ctxt, type, beanDesc));
+        return super.createCollectionLikeDeserializer(ctxt, newType, beanDesc);
     }
 
     @Override
-    public JsonDeserializer<?> createMapDeserializer(DeserializationConfig config,
-            DeserializerProvider p, MapType type, BeanProperty property)
-            throws JsonMappingException
+    public JsonDeserializer<?> createMapDeserializer(DeserializationContext ctxt, MapType type,
+            BeanDescription beanDesc) throws JsonMappingException
     {
         MapType newType =
-                type.withContentTypeHandler(createContentTypeDeserializer(config, type, property));
-        return super.createMapDeserializer(config, p, newType, property);
+                type.withContentTypeHandler(createContentTypeDeserializer(ctxt, type, beanDesc));
+        return super.createMapDeserializer(ctxt, newType, beanDesc);
     }
 
     @Override
-    public JsonDeserializer<?> createMapLikeDeserializer(DeserializationConfig config,
-            DeserializerProvider p, MapLikeType type, BeanProperty property)
-            throws JsonMappingException
+    public JsonDeserializer<?> createMapLikeDeserializer(DeserializationContext ctxt,
+            MapLikeType type, BeanDescription beanDesc) throws JsonMappingException
     {
         MapLikeType newType =
-                type.withContentTypeHandler(createContentTypeDeserializer(config, type, property));
-        return super.createMapLikeDeserializer(config, p, newType, property);
+                type.withContentTypeHandler(createContentTypeDeserializer(ctxt, type, beanDesc));
+        return super.createMapLikeDeserializer(ctxt, newType, beanDesc);
     }
 
-    private TypeDeserializer createContentTypeDeserializer(DeserializationConfig config,
-            JavaType containerType, BeanProperty property)
+    private TypeDeserializer createContentTypeDeserializer(DeserializationContext ctxt,
+            JavaType containerType, BeanDescription beanDesc)
     {
         JavaType contentType = containerType.getContentType();
 
@@ -130,8 +125,9 @@ public class JsonDeserializerFactory extends BeanDeserializerFactory
 
         if (contentClass.equals(Object.class) || contentClass.isAnnotationPresent(JsonObject.class))
         {
-            BasicBeanDescription bean =
-                    config.introspectClassAnnotations(contentType.getRawClass());
+            DeserializationConfig config = ctxt.getConfig();
+
+            BeanDescription bean = config.introspectClassAnnotations(contentType.getRawClass());
             AnnotatedClass ac = bean.getClassInfo();
             AnnotationIntrospector ai = config.getAnnotationIntrospector();
             Collection<NamedType> subtypes =
@@ -140,7 +136,7 @@ public class JsonDeserializerFactory extends BeanDeserializerFactory
                     TypeNameIdResolver.construct(config, contentType, subtypes, false, true);
             JsonTypeAndClassWithFallbackDeserializer deserializer =
                     new JsonTypeAndClassWithFallbackDeserializer(contentType, subtypes, resolver,
-                            property, JsonConstants.getTypeField());
+                            JsonConstants.getTypeField());
             deserializer.setClassValueToClassObjectsMapping(this.classValueToClassObjectsMapping);
             return deserializer;
         } else
@@ -152,11 +148,22 @@ public class JsonDeserializerFactory extends BeanDeserializerFactory
     private class JsonTypeAndClassWithFallbackDeserializer extends JsonTypeAndClassDeserializer
     {
 
+        public JsonTypeAndClassWithFallbackDeserializer(
+                JsonTypeAndClassWithFallbackDeserializer src, BeanProperty property)
+        {
+            super(src, property);
+        }
+
         public JsonTypeAndClassWithFallbackDeserializer(JavaType type,
-                Collection<NamedType> subtypes, TypeIdResolver idRes, BeanProperty property,
-                String typePropName)
+                Collection<NamedType> subtypes, TypeIdResolver idRes, String typePropName)
+        {
+            super(type, subtypes, idRes, typePropName, false);
+        }
+
+        @Override
+        public TypeDeserializer forProperty(BeanProperty prop)
         {
-            super(type, subtypes, idRes, property, typePropName);
+            return new JsonTypeAndClassWithFallbackDeserializer(this, prop);
         }
 
         @Override
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerProvider.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerProvider.java
deleted file mode 100644
index a649d11e4d1..00000000000
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonDeserializerProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2012 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.common.api.server.json.deserializer;
-
-import org.codehaus.jackson.map.DeserializerFactory;
-import org.codehaus.jackson.map.deser.StdDeserializerProvider;
-
-/**
- * @author pkupczyk
- */
-public class JsonDeserializerProvider extends StdDeserializerProvider
-{
-
-    public JsonDeserializerProvider(DeserializerFactory f)
-    {
-        super(f);
-    }
-
-}
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java
index 4f704616c03..feeab4de70d 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java
@@ -21,19 +21,20 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.JsonToken;
-import org.codehaus.jackson.map.BeanProperty;
-import org.codehaus.jackson.map.DeserializationContext;
-import org.codehaus.jackson.map.JsonDeserializer;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.jsontype.NamedType;
-import org.codehaus.jackson.map.jsontype.TypeIdResolver;
-import org.codehaus.jackson.map.jsontype.impl.AsPropertyTypeDeserializer;
-import org.codehaus.jackson.type.JavaType;
-import org.codehaus.jackson.util.JsonParserSequence;
-import org.codehaus.jackson.util.TokenBuffer;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.core.util.JsonParserSequence;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
+import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
+import com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer;
+import com.fasterxml.jackson.databind.util.TokenBuffer;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 import ch.systemsx.cisd.common.api.server.json.common.JsonConstants;
@@ -59,30 +60,49 @@ public class JsonTypeAndClassDeserializer extends AsPropertyTypeDeserializer
     private IJsonClassValueToClassObjectsMapping classValueToClassObjectsMapping =
             new JsonStaticClassValueToClassObjectsMapping();
 
+    public JsonTypeAndClassDeserializer(JsonTypeAndClassDeserializer src, BeanProperty property)
+    {
+        super(src, property);
+        hasSubtypes = src.hasSubtypes;
+        classValueToClassObjectsMapping = src.classValueToClassObjectsMapping;
+    }
+
     public JsonTypeAndClassDeserializer(JavaType type, Collection<NamedType> subtypes,
-            TypeIdResolver idRes, BeanProperty property, String typePropName)
+            TypeIdResolver idRes, String typePropName, boolean typeIdVisible)
     {
-        super(type, idRes, property, typePropName);
+        super(type, idRes, typePropName, typeIdVisible, null);
         hasSubtypes = subtypes != null && subtypes.size() > 1;
     }
 
+    @Override
+    public TypeDeserializer forProperty(BeanProperty prop)
+    {
+        return new JsonTypeAndClassDeserializer(this, prop);
+    }
+
     @Override
     public Object deserializeTypedFromObject(JsonParser jp, DeserializationContext ctxt)
             throws IOException, JsonProcessingException
     {
         // but first, sanity check to ensure we have START_OBJECT or FIELD_NAME
         JsonToken t = jp.getCurrentToken();
-
         if (t == JsonToken.START_OBJECT)
         {
             t = jp.nextToken();
+        } else if (t == JsonToken.START_ARRAY)
+        {
+            /*
+             * This is most likely due to the fact that not all Java types are serialized as JSON
+             * Objects; so if "as-property" inclusion is requested, serialization of things like
+             * Lists must be instead handled as if "as-wrapper-array" was requested. But this can
+             * also be due to some custom handling: so, if "defaultImpl" is defined, it will be
+             * asked to handle this case.
+             */
+            return _deserializeTypedUsingDefaultImpl(jp, ctxt, null);
         } else if (t != JsonToken.FIELD_NAME)
         {
-            throw ctxt.wrongTokenException(jp, JsonToken.START_OBJECT,
-                    "need JSON Object to contain As.PROPERTY type information (for class "
-                            + baseTypeName() + ")");
+            return _deserializeTypedUsingDefaultImpl(jp, ctxt, null);
         }
-
         // Ok, let's try to find the property. But first, need token buffer...
         TokenBuffer tb = null;
 
@@ -121,19 +141,23 @@ public class JsonTypeAndClassDeserializer extends AsPropertyTypeDeserializer
     private Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, TokenBuffer tb,
             String type) throws IOException, JsonProcessingException
     {
-        final JsonParser actualJp;
-        final JsonDeserializer<Object> deser = _findDeserializer(ctxt, type);
-        // deserializer should take care of closing END_OBJECT as well
-        if (tb != null)
-        {
-            actualJp = JsonParserSequence.createFlattened(tb.asParser(jp), jp);
-        } else
-        {
-            actualJp = jp;
+        JsonParser actualJp = jp;
+        TokenBuffer actualTb = tb;
+        JsonDeserializer<Object> deser = _findDeserializer(ctxt, type);
+        if (_typeIdVisible)
+        { // need to merge id back in JSON input?
+            if (actualTb == null)
+            {
+                actualTb = new TokenBuffer(null);
+            }
+            actualTb.writeFieldName(actualJp.getCurrentName());
+            actualTb.writeString(type);
+        }
+        if (actualTb != null)
+        { // need to put back skipped properties?
+            actualJp = JsonParserSequence.createFlattened(actualTb.asParser(actualJp), actualJp);
         }
-        /*
-         * Must point to the next value; tb had no current, jp pointed to VALUE_STRING:
-         */
+        // Must point to the next value; tb had no current, jp pointed to VALUE_STRING:
         actualJp.nextToken(); // to skip past String value
         // deserializer should take care of closing END_OBJECT as well
         return deser.deserialize(actualJp, ctxt);
@@ -189,8 +213,7 @@ public class JsonTypeAndClassDeserializer extends AsPropertyTypeDeserializer
     {
         final JsonParser actualJp;
         final JsonDeserializer<Object> deserializer =
-                ctxt.getDeserializerProvider().findValueDeserializer(ctxt.getConfig(), _baseType,
-                        _property);
+                ctxt.findContextualValueDeserializer(_baseType, _property);
 
         if (tb != null)
         {
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/introspector/JsonTypeAndClassAnnotationIntrospector.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/introspector/JsonTypeAndClassAnnotationIntrospector.java
index 6ab37227e18..0d48932df94 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/introspector/JsonTypeAndClassAnnotationIntrospector.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/introspector/JsonTypeAndClassAnnotationIntrospector.java
@@ -17,14 +17,13 @@
 package ch.systemsx.cisd.common.api.server.json.introspector;
 
 import java.util.HashMap;
-
 import java.util.List;
 
-import org.codehaus.jackson.map.MapperConfig;
-import org.codehaus.jackson.map.introspect.AnnotatedClass;
-import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
-import org.codehaus.jackson.map.jsontype.TypeResolverBuilder;
-import org.codehaus.jackson.type.JavaType;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.cfg.MapperConfig;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
+import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 import ch.systemsx.cisd.common.api.server.json.mapping.IJsonClassValueToClassObjectsMapping;
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/IJsonBaseTypeToSubTypesMapping.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/IJsonBaseTypeToSubTypesMapping.java
index b2319df222e..3f40b6e34de 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/IJsonBaseTypeToSubTypesMapping.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/IJsonBaseTypeToSubTypesMapping.java
@@ -18,7 +18,7 @@ package ch.systemsx.cisd.common.api.server.json.mapping;
 
 import java.util.Set;
 
-import org.codehaus.jackson.map.jsontype.NamedType;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
 
 /**
  * @author pkupczyk
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/JsonReflectionsBaseTypeToSubTypesMapping.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/JsonReflectionsBaseTypeToSubTypesMapping.java
index f31feba089c..5752aac432b 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/JsonReflectionsBaseTypeToSubTypesMapping.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/mapping/JsonReflectionsBaseTypeToSubTypesMapping.java
@@ -21,9 +21,10 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import org.codehaus.jackson.map.jsontype.NamedType;
 import org.reflections.Reflections;
 
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+
 import ch.systemsx.cisd.base.annotation.JsonObject;
 import ch.systemsx.cisd.common.api.server.json.common.JsonConstants;
 
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonReflectionsSubTypeResolver.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonReflectionsSubTypeResolver.java
index 83f94e6623c..ef0545dfe09 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonReflectionsSubTypeResolver.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonReflectionsSubTypeResolver.java
@@ -18,12 +18,12 @@ package ch.systemsx.cisd.common.api.server.json.resolver;
 
 import java.util.Collection;
 
-import org.codehaus.jackson.map.AnnotationIntrospector;
-import org.codehaus.jackson.map.MapperConfig;
-import org.codehaus.jackson.map.introspect.AnnotatedClass;
-import org.codehaus.jackson.map.introspect.AnnotatedMember;
-import org.codehaus.jackson.map.jsontype.NamedType;
-import org.codehaus.jackson.map.jsontype.SubtypeResolver;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.cfg.MapperConfig;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
+import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+import com.fasterxml.jackson.databind.jsontype.SubtypeResolver;
 
 import ch.systemsx.cisd.common.api.server.json.mapping.IJsonBaseTypeToSubTypesMapping;
 
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonTypeAndClassResolverBuilder.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonTypeAndClassResolverBuilder.java
index 121845480a1..f899bc8f8db 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonTypeAndClassResolverBuilder.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/resolver/JsonTypeAndClassResolverBuilder.java
@@ -18,15 +18,14 @@ package ch.systemsx.cisd.common.api.server.json.resolver;
 
 import java.util.Collection;
 
-import org.codehaus.jackson.annotate.JsonTypeInfo.As;
-import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
-import org.codehaus.jackson.map.BeanProperty;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.TypeDeserializer;
-import org.codehaus.jackson.map.jsontype.NamedType;
-import org.codehaus.jackson.map.jsontype.TypeIdResolver;
-import org.codehaus.jackson.map.jsontype.impl.StdTypeResolverBuilder;
-import org.codehaus.jackson.type.JavaType;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
+import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
+import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
 
 import ch.systemsx.cisd.common.api.server.json.deserializer.JsonTypeAndClassDeserializer;
 import ch.systemsx.cisd.common.api.server.json.mapping.IJsonClassValueToClassObjectsMapping;
@@ -49,11 +48,12 @@ public class JsonTypeAndClassResolverBuilder extends StdTypeResolverBuilder
 
     @Override
     public TypeDeserializer buildTypeDeserializer(DeserializationConfig config, JavaType baseType,
-            Collection<NamedType> subtypes, BeanProperty property)
+            Collection<NamedType> subtypes)
     {
         TypeIdResolver idRes = idResolver(config, baseType, subtypes, false, true);
         JsonTypeAndClassDeserializer deserializer =
-                new JsonTypeAndClassDeserializer(baseType, subtypes, idRes, property, _typeProperty);
+                new JsonTypeAndClassDeserializer(baseType, subtypes, idRes, _typeProperty,
+                        _typeIdVisible);
         deserializer.setClassValueToClassObjectsMapping(classValueToClassObjectsMapping);
         return deserializer;
     }
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/serializer/JsonSerializerFactory.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/serializer/JsonSerializerFactory.java
index 667ee4e99c6..96a01ad9c1e 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/serializer/JsonSerializerFactory.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/serializer/JsonSerializerFactory.java
@@ -18,24 +18,23 @@ package ch.systemsx.cisd.common.api.server.json.serializer;
 
 import java.util.Collection;
 
-import org.codehaus.jackson.map.AnnotationIntrospector;
-import org.codehaus.jackson.map.BeanProperty;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.map.TypeSerializer;
-import org.codehaus.jackson.map.introspect.AnnotatedClass;
-import org.codehaus.jackson.map.introspect.BasicBeanDescription;
-import org.codehaus.jackson.map.jsontype.NamedType;
-import org.codehaus.jackson.map.jsontype.TypeIdResolver;
-import org.codehaus.jackson.map.jsontype.impl.AsPropertyTypeSerializer;
-import org.codehaus.jackson.map.jsontype.impl.TypeNameIdResolver;
-import org.codehaus.jackson.map.ser.BeanSerializerFactory;
-import org.codehaus.jackson.map.type.ArrayType;
-import org.codehaus.jackson.map.type.CollectionLikeType;
-import org.codehaus.jackson.map.type.CollectionType;
-import org.codehaus.jackson.map.type.MapLikeType;
-import org.codehaus.jackson.map.type.MapType;
-import org.codehaus.jackson.type.JavaType;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.BeanDescription;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
+import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
+import com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeSerializer;
+import com.fasterxml.jackson.databind.jsontype.impl.TypeNameIdResolver;
+import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;
+import com.fasterxml.jackson.databind.type.ArrayType;
+import com.fasterxml.jackson.databind.type.CollectionType;
+import com.fasterxml.jackson.databind.type.MapType;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 import ch.systemsx.cisd.common.api.server.json.common.JsonConstants;
@@ -53,20 +52,20 @@ public class JsonSerializerFactory extends BeanSerializerFactory
 
     @Override
     protected JsonSerializer<?> buildArraySerializer(SerializationConfig config, ArrayType type,
-            BasicBeanDescription beanDesc, BeanProperty property, boolean staticTyping,
-            TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer)
+            BeanDescription beanDesc, boolean staticTyping, TypeSerializer elementTypeSerializer,
+            JsonSerializer<Object> elementValueSerializer) throws JsonMappingException
     {
         ArrayType newType =
-                type.withContentTypeHandler(createContentTypeSerializer(config, type, property));
-        return super.buildArraySerializer(config, newType, beanDesc, property, staticTyping,
+                type.withContentTypeHandler(createContentTypeSerializer(config, type, null));
+        return super.buildArraySerializer(config, newType, beanDesc, staticTyping,
                 elementTypeSerializer, elementValueSerializer);
     }
 
     @Override
     protected JsonSerializer<?> buildCollectionSerializer(SerializationConfig config,
-            CollectionType type, BasicBeanDescription beanDesc, BeanProperty property,
+            CollectionType type, BeanDescription beanDesc, BeanProperty property,
             boolean staticTyping, TypeSerializer elementTypeSerializer,
-            JsonSerializer<Object> elementValueSerializer)
+            JsonSerializer<Object> elementValueSerializer) throws JsonMappingException
     {
         CollectionType newType =
                 type.withContentTypeHandler(createContentTypeSerializer(config, type, property));
@@ -74,40 +73,16 @@ public class JsonSerializerFactory extends BeanSerializerFactory
                 elementTypeSerializer, elementValueSerializer);
     }
 
-    @Override
-    protected JsonSerializer<?> buildCollectionLikeSerializer(SerializationConfig config,
-            CollectionLikeType type, BasicBeanDescription beanDesc, BeanProperty property,
-            boolean staticTyping, TypeSerializer elementTypeSerializer,
-            JsonSerializer<Object> elementValueSerializer)
-    {
-        CollectionLikeType newType =
-                type.withContentTypeHandler(createContentTypeSerializer(config, type, property));
-        return super.buildCollectionLikeSerializer(config, newType, beanDesc, property,
-                staticTyping, elementTypeSerializer, elementValueSerializer);
-    }
-
     @Override
     protected JsonSerializer<?> buildMapSerializer(SerializationConfig config, MapType type,
-            BasicBeanDescription beanDesc, BeanProperty property, boolean staticTyping,
-            JsonSerializer<Object> keySerializer, TypeSerializer elementTypeSerializer,
-            JsonSerializer<Object> elementValueSerializer)
-    {
-        MapType newType =
-                type.withContentTypeHandler(createContentTypeSerializer(config, type, property));
-        return super.buildMapSerializer(config, newType, beanDesc, property, staticTyping,
-                keySerializer, elementTypeSerializer, elementValueSerializer);
-    }
-
-    @Override
-    protected JsonSerializer<?> buildMapLikeSerializer(SerializationConfig config,
-            MapLikeType type, BasicBeanDescription beanDesc, BeanProperty property,
-            boolean staticTyping, JsonSerializer<Object> keySerializer,
+            BeanDescription beanDesc, boolean staticTyping, JsonSerializer<Object> keySerializer,
             TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer)
+            throws JsonMappingException
     {
-        MapLikeType newType =
-                type.withContentTypeHandler(createContentTypeSerializer(config, type, property));
-        return super.buildMapLikeSerializer(config, newType, beanDesc, property, staticTyping,
-                keySerializer, elementTypeSerializer, elementValueSerializer);
+        MapType newType =
+                type.withContentTypeHandler(createContentTypeSerializer(config, type, null));
+        return super.buildMapSerializer(config, newType, beanDesc, staticTyping, keySerializer,
+                elementTypeSerializer, elementValueSerializer);
     }
 
     private TypeSerializer createContentTypeSerializer(SerializationConfig config,
@@ -124,8 +99,7 @@ public class JsonSerializerFactory extends BeanSerializerFactory
 
         if (contentClass.equals(Object.class) || contentClass.isAnnotationPresent(JsonObject.class))
         {
-            BasicBeanDescription bean =
-                    config.introspectClassAnnotations(contentType.getRawClass());
+            BeanDescription bean = config.introspectClassAnnotations(contentType.getRawClass());
             AnnotatedClass ac = bean.getClassInfo();
             AnnotationIntrospector ai = config.getAnnotationIntrospector();
             Collection<NamedType> subtypes =
diff --git a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonDeserializationTest.java b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonDeserializationTest.java
index b9327ad5294..8eaee1d809e 100644
--- a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonDeserializationTest.java
+++ b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonDeserializationTest.java
@@ -28,11 +28,12 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.ObjectMapper;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import ch.systemsx.cisd.common.api.server.json.object.ObjectWithContainerTypes;
 import ch.systemsx.cisd.common.api.server.json.object.ObjectWithDateTypes;
 import ch.systemsx.cisd.common.api.server.json.object.ObjectWithEnumTypes;
diff --git a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonSerializationTest.java b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonSerializationTest.java
index 717ef681f6b..909a4288e15 100644
--- a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonSerializationTest.java
+++ b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonSerializationTest.java
@@ -22,10 +22,11 @@ import java.util.EnumSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import org.codehaus.jackson.map.ObjectMapper;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import ch.systemsx.cisd.common.api.server.json.object.ObjectWithEnumTypes;
 import ch.systemsx.cisd.common.api.server.json.object.ObjectWithEnumTypes.NestedEnum;
 import ch.systemsx.cisd.common.api.server.json.object.ObjectWithNestedTypes;
diff --git a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonTestObjectMapper.java b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonTestObjectMapper.java
index 80beb5f5873..e1a41e6aae8 100644
--- a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonTestObjectMapper.java
+++ b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/JsonTestObjectMapper.java
@@ -16,11 +16,13 @@
 
 package ch.systemsx.cisd.common.api.server.json;
 
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
 
 import ch.systemsx.cisd.common.api.server.json.deserializer.JsonDeserializerFactory;
-import ch.systemsx.cisd.common.api.server.json.deserializer.JsonDeserializerProvider;
 import ch.systemsx.cisd.common.api.server.json.introspector.JsonTypeAndClassAnnotationIntrospector;
+import ch.systemsx.cisd.common.api.server.json.mapping.IJsonBaseTypeToSubTypesMapping;
+import ch.systemsx.cisd.common.api.server.json.mapping.IJsonClassValueToClassObjectsMapping;
 import ch.systemsx.cisd.common.api.server.json.mapping.JsonReflectionsBaseTypeToSubTypesMapping;
 import ch.systemsx.cisd.common.api.server.json.mapping.JsonStaticClassValueToClassObjectsMapping;
 import ch.systemsx.cisd.common.api.server.json.object.ObjectWithContainerTypes;
@@ -51,12 +53,17 @@ public class JsonTestObjectMapper extends ObjectMapper
 
     public JsonTestObjectMapper()
     {
-        JsonReflectionsBaseTypeToSubTypesMapping subTypesMapping =
-                new JsonReflectionsBaseTypeToSubTypesMapping(getClass().getPackage().getName());
+        super(null, null, new DefaultDeserializationContext.Impl(new JsonDeserializerFactory(
+                getClassMapping())));
+        setAnnotationIntrospector(new JsonTypeAndClassAnnotationIntrospector(getClassMapping()));
+        setSubtypeResolver(new JsonReflectionsSubTypeResolver(getTypeMapping()));
+        setSerializerFactory(new JsonSerializerFactory());
+    }
 
+    private static IJsonClassValueToClassObjectsMapping getClassMapping()
+    {
         JsonStaticClassValueToClassObjectsMapping classMapping =
                 new JsonStaticClassValueToClassObjectsMapping();
-
         classMapping.addClass(".LegacyObjectWithType", ObjectWithType.class);
         classMapping.addClass(".LegacyObjectWithTypeA", ObjectWithTypeA.class);
         classMapping.addClass(".LegacyObjectWithTypeA", ObjectWithTypeALegalDuplicate.class);
@@ -77,12 +84,13 @@ public class JsonTestObjectMapper extends ObjectMapper
         classMapping.addClass(".LegacyObjectWithRenamedProperties",
                 ObjectWithRenamedProperties.class);
         classMapping.addClass(".LegacyObjectWithPrivateAccess", ObjectWithPrivateAccess.class);
+        return classMapping;
+    }
 
-        setAnnotationIntrospector(new JsonTypeAndClassAnnotationIntrospector(classMapping));
-        setSubtypeResolver(new JsonReflectionsSubTypeResolver(subTypesMapping));
-        setDeserializerProvider(new JsonDeserializerProvider(new JsonDeserializerFactory(
-                classMapping)));
-        setSerializerFactory(new JsonSerializerFactory());
+    private static IJsonBaseTypeToSubTypesMapping getTypeMapping()
+    {
+        return new JsonReflectionsBaseTypeToSubTypesMapping(JsonTestObjectMapper.class.getPackage()
+                .getName());
     }
 
 }
diff --git a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithIgnoredProperties.java b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithIgnoredProperties.java
index c3335b05f87..f10e09f8d14 100644
--- a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithIgnoredProperties.java
+++ b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithIgnoredProperties.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.common.api.server.json.object;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithRenamedProperties.java b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithRenamedProperties.java
index d53f694ab3c..863baae6de3 100644
--- a/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithRenamedProperties.java
+++ b/openbis-common/sourceTest/java/ch/systemsx/cisd/common/api/server/json/object/ObjectWithRenamedProperties.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.common.api.server.json.object;
 
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/openbis/.classpath b/openbis/.classpath
index 79e4cde9bf4..a26484a7c4c 100644
--- a/openbis/.classpath
+++ b/openbis/.classpath
@@ -47,9 +47,6 @@
 	<classpathentry kind="lib" path="/libraries/poi/poi-ooxml-schemas-3.7-20101029.jar"/>
 	<classpathentry kind="lib" path="/libraries/gwt-image-loader/gwt-image-loader.jar"/>
 	<classpathentry kind="lib" path="/libraries/mail/mail.jar"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-core-asl.jar"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-mapper-asl.jar"/>
-	<classpathentry kind="lib" path="/libraries/jsonrpc4j/jsonrpc4j.jar"/>
 	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-server.jar" sourcepath="/libraries/jetty7/src/jetty_src.zip"/>
 	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-servlet.jar" sourcepath="/libraries/jetty7/src/jetty_src.zip"/>
 	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/servlet-api-2.5.jar"/>
@@ -78,5 +75,9 @@
 	<classpathentry kind="lib" path="/libraries/spring/spring.jar"/>
 	<classpathentry kind="lib" path="/libraries/jmock/hamcrest/hamcrest-integration.jar"/>
 	<classpathentry kind="lib" path="/libraries/hibernate-search/jsr250-api.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-annotations.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-core.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-databind.jar"/>
+	<classpathentry kind="lib" path="/libraries/jsonrpc4j/jsonrpc4j.jar" sourcepath="/libraries/jsonrpc4j/jsonrpc4j-sources.jar"/>
 	<classpathentry kind="output" path="targets/www/WEB-INF/classes"/>
 </classpath>
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/json/GenericObjectMapper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/json/GenericObjectMapper.java
index b419b9beee4..eecac1b22b2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/json/GenericObjectMapper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/json/GenericObjectMapper.java
@@ -16,10 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.api.json;
 
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
 
 import ch.systemsx.cisd.common.api.server.json.deserializer.JsonDeserializerFactory;
-import ch.systemsx.cisd.common.api.server.json.deserializer.JsonDeserializerProvider;
 import ch.systemsx.cisd.common.api.server.json.introspector.JsonTypeAndClassAnnotationIntrospector;
 import ch.systemsx.cisd.common.api.server.json.mapping.JsonReflectionsBaseTypeToSubTypesMapping;
 import ch.systemsx.cisd.common.api.server.json.resolver.JsonReflectionsSubTypeResolver;
@@ -35,12 +35,13 @@ public class GenericObjectMapper extends ObjectMapper
 
     public GenericObjectMapper()
     {
+        super(null, null, new DefaultDeserializationContext.Impl(new JsonDeserializerFactory(
+                GenericJsonClassValueToClassObjectsMapping.getInstance())));
+
         setAnnotationIntrospector(new JsonTypeAndClassAnnotationIntrospector(
                 GenericJsonClassValueToClassObjectsMapping.getInstance()));
         setSubtypeResolver(new JsonReflectionsSubTypeResolver(
                 JsonReflectionsBaseTypeToSubTypesMapping.getInstance()));
-        setDeserializerProvider(new JsonDeserializerProvider(new JsonDeserializerFactory(
-                GenericJsonClassValueToClassObjectsMapping.getInstance())));
         setSerializerFactory(new JsonSerializerFactory());
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/calculator/customcolumn/CustomColumnJSONBuilder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/calculator/customcolumn/CustomColumnJSONBuilder.java
index b670f263c98..7e0d25a2cbc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/calculator/customcolumn/CustomColumnJSONBuilder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/calculator/customcolumn/CustomColumnJSONBuilder.java
@@ -20,7 +20,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 import ch.systemsx.cisd.common.utilities.ExceptionUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.customcolumn.core.CustomColumnParam;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/api/v1/dto/QueryTableModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/api/v1/dto/QueryTableModel.java
index 7151915cbee..077b258f3dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/api/v1/dto/QueryTableModel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/api/v1/dto/QueryTableModel.java
@@ -20,8 +20,8 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/openbis_api/.classpath b/openbis_api/.classpath
index 5b24d8fb62a..69c8b7fc0ca 100644
--- a/openbis_api/.classpath
+++ b/openbis_api/.classpath
@@ -4,9 +4,11 @@
 	<classpathentry kind="src" path="sourceTest/java"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="lib" path="/libraries/commons-lang/commons-lang.jar" sourcepath="/libraries/commons-lang/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-core-asl.jar" sourcepath="/libraries/jackson/jackson-src.zip"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
 	<classpathentry kind="lib" path="/libraries/spring/spring-core.jar"/>
 	<classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-annotations.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-core.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-databind.jar"/>
 	<classpathentry kind="output" path="targets/classes"/>
 </classpath>
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java
index 1784ff876a6..1a690eae52c 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java
@@ -29,7 +29,8 @@ import org.apache.commons.lang.builder.EqualsBuilder;
 import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
-import org.codehaus.jackson.annotate.JsonIgnore;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/MaterialIdentifier.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/MaterialIdentifier.java
index b417046e281..4e4079baf92 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/MaterialIdentifier.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/MaterialIdentifier.java
@@ -18,7 +18,7 @@ package ch.systemsx.cisd.openbis.generic.shared.api.v1.dto;
 
 import java.io.Serializable;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Project.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Project.java
index 2bcfd2489db..43cf39e5806 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Project.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Project.java
@@ -18,10 +18,9 @@ package ch.systemsx.cisd.openbis.generic.shared.api.v1.dto;
 
 import java.io.Serializable;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
-
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
 
 /**
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Sample.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Sample.java
index d1c43b697c7..6c3dffe7f41 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Sample.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/Sample.java
@@ -28,12 +28,11 @@ import org.apache.commons.lang.builder.EqualsBuilder;
 import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
 
-import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
+import ch.systemsx.cisd.base.annotation.JsonObject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
 
 /**
@@ -594,12 +593,13 @@ public final class Sample implements Serializable, IIdentifierHolder
         this.sampleTypeCode = sampleTypeCode;
     }
 
-    @JsonProperty(value = "properties")
+    @JsonProperty("properties")
     public Map<String, String> getPropertiesJson()
     {
         return retrievedFetchOptions.contains(SampleFetchOption.PROPERTIES) ? properties : null;
     }
 
+    @JsonProperty("properties")
     private void setProperties(HashMap<String, String> properties)
     {
         this.properties = properties;
@@ -615,23 +615,25 @@ public final class Sample implements Serializable, IIdentifierHolder
         this.retrievedFetchOptions = fetchOptions;
     }
 
-    @JsonProperty(value = "children")
+    @JsonProperty("children")
     public List<Sample> getChildrenJson()
     {
         return retrievedFetchOptions.contains(SampleFetchOption.CHILDREN) ? children : null;
     }
 
-    @JsonProperty(value = "parents")
+    @JsonProperty("parents")
     public List<Sample> getParentsJson()
     {
         return retrievedFetchOptions.contains(SampleFetchOption.PARENTS) ? parents : null;
     }
 
+    @JsonProperty("parents")
     private void setParents(List<Sample> parents)
     {
         this.parents = parents;
     }
 
+    @JsonProperty("children")
     private void setChildren(List<Sample> children)
     {
         this.children = children;
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SpaceWithProjectsAndRoleAssignments.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SpaceWithProjectsAndRoleAssignments.java
index 4aaa8b92c56..2952f5b0829 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SpaceWithProjectsAndRoleAssignments.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SpaceWithProjectsAndRoleAssignments.java
@@ -25,11 +25,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
-
 import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
 
 /**
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/VocabularyTerm.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/VocabularyTerm.java
index 37eb6a9cdad..4fb78ca1fcc 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/VocabularyTerm.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/VocabularyTerm.java
@@ -16,10 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
-import ch.systemsx.cisd.common.annotation.BeanProperty;
 import ch.systemsx.cisd.base.annotation.JsonObject;
+import ch.systemsx.cisd.common.annotation.BeanProperty;
 
 /**
  * A vocabulary term.
diff --git a/openbis_knime/.classpath b/openbis_knime/.classpath
index f79691fcf05..b61dcb0bca8 100644
--- a/openbis_knime/.classpath
+++ b/openbis_knime/.classpath
@@ -22,6 +22,8 @@
 	<classpathentry kind="lib" path="/libraries/knime/eclipse-equinox-common.jar"/>
 	<classpathentry kind="lib" path="/libraries/knime/eclipse-osgi.jar"/>
 	<classpathentry kind="lib" path="/libraries/commons-io/commons-io.jar" sourcepath="/libraries/commons-io/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-core-asl.jar" sourcepath="/libraries/jackson/jackson-src.zip"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-annotations.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-core.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-databind.jar"/>
 	<classpathentry kind="output" path="targets/classes"/>
 </classpath>
diff --git a/screening/.classpath b/screening/.classpath
index c2a78068668..44da96f6b73 100644
--- a/screening/.classpath
+++ b/screening/.classpath
@@ -48,8 +48,6 @@
 	<classpathentry kind="lib" path="/libraries/gwt2.4/validation-api-1.0.0.GA.jar"/>
 	<classpathentry kind="lib" path="/libraries/apgdiff/apgdiff.jar" sourcepath="/libraries/apgdiff/src.zip"/>
 	<classpathentry kind="lib" path="/libraries/jsonrpc4j/jsonrpc4j.jar" sourcepath="/libraries/jsonrpc4j/jsonrpc4j-sources.jar"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-core-asl.jar"/>
-	<classpathentry kind="lib" path="/libraries/jackson/jackson-mapper-asl.jar"/>
 	<classpathentry kind="lib" path="/libraries/hibernate-core/hibernate-core.jar"/>
 	<classpathentry kind="lib" path="/libraries/spring/spring-beans.jar"/>
 	<classpathentry kind="lib" path="/libraries/spring/spring-web.jar"/>
@@ -68,6 +66,9 @@
 	<classpathentry kind="lib" path="/libraries/reflections/lib/xml-apis-1.0.b2.jar"/>
 	<classpathentry kind="lib" path="/libraries/reflections/reflections.jar"/>
 	<classpathentry kind="lib" path="/libraries/slf4j/slf4j.jar" sourcepath="/libraries/slf4j/src.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-annotations.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-core.jar"/>
+	<classpathentry kind="lib" path="/libraries/jackson/jackson-databind.jar"/>
 	<classpathentry kind="lib" path="/libraries/cisd-jhdf5/cisd-jhdf5-core.jar"/>
 	<classpathentry kind="lib" path="/libraries/cisd-jhdf5/cisd-jhdf5-tools.jar"/>
 	<classpathentry kind="lib" path="/libraries/cisd-jhdf5/hdf5-linux-intel.jar"/>
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/json/ScreeningObjectMapper.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/json/ScreeningObjectMapper.java
index 13c9b638c3d..b4500d9ee87 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/json/ScreeningObjectMapper.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/json/ScreeningObjectMapper.java
@@ -16,15 +16,14 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.shared.api.json;
 
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
 
 import ch.systemsx.cisd.common.api.server.json.deserializer.JsonDeserializerFactory;
-import ch.systemsx.cisd.common.api.server.json.deserializer.JsonDeserializerProvider;
 import ch.systemsx.cisd.common.api.server.json.introspector.JsonTypeAndClassAnnotationIntrospector;
 import ch.systemsx.cisd.common.api.server.json.mapping.JsonReflectionsBaseTypeToSubTypesMapping;
 import ch.systemsx.cisd.common.api.server.json.resolver.JsonReflectionsSubTypeResolver;
 import ch.systemsx.cisd.common.api.server.json.serializer.JsonSerializerFactory;
-import ch.systemsx.cisd.openbis.generic.shared.api.json.GenericJsonClassValueToClassObjectsMapping;
 
 /**
  * Jackson library object mapper used in screening OpenBIS.
@@ -36,12 +35,13 @@ public class ScreeningObjectMapper extends ObjectMapper
 
     public ScreeningObjectMapper()
     {
+        super(null, null, new DefaultDeserializationContext.Impl(new JsonDeserializerFactory(
+                ScreeningJsonClassValueToClassObjectsMapping.getInstance())));
+
         setAnnotationIntrospector(new JsonTypeAndClassAnnotationIntrospector(
                 ScreeningJsonClassValueToClassObjectsMapping.getInstance()));
         setSubtypeResolver(new JsonReflectionsSubTypeResolver(
                 JsonReflectionsBaseTypeToSubTypesMapping.getInstance()));
-        setDeserializerProvider(new JsonDeserializerProvider(new JsonDeserializerFactory(
-                GenericJsonClassValueToClassObjectsMapping.getInstance())));
         setSerializerFactory(new JsonSerializerFactory());
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ExperimentIdentifier.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ExperimentIdentifier.java
index 3ecb95f2f02..171472cdfea 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ExperimentIdentifier.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ExperimentIdentifier.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVector.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVector.java
index f2fbcbfc981..acb2a8a59b2 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVector.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVector.java
@@ -4,7 +4,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Geometry.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Geometry.java
index 191e0c2284d..3499f5fbe37 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Geometry.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Geometry.java
@@ -18,7 +18,7 @@ package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 
 import java.io.Serializable;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageChannel.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageChannel.java
index 446b77d1e1e..06c6735de02 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageChannel.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageChannel.java
@@ -20,7 +20,7 @@ import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
 
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetReference.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetReference.java
index 8e414e4f86e..4e0c2d739c8 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetReference.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetReference.java
@@ -19,10 +19,6 @@ package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 import java.util.Date;
 import java.util.Map;
 
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-import org.codehaus.jackson.annotate.JsonTypeInfo.As;
-import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
-
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageTransformationInfo.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageTransformationInfo.java
index ddf93340dc6..37468ec3f87 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageTransformationInfo.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageTransformationInfo.java
@@ -18,7 +18,7 @@ package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 
 import java.io.Serializable;
 
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/MaterialIdentifier.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/MaterialIdentifier.java
index 7dc2c1a4416..66da18644cf 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/MaterialIdentifier.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/MaterialIdentifier.java
@@ -18,7 +18,7 @@ package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 
 import java.io.Serializable;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PermanentIdentifier.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PermanentIdentifier.java
index bde98acdd40..9b021ac66a2 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PermanentIdentifier.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PermanentIdentifier.java
@@ -18,10 +18,6 @@ package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 
 import java.io.Serializable;
 
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-import org.codehaus.jackson.annotate.JsonTypeInfo.As;
-import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
-
 /**
  * A class representing a permanent identifier in openBIS.
  * 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Plate.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Plate.java
index dbd0a13bb23..ef3dde6495d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Plate.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/Plate.java
@@ -3,8 +3,6 @@ package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 
-import org.codehaus.jackson.annotate.JsonSubTypes;
-
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateIdentifier.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateIdentifier.java
index c149f0c8347..f5a8430e916 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateIdentifier.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateIdentifier.java
@@ -1,7 +1,7 @@
 package ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateWellMaterialMapping.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateWellMaterialMapping.java
index f27b8d27a3a..01dfcdac3f9 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateWellMaterialMapping.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/PlateWellMaterialMapping.java
@@ -20,7 +20,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/JsonAnnotationTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/JsonAnnotationTest.java
index b1935134ec3..564ee3c4159 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/JsonAnnotationTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/JsonAnnotationTest.java
@@ -25,12 +25,13 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonSubTypes.Type;
 import org.reflections.Reflections;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+
 import ch.systemsx.cisd.base.annotation.JsonObject;
 import ch.systemsx.cisd.common.api.server.json.JsonUniqueCheckIgnore;
 import ch.systemsx.cisd.common.api.server.json.util.ClassReferences;
@@ -65,10 +66,10 @@ public class JsonAnnotationTest
     private void findAllClassesUsedByJsonRpcApi()
     {
         Class<?>[] jsonRpcInterfaces =
-            { IDssServiceRpcGeneric.class, IScreeningApiServer.class,
-                    IGeneralInformationChangingService.class,
-                    IGeneralInformationService.class, IWebInformationService.class,
-                    IQueryApiServer.class, IDssServiceRpcScreening.class };
+                    { IDssServiceRpcGeneric.class, IScreeningApiServer.class,
+                            IGeneralInformationChangingService.class,
+                            IGeneralInformationService.class, IWebInformationService.class,
+                            IQueryApiServer.class, IDssServiceRpcScreening.class };
 
         for (Class<?> jsonClass : jsonRpcInterfaces)
         {
-- 
GitLab