diff --git a/pom.xml b/pom.xml
index c835e26..3ad5109 100644
--- a/pom.xml
+++ b/pom.xml
@@ -90,6 +90,13 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>2.15.0</version>
+            <scope>test</scope>
         </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
index afa7293..6e0845c 100644
--- a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
+++ b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
@@ -106,7 +106,7 @@
             } else {
                 pid = (event.getPid().startsWith(event.getFactoryPid() + '.') ?
                         event.getPid().substring(event.getFactoryPid().length() + 1) : event.getPid());
-                id = event.getFactoryPid() + '.' + event.getPid();
+                id = event.getFactoryPid() + '.' + pid;
             }
             if ( event.getType() == ConfigurationEvent.CM_DELETED ) {
                 final Coordinator.Operation op = Coordinator.SHARED.get(event.getPid(), event.getFactoryPid(), true);
@@ -191,22 +191,7 @@
         final String configPid;
         int n = pid.indexOf('-');
         if (n > 0) {
-            // quick check if this is an existing configuration
-            final String fString = pid.substring(0, n);
-            final String cString = pid.substring(n + 1);
-            boolean useExtendedPid = false;
-            try {
-                if ( ConfigUtil.getConfiguration(this.configAdmin, fString, fString + '.' + cString) != null ) {
-                    useExtendedPid = true;
-                }
-            } catch ( final Exception ignore) {
-                // ignore this
-            }
-            if ( useExtendedPid ) {
-                configPid = fString + '.' + cString;
-            } else {
-                configPid = pid.substring(n + 1);
-            }
+            configPid = pid.substring(n + 1);
             factoryPid = pid.substring(0, n);
         } else {
             factoryPid = null;
diff --git a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
index 981d590..a9eba9f 100644
--- a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
+++ b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
@@ -194,6 +194,12 @@
                         + "))");
             }
             if (configs == null || configs.length == 0) {
+                configs = ca.listConfigurations("(&("
+                        + ConfigurationAdmin.SERVICE_FACTORYPID + "=" + encode(factoryPid)
+                        + ")(" + Constants.SERVICE_PID + "=" + encode(factoryPid + "." + configPid)
+                        + "))");
+            }
+            if (configs == null || configs.length == 0) {
                 // check for old style with alias pid
                 configs = ca.listConfigurations(
                         "(&(" + ConfigurationAdmin.SERVICE_FACTORYPID
diff --git a/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java b/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
index 7ef7ca9..2b0c9a6 100644
--- a/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
+++ b/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
@@ -18,14 +18,19 @@
  */
 package org.apache.sling.installer.factories.configuration.impl;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.Hashtable;
 
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
 public class ConfigUtilTest {
 
@@ -105,4 +110,44 @@
         assertTrue(ConfigUtil.isSameData(a, b));
         assertTrue(ConfigUtil.isSameData(b, a));
     }
+
+    @Test public void testGetOrCreateConfiguration() throws Exception {
+        Configuration c1 = Mockito.mock(Configuration.class);
+        Configuration c2 = Mockito.mock(Configuration.class);
+        ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(service.pid=c1))"))
+                .thenReturn(new Configuration[] {c1});
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(service.pid=a.b.c.c1))"))
+                .thenReturn(new Configuration[] {c2});
+        Configuration cfg = ConfigUtil.getConfiguration(cm, "a.b.c", "c1");
+        assertSame(c1, cfg);
+    }
+
+    @Test public void testGetOrCreateConfigurationFactoryPrefix() throws Exception {
+        Configuration c1 = Mockito.mock(Configuration.class);
+        Configuration c2 = Mockito.mock(Configuration.class);
+        ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(service.pid=a.b.c.c1))"))
+                .thenReturn(new Configuration[] {c1});
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(org.apache.sling.installer.osgi.factoryaliaspid=c1))"))
+                .thenReturn(new Configuration[] {c2});
+        Configuration cfg = ConfigUtil.getConfiguration(cm, "a.b.c", "c1");
+        assertSame(c1, cfg);
+
+        assertNull(ConfigUtil.getConfiguration(cm, "a.b.c", "c2"));
+    }
+
+    @Test public void testGetOrCreateConfigurationAliasKey() throws Exception {
+        Configuration c1 = Mockito.mock(Configuration.class);
+        ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+        Mockito.when(cm.listConfigurations(
+                "(&(service.factoryPid=a.b.c)(org.apache.sling.installer.osgi.factoryaliaspid=c1))"))
+                .thenReturn(new Configuration[] {c1});
+        Configuration cfg = ConfigUtil.getConfiguration(cm, "a.b.c", "c1");
+        assertSame(c1, cfg);
+    }
 }
