diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
index 37d3668..7ecfd79 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
@@ -426,8 +426,6 @@
 
                 BigInteger opId = operationId.uint64();
 
-                // TODO do we care about dpn.direction()?
-
                 DefaultContexts convertContext = convertContext(context);
                 if (commands.contains("downlink")) {
                     if (context.dl().lifetime() >= 0L) {
@@ -449,6 +447,7 @@
                             cacheManager.contextsCache.put(convertContext.contextId(), Optional.of(convertContext));
                         }));
                     } else {
+                        throw new RuntimeException("Unimplemented.");
                         // TODO delete bearer
                     }
                 }
@@ -473,6 +472,7 @@
                         }));
                     } else {
                         // TODO delete bearer
+                        throw new RuntimeException("Unimplemented.");
                     }
                 }
             }
@@ -720,7 +720,7 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), configureDpn)) {
                     DefaultConfigureDpnInput input = (DefaultConfigureDpnInput) modelObject;
-                    log.info("configure-dpn event {}", input);
+                    log.debug("configure-dpn event {}", input);
                     switch (input.operation().enumeration()) {
                         case ADD:
                             configureDpnOutput = configureDpnAdd(input);
@@ -758,8 +758,7 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), configure)) {
                     DefaultConfigureInput input = (DefaultConfigureInput) modelObject;
-                    log.info("configure event {}", input);
-                    log.info("info: {}\ninput: {}", clientInfo, input);
+                    log.debug("configure event {}", input);
                     if (!clientInfo.containsKey(input.clientId())) {
                         throw new RuntimeException("Client Identifier is not registered.");
                     }
@@ -819,7 +818,7 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), configureBundles)) {
                     DefaultConfigureBundlesInput input = (DefaultConfigureBundlesInput) modelObject;
-                    log.info("configure-bundles event {}", input);
+                    log.debug("configure-bundles event {}", input);
                     if (!clientInfo.containsKey(input.clientId())) {
                         throw new RuntimeException("Client Identifier is not registered.");
                     }
@@ -914,7 +913,7 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), registerClient)) {
                     DefaultRegisterClientInput input = (DefaultRegisterClientInput) modelObject;
-                    log.info("register-client event {}", input);
+                    log.debug("register-client event {}", input);
                     if (clientInfo.containsKey(input.clientId())) {
                         throw new RuntimeException("Client already registered.");
                     }
@@ -970,7 +969,7 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), registerClient)) {
                     DefaultRegisterClientInput input = (DefaultRegisterClientInput) modelObject;
-                    log.info("deregister-client event {}", input);
+                    log.debug("deregister-client event {}", input);
                     if (!clientInfo.containsKey(input.clientId())) {
                         throw new RuntimeException("Client does not exist.");
                     }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java
index fd44fce..0332312 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java
@@ -197,7 +197,6 @@
                 uint32_t op_id;
             } create_session_msg;
          */
-        // TODO: check if subscriber is open.
         ByteBuffer bb = ByteBuffer.allocate(41)
                 .put(topic_id)
                 .put(s11MsgType.CREATE_SESSION.getType())
