diff --git a/src/main/java/org/apache/sling/hamcrest/MapUtil.java b/src/main/java/org/apache/sling/hamcrest/MapUtil.java
index a391c4e..e09339e 100644
--- a/src/main/java/org/apache/sling/hamcrest/MapUtil.java
+++ b/src/main/java/org/apache/sling/hamcrest/MapUtil.java
@@ -20,7 +20,6 @@
 
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -43,13 +42,8 @@
         if (args == null || args.length == 0) {
             return Collections.emptyMap();
         }
-        if (args.length == 1) {
-            if (args[0] instanceof Map) {
-                return (Map<String, Object>)args[0];
-            }
-            else if (args[0] instanceof Dictionary) {
-                return toMap((Dictionary<String, Object>)args[0]);
-            }
+        if (args.length == 1 && args[0] instanceof Map) {
+            return (Map<String, Object>)args[0];
         }
         if (args.length % 2 != 0) {
             throw new IllegalArgumentException("args must be an even number of name/values:" + Arrays.asList(args));
diff --git a/src/test/java/org/apache/sling/hamcrest/MapUtilTest.java b/src/test/java/org/apache/sling/hamcrest/MapUtilTest.java
index 9257fbf..6ea1a34 100644
--- a/src/test/java/org/apache/sling/hamcrest/MapUtilTest.java
+++ b/src/test/java/org/apache/sling/hamcrest/MapUtilTest.java
@@ -20,6 +20,7 @@
 
 import static org.junit.Assert.assertEquals;
 
+import java.util.Collections;
 import java.util.Map;
 
 import org.junit.Test;
@@ -28,11 +29,44 @@
 
 public class MapUtilTest {
 
-    @Test
+    private static final ImmutableMap<String, Object> EXPECTED_MAP = ImmutableMap.<String, Object>of("param1", "var1", "param2", 123, "param3", true);
+
+	@Test
     public void testMapObjectVarargs() {
         Map<String, Object> convertedMap = MapUtil.toMap("param1", "var1", "param2", 123, "param3", true);
         
-        assertEquals(ImmutableMap.<String, Object>of("param1", "var1", "param2", 123, "param3", true), convertedMap);
+        assertEquals(EXPECTED_MAP, convertedMap);
     }
-    
+ 
+    @Test
+    public void testMapObjectMap() {
+        Map<String, Object> convertedMap = MapUtil.toMap(EXPECTED_MAP);
+        
+        assertEquals(EXPECTED_MAP, convertedMap);
+    }
+ 
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testMapObjectVarArgs_NotMap() {
+        MapUtil.toMap("param1", "var1", "param2", 123, "param3");
+    }
+ 
+    @Test
+    public void testMapObjectVarargs_EmptyArgs() {
+        Map<String, Object> convertedMap = MapUtil.toMap();
+        
+        assertEquals(Collections.emptyMap(), convertedMap);
+    }
+ 
+    @Test
+    public void testMapObjectVarargs_Null() {
+        Map<String, Object> convertedMap = MapUtil.toMap((Object[])null);
+        
+        assertEquals(Collections.emptyMap(), convertedMap);
+    }
+ 
+    @Test(expected = IllegalArgumentException.class)
+    public void testMapObjectVarArgs_OddNumberOfArgs() {
+        MapUtil.toMap("param1", "var1", "param2", 123, "param3");
+    }
 }
