diff --git a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
index d99a183..7ce5669 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
@@ -35,14 +35,14 @@
         description = "Manages network configuration")
 public class NetworkConfigCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "subjectKey", description = "Subject key",
+    @Argument(index = 0, name = "subjectClassKey", description = "Subject class key",
+            required = false, multiValued = false)
+    String subjectClassKey = null;
+
+    @Argument(index = 1, name = "subjectKey", description = "Subject key",
             required = false, multiValued = false)
     String subjectKey = null;
 
-    @Argument(index = 1, name = "subject", description = "Subject",
-            required = false, multiValued = false)
-    String subject = null;
-
     @Argument(index = 2, name = "configKey", description = "Config key",
             required = false, multiValued = false)
     String configKey = null;
@@ -54,18 +54,18 @@
     protected void execute() {
         service = get(NetworkConfigService.class);
         JsonNode root = mapper.createObjectNode();
-        if (isNullOrEmpty(subjectKey)) {
+        if (isNullOrEmpty(subjectClassKey)) {
             addAll((ObjectNode) root);
         } else {
-            SubjectFactory subjectFactory = service.getSubjectFactory(subjectKey);
-            if (isNullOrEmpty(subject)) {
+            SubjectFactory subjectFactory = service.getSubjectFactory(subjectClassKey);
+            if (isNullOrEmpty(subjectKey)) {
                 addSubjectClass((ObjectNode) root, subjectFactory);
             } else {
-                Object s = subjectFactory.createSubject(subject);
+                Object s = subjectFactory.createSubject(subjectKey);
                 if (isNullOrEmpty(configKey)) {
                     addSubject((ObjectNode) root, s);
                 } else {
-                    root = getSubjectConfig(getConfig(s, subjectKey, configKey));
+                    root = getSubjectConfig(getConfig(s, subjectClassKey, configKey));
                 }
             }
         }
@@ -82,14 +82,14 @@
         service.getSubjectClasses()
                 .forEach(sc -> {
                     SubjectFactory sf = service.getSubjectFactory(sc);
-                    addSubjectClass(newObject(root, sf.subjectKey()), sf);
+                    addSubjectClass(newObject(root, sf.subjectClassKey()), sf);
                 });
     }
 
     @SuppressWarnings("unchecked")
     private void addSubjectClass(ObjectNode root, SubjectFactory sf) {
         service.getSubjects(sf.subjectClass())
-                .forEach(s -> addSubject(newObject(root, s.toString()), s));
+                .forEach(s -> addSubject(newObject(root, sf.subjectKey(s)), s));
     }
 
     private void addSubject(ObjectNode root, Object s) {
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java
index f94967e..cf58877 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java
@@ -42,7 +42,7 @@
 
     private void print(ConfigFactory configFactory) {
         print(shortOnly ? SHORT_FMT : FMT,
-              configFactory.subjectFactory().subjectKey(),
+              configFactory.subjectFactory().subjectClassKey(),
               configFactory.configKey(),
               configFactory.subjectFactory().subjectClass().getName(),
               configFactory.configClass().getName());
diff --git a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
index c1eed98..8eb69a45 100644
--- a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
+++ b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
@@ -41,27 +41,27 @@
     /**
      * Returns the subject factory with the specified key.
      *
-     * @param subjectKey subject class key
+     * @param subjectClassKey subject class key
      * @return subject class
      */
-    SubjectFactory getSubjectFactory(String subjectKey);
+    SubjectFactory getSubjectFactory(String subjectClassKey);
 
     /**
      * Returns the subject factory for the specified class.
      *
      * @param subjectClass subject class
-     * @return subject class key
+     * @return subject class factory
      */
     SubjectFactory getSubjectFactory(Class subjectClass);
 
     /**
      * Returns the configuration class with the specified key.
      *
-     * @param subjectKey subject class key
-     * @param configKey  subject class name
+     * @param subjectClassKey subject class key
+     * @param configKey       subject class name
      * @return subject class
      */
-    Class<? extends Config> getConfigClass(String subjectKey, String configKey);
+    Class<? extends Config> getConfigClass(String subjectClassKey, String configKey);
 
     /**
      * Returns the set of subjects for which some configuration is available.
diff --git a/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java b/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java
index cd2db34..f992d72 100644
--- a/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java
+++ b/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java
@@ -28,7 +28,7 @@
 public abstract class SubjectFactory<S> {
 
     private final Class<S> subjectClass;
-    private final String subjectKey;
+    private final String subjectClassKey;
 
     /**
      * Creates a new configuration factory for the specified class of subjects
@@ -36,12 +36,12 @@
      * subject and configuration class keys are used merely as keys for use in
      * composite JSON trees.
      *
-     * @param subjectClass subject class
-     * @param subjectKey   subject class key
+     * @param subjectClass    subject class
+     * @param subjectClassKey subject class key
      */
-    protected SubjectFactory(Class<S> subjectClass, String subjectKey) {
+    protected SubjectFactory(Class<S> subjectClass, String subjectClassKey) {
         this.subjectClass = subjectClass;
-        this.subjectKey = subjectKey;
+        this.subjectClassKey = subjectClassKey;
     }
 
     /**
@@ -60,8 +60,20 @@
      *
      * @return configuration key
      */
-    public String subjectKey() {
-        return subjectKey;
+    public String subjectClassKey() {
+        return subjectClassKey;
+    }
+
+    /**
+     * Returns the unique key of the specified configuration subject.
+     * This is primarily aimed for use in composite JSON trees in external
+     * representations and has no bearing on the internal behaviours.
+     *
+     * @param subject specific subject
+     * @return subject key
+     */
+    public String subjectKey(S subject) {
+        return subject.toString();
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java b/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java
index 884f2e2..311566b 100644
--- a/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java
+++ b/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java
@@ -43,6 +43,10 @@
                 public ApplicationId createSubject(String key) {
                     return coreService.registerApplication(key);
                 }
+                @Override
+                public String subjectKey(ApplicationId subject) {
+                    return subject.name();
+                }
             };
 
     public static final SubjectFactory<DeviceId> DEVICE_SUBJECT_FACTORY =
@@ -59,6 +63,10 @@
                 public ConnectPoint createSubject(String key) {
                     return ConnectPoint.deviceConnectPoint(key);
                 }
+                @Override
+                public String subjectKey(ConnectPoint subject) {
+                    return key(subject);
+                }
             };
 
     public static final SubjectFactory<HostId> HOST_SUBJECT_FACTORY =
@@ -78,6 +86,10 @@
                     return LinkKey.linkKey(ConnectPoint.deviceConnectPoint(cps[0]),
                                            ConnectPoint.deviceConnectPoint(cps[1]));
                 }
+                @Override
+                public String subjectKey(LinkKey subject) {
+                    return key(subject.src()) + "-" + key(subject.dst());
+                }
             };
 
     /**
@@ -90,4 +102,8 @@
         coreService = service;
     }
 
+    private static String key(ConnectPoint subject) {
+        return subject.deviceId() + "/" + subject.port();
+    }
+
 }
diff --git a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
index b70d14e..7307258 100644
--- a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
@@ -29,7 +29,7 @@
     }
 
     @Override
-    public SubjectFactory getSubjectFactory(String subjectKey) {
+    public SubjectFactory getSubjectFactory(String subjectClassKey) {
         return null;
     }
 
@@ -39,7 +39,7 @@
     }
 
     @Override
-    public Class<? extends Config> getConfigClass(String subjectKey, String configKey) {
+    public Class<? extends Config> getConfigClass(String subjectClassKey, String configKey) {
         return null;
     }
 
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
index 5cd96ca..db484ee 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
@@ -96,7 +96,7 @@
         configClasses.put(identifier(configFactory), configFactory.configClass());
 
         SubjectFactory subjectFactory = configFactory.subjectFactory();
-        subjectClasses.putIfAbsent(subjectFactory.subjectKey(), subjectFactory);
+        subjectClasses.putIfAbsent(subjectFactory.subjectClassKey(), subjectFactory);
         subjectClassKeys.putIfAbsent(subjectFactory.subjectClass(), subjectFactory);
 
         store.addConfigFactory(configFactory);
@@ -145,8 +145,8 @@
     }
 
     @Override
-    public SubjectFactory getSubjectFactory(String subjectKey) {
-        return subjectClasses.get(subjectKey);
+    public SubjectFactory getSubjectFactory(String subjectClassKey) {
+        return subjectClasses.get(subjectClassKey);
     }
 
     @Override
@@ -155,8 +155,8 @@
     }
 
     @Override
-    public Class<? extends Config> getConfigClass(String subjectKey, String configKey) {
-        return configClasses.get(new ConfigIdentifier(subjectKey, configKey));
+    public Class<? extends Config> getConfigClass(String subjectClassKey, String configKey) {
+        return configClasses.get(new ConfigIdentifier(subjectClassKey, configKey));
     }
 
     @Override
@@ -255,7 +255,7 @@
     }
 
     private static ConfigIdentifier identifier(ConfigFactory factory) {
-        return new ConfigIdentifier(factory.subjectFactory().subjectKey(), factory.configKey());
+        return new ConfigIdentifier(factory.subjectFactory().subjectClassKey(), factory.configKey());
     }
 
     static final class ConfigIdentifier {
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
index 9e2b627..808fcc1 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
@@ -49,73 +49,77 @@
     public Response download() {
         NetworkConfigService service = get(NetworkConfigService.class);
         ObjectNode root = mapper().createObjectNode();
-        service.getSubjectClasses().forEach(sc ->
-            produceJson(service, newObject(root, service.getSubjectFactory(sc).subjectKey()), sc));
+        service.getSubjectClasses().forEach(sc -> {
+            SubjectFactory subjectFactory = service.getSubjectFactory(sc);
+            produceJson(service, newObject(root, subjectFactory.subjectClassKey()),
+                        subjectFactory, sc);
+        });
         return ok(root).build();
     }
 
     /**
      * Get all network configuration for a subject class.
      *
-     * @param subjectKey subject class key
+     * @param subjectClassKey subject class key
      * @return network configuration JSON
      */
     @GET
-    @Path("{subjectKey}")
+    @Path("{subjectClassKey}")
     @Produces(MediaType.APPLICATION_JSON)
     @SuppressWarnings("unchecked")
-    public Response download(@PathParam("subjectKey") String subjectKey) {
+    public Response download(@PathParam("subjectClassKey") String subjectClassKey) {
         NetworkConfigService service = get(NetworkConfigService.class);
         ObjectNode root = mapper().createObjectNode();
-        produceJson(service, root, service.getSubjectFactory(subjectKey).subjectClass());
+        SubjectFactory subjectFactory = service.getSubjectFactory(subjectClassKey);
+        produceJson(service, root, subjectFactory, subjectFactory.subjectClass());
         return ok(root).build();
     }
 
     /**
-     * Get all network configuration for a subject.
+     * Get all network configuration for a subjectKey.
      *
-     * @param subjectKey subject class key
-     * @param subject    subject key
+     * @param subjectClassKey subjectKey class key
+     * @param subjectKey      subjectKey key
      * @return network configuration JSON
      */
     @GET
-    @Path("{subjectKey}/{subject}")
+    @Path("{subjectClassKey}/{subjectKey}")
     @Produces(MediaType.APPLICATION_JSON)
     @SuppressWarnings("unchecked")
-    public Response download(@PathParam("subjectKey") String subjectKey,
-                             @PathParam("subject") String subject) {
+    public Response download(@PathParam("subjectClassKey") String subjectClassKey,
+                             @PathParam("subjectKey") String subjectKey) {
         NetworkConfigService service = get(NetworkConfigService.class);
         ObjectNode root = mapper().createObjectNode();
-        produceSubjectJson(service, root,
-                           service.getSubjectFactory(subjectKey).createSubject(subject));
+        SubjectFactory subjectFactory = service.getSubjectFactory(subjectClassKey);
+        produceSubjectJson(service, root, subjectFactory.createSubject(subjectKey));
         return ok(root).build();
     }
 
     /**
-     * Get specific network configuration for a subject.
+     * Get specific network configuration for a subjectKey.
      *
-     * @param subjectKey subject class key
-     * @param subject    subject key
-     * @param configKey  configuration class key
+     * @param subjectClassKey subjectKey class key
+     * @param subjectKey      subjectKey key
+     * @param configKey       configuration class key
      * @return network configuration JSON
      */
     @GET
-    @Path("{subjectKey}/{subject}/{configKey}")
+    @Path("{subjectClassKey}/{subjectKey}/{configKey}")
     @Produces(MediaType.APPLICATION_JSON)
     @SuppressWarnings("unchecked")
-    public Response download(@PathParam("subjectKey") String subjectKey,
-                             @PathParam("subject") String subject,
+    public Response download(@PathParam("subjectClassKey") String subjectClassKey,
+                             @PathParam("subjectKey") String subjectKey,
                              @PathParam("configKey") String configKey) {
         NetworkConfigService service = get(NetworkConfigService.class);
-        return ok(service.getConfig(service.getSubjectFactory(subjectKey).createSubject(subject),
-                                    service.getConfigClass(subjectKey, configKey)).node()).build();
+        return ok(service.getConfig(service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
+                                    service.getConfigClass(subjectClassKey, configKey)).node()).build();
     }
 
     @SuppressWarnings("unchecked")
     private void produceJson(NetworkConfigService service, ObjectNode node,
-                             Class subjectClass) {
+                             SubjectFactory subjectFactory, Class subjectClass) {
         service.getSubjects(subjectClass).forEach(s ->
-            produceSubjectJson(service, newObject(node, s.toString()), s));
+            produceSubjectJson(service, newObject(node, subjectFactory.subjectKey(s)), s));
     }
 
     private void produceSubjectJson(NetworkConfigService service, ObjectNode node,
@@ -128,8 +132,8 @@
      * Upload bulk network configuration.
      *
      * @param request network configuration JSON rooted at the top node
-     * @throws IOException if unable to parse the request
      * @return empty response
+     * @throws IOException if unable to parse the request
      */
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
@@ -146,78 +150,78 @@
     /**
      * Upload multiple network configurations for a subject class.
      *
-     * @param subjectKey subject class key
-     * @param request    network configuration JSON rooted at the top node
+     * @param subjectClassKey subject class key
+     * @param request         network configuration JSON rooted at the top node
      * @return empty response
      * @throws IOException if unable to parse the request
      */
     @POST
-    @Path("{subjectKey}")
+    @Path("{subjectClassKey}")
     @Consumes(MediaType.APPLICATION_JSON)
     @SuppressWarnings("unchecked")
-    public Response upload(@PathParam("subjectKey") String subjectKey,
+    public Response upload(@PathParam("subjectClassKey") String subjectClassKey,
                            InputStream request) throws IOException {
         NetworkConfigService service = get(NetworkConfigService.class);
         ObjectNode root = (ObjectNode) mapper().readTree(request);
-        consumeJson(service, root, service.getSubjectFactory(subjectKey));
+        consumeJson(service, root, service.getSubjectFactory(subjectClassKey));
         return Response.ok().build();
     }
 
     /**
-     * Upload mutliple network configurations for a subject.
+     * Upload mutliple network configurations for a subjectKey.
      *
-     * @param subjectKey subject class key
-     * @param subject    subject key
-     * @param request    network configuration JSON rooted at the top node
+     * @param subjectClassKey subjectKey class key
+     * @param subjectKey      subjectKey key
+     * @param request         network configuration JSON rooted at the top node
      * @return empty response
      * @throws IOException if unable to parse the request
      */
     @POST
-    @Path("{subjectKey}/{subject}")
+    @Path("{subjectClassKey}/{subjectKey}")
     @Consumes(MediaType.APPLICATION_JSON)
     @SuppressWarnings("unchecked")
-    public Response upload(@PathParam("subjectKey") String subjectKey,
-                           @PathParam("subject") String subject,
+    public Response upload(@PathParam("subjectClassKey") String subjectClassKey,
+                           @PathParam("subjectKey") String subjectKey,
                            InputStream request) throws IOException {
         NetworkConfigService service = get(NetworkConfigService.class);
         ObjectNode root = (ObjectNode) mapper().readTree(request);
         consumeSubjectJson(service, root,
-                           service.getSubjectFactory(subjectKey).createSubject(subject),
-                           subjectKey);
+                           service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
+                           subjectClassKey);
         return Response.ok().build();
     }
 
     /**
-     * Upload specific network configuration for a subject.
+     * Upload specific network configuration for a subjectKey.
      *
-     * @param subjectKey subject class key
-     * @param subject    subject key
-     * @param configKey  configuration class key
-     * @param request    network configuration JSON rooted at the top node
+     * @param subjectClassKey subjectKey class key
+     * @param subjectKey      subjectKey key
+     * @param configKey       configuration class key
+     * @param request         network configuration JSON rooted at the top node
      * @return empty response
      * @throws IOException if unable to parse the request
      */
     @POST
-    @Path("{subjectKey}/{subject}/{configKey}")
+    @Path("{subjectClassKey}/{subjectKey}/{configKey}")
     @Consumes(MediaType.APPLICATION_JSON)
     @SuppressWarnings("unchecked")
-    public Response upload(@PathParam("subjectKey") String subjectKey,
-                           @PathParam("subject") String subject,
+    public Response upload(@PathParam("subjectClassKey") String subjectClassKey,
+                           @PathParam("subjectKey") String subjectKey,
                            @PathParam("configKey") String configKey,
                            InputStream request) throws IOException {
         NetworkConfigService service = get(NetworkConfigService.class);
         ObjectNode root = (ObjectNode) mapper().readTree(request);
-        service.applyConfig(service.getSubjectFactory(subjectKey).createSubject(subject),
-                            service.getConfigClass(subjectKey, configKey), root);
+        service.applyConfig(service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
+                            service.getConfigClass(subjectClassKey, configKey), root);
         return Response.ok().build();
     }
 
     private void consumeJson(NetworkConfigService service, ObjectNode classNode,
                              SubjectFactory subjectFactory) {
         classNode.fieldNames().forEachRemaining(s ->
-                                                        consumeSubjectJson(service, (ObjectNode) classNode.path(s),
-                                                                           subjectFactory.createSubject(s),
-                                                                           subjectFactory.subjectKey()));
+            consumeSubjectJson(service, (ObjectNode) classNode.path(s),
+                               subjectFactory.createSubject(s),
+                               subjectFactory.subjectClassKey()));
     }
 
     private void consumeSubjectJson(NetworkConfigService service,
@@ -225,7 +229,7 @@
                                     String subjectKey) {
         subjectNode.fieldNames().forEachRemaining(c ->
             service.applyConfig(subject, service.getConfigClass(subjectKey, c),
-                                (ObjectNode) subjectNode.path(c)));
+                                subjectNode.path(c)));
     }
 
 
@@ -241,64 +245,62 @@
         service.getSubjectClasses()
                 .forEach(subjectClass -> service.getSubjects(subjectClass)
                         .forEach(subject -> service.getConfigs(subject)
-                                .forEach(config -> service
-                                        .removeConfig(subject, config.getClass()))));
+                                .forEach(config -> service.removeConfig(subject, config.getClass()))));
         return Response.ok().build();
     }
 
     /**
      * Clear all network configurations for a subject class.
      *
-     * @param subjectKey subject class key
+     * @param subjectClassKey subject class key
      * @return empty response
      */
     @DELETE
-    @Path("{subjectKey}")
+    @Path("{subjectClassKey}")
     @SuppressWarnings("unchecked")
-    public Response delete(@PathParam("subjectKey") String subjectKey) {
+    public Response delete(@PathParam("subjectClassKey") String subjectClassKey) {
         NetworkConfigService service = get(NetworkConfigService.class);
-        service.getSubjects(service.getSubjectFactory(subjectKey).getClass())
+        service.getSubjects(service.getSubjectFactory(subjectClassKey).getClass())
                 .forEach(subject -> service.getConfigs(subject)
-                        .forEach(config -> service
-                                .removeConfig(subject, config.getClass())));
+                        .forEach(config -> service.removeConfig(subject, config.getClass())));
         return Response.ok().build();
     }
 
     /**
-     * Clear all network configurations for a subject.
+     * Clear all network configurations for a subjectKey.
      *
-     * @param subjectKey subject class key
-     * @param subject    subject key
+     * @param subjectClassKey subjectKey class key
+     * @param subjectKey      subjectKey key
      * @return empty response
      */
     @DELETE
-    @Path("{subjectKey}/{subject}")
+    @Path("{subjectClassKey}/{subjectKey}")
     @SuppressWarnings("unchecked")
-    public Response delete(@PathParam("subjectKey") String subjectKey,
-                           @PathParam("subject") String subject) {
+    public Response delete(@PathParam("subjectClassKey") String subjectClassKey,
+                           @PathParam("subjectKey") String subjectKey) {
         NetworkConfigService service = get(NetworkConfigService.class);
-        Object s = service.getSubjectFactory(subjectKey).createSubject(subject);
+        Object s = service.getSubjectFactory(subjectClassKey).createSubject(subjectKey);
         service.getConfigs(s).forEach(c -> service.removeConfig(s, c.getClass()));
         return Response.ok().build();
     }
 
     /**
-     * Clear specific network configuration for a subject.
+     * Clear specific network configuration for a subjectKey.
      *
-     * @param subjectKey subject class key
-     * @param subject    subject key
-     * @param configKey  configuration class key
+     * @param subjectClassKey subjectKey class key
+     * @param subjectKey      subjectKey key
+     * @param configKey       configuration class key
      * @return empty response
      */
     @DELETE
-    @Path("{subjectKey}/{subject}/{configKey}")
+    @Path("{subjectClassKey}/{subjectKey}/{configKey}")
     @SuppressWarnings("unchecked")
-    public Response delete(@PathParam("subjectKey") String subjectKey,
-                           @PathParam("subject") String subject,
+    public Response delete(@PathParam("subjectClassKey") String subjectClassKey,
+                           @PathParam("subjectKey") String subjectKey,
                            @PathParam("configKey") String configKey) {
         NetworkConfigService service = get(NetworkConfigService.class);
-        service.removeConfig(service.getSubjectFactory(subjectKey).createSubject(subject),
-                             service.getConfigClass(subjectKey, configKey));
+        service.removeConfig(service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
+                             service.getConfigClass(subjectClassKey, configKey));
         return Response.ok().build();
     }
 
