http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
index e1bba2e..5661ee2 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
@@ -18,32 +18,26 @@
  */
 package org.apache.johnzon.mapper.access;
 
-import org.apache.johnzon.mapper.Adapter;
-import org.apache.johnzon.mapper.JohnzonAny;
-import org.apache.johnzon.mapper.Converter;
-import org.apache.johnzon.mapper.JohnzonConverter;
-import org.apache.johnzon.mapper.MapperConverter;
-import org.apache.johnzon.mapper.ObjectConverter;
-import org.apache.johnzon.mapper.internal.ConverterAdapter;
-import org.apache.johnzon.mapper.reflection.JohnzonParameterizedType;
+import static org.apache.johnzon.mapper.reflection.Converters.matches;
 
 import java.beans.ConstructorProperties;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.GenericDeclaration;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 
-import static java.util.Arrays.asList;
-import static org.apache.johnzon.mapper.reflection.Converters.matches;
+import org.apache.johnzon.mapper.Adapter;
+import org.apache.johnzon.mapper.Converter;
+import org.apache.johnzon.mapper.JohnzonAny;
+import org.apache.johnzon.mapper.JohnzonConverter;
+import org.apache.johnzon.mapper.MapperConverter;
+import org.apache.johnzon.mapper.ObjectConverter;
+import org.apache.johnzon.mapper.internal.ConverterAdapter;
 
 // handle some specific types
 public abstract class BaseAccessMode implements AccessMode {
@@ -134,6 +128,7 @@ public abstract class BaseAccessMode implements AccessMode {
         final String[] constructorParameters;
         final Adapter<?, ?>[] constructorParameterConverters;
         final Adapter<?, ?>[] constructorItemParameterConverters;
+        final ObjectConverter.Codec<?>[] objectConverters;
         if (constructorHasArguments) {
             factoryParameterTypes = constructor.getGenericParameterTypes();
 
@@ -143,6 +138,7 @@ public abstract class BaseAccessMode implements AccessMode {
 
             constructorParameterConverters = new Adapter<?, 
?>[constructor.getGenericParameterTypes().length];
             constructorItemParameterConverters = new Adapter<?, 
?>[constructorParameterConverters.length];
+            objectConverters = new 
ObjectConverter.Codec[constructorParameterConverters.length];
             for (int i = 0; i < constructorParameters.length; i++) {
                 for (final Annotation a : 
constructor.getParameterAnnotations()[i]) {
                     if (a.annotationType() == JohnzonConverter.class) {
@@ -158,7 +154,7 @@ public abstract class BaseAccessMode implements AccessMode {
                                     constructorItemParameterConverters[i] = 
converter;
                                 }
                             } else {
-                                throw new UnsupportedOperationException("TODO 
implement");
+                                objectConverters[i] = 
(ObjectConverter.Codec<?>) mapperConverter;
                             }
                         } catch (final Exception e) {
                             throw new IllegalArgumentException(e);
@@ -171,6 +167,7 @@ public abstract class BaseAccessMode implements AccessMode {
             constructorParameters = null;
             constructorParameterConverters = null;
             constructorItemParameterConverters = null;
+            objectConverters = null;
         }
 
         final Constructor<?> cons = constructor;
@@ -213,6 +210,11 @@ public abstract class BaseAccessMode implements AccessMode 
{
             public Adapter<?, ?>[] getParameterItemConverter() {
                 return constructorItemParameterConverters;
             }
+
+            @Override
+            public ObjectConverter.Codec<?>[] getObjectConverter() {
+                return objectConverters;
+            }
         };
     }
 
@@ -263,78 +265,4 @@ public abstract class BaseAccessMode implements AccessMode 
{
         }
         return delegate;
     }
-
-    protected Type fixType(final Class<?> clazz, final Type type) { // to 
enhance
-        if (TypeVariable.class.isInstance(type)) { // we need to handle it on 
deserialization side, not needed on serialization side
-            return fixTypeVariable(clazz, type);
-        }
-        if (ParameterizedType.class.isInstance(type)) {
-            final ParameterizedType pt = ParameterizedType.class.cast(type);
-            final Type[] actualTypeArguments = pt.getActualTypeArguments();
-            if (actualTypeArguments.length == 1 && 
Class.class.isInstance(pt.getRawType())
-                && 
Collection.class.isAssignableFrom(Class.class.cast(pt.getRawType()))
-                && 
Class.class.cast(pt.getRawType()).getName().startsWith("java.util.")
-                && TypeVariable.class.isInstance(actualTypeArguments[0])) {
-                return new JohnzonParameterizedType(pt.getRawType(), 
fixTypeVariable(clazz, actualTypeArguments[0]));
-            } else if (actualTypeArguments.length == 2 && 
Class.class.isInstance(pt.getRawType())
-                && 
Map.class.isAssignableFrom(Class.class.cast(pt.getRawType()))
-                && 
Class.class.cast(pt.getRawType()).getName().startsWith("java.util.")
-                && TypeVariable.class.isInstance(actualTypeArguments[1])) {
-                return new JohnzonParameterizedType(pt.getRawType(), 
actualTypeArguments[0], fixTypeVariable(clazz, actualTypeArguments[1]));
-            }
-        }
-        return type;
-    }
-
-    private Type fixTypeVariable(final Class<?> clazz, final Type type) {
-        final TypeVariable typeVariable = TypeVariable.class.cast(type);
-        final Class<?> classWithDeclaration = findClass(clazz.getSuperclass(), 
typeVariable.getGenericDeclaration());
-
-        if (classWithDeclaration != null) {
-            // try to match generic
-            final TypeVariable<? extends Class<?>>[] typeParameters = 
classWithDeclaration.getTypeParameters();
-            final int idx = asList(typeParameters).indexOf(typeVariable);
-            if (idx >= 0) {
-
-                ParameterizedType pt = findParameterizedType(clazz, 
classWithDeclaration);
-                if (pt != null) {
-                    if (pt.getActualTypeArguments().length == 
typeParameters.length) {
-                        return pt.getActualTypeArguments()[idx];
-                    }
-                }
-            }
-        }
-        return type;
-    }
-
-    private Class<?> findClass(final Class<?> clazz, final GenericDeclaration 
genericDeclaration) {
-
-        if (clazz == null || clazz == genericDeclaration) {
-            return clazz;
-        }
-
-        final Class<?> superclass = clazz.getSuperclass();
-        if (superclass != null && superclass != Object.class) {
-            return findClass(superclass, genericDeclaration);
-        }
-
-        return null;
-    }
-
-    private ParameterizedType findParameterizedType(Class<?> clazz, Class<?> 
classWithDeclaration) {
-
-        if (clazz == Object.class) {
-            return null;
-        }
-
-        Type genericSuperclass = clazz.getGenericSuperclass();
-
-        if (genericSuperclass instanceof ParameterizedType &&
-            ((ParameterizedType) genericSuperclass).getRawType() == 
classWithDeclaration) {
-
-                return (ParameterizedType) genericSuperclass;
-        }
-
-        return findParameterizedType(clazz.getSuperclass(), 
classWithDeclaration);
-    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
index cff4358..831f895 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
@@ -18,12 +18,6 @@
  */
 package org.apache.johnzon.mapper.access;
 
-import org.apache.johnzon.mapper.Adapter;
-import org.apache.johnzon.mapper.JohnzonAny;
-import org.apache.johnzon.mapper.JohnzonProperty;
-import org.apache.johnzon.mapper.MapperException;
-import org.apache.johnzon.mapper.ObjectConverter;
-
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
@@ -31,6 +25,12 @@ import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.johnzon.mapper.Adapter;
+import org.apache.johnzon.mapper.JohnzonAny;
+import org.apache.johnzon.mapper.JohnzonProperty;
+import org.apache.johnzon.mapper.MapperException;
+import org.apache.johnzon.mapper.ObjectConverter;
+
 public class FieldAccessMode extends BaseAccessMode {
     public FieldAccessMode(final boolean useConstructor, final boolean 
acceptHiddenConstructor) {
         super(useConstructor, acceptHiddenConstructor);
@@ -39,14 +39,14 @@ public class FieldAccessMode extends BaseAccessMode {
     @Override
     public Map<String, Reader> doFindReaders(final Class<?> clazz) {
         final Map<String, Reader> readers = new HashMap<String, Reader>();
-        for (final Map.Entry<String, Field> f : fields(clazz).entrySet()) {
+        for (final Map.Entry<String, Field> f : fields(clazz, 
true).entrySet()) {
             final String key = f.getKey();
             if (isIgnored(key) || Meta.getAnnotation(f.getValue(), 
JohnzonAny.class) != null) {
                 continue;
             }
 
             final Field field = f.getValue();
-            readers.put(extractKey(field, key), new FieldReader(field, 
fixType(clazz, field.getGenericType())));
+            readers.put(extractKey(field, key), new FieldReader(field, 
field.getGenericType()));
         }
         return readers;
     }
@@ -54,14 +54,14 @@ public class FieldAccessMode extends BaseAccessMode {
     @Override
     public Map<String, Writer> doFindWriters(final Class<?> clazz) {
         final Map<String, Writer> writers = new HashMap<String, Writer>();
-        for (final Map.Entry<String, Field> f : fields(clazz).entrySet()) {
+        for (final Map.Entry<String, Field> f : fields(clazz, 
false).entrySet()) {
             final String key = f.getKey();
             if (isIgnored(key)) {
                 continue;
             }
 
             final Field field = f.getValue();
-            writers.put(extractKey(field, key), new FieldWriter(field, 
fixType(clazz, field.getGenericType())));
+            writers.put(extractKey(field, key), new FieldWriter(field, 
field.getGenericType()));
         }
         return writers;
     }
@@ -75,7 +75,7 @@ public class FieldAccessMode extends BaseAccessMode {
         return key.contains("$");
     }
 
-    protected Map<String, Field> fields(final Class<?> clazz) {
+    protected Map<String, Field> fields(final Class<?> clazz, boolean 
includeFinalFields) {
         final Map<String, Field> fields = new HashMap<String, Field>();
         Class<?> current = clazz;
         while (current != null && current != Object.class) {
@@ -84,7 +84,8 @@ public class FieldAccessMode extends BaseAccessMode {
                 final int modifiers = f.getModifiers();
                 if (fields.containsKey(name)
                         || Modifier.isStatic(modifiers)
-                        || Modifier.isTransient(modifiers)) {
+                        || Modifier.isTransient(modifiers)
+                        || (!includeFinalFields && 
Modifier.isFinal(modifiers))) {
                     continue;
                 }
                 fields.put(name, f);

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
index c81c070..b694bd2 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
@@ -18,12 +18,6 @@
  */
 package org.apache.johnzon.mapper.access;
 
-import org.apache.johnzon.mapper.Adapter;
-import org.apache.johnzon.mapper.JohnzonAny;
-import org.apache.johnzon.mapper.JohnzonProperty;
-import org.apache.johnzon.mapper.MapperException;
-import org.apache.johnzon.mapper.ObjectConverter;
-
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
@@ -34,6 +28,12 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.johnzon.mapper.Adapter;
+import org.apache.johnzon.mapper.JohnzonAny;
+import org.apache.johnzon.mapper.JohnzonProperty;
+import org.apache.johnzon.mapper.MapperException;
+import org.apache.johnzon.mapper.ObjectConverter;
+
 public class MethodAccessMode extends BaseAccessMode {
     private final boolean supportGetterAsWritter;
 
@@ -52,7 +52,7 @@ public class MethodAccessMode extends BaseAccessMode {
                 if (isIgnored(descriptor.getName()) || 
Meta.getAnnotation(readMethod, JohnzonAny.class) != null) {
                     continue;
                 }
-                readers.put(extractKey(descriptor.getName(), readMethod, 
null), new MethodReader(readMethod, fixType(clazz, 
readMethod.getGenericReturnType())));
+                readers.put(extractKey(descriptor.getName(), readMethod, 
null), new MethodReader(readMethod, readMethod.getGenericReturnType()));
             }
         }
         return readers;
@@ -69,12 +69,12 @@ public class MethodAccessMode extends BaseAccessMode {
             final Method writeMethod = descriptor.getWriteMethod();
             if (writeMethod != null) {
                 writers.put(extractKey(descriptor.getName(), writeMethod, 
descriptor.getReadMethod()),
-                        new MethodWriter(writeMethod, fixType(clazz, 
writeMethod.getGenericParameterTypes()[0])));
+                        new MethodWriter(writeMethod, 
writeMethod.getGenericParameterTypes()[0]));
             } else if (supportGetterAsWritter
                     && 
Collection.class.isAssignableFrom(descriptor.getPropertyType())
                     && descriptor.getReadMethod() != null) {
                 final Method readMethod = descriptor.getReadMethod();
-                writers.put(extractKey(descriptor.getName(), readMethod, 
null), new MethodGetterAsWriter(readMethod, fixType(clazz, 
readMethod.getGenericReturnType())));
+                writers.put(extractKey(descriptor.getName(), readMethod, 
null), new MethodGetterAsWriter(readMethod, readMethod.getGenericReturnType()));
             }
         }
         return writers;

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java
new file mode 100644
index 0000000..201a609
--- /dev/null
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/JsonPointerTracker.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper.internal;
+
+import org.apache.johnzon.core.JsonPointerUtil;
+
+/**
+ * Internal class to easily collect information about the 'depth' of a json 
object
+ * without having to eagerly construct it.
+ *
+ * For use in recursive generator and parser method calls to defer string 
operations.
+ */
+public class JsonPointerTracker {
+    private final JsonPointerTracker parent;
+    private final String currentNode;
+
+    private String jsonPointer;
+
+
+    /**
+     * @param parent or {@code null} if this is the root object
+     * @param currentNode the name of the attribute or "/" for the root object
+     */
+    public JsonPointerTracker(JsonPointerTracker parent, String currentNode) {
+        this.parent = parent;
+        this.currentNode = currentNode;
+    }
+
+    /**
+     * For Arrays and Lists.
+     * @param jsonPointer
+     * @param i current counter number
+     */
+    public JsonPointerTracker(JsonPointerTracker jsonPointer, int i) {
+       this(jsonPointer, Integer.toString(i));
+    }
+
+    @Override
+    public String toString() {
+        if (jsonPointer == null) {
+            if (parent != null) {
+                if (parent.parent == null) {
+                    jsonPointer = "/" + JsonPointerUtil.encode(currentNode);
+                } else {
+                    jsonPointer = parent.toString() + "/" + 
JsonPointerUtil.encode(currentNode);
+                }
+            } else {
+                jsonPointer = "/";
+            }
+        }
+
+        return jsonPointer;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java
new file mode 100644
index 0000000..a456f94
--- /dev/null
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Generics.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper.reflection;
+
+import static java.util.Arrays.asList;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.ArrayList;
+import java.util.Collection;
+
+public final class Generics {
+    private Generics() {
+        // no-op
+    }
+
+    // todo: this piece of code needs to be enhanced a lot:
+    // - better handling of the hierarchy
+    // - wildcard support?
+    // - cycle handling (Foo<Foo>)
+    // - ....
+    public static Type resolve(final Type value, final Class<?> rootClass) {
+        if (TypeVariable.class.isInstance(value)) {
+            return resolveTypeVariable(value, rootClass);
+        }
+        if (ParameterizedType.class.isInstance(value)) {
+            return resolveParameterizedType(value, rootClass);
+        }
+        return value;
+    }
+
+    private static Type resolveParameterizedType(final Type value, final 
Class<?> rootClass) {
+        Collection<Type> args = null;
+        final ParameterizedType parameterizedType = 
ParameterizedType.class.cast(value);
+        int index = 0;
+        for (final Type arg : parameterizedType.getActualTypeArguments()) {
+            final Type type = resolve(arg, rootClass);
+            if (type != arg) {
+                if (args == null) {
+                    args = new ArrayList<Type>();
+                    if (index > 0) {
+                        
args.addAll(asList(parameterizedType.getActualTypeArguments()).subList(0, 
index));
+                    }
+                }
+            }
+            if (args != null) {
+                args.add(type);
+            }
+            index++;
+        }
+        if (args != null) {
+            return new 
JohnzonParameterizedType(parameterizedType.getRawType(), args.toArray(new 
Type[args.size()]));
+        }
+        return value;
+    }
+
+    // for now the level is hardcoded to 2 with generic > concrete
+    private static Type resolveTypeVariable(final Type value, final Class<?> 
rootClass) {
+        final TypeVariable<?> tv = TypeVariable.class.cast(value);
+        Type parent = rootClass == null ? null : 
rootClass.getGenericSuperclass();
+        while (Class.class.isInstance(parent)) {
+            parent = Class.class.cast(parent).getGenericSuperclass();
+        }
+        while (ParameterizedType.class.isInstance(parent) && 
ParameterizedType.class.cast(parent).getRawType() != 
tv.getGenericDeclaration()) {
+            parent = 
Class.class.cast(ParameterizedType.class.cast(parent).getRawType()).getGenericSuperclass();
+        }
+        if (ParameterizedType.class.isInstance(parent)) {
+            final ParameterizedType parentPt = 
ParameterizedType.class.cast(parent);
+            final int argIndex = 
asList(Class.class.cast(parentPt.getRawType()).getTypeParameters()).indexOf(tv);
+            if (argIndex >= 0) {
+                final Type type = parentPt.getActualTypeArguments()[argIndex];
+                if (TypeVariable.class.isInstance(type)) {
+                    return resolveTypeVariable(type, rootClass);
+                }
+                return type;
+            }
+        }
+        return value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java
index 532d32c..93733d9 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestBufferProvider.java
@@ -69,7 +69,7 @@ public class TestBufferProvider implements 
BufferStrategy.BufferProvider<char[]>
     }
 
     public int newBufferCalls() {
-        return releaseCalls.get();
+        return newBufferCalls.get();
     }
 
     public void clear() {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
new file mode 100644
index 0000000..4175607
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
@@ -0,0 +1,298 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test serialising objects which contain the same Object multiple times,
+ * sometimes even with cycles.
+ */
+public class CircularObjectsTest {
+
+    @Test
+    public void testSimpleCyclicPerson() {
+        Person john = new Person("John");
+        Person marry = new Person("Marry");
+
+        john.setMarriedTo(marry);
+        marry.setMarriedTo(john);
+
+        Mapper mapper = new 
MapperBuilder().setAccessModeName("field").setDeduplicateObjects(true).build();
+        String ser = mapper.writeObjectAsString(john);
+
+        assertNotNull(ser);
+        assertTrue(ser.contains("\"name\":\"John\""));
+        assertTrue(ser.contains("\"marriedTo\":\"/\""));
+        assertTrue(ser.contains("\"name\":\"Marry\""));
+
+        // and now de-serialise it back
+        Person john2 = mapper.readObject(ser, Person.class);
+        assertNotNull(john2);
+        assertEquals("John", john2.getName());
+
+        Person marry2 = john2.getMarriedTo();
+        assertNotNull(marry2);
+        assertEquals("Marry", marry2.getName());
+
+        assertEquals(john2, marry2.getMarriedTo());
+    }
+
+    @Test
+    public void testSimpleCyclicPersonAnnotatedDedup() {
+        DeduplicatedPerson john = new DeduplicatedPerson("John");
+        DeduplicatedPerson marry = new DeduplicatedPerson("Marry");
+
+        john.setMarriedTo(marry);
+        marry.setMarriedTo(john);
+
+        Mapper mapper = new MapperBuilder().setAccessModeName("field").build();
+        String ser = mapper.writeObjectAsString(john);
+
+        assertNotNull(ser);
+        assertTrue(ser.contains("\"name\":\"John\""));
+        assertTrue(ser.contains("\"marriedTo\":\"/\""));
+        assertTrue(ser.contains("\"name\":\"Marry\""));
+
+        // and now de-serialise it back
+        DeduplicatedPerson john2 = mapper.readObject(ser, 
DeduplicatedPerson.class);
+        assertNotNull(john2);
+        assertEquals("John", john2.getName());
+
+        DeduplicatedPerson marry2 = john2.getMarriedTo();
+        assertNotNull(marry2);
+        assertEquals("Marry", marry2.getName());
+
+        assertEquals(john2, marry2.getMarriedTo());
+    }
+
+    @Test
+    public void testComplexCyclicPerson() {
+        Person karl = new Person("Karl");
+        Person andrea = new Person("Andrea");
+        Person lu = new Person("Lu");
+        Person sue = new Person("Sue");
+
+        karl.setMarriedTo(andrea);
+        karl.getKids().add(lu);
+        karl.getKids().add(sue);
+
+        andrea.setMarriedTo(karl);
+        andrea.getKids().add(lu);
+        andrea.getKids().add(sue);
+
+        lu.setFather(karl);
+        lu.setMother(andrea);
+
+        sue.setFather(karl);
+        sue.setMother(andrea);
+
+        Mapper mapper = new 
MapperBuilder().setAccessModeName("field").setDeduplicateObjects(true).build();
+
+        {
+            // test karl
+            String karlJson = mapper.writeObjectAsString(karl);
+            Person karl2 = mapper.readObject(karlJson, Person.class);
+            assertEquals("Karl", karl2.getName());
+            assertEquals("Andrea", karl2.getMarriedTo().getName());
+            assertEquals(karl2, karl2.getMarriedTo().getMarriedTo());
+            assertEquals(2, karl2.getKids().size());
+            assertEquals("Lu", karl2.getKids().get(0).getName());
+            assertEquals("Sue", karl2.getKids().get(1).getName());
+            assertEquals(2, karl2.getMarriedTo().getKids().size());
+            assertEquals("Lu", 
karl2.getMarriedTo().getKids().get(0).getName());
+            assertEquals("Sue", 
karl2.getMarriedTo().getKids().get(1).getName());
+        }
+
+        {
+            // test Sue
+            String sueJson = mapper.writeObjectAsString(sue);
+            Person sue2 = mapper.readObject(sueJson, Person.class);
+
+            assertEquals("Sue", sue2.getName());
+            assertNull(sue2.getMarriedTo());
+            assertEquals("Andrea", sue2.getMother().getName());
+            assertEquals("Karl", sue2.getFather().getName());
+
+            assertEquals(sue2.getMother().getKids().get(0), 
sue2.getFather().getKids().get(0));
+            assertEquals(sue2.getMother().getKids().get(1), 
sue2.getFather().getKids().get(1));
+        }
+    }
+
+    @Test
+    public void testCyclesInArrays() {
+        Person karl = new Person("Karl");
+        Person andrea = new Person("Andrea");
+        Person lu = new Person("Lu");
+        Person sue = new Person("Sue");
+
+        karl.setMarriedTo(andrea);
+        karl.getKids().add(lu);
+        karl.getKids().add(sue);
+
+        andrea.setMarriedTo(karl);
+        andrea.getKids().add(lu);
+        andrea.getKids().add(sue);
+
+        lu.setFather(karl);
+        lu.setMother(andrea);
+
+        sue.setFather(karl);
+        sue.setMother(andrea);
+
+        Mapper mapper = new 
MapperBuilder().setAccessModeName("field").setDeduplicateObjects(true).build();
+
+        // test deep array
+        Person[] people = new Person[4];
+        people[0] = karl;
+        people[1] = andrea;
+        people[2] = lu;
+        people[3] = sue;
+
+        String peopleJson = mapper.writeArrayAsString(people);
+        Person[] people2 = mapper.readArray(new StringReader(peopleJson), 
Person.class);
+        assertNotNull(people2);
+        assertEquals(4, people2.length);
+        assertEquals("Karl",   people2[0].getName());
+        assertEquals("Andrea", people2[1].getName());
+        assertEquals("Lu",     people2[2].getName());
+        assertEquals("Sue",    people2[3].getName());
+
+    }
+
+    public static class Person {
+        private String name;
+        private Person marriedTo;
+        private Person mother;
+        private Person father;
+        private List<Person> kids = new ArrayList<Person>();
+
+        public Person() {
+        }
+
+        public Person(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public Person getMarriedTo() {
+            return marriedTo;
+        }
+
+        public void setMarriedTo(Person marriedTo) {
+            this.marriedTo = marriedTo;
+        }
+
+        public Person getMother() {
+            return mother;
+        }
+
+        public void setMother(Person mother) {
+            this.mother = mother;
+        }
+
+        public Person getFather() {
+            return father;
+        }
+
+        public void setFather(Person father) {
+            this.father = father;
+        }
+
+        public List<Person> getKids() {
+            return kids;
+        }
+
+        public void setKids(List<Person> kids) {
+            this.kids = kids;
+        }
+    }
+
+    @JohnzonDeduplicateObjects
+    public static class DeduplicatedPerson {
+        private String name;
+        private DeduplicatedPerson marriedTo;
+        private DeduplicatedPerson mother;
+        private DeduplicatedPerson father;
+        private List<DeduplicatedPerson> kids = new 
ArrayList<DeduplicatedPerson>();
+
+        public DeduplicatedPerson() {
+        }
+
+        public DeduplicatedPerson(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public DeduplicatedPerson getMarriedTo() {
+            return marriedTo;
+        }
+
+        public void setMarriedTo(DeduplicatedPerson marriedTo) {
+            this.marriedTo = marriedTo;
+        }
+
+        public DeduplicatedPerson getMother() {
+            return mother;
+        }
+
+        public void setMother(DeduplicatedPerson mother) {
+            this.mother = mother;
+        }
+
+        public DeduplicatedPerson getFather() {
+            return father;
+        }
+
+        public void setFather(DeduplicatedPerson father) {
+            this.father = father;
+        }
+
+        public List<DeduplicatedPerson> getKids() {
+            return kids;
+        }
+
+        public void setKids(List<DeduplicatedPerson> kids) {
+            this.kids = kids;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java
new file mode 100644
index 0000000..0125ff4
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CustomEnumCodecTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper;
+
+import org.junit.Test;
+
+import java.io.StringReader;
+import java.util.Locale;
+
+import static org.junit.Assert.assertEquals;
+
+public class CustomEnumCodecTest {
+    @Test
+    public void roundTrip() {
+        final Mapper mapper = new MapperBuilder().addAdapter(E.class, 
String.class, new EConverter()).build();
+        final String json = "{\"e\":\"a\"}";
+        final EHolder holder = mapper.readObject(json, EHolder.class);
+        assertEquals(E.A, holder.e);
+        assertEquals(json, mapper.writeObjectAsString(holder));
+    }
+
+    @Test
+    public void roundTripArray() {
+        final Mapper mapper = new MapperBuilder().addAdapter(E.class, 
String.class, new EConverter()).build();
+        final String json = "[\"b\"]";
+        final E[] es = mapper.readArray(new StringReader(json), E.class);
+        assertEquals(1, es.length);
+        assertEquals(E.B, es[0]);
+        assertEquals(json, mapper.writeArrayAsString(es));
+    }
+
+    public static class EHolder {
+        public E e;
+    }
+
+    public enum E {
+        A, B
+    }
+
+    public static class EConverter implements Adapter<E, String> {
+        @Override
+        public String from(final E instance) {
+            return instance.name().toLowerCase(Locale.ENGLISH);
+        }
+
+        @Override
+        public E to(final String text) {
+            return E.valueOf(text.toUpperCase(Locale.ENGLISH));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java
index 841e4ec..f69ea3b 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/EnumTest.java
@@ -23,6 +23,7 @@ import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.EnumSet;
 import java.util.List;
 
 public class EnumTest {
@@ -89,6 +90,21 @@ public class EnumTest {
             .build());
     }
 
+    @Test
+    public void testEnumSet() {
+        EnumSetObject eso = new EnumSetObject();
+        eso.setEnumset(EnumSet.of(AdvancedEnum.VALUE_1, AdvancedEnum.VALUE_2));
+
+        String json = newTestMapperBuilder().build().writeObjectAsString(eso);
+
+        EnumSetObject eso2 = newTestMapperBuilder().build().readObject(json, 
EnumSetObject.class);
+        Assert.assertNotNull(eso2);
+        Assert.assertNotNull(eso2.getEnumset());
+        Assert.assertEquals(2, eso2.getEnumset().size());
+        Assert.assertTrue(eso2.getEnumset().contains(AdvancedEnum.VALUE_1));
+        Assert.assertTrue(eso2.getEnumset().contains(AdvancedEnum.VALUE_2));
+    }
+
     private void testAdvancedEnum(Mapper mapper) {
         AdvancedEnumObject object = new 
AdvancedEnumObject(AdvancedEnum.VALUE_1, Arrays.asList(AdvancedEnum.VALUE_2,
             AdvancedEnum.VALUE_1,
@@ -146,10 +162,22 @@ public class EnumTest {
         }
     }
 
+    public static class EnumSetObject {
+        private EnumSet<AdvancedEnum> enumset;
+
+        public EnumSet<AdvancedEnum> getEnumset() {
+            return enumset;
+        }
+
+        public void setEnumset(EnumSet<AdvancedEnum> enumset) {
+            this.enumset = enumset;
+        }
+    }
 
     public enum AdvancedEnum {
         VALUE_1("one", 1),
-        VALUE_2("two", 2);
+        VALUE_2("two", 2),
+        VALUE_3("three", 3);
 
         private String string;
         private int i;

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java
new file mode 100644
index 0000000..2f78b6b
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/GenericsTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.superbiz.Model;
+
+import java.util.Comparator;
+
+public class GenericsTest {
+    @Test
+    public void typeVariableMultiLevel() {
+        final String input = 
"{\"aalist\":[{\"detail\":\"something2\",\"name\":\"Na2\"}]," +
+                
"\"childA\":{\"detail\":\"something\",\"name\":\"Na\"},\"childB\":{}}";
+
+        final Mapper mapper = new MapperBuilder().setAttributeOrder(new 
Comparator<String>() {
+            @Override
+            public int compare(String o1, String o2) {
+                return o1.compareTo(o2);
+            }
+        }).build();
+
+        final Model model = mapper.readObject(input, Model.class);
+        assertNotNull(model.getChildA());
+        assertNotNull(model.getChildB());
+        assertNotNull(model.getAalist());
+        assertEquals("something", model.getChildA().detail);
+        assertEquals("Na", model.getChildA().name);
+        assertEquals(1, model.getAalist().size());
+        assertEquals("something2", model.getAalist().iterator().next().detail);
+        assertEquals(input, mapper.writeObjectAsString(model));
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java
new file mode 100644
index 0000000..c64c8e6
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/JohnzonIgnoreNestedTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper;
+
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Comparator;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+
+public class JohnzonIgnoreNestedTest {
+    @Test
+    public void ignoreNested() {
+        final To to = new To();
+        to.name = "to";
+
+        final Person from = new Person();
+        from.name = "myname";
+        from.street = "blastreet 1";
+        from.description = "gets ignored";
+
+        to.person = from;
+        to.persons = singletonList(from);
+
+        final Mapper mapper = new MapperBuilder().setAttributeOrder(new 
Comparator<String>() {
+            @Override
+            public int compare(String o1, String o2) {
+                return o1.compareTo(o2);
+            }
+        }).build();
+        
assertEquals("{\"name\":\"to\",\"person\":{\"name\":\"myname\"},\"persons\":[{\"name\":\"myname\"}]}",
 mapper.writeObjectAsString(to));
+    }
+
+    public static class To {
+        public String name;
+
+        @JohnzonIgnoreNested(properties = {"street", "description"})
+        public Person person;
+
+        @JohnzonIgnoreNested(properties = {"street", "description"})
+        public Collection<Person> persons;
+    }
+
+    public static class Person {
+        public String name;
+        public String street;
+        public String description;
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
index dc74f24..830779e 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
@@ -85,6 +85,16 @@ public class LiteralTest {
 
     }
 
+    @Test
+    public void readWhenUseBigDecimalForFloats() throws Exception {
+        final String json = "[1.5]";
+        final List<Object> expected = new ArrayList<Object>();
+        expected.add(new BigDecimal(1.5d));
+        final Collection<Object> read = new 
MapperBuilder().setUseBigDecimalForFloats(true).build()
+                .readCollection(new StringReader(json), new 
JohnzonParameterizedType(List.class, Object.class));
+        assertEquals(expected, read);
+    }
+
     @Test(expected = NumberFormatException.class)
     public void writeReadNumbersInf() {
         final NumberClass nc = new NumberClass();

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
index f51ce91..0a9cc7f 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
@@ -166,7 +166,7 @@ public class MapperConfigTest {
                                 new FieldAccessMode(true, true),
                                 Charset.forName("UTF-8"),
                                 null,
-                                false);
+                                false, false, null, false, false);
     }
 
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
index 594315a..0f58356 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
@@ -38,6 +38,7 @@ import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.SortedMap;
 import java.util.TreeMap;
 
 import static java.util.Arrays.asList;
@@ -160,6 +161,29 @@ public class MapperTest {
     }
 
     @Test
+    public void sortedMap() {
+        final Mapper sortedMapper = new MapperBuilder().setAttributeOrder(new 
Comparator<String>() {
+            @Override
+            public int compare(final String o1, final String o2) {
+                return o2.compareTo(o1);
+            }
+        }).build();
+        final Map<String, String> sorted = new TreeMap<String, String>(new 
Comparator<String>() {
+            @Override
+            public int compare(final String o1, final String o2) {
+                return o1.compareTo(o2);
+            }
+        });
+        sorted.put("a", "1");
+        sorted.put("b", "2");
+        sorted.put("c", "3");
+        assertEquals("{\"a\":\"1\",\"b\":\"2\",\"c\":\"3\"}", 
sortedMapper.writeObjectAsString(sorted));
+        assertEquals(asList("c", "b", "a"), new 
ArrayList<Object>(Map.class.cast(
+                
sortedMapper.readObject("{\"a\":\"1\",\"b\":\"2\",\"c\":\"3\"}",
+                        new JohnzonParameterizedType(SortedMap.class, 
String.class, String.class))).keySet()));
+    }
+
+    @Test
     public void justObjectAsModel() {
         final Mapper encodingAwareMapper = new 
MapperBuilder().setEncoding("UTF-8" /*otherwise guess algo fails for too small 
string*/).build();
         final Mapper simpleMapper = new MapperBuilder().build();
@@ -184,8 +208,9 @@ public class MapperTest {
             // read
             assertEquals(Boolean.TRUE, simpleMapper.readObject(new 
ByteArrayInputStream("true".getBytes()), Object.class));
             assertEquals(Boolean.FALSE, simpleMapper.readObject(new 
ByteArrayInputStream("false".getBytes()), Object.class));
-            assertEquals(1., encodingAwareMapper
-                    .readObject(new ByteArrayInputStream("1".getBytes()), 
Object.class));
+            assertEquals(1.,
+                    (Double) encodingAwareMapper.readObject(new 
ByteArrayInputStream("1".getBytes()), Object.class),
+                         0.1);
             assertEquals("val", simpleMapper.readObject(new 
ByteArrayInputStream("\"val\"".getBytes()), Object.class));
             assertEquals(asList("val1", "val2"), simpleMapper.readObject(new 
ByteArrayInputStream("[\"val1\", \"val2\"]".getBytes()), Object.class));
             assertEquals(new HashMap<String, Object>() {{

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
index 54354a2..c76d7bf 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
@@ -21,8 +21,11 @@ package org.apache.johnzon.mapper;
 import static org.junit.Assert.assertEquals;
 
 import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.junit.Test;
@@ -37,6 +40,54 @@ public class NullTest {
     }
 
     @Test
+    public void writeListWithNull() {
+        StringWriter writer = new StringWriter();
+        new MapperBuilder().build().writeIterable(Arrays.asList("one", "two", 
null, "four"), writer);
+        assertEquals("[\"one\",\"two\",null,\"four\"]", writer.toString());
+    }
+
+    @Test
+    public void writeListWithNullWithinMap() {
+        StringWriter writer = new StringWriter();
+        new 
MapperBuilder().build().writeObject(Collections.singletonMap("list",
+                Arrays.asList(5L, null, 300L, 90000000000L)), writer);
+        assertEquals("{\"list\":[5,null,300,90000000000]}", writer.toString());
+    }
+
+    @Test
+    public void writeListWithNullWithinType() {
+        StringWriter writer = new StringWriter();
+        NullContainer container = new NullContainer();
+        container.setList(Arrays.asList(1.4142, 1.7320508757, null, 3.14159));
+        new MapperBuilder().build().writeObject(container, writer);
+        assertEquals("{\"list\":[1.4142,1.7320508757,null,3.14159]}", 
writer.toString());
+    }
+
+    @Test
+    public void writeArrayWithNull() {
+        StringWriter writer = new StringWriter();
+        new MapperBuilder().build().writeArray(new String[]{ "one", "two", 
"three", null }, writer);
+        assertEquals("[\"one\",\"two\",\"three\",null]", writer.toString());
+    }
+
+    @Test
+    public void writeArrayWithNullWithinMap() {
+        StringWriter writer = new StringWriter();
+        new 
MapperBuilder().build().writeObject(Collections.singletonMap("array",
+                new Long[]{ null, 100L, 300L, 90000000000L }), writer);
+        assertEquals("{\"array\":[null,100,300,90000000000]}", 
writer.toString());
+    }
+
+    @Test
+    public void writeArrayWithNullWithinType() {
+        StringWriter writer = new StringWriter();
+        NullContainer container = new NullContainer();
+        container.setArray(new Double[]{ 1.4142, 1.7320508757, 2.2360679775, 
null });
+        new MapperBuilder().build().writeObject(container, writer);
+        assertEquals("{\"array\":[1.4142,1.7320508757,2.2360679775,null]}", 
writer.toString());
+    }
+
+    @Test
     public void writeNullObjectDefaultMap() {
         final StringWriter writer = new StringWriter();
 
@@ -192,4 +243,24 @@ public class NullTest {
 
     }
 
+    public static class NullContainer {
+        private List<Double> list;
+        private Double[] array;
+
+        public Double[] getArray() {
+            return array;
+        }
+
+        public void setArray(Double[] array) {
+            this.array = array;
+        }
+
+        public List<Double> getList() {
+            return list;
+        }
+
+        public void setList(final List<Double> list) {
+            this.list = list;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java
index 510672d..c465f8b 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectConverterWithAnnotationTest.java
@@ -24,6 +24,7 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import javax.json.JsonObject;
+import java.beans.ConstructorProperties;
 import java.lang.reflect.Type;
 import java.util.Arrays;
 import java.util.List;
@@ -159,6 +160,38 @@ public class ObjectConverterWithAnnotationTest {
         Assert.assertEquals(expected, tourDeFlanderen);
     }
 
+    @Test
+    public void testDeserializeObjectWithAnnotatedConsturctorParameter() {
+
+        String json = "{" +
+                        "\"bike\": {" +
+                          "\"" + MANUFACTURER_ID + "\":1," +
+                          "\"" + TYPE_INDEX + "\":0" +
+                        "}" +
+                      "}";
+
+        Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
+                                           .setReadAttributeBeforeWrite(true)
+                                           .build();
+
+        BikeWrapper bikeWrapper = mapper.readObject(json, BikeWrapper.class);
+        Assert.assertNotNull(bikeWrapper);
+        Assert.assertEquals(bikeWrapper.getBike(), new Bike("Canyon", 
BikeType.ROAD));
+    }
+
+    public static class BikeWrapper {
+        private final Bike bike;
+
+        @ConstructorProperties(value = "bike")
+        BikeWrapper(@JohnzonConverter(value = BikeConverter.class) Bike bike) {
+            this.bike = bike;
+        }
+
+        Bike getBike() {
+            return bike;
+        }
+    }
+
 
     public static class CycleRace {
         private boolean monument;

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
new file mode 100644
index 0000000..b6bb10d
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class ObjectSerializationTest {
+    private final Mapper mapper = new MapperBuilder().build();
+
+    @Test
+    public void primitiveBoolean() {
+        assertEquals("{\"data\":true}", toJson(new Wrapper(true)));
+    }
+
+    @Test
+    public void numberBoolean() {
+        assertEquals("{\"data\":1}", toJson(new Wrapper(1)));
+    }
+
+    @Test
+    public void stringBoolean() {
+        assertEquals("{\"data\":\"ok\"}", toJson(new Wrapper("ok")));
+    }
+
+    @Test
+    public void objectBoolean() {
+        assertEquals("{\"data\":{\"data\":\"ok\"}}", toJson(new Wrapper(new 
Wrapper("ok"))));
+    }
+
+    @Test
+    public void arrayString() {
+        assertEquals("{\"data\":[\"10\",\"2\"]}", toJson(new 
Wrapper(asList("10", "2"))));
+    }
+
+    @Test
+    public void nestedArrayString() {
+        assertEquals("{\"data\":{\"data\":[\"10\",\"2\"]}}", toJson(new 
Wrapper(new Wrapper(asList("10", "2")))));
+    }
+
+    private String toJson(final Wrapper wrapper) {
+        return mapper.writeObjectAsString(wrapper);
+    }
+
+    public static class Wrapper {
+        private final Object data;
+
+        private Wrapper(final Object data) {
+            this.data = data;
+        }
+
+        public Object getData() {
+            return data;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
index 8ac0289..adfe0e5 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
@@ -127,11 +127,15 @@ public class ObjectTypeTest {
     }
 
     @Test
-    public void multiple() {
+    public void testGenericList() {
         assumeFalse("field".equals(accessMode) /*we need setType*/);
 
         final Multiple multiple = new Multiple();
-        multiple.dogs = asList(new Dog(), new Beagle());
+        Poodle poodle = new Poodle();
+        poodle.setHairCut(true);
+        Beagle beagle = new Beagle();
+        beagle.setColor("brown");
+        multiple.dogs = asList(poodle, beagle);
         final Mapper mapper = new MapperBuilder()
                 .setAccessModeName(accessMode)
                 .setReadAttributeBeforeWrite(true)
@@ -142,18 +146,19 @@ public class ObjectTypeTest {
                     }
                 }).build();
         final String json = "{\"dogs\":[" +
-                
"{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Dog\",\"value\":{}}," +
-                
"{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"value\":{}}]}";
+                
"{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\",\"value\":{\"hairCut\":true}},"
 +
+                
"{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"value\":{\"color\":\"brown\"}}]}";
         assertEquals(json, mapper.writeObjectAsString(multiple));
 
         final Multiple deser = mapper.readObject(json, Multiple.class);
         assertEquals(2, deser.dogs.size());
-        assertTrue(Dog.class.isInstance(deser.dogs.get(0)));
+        assertTrue(Poodle.class.isInstance(deser.dogs.get(0)));
         assertFalse(Beagle.class.isInstance(deser.dogs.get(0)));
         assertTrue(Beagle.class.isInstance(deser.dogs.get(1)));
     }
 
 
+
     private Mutt getJavaObject() {
         Poodle mum = new Poodle();
         mum.setName("Rosa");
@@ -306,7 +311,7 @@ public class ObjectTypeTest {
         }
     }
 
-    public static class Dog {
+    public static abstract class Dog {
         private String name;
         private Dog father;
         private Dog mother;
@@ -366,6 +371,15 @@ public class ObjectTypeTest {
     }
 
     public static class Beagle extends Dog {
+        private String color;
+
+        public String getColor() {
+            return color;
+        }
+
+        public void setColor(String color) {
+            this.color = color;
+        }
     }
 
     public static class Poodle extends Dog {
@@ -414,4 +428,25 @@ public class ObjectTypeTest {
             return POODLES.get(jsonObject.getString("poodleName"));
         }
     }
+
+    public static class DogOwner {
+        private String name;
+        private List<Dog> dogs;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public List<Dog> getDogs() {
+            return dogs;
+        }
+
+        public void setDogs(List<Dog> dogs) {
+            this.dogs = dogs;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java
new file mode 100644
index 0000000..dfc3a75
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/SerializeValueFilterTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper;
+
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.List;
+
+import static java.util.Collections.singleton;
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+
+public class SerializeValueFilterTest {
+    @Test
+    public void customIgnore() {
+        // in this test we will serialize lists but not sets or other 
collection impls
+        final Mapper mapper = new MapperBuilder().setSerializeValueFilter(new 
SerializeValueFilter() {
+            @Override
+            public boolean shouldIgnore(String name, Object value) {
+                return !List.class.isInstance(value);
+            }
+        }).build();
+
+        assertEquals("{\"list\":[\"test\"]}", mapper.writeObjectAsString(new 
Foo(singletonList("test"))));
+        assertEquals("{}", mapper.writeObjectAsString(new 
Foo(singleton("test"))));
+    }
+
+    public static class Foo {
+        public Collection<String> list;
+
+        public Foo(final Collection<String> list) {
+            this.list = list;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java
new file mode 100644
index 0000000..1bcc7f6
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/internal/JsonPointerTrackerTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.johnzon.mapper.internal;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JsonPointerTrackerTest {
+
+
+    @Test
+    public void testJsonPointerTracker() {
+        JsonPointerTracker jptRoot = new JsonPointerTracker(null, "/");
+
+        Assert.assertEquals("/", jptRoot.toString());
+
+        JsonPointerTracker jptAttrL1 = new JsonPointerTracker(jptRoot, 
"attrL1");
+        JsonPointerTracker jptAttrL2 = new JsonPointerTracker(jptAttrL1, 
"attrL2");
+
+        Assert.assertEquals("/attrL1/attrL2", jptAttrL2.toString());
+        Assert.assertEquals("/attrL1", jptAttrL1.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java 
b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
index 14844bd..142ca18 100644
--- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
+++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
@@ -71,7 +71,7 @@ public class ExtendMappingTest {
                         public int compare(final String o1, final String o2) {
                             return o1.compareTo(o2);
                         }
-                    }, false));
+                    }, false, false, null, false, false));
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/Model.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/superbiz/Model.java 
b/johnzon-mapper/src/test/java/org/superbiz/Model.java
new file mode 100644
index 0000000..1b3a077
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/superbiz/Model.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.superbiz;
+
+public class Model extends ModelBase<Model.ChildA, Model.ChildB> {
+    public static class ChildA extends ModelSuperBase.ChildA {
+        public String detail;
+    }
+
+    public static class ChildB extends ModelSuperBase.ChildB {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java 
b/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java
new file mode 100644
index 0000000..d7668df
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/superbiz/ModelBase.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.superbiz;
+
+import java.util.Collection;
+
+public abstract class ModelBase<A extends ModelSuperBase.ChildA, B extends 
ModelSuperBase.ChildB>
+        extends ModelSuperBase<A, B> {
+    private Collection<A> aalist;
+
+    public Collection<A> getAalist() {
+        return aalist;
+    }
+
+    public void setAalist(final Collection<A> aalist) {
+        this.aalist = aalist;
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java 
b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java
new file mode 100644
index 0000000..c39d80b
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperBase.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.superbiz;
+
+public abstract class ModelSuperBase<A extends ModelSuperBase.ChildA, B 
extends ModelSuperBase.ChildB>
+        extends ModelSuperSuperBase<A, B> {
+    public static class ChildA extends ModelSuperSuperBase.ChildA {
+
+    }
+
+    public static class ChildB extends ModelSuperSuperBase.ChildB {
+
+    }
+
+    private A childA;
+    private B childB;
+
+    @Override
+    public A getChildA() {
+        return childA;
+    }
+
+    @Override
+    public void setChildA(A childA) {
+        this.childA = childA;
+    }
+
+    @Override
+    public B getChildB() {
+        return childB;
+    }
+
+    @Override
+    public void setChildB(B childB) {
+        this.childB = childB;
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java 
b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java
new file mode 100644
index 0000000..72980b6
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/superbiz/ModelSuperSuperBase.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.superbiz;
+
+public abstract class ModelSuperSuperBase<A extends 
ModelSuperSuperBase.ChildA, B extends ModelSuperSuperBase.ChildB> {
+    public static class ChildA {
+        public String name;
+    }
+
+    public static class ChildB {
+
+    }
+
+    private A childA;
+    private B childB;
+
+    public A getChildA() {
+        return childA;
+    }
+
+    public void setChildA(A childA) {
+        this.childA = childA;
+    }
+
+    public B getChildB() {
+        return childB;
+    }
+
+    public void setChildB(B childB) {
+        this.childB = childB;
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-maven-plugin/pom.xml b/johnzon-maven-plugin/pom.xml
index 1911c1e..4114091 100644
--- a/johnzon-maven-plugin/pom.xml
+++ b/johnzon-maven-plugin/pom.xml
@@ -39,7 +39,7 @@
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-json_1.0_spec</artifactId>
-      <version>${jsonspecversion}</version>
+      <version>${geronimo-jsonp.version}</version>
       <scope>compile</scope>
     </dependency>
     <dependency>

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-websocket/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-websocket/pom.xml b/johnzon-websocket/pom.xml
index d068e8f..3dc74cb 100644
--- a/johnzon-websocket/pom.xml
+++ b/johnzon-websocket/pom.xml
@@ -29,8 +29,8 @@
   <name>Johnzon :: WebSocket</name>
 
   <properties>
-    <tomcat.version>8.5.3</tomcat.version>
-    <tomee.version>7.0.1</tomee.version>
+    <tomcat.version>8.5.9</tomcat.version>
+    <tomee.version>7.0.3</tomee.version>
     
<staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
   </properties>
 
@@ -109,6 +109,13 @@
   </dependencies>
 
   <build>
+    <testResources>
+      <testResource>
+        <directory>src/test/resources</directory>
+        <filtering>true</filtering>
+      </testResource>
+    </testResources>
+
     <plugins>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
@@ -119,6 +126,41 @@
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <version>2.10</version>
+        <executions>
+          <execution> <!-- override some ee api -->
+            <id>unpack-ee-api</id>
+            <phase>generate-test-resources</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              
<outputDirectory>${project.build.directory}/ee-api</outputDirectory>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.tomee</groupId>
+                  <artifactId>javaee-api</artifactId>
+                  <version>7.0-1</version>
+                  <type>zip</type>
+                  <excludes>
+                    LICENSE,NOTICE,README.txt,
+                    geronimo-jaspic_1.0_spec*jar,
+                    geronimo-jsp_2.2_spec*.jar,
+                    javaee-api*.jar,
+                    tomcat-el-api*.jar,
+                    tomcat-servlet-api*.jar,
+                    tomcat-websocket-api*.jar,
+                    geronimo-json_1.0_spec*.jar
+                  </excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
         <executions>
           <execution>

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/johnzon-websocket/src/test/resources/arquillian.xml
----------------------------------------------------------------------
diff --git a/johnzon-websocket/src/test/resources/arquillian.xml 
b/johnzon-websocket/src/test/resources/arquillian.xml
index 1f2d9d0..0472bd2 100644
--- a/johnzon-websocket/src/test/resources/arquillian.xml
+++ b/johnzon-websocket/src/test/resources/arquillian.xml
@@ -32,6 +32,12 @@
       <property name="cleanOnStartUp">true</property>
       <property name="dir">target/apache-tomee-remote</property>
       <property 
name="appWorkingDir">target/arquillian-test-working-dir</property>
+      <!-- override jsonp api -->
+      <property name="lib">${project.build.directory}/ee-api</property>
+      <property name="additionalLibs">
+        remove:javaee-api
+        
mvn:org.apache.geronimo.specs:geronimo-json_1.0_spec:${geronimo-jsonp.version}
+      </property>
     </configuration>
   </container>
 </arquillian>

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/pom.xml
----------------------------------------------------------------------
diff --git a/jsonb-api/pom.xml b/jsonb-api/pom.xml
deleted file mode 100644
index e9a2f3b..0000000
--- a/jsonb-api/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you 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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation=" 
http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd";>
-  <parent>
-    <artifactId>johnzon</artifactId>
-    <groupId>org.apache.johnzon</groupId>
-    <version>1.0.1-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>jsonb-api</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <name>Johnzon :: JSON-B API</name>
-
-  <properties>
-    <java-compile.version>1.8</java-compile.version>
-    
<staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
-  </properties>
-</project>

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/run_sigtest.sh
----------------------------------------------------------------------
diff --git a/jsonb-api/run_sigtest.sh b/jsonb-api/run_sigtest.sh
deleted file mode 100755
index e44f6f0..0000000
--- a/jsonb-api/run_sigtest.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-# file to run the CDI signature tests
-
-
-# HOWTO
-# download sigtestdev.jar from http://download.java.net/sigtest/2.2/Rel/
-# copy to a local folder and set SIGTEST_HOME to it
-
-
-
-mvn dependency:copy-dependencies -DincludeScope=compile
-
-java -jar ${SIGTEST_HOME}/lib/sigtestdev.jar Setup -classpath 
${JAVA_HOME}/jre/lib/rt.jar:./target/jsonb-api-1.0-SNAPSHOT.jar:./target/dependency/geronimo-json_1.0_spec-1.0-alpha-1.jar
 -Package javax.json.bind -FileName jsonb-api.sig -static
-
-# now run the real sig test
-#java -jar ${SIGTEST_HOME}/lib/sigtestdev.jar SignatureTest -classpath 
${JAVA_HOME}/jre/lib/rt.jar:./target/dependency/geronimo-jcdi_1.1_spec-1.0-alpha-1.jar:./target/dependency/geronimo-atinject_1.0_spec-1.0.jar:./target/dependency/geronimo-el_2.2_spec-1.0.2.jar:./target/dependency/geronimo-interceptor_1.2_spec-1.0-alpha-1.jar
 -Package javax.decorator -Package javax.enterprise -FileName cdi-api.sig 
-static
-#java -jar ${SIGTEST_HOME}/lib/sigtestdev.jar SignatureTest -classpath 
${JAVA_HOME}/jre/lib/rt.jar:./target/jsonb-api-1.0-SNAPSHOT.jar:./target/dependency/geronimo-json_1.0_spec-1.0-alpha-1.jar
 -Package javax.json.bind -FileName jsonb -FileName jsonb-api.sig -static
-

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/src/main/java/javax/json/bind/Jsonb.java
----------------------------------------------------------------------
diff --git a/jsonb-api/src/main/java/javax/json/bind/Jsonb.java 
b/jsonb-api/src/main/java/javax/json/bind/Jsonb.java
deleted file mode 100644
index 83de741..0000000
--- a/jsonb-api/src/main/java/javax/json/bind/Jsonb.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 javax.json.bind;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.lang.reflect.Type;
-
-public interface Jsonb extends AutoCloseable {
-    <T> T fromJson(String str, Class<T> type) throws JsonbException;
-
-    <T> T fromJson(String str, Type runtimeType) throws JsonbException;
-
-    <T> T fromJson(Reader reader, Class<T> type) throws JsonbException;
-
-    <T> T fromJson(Reader reader, Type runtimeType) throws JsonbException;
-
-    <T> T fromJson(InputStream stream, Class<T> type) throws JsonbException;
-
-    <T> T fromJson(InputStream stream, Type runtimeType) throws JsonbException;
-
-    String toJson(Object object) throws JsonbException;
-
-    String toJson(Object object, Type runtimeType) throws JsonbException;
-
-    void toJson(Object object, Writer writer) throws JsonbException;
-
-    void toJson(Object object, Type runtimeType, Writer writer) throws 
JsonbException;
-
-    void toJson(Object object, OutputStream stream) throws JsonbException;
-
-    void toJson(Object object, Type runtimeType, OutputStream stream) throws 
JsonbException;
-}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/76fe13de/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java
----------------------------------------------------------------------
diff --git a/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java 
b/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java
deleted file mode 100644
index 77e4a8c..0000000
--- a/jsonb-api/src/main/java/javax/json/bind/JsonbBuilder.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 javax.json.bind;
-
-import javax.json.bind.spi.JsonbProvider;
-import javax.json.spi.JsonProvider;
-
-public interface JsonbBuilder {
-    JsonbBuilder withConfig(final JsonbConfig config);
-
-    JsonbBuilder withProvider(final JsonProvider jsonpProvider);
-
-    Jsonb build();
-
-    static Jsonb create() {
-        return JsonbProvider.provider().create().build();
-    }
-
-    static Jsonb create(final JsonbConfig config) {
-        return JsonbProvider.provider().create().withConfig(config).build();
-    }
-
-    static JsonbBuilder newBuilder() {
-        return JsonbProvider.provider().create();
-    }
-
-    static JsonbBuilder newBuilder(final String providerName) {
-        return JsonbProvider.provider(providerName).create();
-    }
-
-    static JsonbBuilder newBuilder(final JsonbProvider provider) {
-        return provider.create();
-    }
-}

Reply via email to