diff --git a/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java b/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
index 4081a01..e063c39 100644
--- a/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
+++ b/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
@@ -278,19 +278,11 @@
         }
 
         for(final Config c : configs) {
-            final int pos = c.getPid().indexOf('~');
-            final Configuration config;
-            if ( pos != -1 ) {
-                config = new Configuration(c.getPid().substring(0, pos), c.getPid().substring(pos + 1));
-            } else {
-                config = new Configuration(c.getPid());
-            }
+            final Configuration config = new Configuration(c.getPid());
+         
             final Enumeration<String> keyEnum = c.getProperties().keys();
             while ( keyEnum.hasMoreElements() ) {
                 final String key = keyEnum.nextElement();
-                if ( key.startsWith(":configurator:") ) {
-                    throw new IOException(exceptionPrefix + "Configuration must not define configurator property " + key);
-                }
                 final Object val = c.getProperties().get(key);
                 config.getProperties().put(key, val);
             }
diff --git a/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java b/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
index 4f7d77f..969ef62 100644
--- a/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
+++ b/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
@@ -16,17 +16,6 @@
  */
 package org.apache.sling.feature.io.json;
 
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Bundles;
-import org.apache.sling.feature.Configuration;
-import org.apache.sling.feature.Configurations;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.ExtensionType;
-import org.apache.sling.feature.Include;
-import org.osgi.resource.Capability;
-import org.osgi.resource.Requirement;
-
 import java.io.StringReader;
 import java.io.Writer;
 import java.lang.reflect.Array;
@@ -41,6 +30,17 @@
 import javax.json.stream.JsonGenerator;
 import javax.json.stream.JsonGeneratorFactory;
 
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Bundles;
+import org.apache.sling.feature.Configuration;
+import org.apache.sling.feature.Configurations;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionType;
+import org.apache.sling.feature.Include;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+
 /**
  * Common functionality for writing JSON
  */
@@ -104,14 +104,7 @@
         generator.writeStartObject(JSONConstants.FEATURE_CONFIGURATIONS);
 
         for(final Configuration cfg : cfgs) {
-            final String key;
-            if ( cfg.isFactoryConfiguration() ) {
-                key = cfg.getFactoryPid() + "~" + cfg.getName();
-            } else {
-                key = cfg.getPid();
-            }
-
-            generator.writeStartObject(key);
+            generator.writeStartObject(cfg.getPid());
 
             final Enumeration<String> e = cfg.getProperties().keys();
             while ( e.hasMoreElements() ) {
diff --git a/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java b/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java
index 6c99042..ab30274 100644
--- a/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java
+++ b/src/test/java/org/apache/sling/feature/io/json/FeatureJSONReaderTest.java
@@ -46,7 +46,7 @@
         assertEquals(2, feature.getConfigurations().size());
         final Configuration cfg1 = U.findConfiguration(feature.getConfigurations(), "my.pid");
         assertEquals(7, cfg1.getProperties().get("number"));
-        final Configuration cfg2 = U.findFactoryConfiguration(feature.getConfigurations(), "my.factory.pid", "name");
+        final Configuration cfg2 = U.findConfiguration(feature.getConfigurations(), "my.factory.pid~name");
         assertEquals("yeah", cfg2.getProperties().get("a.value"));
 
         assertEquals(3, feature.getCapabilities().size());
diff --git a/src/test/java/org/apache/sling/feature/io/json/U.java b/src/test/java/org/apache/sling/feature/io/json/U.java
index fa23b47..ee642c1 100644
--- a/src/test/java/org/apache/sling/feature/io/json/U.java
+++ b/src/test/java/org/apache/sling/feature/io/json/U.java
@@ -41,7 +41,7 @@
 
     public static Configuration findConfiguration(final List<Configuration> cfgs, final String pid) {
         for(final Configuration c : cfgs) {
-            if ( !c.isFactoryConfiguration() && pid.equals(c.getPid()) ) {
+            if (pid.equals(c.getPid())) {
                 return c;
             }
         }
@@ -49,16 +49,6 @@
         return null;
     }
 
-    public static Configuration findFactoryConfiguration(final List<Configuration> cfgs, final String factoryid, final String name) {
-        for(final Configuration c : cfgs) {
-            if ( c.isFactoryConfiguration() && factoryid.equals(c.getFactoryPid()) && name.equals(c.getName())) {
-                return c;
-            }
-        }
-        fail("Factory Configuration not found " + factoryid + "~" + name);
-        return null;
-    }
-
     public static Capability findCapability(List<Capability> capabilities, final String namespace) {
         for (Capability capability : capabilities) {
             if (capability.getNamespace().equals(namespace)) {
