diff --git a/deployer/api/src/main/java/org/apache/karaf/cave/deployer/api/Deployer.java b/deployer/api/src/main/java/org/apache/karaf/cave/deployer/api/Deployer.java
index b9c42a0..a2f5014 100644
--- a/deployer/api/src/main/java/org/apache/karaf/cave/deployer/api/Deployer.java
+++ b/deployer/api/src/main/java/org/apache/karaf/cave/deployer/api/Deployer.java
@@ -189,6 +189,26 @@
     void createConfig(String pid, String connection) throws Exception;
 
     /**
+     * Create an empty configuration factory on a Karaf instance.
+     */
+    String createConfigurationFactory(String factoryPid, String connection) throws Exception;
+
+    /**
+     * Create an empty configuration factory on a Karaf instance.
+     */
+    String createConfigurationFactory(String factoryPid, String alias, String connection) throws Exception;
+
+    /**
+     * Create a configuration factory on a Karaf instance.
+     */
+    String createConfigurationFactory(String factoryPid, Map<String, String> properties, String connection) throws Exception;
+
+    /**
+     * Create a configuration factory on a Karaf instance.
+     */
+    String createConfigurationFactory(String factoryPid, String alias, Map<String, String> properties, String connection) throws Exception;
+
+    /**
      * Simple remote operation to get the properties of a given configuration on a remote Karaf instance.
      */
     Map<String, String> configProperties(String pid, String connection) throws Exception;
diff --git a/deployer/command/src/main/java/org/apache/karaf/cave/deployer/command/ConfigFactoryCreateCommand.java b/deployer/command/src/main/java/org/apache/karaf/cave/deployer/command/ConfigFactoryCreateCommand.java
new file mode 100644
index 0000000..af2ac5c
--- /dev/null
+++ b/deployer/command/src/main/java/org/apache/karaf/cave/deployer/command/ConfigFactoryCreateCommand.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.cave.deployer.command;
+
+import org.apache.karaf.cave.deployer.api.Deployer;
+import org.apache.karaf.cave.deployer.command.completers.ConnectionCompleter;
+import org.apache.karaf.shell.api.action.Action;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Reference;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+
+@Service
+@Command(scope = "cave", name = "deployer-config-factory-create", description = "Create a configuration factory on remote instance")
+public class ConfigFactoryCreateCommand implements Action {
+
+    @Reference
+    private Deployer deployer;
+
+    @Argument(index = 0, name = "connection", description = "The connection to use", required = true, multiValued = false)
+    @Completion(ConnectionCompleter.class)
+    String connection;
+
+    @Argument(index = 1, name = "factoryPid", description = "The factory PID to create", required = true, multiValued = false)
+    String factoryPid;
+
+    @Argument(index = 2, name = "alias", description = "The alias", required = false, multiValued = false)
+    String alias = null;
+
+    @Override
+    public Object execute() throws Exception {
+        String configPid;
+        if (alias != null && !alias.isEmpty()) {
+            configPid = deployer.createConfigurationFactory(factoryPid, alias, connection);
+        } else {
+            configPid = deployer.createConfigurationFactory(factoryPid, connection);
+        }
+        System.out.println(configPid);
+        return null;
+    }
+
+}
diff --git a/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/CaveDeployerMBean.java b/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/CaveDeployerMBean.java
index b96b7be..ef9d37e 100644
--- a/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/CaveDeployerMBean.java
+++ b/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/CaveDeployerMBean.java
@@ -52,6 +52,10 @@
 
     List<String> configs(String connection) throws Exception;
     void createConfig(String pid, String connection) throws Exception;
+    String createConfigFactory(String factoryPid, String connection) throws Exception;
+    String createConfigFactory(String factoryPid, String alias, String connection) throws Exception;
+    String createConfigFactory(String factoryPid, Map<String, String> properties, String connection) throws Exception;
+    String createConfigFactory(String factoryPid, String alias, Map<String, String> properties, String connection) throws Exception;
     Map<String, String> getConfigProperties(String pid, String connection) throws Exception;
     void deleteConfig(String pid, String connection) throws Exception;
     void appendConfigProperty(String pid, String key, String value, String connection) throws Exception;
diff --git a/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/internal/CaveDeployerMBeanImpl.java b/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/internal/CaveDeployerMBeanImpl.java
index a9410fd..3f4db03 100644
--- a/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/internal/CaveDeployerMBeanImpl.java
+++ b/deployer/management/src/main/java/org/apache/karaf/cave/deployer/management/internal/CaveDeployerMBeanImpl.java
@@ -248,6 +248,26 @@
     }
 
     @Override
+    public String createConfigFactory(String factoryPid, String connection) throws Exception {
+        return deployer.createConfigurationFactory(factoryPid, connection);
+    }
+
+    @Override
+    public String createConfigFactory(String factoryPid, String alias, String connection) throws Exception {
+        return deployer.createConfigurationFactory(factoryPid, alias, connection);
+    }
+
+    @Override
+    public String createConfigFactory(String factoryPid, Map<String, String> properties, String connection) throws Exception {
+        return deployer.createConfigurationFactory(factoryPid, properties, connection);
+    }
+
+    @Override
+    public String createConfigFactory(String factoryPid, String alias, Map<String, String> properties, String connection) throws Exception {
+        return deployer.createConfigurationFactory(factoryPid, alias, properties, connection);
+    }
+
+    @Override
     public Map<String, String> getConfigProperties(String pid, String connection) throws Exception {
         return deployer.configProperties(pid, connection);
     }
diff --git a/deployer/service/src/main/java/org/apache/karaf/cave/deployer/service/impl/DeployerImpl.java b/deployer/service/src/main/java/org/apache/karaf/cave/deployer/service/impl/DeployerImpl.java
index eef6d00..46d9fc0 100644
--- a/deployer/service/src/main/java/org/apache/karaf/cave/deployer/service/impl/DeployerImpl.java
+++ b/deployer/service/src/main/java/org/apache/karaf/cave/deployer/service/impl/DeployerImpl.java
@@ -849,6 +849,82 @@
     }
 
     @Override
+    public String createConfigurationFactory(String factoryPid, String connectionName) throws Exception {
+        Connection connection = getConnection(connectionName);
+        JMXConnector jmxConnector = connect(connection.getJmxUrl(),
+                connection.getKarafName(),
+                connection.getUser(),
+                connection.getPassword());
+        try {
+            MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
+            ObjectName name = new ObjectName("org.apache.karaf:type=config,name=" + connection.getKarafName());
+            String configPid = (String) mBeanServerConnection.invoke(name, "createFactoryConfiguration", new Object[]{ factoryPid }, new String[]{ String.class.getName() });
+            return configPid;
+        } finally {
+            if (jmxConnector != null) {
+                jmxConnector.close();
+            }
+        }
+    }
+
+    @Override
+    public String createConfigurationFactory(String factoryPid, String alias, String connectionName) throws Exception {
+        Connection connection = getConnection(connectionName);
+        JMXConnector jmxConnector = connect(connection.getJmxUrl(),
+                connection.getKarafName(),
+                connection.getUser(),
+                connection.getPassword());
+        try {
+            MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
+            ObjectName name = new ObjectName("org.apache.karaf:type=config,name=" + connection.getKarafName());
+            String configPid = (String) mBeanServerConnection.invoke(name, "createFactoryConfiguration", new Object[] { factoryPid, alias }, new String[]{ String.class.getName(), String.class.getName() });
+            return configPid;
+        } finally {
+            if (jmxConnector != null) {
+                jmxConnector.close();
+            }
+        }
+    }
+
+    @Override
+    public String createConfigurationFactory(String factoryPid, Map<String, String> properties, String connectionName) throws Exception {
+        Connection connection = getConnection(connectionName);
+        JMXConnector jmxConnector = connect(connection.getJmxUrl(),
+                connection.getKarafName(),
+                connection.getUser(),
+                connection.getPassword());
+        try {
+            MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
+            ObjectName name = new ObjectName("org.apache.karaf:type=config,name=" + connection.getKarafName());
+            String configPid = (String) mBeanServerConnection.invoke(name, "createFactoryConfiguration", new Object[] { factoryPid, properties }, new String[]{ String.class.getName(), Map.class.getName() });
+            return configPid;
+        } finally {
+            if (jmxConnector != null) {
+                jmxConnector.close();
+            }
+        }
+    }
+
+    @Override
+    public String createConfigurationFactory(String factoryPid, String alias, Map<String, String> properties, String connectionName) throws Exception {
+        Connection connection = getConnection(connectionName);
+        JMXConnector jmxConnector = connect(connection.getJmxUrl(),
+                connection.getKarafName(),
+                connection.getUser(),
+                connection.getPassword());
+        try {
+            MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
+            ObjectName name = new ObjectName("org.apache.karaf:type=config,name=" + connection.getKarafName());
+            String configPid = (String) mBeanServerConnection.invoke(name, "createFactoryConfiguration", new Object[] { factoryPid, alias, properties }, new String[]{ String.class.getName(), String.class.getName(), Map.class.getName() });
+            return configPid;
+        } finally {
+            if (jmxConnector != null) {
+                jmxConnector.close();
+            }
+        }
+    }
+
+    @Override
     public void deleteConfig(String pid, String connectionName) throws Exception {
         Connection connection = getConnection(connectionName);
         JMXConnector jmxConnector = connect(connection.getJmxUrl(),
diff --git a/rest/src/main/java/org/apache/karaf/cave/rest/DeployerRest.java b/rest/src/main/java/org/apache/karaf/cave/rest/DeployerRest.java
index 04fa81f..56ba6d2 100644
--- a/rest/src/main/java/org/apache/karaf/cave/rest/DeployerRest.java
+++ b/rest/src/main/java/org/apache/karaf/cave/rest/DeployerRest.java
@@ -405,6 +405,18 @@
         deployer.createConfig(pid, connection);
     }
 
+    @Path("/{connection}/configfactory/{pid}")
+    @POST
+    public void createConfigFactory(@PathParam("connection") String connection, @PathParam("factoryPid") String factoryPid) throws Exception {
+        deployer.createConfigurationFactory(factoryPid, connection);
+    }
+
+    @Path("/{connection}/configfactory/{pid}/{alias}")
+    @POST
+    public void createConfigFactory(@PathParam("connection") String connection, @PathParam("factoryPid") String factoryPid, @PathParam("alias") String alias) throws Exception {
+        deployer.createConfigurationFactory(factoryPid, alias, connection);
+    }
+
     @Path("/{connection}/config/{pid}")
     @DELETE
     public void deleteConfig(@PathParam("connection") String connection, @PathParam("pid") String pid) throws Exception {
