...

diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java b/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java
index 6c9c6c0..8fdda5d 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/BasicDeserializerFactory.java
@@ -393,7 +393,9 @@
             if (kt == null || !kt.isEnum()) {
                 throw new IllegalArgumentException("Can not construct EnumMap; generic (key) type not available");
             }
-            return new EnumMapDeserializer(constructEnumResolver(kt, config), contentDeser);
+            return new EnumMapDeserializer(keyType.getRawClass(),
+                    createEnumDeserializer(config, p, keyType, property),
+                    contentDeser);
         }
 
         // Otherwise, generic handler works ok.
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
index e04d174..9c06f55 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
@@ -66,8 +66,8 @@
     {
         JsonToken curr = jp.getCurrentToken();
         
-        // Usually should just get string value:
-        if (curr == JsonToken.VALUE_STRING) {
+        // Usually should just get string value; but in some cases FIELD_NAME (enum as key)
+        if (curr == JsonToken.VALUE_STRING || curr == JsonToken.FIELD_NAME) {
             String name = jp.getText();
             Enum<?> result = _resolver.findEnum(name);
             if (result == null) {
@@ -124,7 +124,7 @@
             JsonToken curr = jp.getCurrentToken();
             
             // Usually should just get string value:
-            if (curr != JsonToken.VALUE_STRING) {
+            if (curr != JsonToken.VALUE_STRING && curr != JsonToken.FIELD_NAME) {
                 throw ctxt.mappingException(_enumClass);
             }
             String value = jp.getText();
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java
index ad4ddcf..1996a63 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumMapDeserializer.java
@@ -26,17 +26,27 @@
 public class EnumMapDeserializer
     extends StdDeserializer<EnumMap<?,?>>
 {
-    protected final EnumResolver<?> _enumResolver;
+    protected final Class<?> _enumClass;
+
+    protected final JsonDeserializer<Enum<?>> _keyDeserializer;
 
     protected final JsonDeserializer<Object> _valueDeserializer;
 
-    public EnumMapDeserializer(EnumResolver<?> enumRes, JsonDeserializer<Object> valueDes)
+    @Deprecated
+    public EnumMapDeserializer(EnumResolver<?> enumRes, JsonDeserializer<Object> valueDeser)
     {
-        super(EnumMap.class);
-        _enumResolver = enumRes;
-        _valueDeserializer = valueDes;
+        this(enumRes.getEnumClass(), new EnumDeserializer(enumRes), valueDeser);
     }
 
+    public EnumMapDeserializer(Class<?> enumClass, JsonDeserializer<?> keyDeserializer,
+            JsonDeserializer<Object> valueDeser)
+    {
+        super(EnumMap.class);
+        _enumClass = enumClass;
+        _keyDeserializer = (JsonDeserializer<Enum<?>>) keyDeserializer;
+        _valueDeserializer = valueDeser;
+    }
+    
     @Override
     public EnumMap<?,?> deserialize(JsonParser jp, DeserializationContext ctxt)
         throws IOException, JsonProcessingException
@@ -48,10 +58,9 @@
         EnumMap result = constructMap();
 
         while ((jp.nextToken()) != JsonToken.END_OBJECT) {
-            String fieldName = jp.getCurrentName();
-            Enum<?> key = _enumResolver.findEnum(fieldName);
+            Enum<?> key = _keyDeserializer.deserialize(jp, ctxt);
             if (key == null) {
-                throw ctxt.weirdStringException(_enumResolver.getEnumClass(), "value not one of declared Enum instance names");
+                throw ctxt.weirdStringException(_enumClass, "value not one of declared Enum instance names");
             }
             // And then the value...
             JsonToken t = jp.nextToken();
@@ -76,7 +85,6 @@
     
     private EnumMap<?,?> constructMap()
     {
-        Class<? extends Enum<?>> enumCls = _enumResolver.getEnumClass();
-    	return new EnumMap(enumCls);
+    	return new EnumMap(_enumClass);
     }
 }