diff --git a/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java b/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java
index 47b089c..aaef888 100644
--- a/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java
+++ b/src/main/java/org/apache/sling/feature/modelconverter/FeatureToProvisioning.java
@@ -16,6 +16,26 @@
  */
 package org.apache.sling.feature.modelconverter;
 
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Bundles;
+import org.apache.sling.feature.Configurations;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionType;
+import org.apache.sling.feature.Extensions;
+import org.apache.sling.feature.FeatureConstants;
+import org.apache.sling.feature.builder.BuilderContext;
+import org.apache.sling.feature.builder.FeatureBuilder;
+import org.apache.sling.feature.builder.FeatureProvider;
+import org.apache.sling.feature.io.json.FeatureJSONReader;
+import org.apache.sling.provisioning.model.Artifact;
+import org.apache.sling.provisioning.model.Configuration;
+import org.apache.sling.provisioning.model.Feature;
+import org.apache.sling.provisioning.model.Model;
+import org.apache.sling.provisioning.model.Section;
+import org.apache.sling.provisioning.model.io.ModelWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileWriter;
@@ -40,27 +60,6 @@
 import javax.json.JsonString;
 import javax.json.JsonValue;
 
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Bundles;
-import org.apache.sling.feature.Configurations;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.ExtensionType;
-import org.apache.sling.feature.Extensions;
-import org.apache.sling.feature.FeatureConstants;
-import org.apache.sling.feature.KeyValueMap;
-import org.apache.sling.feature.builder.BuilderContext;
-import org.apache.sling.feature.builder.FeatureBuilder;
-import org.apache.sling.feature.builder.FeatureProvider;
-import org.apache.sling.feature.io.json.FeatureJSONReader;
-import org.apache.sling.provisioning.model.Artifact;
-import org.apache.sling.provisioning.model.Configuration;
-import org.apache.sling.provisioning.model.Feature;
-import org.apache.sling.provisioning.model.Model;
-import org.apache.sling.provisioning.model.Section;
-import org.apache.sling.provisioning.model.io.ModelWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /** Converter that converts the feature model to the provisioning model.
  */
 public class FeatureToProvisioning {
@@ -120,7 +119,7 @@
         return FeatureBuilder.assemble(feature, bc);
     }
 
-    private static void convert(Feature f, KeyValueMap variables, Bundles bundles, Configurations configurations, KeyValueMap frameworkProps,
+    private static void convert(Feature f, Map<String,String> variables, Bundles bundles, Configurations configurations, Map<String,String> frameworkProps,
             Extensions extensions, String outputFile, String [] runModes) {
         final Map<String, Feature> additionalFeatures = new HashMap<>();
 
@@ -128,7 +127,7 @@
             runModes = null;
         }
         org.apache.sling.provisioning.model.KeyValueMap<String> vars = f.getVariables();
-        for (Map.Entry<String, String> entry : variables) {
+        for (Map.Entry<String, String> entry : variables.entrySet()) {
             vars.put(entry.getKey(), entry.getValue());
         }
 
@@ -148,7 +147,7 @@
                 }
             }
 
-            for(final Map.Entry<String, String> prop : bundle.getMetadata()) {
+            for(final Map.Entry<String, String> prop : bundle.getMetadata().entrySet()) {
                 switch (prop.getKey()) {
                     // these are handled separately
                     case "start-level":
@@ -222,7 +221,7 @@
         }
 
         // framework properties
-        for(final Map.Entry<String, String> prop : frameworkProps) {
+        for(final Map.Entry<String, String> prop : frameworkProps.entrySet()) {
             String key = prop.getKey();
             int idx = key.indexOf(".runmodes:");
 
@@ -243,7 +242,7 @@
                     String[] extRunModes = runModes;
                     final ArtifactId id = cp.getId();
                     final Artifact newCP = new Artifact(id.getGroupId(), id.getArtifactId(), id.getVersion(), id.getClassifier(), id.getType());
-                    for(final Map.Entry<String, String> prop : cp.getMetadata()) {
+                    for(final Map.Entry<String, String> prop : cp.getMetadata().entrySet()) {
                         if (prop.getKey().equals("runmodes")) {
                             if (extRunModes == null) {
                                 extRunModes = prop.getValue().split(",");
diff --git a/src/main/java/org/apache/sling/feature/modelconverter/ProvisioningToFeature.java b/src/main/java/org/apache/sling/feature/modelconverter/ProvisioningToFeature.java
index 0c94ea1..148bcc6 100644
--- a/src/main/java/org/apache/sling/feature/modelconverter/ProvisioningToFeature.java
+++ b/src/main/java/org/apache/sling/feature/modelconverter/ProvisioningToFeature.java
@@ -16,21 +16,6 @@
  */
 package org.apache.sling.feature.modelconverter;
 
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Bundles;
 import org.apache.sling.feature.Configurations;
@@ -38,7 +23,6 @@
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Extensions;
 import org.apache.sling.feature.FeatureConstants;
-import org.apache.sling.feature.KeyValueMap;
 import org.apache.sling.feature.io.file.ArtifactHandler;
 import org.apache.sling.feature.io.file.ArtifactManager;
 import org.apache.sling.feature.io.file.ArtifactManagerConfig;
@@ -60,6 +44,21 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
 /** Converter that converts the provisioning model to the feature model.
  */
 public class ProvisioningToFeature {
@@ -294,11 +293,11 @@
     }
 
     private static void buildFromFeature(final Feature feature,
-            final KeyValueMap variables,
+            final Map<String,String> variables,
             final Bundles bundles,
             final Configurations configurations,
             final Extensions extensions,
-            final KeyValueMap properties) {
+            final Map<String,String> properties) {
         for (Iterator<Map.Entry<String, String>> it = feature.getVariables().iterator(); it.hasNext(); ) {
             Entry<String, String> entry = it.next();
             variables.put(entry.getKey(), entry.getValue());
diff --git a/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java b/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java
index 50cfe88..580997e 100644
--- a/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java
+++ b/src/test/java/org/apache/sling/feature/modelconverter/ModelConverterTest.java
@@ -16,35 +16,6 @@
  */
 package org.apache.sling.feature.modelconverter;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.UncheckedIOException;
-import java.net.URISyntaxException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Bundles;
 import org.apache.sling.feature.Configurations;
 import org.apache.sling.feature.Extension;
@@ -76,6 +47,34 @@
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.UncheckedIOException;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 public class ModelConverterTest {
     private Path tempDir;
     private ArtifactManager artifactManager;
@@ -463,10 +462,10 @@
         assertEquals(expected.getVendor(), actual.getVendor());
         assertEquals(expected.getLicense(), actual.getLicense());
 
-        assertFeatureKVMapEquals(expected.getVariables(), actual.getVariables());
+        assertEquals(expected.getVariables(), actual.getVariables());
         assertBundlesEqual(expected.getBundles(), actual.getBundles());
         assertConfigurationsEqual(expected.getConfigurations(), actual.getConfigurations(), expected.getBundles(), actual.getBundles());
-        assertFeatureKVMapEquals(expected.getFrameworkProperties(), actual.getFrameworkProperties());
+        assertEquals(expected.getFrameworkProperties(), actual.getFrameworkProperties());
         assertExtensionEqual(expected.getExtensions(), actual.getExtensions());
 
         // Ignore caps and reqs, includes and here since they cannot come from the prov model.
@@ -481,7 +480,7 @@
                 org.apache.sling.feature.Artifact ac = it2.next();
                 if (ac.getId().equals(ex.getId())) {
                     found = true;
-                    assertFeatureKVMapEquals(ex.getMetadata(), ac.getMetadata());
+                    assertEquals(ex.getMetadata(), ac.getMetadata());
                     break;
                 }
             }
@@ -658,16 +657,6 @@
         return m;
     }
 
-    private Map<String, String> featureKvToMap(org.apache.sling.feature.KeyValueMap kvm) {
-        Map<String, String> m = new HashMap<>();
-
-        for (Map.Entry<String, String> entry : kvm) {
-            m.put(entry.getKey(), entry.getValue());
-        }
-
-        return m;
-    }
-
     private boolean artifactGroupsEquals(String featureName, ArtifactGroup g1, ArtifactGroup g2) {
         int sl1 = effectiveStartLevel(featureName, g1.getStartLevel());
         int sl2 = effectiveStartLevel(featureName, g2.getStartLevel());
@@ -714,11 +703,6 @@
         assertEquals(kvToMap(expected), kvToMap(actual));
     }
 
-    private void assertFeatureKVMapEquals(org.apache.sling.feature.KeyValueMap expected,
-            org.apache.sling.feature.KeyValueMap actual) {
-        assertEquals(featureKvToMap(expected), featureKvToMap(actual));
-    }
-
     private void assertExtensionEqual(Extensions expected, Extensions actual) {
         assertEquals(expected.size(), actual.size());
 
