diff --git a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfController.java b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfController.java
index cd935b5..1cc7b81 100755
--- a/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfController.java
+++ b/protocols/ospf/api/src/main/java/org/onosproject/ospf/controller/OspfController.java
@@ -1,109 +1,90 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed 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.onosproject.ospf.controller;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Abstraction of an OSPF controller.
- * Serves as a one stop shop for obtaining OSPF devices and (un)register listeners on OSPF events.
- */
-public interface OspfController {
-
-    /**
-     * Registers a listener for router meta events.
-     *
-     * @param listener the listener to notify
-     */
-    void addRouterListener(OspfRouterListener listener);
-
-    /**
-     * Unregisters a router listener.
-     *
-     * @param listener the listener to unregister
-     */
-    void removeRouterListener(OspfRouterListener listener);
-
-    /**
-     * Registers a listener for OSPF message events.
-     *
-     * @param listener the listener to notify
-     */
-    void addLinkListener(OspfLinkListener listener);
-
-    /**
-     * Unregisters a link listener.
-     *
-     * @param listener the listener to unregister
-     */
-    void removeLinkListener(OspfLinkListener listener);
-
-    /**
-     * Updates configuration of processes.
-     *
-     * @param processes process info to update
-     */
-    public void updateConfig(List<OspfProcess> processes);
-
-    /**
-     * Deletes configuration parameters.
-     *
-     * @param processes list of process instance
-     * @param attribute attribute to delete
-     */
-    public void deleteConfig(List<OspfProcess> processes, String attribute);
-
-    /**
-     * Gets string representation of area configuration parameters to be displayed after CLI command.
-     *
-     * @param processId process Id
-     * @param areaId    area Id
-     * @return Area Information
-     */
-    public String showAreaParameters(String processId, String areaId);
-
-    /**
-     * Gets string representation of area configuration information for the given area/process.
-     * This method will be called for CLI command.
-     *
-     * @param processId process id to which area belongs
-     * @param areaId    area id
-     * @return string representation of area configuration for CLI display
-     */
-    List<String> showAreaConfigurations(String processId, String areaId);
-
-    /**
-     * Gets the list of listeners registered for router events.
-     *
-     * @return list of listeners
-     */
-    Set<OspfRouterListener> listener();
-
-    /**
-     * Gets the list of listeners registered for link events.
-     *
-     * @return list of listeners
-     */
-    public Set<OspfLinkListener> linkListener();
-
-    /**
-     * Gets the configured process.
-     *
-     * @return list of process instances
-     */
-    public List<OspfProcess> getAllConfiguredProcesses();
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed 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.onosproject.ospf.controller;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Abstraction of an OSPF controller.
+ * Serves as a one stop shop for obtaining OSPF devices and (un)register listeners on OSPF events.
+ */
+public interface OspfController {
+
+    /**
+     * Registers a listener for router meta events.
+     *
+     * @param listener the listener to notify
+     */
+    void addRouterListener(OspfRouterListener listener);
+
+    /**
+     * Unregisters a router listener.
+     *
+     * @param listener the listener to unregister
+     */
+    void removeRouterListener(OspfRouterListener listener);
+
+    /**
+     * Registers a listener for OSPF message events.
+     *
+     * @param listener the listener to notify
+     */
+    void addLinkListener(OspfLinkListener listener);
+
+    /**
+     * Unregisters a link listener.
+     *
+     * @param listener the listener to unregister
+     */
+    void removeLinkListener(OspfLinkListener listener);
+
+    /**
+     * Updates configuration of processes.
+     *
+     * @param processes process info to update
+     */
+    public void updateConfig(List<OspfProcess> processes);
+
+    /**
+     * Deletes configuration parameters.
+     *
+     * @param processes list of process instance
+     * @param attribute attribute to delete
+     */
+    public void deleteConfig(List<OspfProcess> processes, String attribute);
+
+    /**
+     * Gets the list of listeners registered for router events.
+     *
+     * @return list of listeners
+     */
+    Set<OspfRouterListener> listener();
+
+    /**
+     * Gets the list of listeners registered for link events.
+     *
+     * @return list of listeners
+     */
+    public Set<OspfLinkListener> linkListener();
+
+    /**
+     * Gets the configured process.
+     *
+     * @return list of process instances
+     */
+    public List<OspfProcess> getAllConfiguredProcesses();
 }
\ No newline at end of file
