diff --git a/.gitignore b/.gitignore
index 5e3e8df..1271c27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
 .settings
 
 # IDEA
+.idea
 *.iml
 *.ipr
 *.iws
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.java
index 833b58f..748979f 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.java
@@ -13,7 +13,7 @@
  */
 @SuppressWarnings("serial")
 public class JsonNodeDeserializer
-    extends BaseNodeDeserializer
+    extends BaseNodeDeserializer<JsonNode>
 {
     /**
      * Singleton instance of generic deserializer for {@link JsonNode}.
@@ -21,7 +21,7 @@
      */
     private final static JsonNodeDeserializer instance = new JsonNodeDeserializer();
 
-    protected JsonNodeDeserializer() { }
+    protected JsonNodeDeserializer() { super(JsonNode.class); }
 
     /**
      * Factory method for accessing deserializer for specific node type
@@ -44,6 +44,11 @@
     /**********************************************************
      */
 
+    @Override
+    public JsonNode getNullValue() {
+        return NullNode.getInstance();
+    }
+
     /**
      * Implementation that will produce types of any JSON nodes; not just one
      * deserializer is registered to handle (in case of more specialized handler).
@@ -70,13 +75,13 @@
      */
 
     final static class ObjectDeserializer
-        extends BaseNodeDeserializer
+        extends BaseNodeDeserializer<ObjectNode>
     {
         private static final long serialVersionUID = 1L;
 
         protected final static ObjectDeserializer _instance = new ObjectDeserializer();
 
-        protected ObjectDeserializer() { }
+        protected ObjectDeserializer() { super(ObjectNode.class); }
 
         public static ObjectDeserializer getInstance() { return _instance; }
         
@@ -96,13 +101,13 @@
     }
         
     final static class ArrayDeserializer
-        extends BaseNodeDeserializer
+        extends BaseNodeDeserializer<ArrayNode>
     {
         private static final long serialVersionUID = 1L;
 
         protected final static ArrayDeserializer _instance = new ArrayDeserializer();
 
-        protected ArrayDeserializer() { }
+        protected ArrayDeserializer() { super(ArrayNode.class); }
 
         public static ArrayDeserializer getInstance() { return _instance; }
         
@@ -123,12 +128,12 @@
  * implementations
  */
 @SuppressWarnings("serial")
-abstract class BaseNodeDeserializer
-    extends StdDeserializer<JsonNode>
+abstract class BaseNodeDeserializer<T extends JsonNode>
+    extends StdDeserializer<T>
 {
-    public BaseNodeDeserializer()
+    public BaseNodeDeserializer(Class<T> vc)
     {
-        super(JsonNode.class);
+        super(vc);
     }
     
     @Override
@@ -142,16 +147,6 @@
         return typeDeserializer.deserializeTypedFromAny(jp, ctxt);
     }
 
-    @Override
-    public JsonNode getNullValue() {
-        return NullNode.getInstance();
-    }
-
-    @Override
-    public Class<?> handledType() {
-        return JsonNode.class;
-    }
-
     /*
     /**********************************************************
     /* Overridable methods
diff --git a/src/test/java/com/fasterxml/jackson/databind/node/TestTreeDeserialization.java b/src/test/java/com/fasterxml/jackson/databind/node/TestTreeDeserialization.java
index 1f88848..0c88cdc 100644
--- a/src/test/java/com/fasterxml/jackson/databind/node/TestTreeDeserialization.java
+++ b/src/test/java/com/fasterxml/jackson/databind/node/TestTreeDeserialization.java
@@ -1,8 +1,9 @@
 package com.fasterxml.jackson.databind.node;
 
-import java.io.*;
-
-import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.BaseMapTest;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
 
 /**
  * This unit test suite tries to verify that JsonNode-based trees
@@ -115,4 +116,24 @@
         assertNotNull(n);
         assertTrue(n.isNull());
     }
+
+    final static class CovarianceBean {
+        ObjectNode _object;
+        ArrayNode _array;
+
+        public void setObject(ObjectNode n) { _object = n; }
+        public void setArray(ArrayNode n) { _array = n; }
+    }
+
+    public void testNullHandlingCovariance() throws Exception
+    {
+        String JSON = "{\"object\" : null, \"array\" : null }";
+        CovarianceBean bean = objectMapper().readValue(JSON, CovarianceBean.class);
+
+        ObjectNode on = bean._object;
+        assertNull(on);
+
+        ArrayNode an = bean._array;
+        assertNull(an);
+    }
 }
