Adding separate handling for Map type, distinct from generic "JSON Object"; while JSON Schema is lame enough to not make distinction, we shouldn't be
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java
index fd69104..d80eb03 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java
@@ -22,6 +22,8 @@
     extends StdDeserializer<Object>
     implements ContextualDeserializer, ResolvableDeserializer
 {
+    private static final long serialVersionUID = 1L;
+
     protected final JsonDeserializer<?> _delegatee;
     
     /*
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
index 3d9ce46..223b242 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
@@ -13,6 +13,8 @@
 public abstract class FromStringDeserializer<T>
     extends StdScalarDeserializer<T>
 {
+    private static final long serialVersionUID = 1L;
+
     protected FromStringDeserializer(Class<?> vc) {
         super(vc);
     }
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java
index ad990c4..e865964 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java
@@ -28,6 +28,8 @@
     extends ContainerDeserializerBase<Map<Object,Object>>
     implements ContextualDeserializer, ResolvableDeserializer
 {
+    private static final long serialVersionUID = -3378654289961736240L;
+
     // // Configuration: typing, deserializers
 
     protected final JavaType _mapType;
diff --git a/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java b/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java
index 7e4ee3c..86940c5 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java
@@ -68,6 +68,7 @@
     public static class DurationDeserializer
         extends FromStringDeserializer<Duration>
     {
+        private static final long serialVersionUID = 1L;
         public DurationDeserializer() { super(Duration.class); }
     
         @Override
@@ -81,6 +82,7 @@
     public static class GregorianCalendarDeserializer
         extends StdScalarDeserializer<XMLGregorianCalendar>
     {
+        private static final long serialVersionUID = 1L;
         public GregorianCalendarDeserializer() { super(XMLGregorianCalendar.class); }
         
         @Override
@@ -100,6 +102,7 @@
     public static class QNameDeserializer
         extends FromStringDeserializer<QName>
     {
+        private static final long serialVersionUID = 1L;
         public QNameDeserializer() { super(QName.class); }
         
         @Override
diff --git a/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java
index 3c85afc..206b37c 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java
@@ -18,7 +18,9 @@
  */
 public abstract class DOMDeserializer<T> extends FromStringDeserializer<T>
 {
-    final static DocumentBuilderFactory _parserFactory;
+    private static final long serialVersionUID = 1L;
+
+    private final static DocumentBuilderFactory _parserFactory;
     static {
         _parserFactory = DocumentBuilderFactory.newInstance();
         // yup, only cave men do XML without recognizing namespaces...
@@ -47,6 +49,7 @@
     
     public static class NodeDeserializer extends DOMDeserializer<Node>
     {
+        private static final long serialVersionUID = 1L;
         public NodeDeserializer() { super(Node.class); }
         @Override
         public Node _deserialize(String value, DeserializationContext ctxt) throws IllegalArgumentException {
@@ -56,6 +59,7 @@
 
     public static class DocumentDeserializer extends DOMDeserializer<Document>
     {
+        private static final long serialVersionUID = 1L;
         public DocumentDeserializer() { super(Document.class); }
         @Override
         public Document _deserialize(String value, DeserializationContext ctxt) throws IllegalArgumentException {
diff --git a/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java
index 22dfbec..882d40a 100644
--- a/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java
+++ b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java
@@ -3,9 +3,14 @@
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JsonMappingException;
 
+/**
+ * Interface for visitor callbacks, when type in question can be any of
+ * legal JSON types.
+ */
 public interface JsonFormatVisitorWrapper extends JsonFormatVisitorWithSerializerProvider
 {
     public JsonObjectFormatVisitor expectObjectFormat(JavaType convertedType) throws JsonMappingException;
+
     public JsonArrayFormatVisitor expectArrayFormat(JavaType convertedType) throws JsonMappingException;
     public JsonStringFormatVisitor expectStringFormat(JavaType convertedType) throws JsonMappingException;
     public JsonNumberFormatVisitor expectNumberFormat(JavaType convertedType) throws JsonMappingException;
@@ -13,4 +18,12 @@
     public JsonBooleanFormatVisitor expectBooleanFormat(JavaType convertedType) throws JsonMappingException;
     public JsonNullFormatVisitor expectNullFormat(JavaType convertedType) throws JsonMappingException;
     public JsonAnyFormatVisitor expectAnyFormat(JavaType convertedType) throws JsonMappingException;
+
+    /**
+     * Method called when type is of Java {@link java.util.Map} type, and will
+     * be serialized as a JSON Object.
+     * 
+     * @since 2.2
+     */
+    public JsonMapFormatVisitor expectMapFormat(JavaType type) throws JsonMappingException;
 }
diff --git a/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonMapFormatVisitor.java b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonMapFormatVisitor.java
new file mode 100644
index 0000000..c23855e
--- /dev/null
+++ b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonMapFormatVisitor.java
@@ -0,0 +1,38 @@
+package com.fasterxml.jackson.databind.jsonFormatVisitors;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public interface JsonMapFormatVisitor extends JsonFormatVisitorWithSerializerProvider
+{
+    /**
+     * Visit method called to indicate type of keys of the Map type
+     * being visited
+     */
+    public void keyFormat(JsonFormatVisitable handler, JavaType keyType) throws JsonMappingException;
+
+    /**
+     * Visit method called after {@link #keyFormat} to allow visiting of
+     * the value type
+     */
+    public void valueFormat(JsonFormatVisitable handler, JavaType valueType) throws JsonMappingException;
+    
+    /**
+     * Default "empty" implementation, useful as the base to start on;
+     * especially as it is guaranteed to implement all the method
+     * of the interface, even if new methods are getting added.
+     */
+    public static class Base
+        implements JsonMapFormatVisitor
+    {
+        protected SerializerProvider provider;
+
+        public SerializerProvider getProvider() { return provider; }
+
+        public void setProvider(SerializerProvider p) { provider = p; }
+
+        public void keyFormat(JsonFormatVisitable handler, JavaType keyType) throws JsonMappingException { }
+        public void valueFormat(JsonFormatVisitable handler, JavaType valueType) throws JsonMappingException { }
+    }
+}
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java
index 3c14995..a51aee3 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java
@@ -9,7 +9,10 @@
 import com.fasterxml.jackson.databind.*;
 import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
 import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonMapFormatVisitor;
 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.ser.ContainerSerializer;
@@ -501,8 +504,16 @@
     public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
         throws JsonMappingException
     {
-        //jackphel Aug 17 2012 : this can definitely more more exact. 
-        visitor.expectObjectFormat(typeHint);
+        JsonMapFormatVisitor v2 = (visitor == null) ? null : visitor.expectMapFormat(typeHint);
+        if (v2 != null) {
+            v2.keyFormat(_keySerializer, _keyType);
+            JsonSerializer<?> valueSer = _valueSerializer;
+            if (valueSer == null) {
+                valueSer = _findAndAddDynamic(_dynamicValueSerializers,
+                            _valueType, visitor.getProvider());
+            }
+            v2.valueFormat(valueSer, _valueType);
+        }
     }
 
     /*
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java
index 02788c2..e629287 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java
@@ -347,19 +347,18 @@
         throws JsonMappingException
     {
         JsonArrayFormatVisitor arrayVisitor = visitor.expectArrayFormat(typeHint);
-        if (arrayVisitor == null) { // not sure if this is legal but...
-            return; 
+        if (arrayVisitor != null) {
+            TypeFactory tf = visitor.getProvider().getTypeFactory();
+            JavaType contentType = tf.moreSpecificType(_elementType, typeHint.getContentType());
+            if (contentType == null) {
+                throw new JsonMappingException("Could not resolve type");
+            }
+            JsonSerializer<?> valueSer = _elementSerializer;
+            if (valueSer == null) {
+                valueSer = visitor.getProvider().findValueSerializer(contentType, _property);
+            }
+            arrayVisitor.itemsFormat(valueSer, contentType);
         }
-        TypeFactory tf = visitor.getProvider().getTypeFactory();
-        JavaType contentType = tf.moreSpecificType(_elementType, typeHint.getContentType());
-        if (contentType == null) {
-            throw new JsonMappingException("Could not resolve type");
-        }
-        JsonSerializer<?> valueSer = _elementSerializer;
-        if (valueSer == null) {
-            valueSer = visitor.getProvider().findValueSerializer(contentType, _property);
-        }
-        arrayVisitor.itemsFormat(valueSer, contentType);
     }
 
     protected final JsonSerializer<Object> _findAndAddDynamic(PropertySerializerMap map,