diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java
index 0444d69..9cbfbf6 100644
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java
@@ -19,13 +19,13 @@
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.onosproject.bgpio.protocol.BGPLSNlri;
-import org.onosproject.bgpio.protocol.linkstate.BGPLinkLSIdentifier;
+import org.onosproject.bgpio.protocol.BgpLSNlri;
+import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSIdentifier;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixIPv4LSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
 
 import com.google.common.base.MoreObjects;
@@ -34,16 +34,16 @@
  * Implementation of Adj-RIB-In for each peer.
  */
 public class AdjRibIn {
-    private Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
-    private Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
-    private Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
+    private Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
+    private Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
+    private Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
 
     /**
      * Returns the adjacency node.
      *
      * @return node adjacency RIB node
      */
-    public Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
+    public Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
         return nodeTree;
     }
 
@@ -52,7 +52,7 @@
      *
      * @return link adjacency RIB node
      */
-    public Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
+    public Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
         return linkTree;
     }
 
@@ -61,7 +61,7 @@
      *
      * @return prefix adjacency RIB node
      */
-    public Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
+    public Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
         return prefixTree;
     }
 
@@ -71,23 +71,23 @@
      * @param nlri NLRI Info
      * @param details has pathattribute , protocolID and identifier
      */
-    public void add(BGPLSNlri nlri, PathAttrNlriDetails details) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
-            BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+    public void add(BgpLSNlri nlri, PathAttrNlriDetails details) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
+            BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
             if (nodeTree.containsKey(nodeLSIdentifier)) {
                 nodeTree.replace(nodeLSIdentifier, details);
             } else {
                 nodeTree.put(nodeLSIdentifier, details);
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
-            BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+            BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
             if (linkTree.containsKey(linkLSIdentifier)) {
                 linkTree.replace(linkLSIdentifier, details);
             } else {
                 linkTree.put(linkLSIdentifier, details);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
-            BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
+            BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
             if (prefixTree.containsKey(prefixIdentifier)) {
                 prefixTree.replace(prefixIdentifier, details);
             } else {
@@ -101,19 +101,19 @@
      *
      * @param nlri NLRI Info
      */
-    public void remove(BGPLSNlri nlri) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
-            BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+    public void remove(BgpLSNlri nlri) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
+            BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
             if (nodeTree.containsKey(nodeLSIdentifier)) {
                 nodeTree.remove(nodeLSIdentifier);
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
-            BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+            BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
             if (linkTree.containsKey(linkLSIdentifier)) {
                 linkTree.remove(linkLSIdentifier);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
-            BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
+            BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
             if (prefixTree.containsKey(prefixIdentifier)) {
                 prefixTree.remove(prefixIdentifier);
             }
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPChannelHandler.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
similarity index 80%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPChannelHandler.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
index c467f3c..8754563 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPChannelHandler.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
@@ -40,20 +40,20 @@
 import org.jboss.netty.handler.timeout.ReadTimeoutHandler;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPId;
-import org.onosproject.bgp.controller.BGPPeer;
-import org.onosproject.bgp.controller.BGPPeerCfg;
-import org.onosproject.bgp.controller.impl.BGPControllerImpl.BGPPeerManagerImpl;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPMessage;
-import org.onosproject.bgpio.protocol.BGPOpenMsg;
-import org.onosproject.bgpio.protocol.BGPType;
-import org.onosproject.bgpio.protocol.BGPVersion;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpId;
+import org.onosproject.bgp.controller.BgpPeer;
+import org.onosproject.bgp.controller.BgpPeerCfg;
+import org.onosproject.bgp.controller.impl.BgpControllerImpl.BgpPeerManagerImpl;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpMessage;
+import org.onosproject.bgpio.protocol.BgpOpenMsg;
+import org.onosproject.bgpio.protocol.BgpType;
+import org.onosproject.bgpio.protocol.BgpVersion;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.FourOctetAsNumCapabilityTlv;
 import org.onosproject.bgpio.types.MultiProtocolExtnCapabilityTlv;
 import org.slf4j.Logger;
@@ -62,20 +62,20 @@
 /**
  * Channel handler deals with the bgp peer connection and dispatches messages from peer to the appropriate locations.
  */
-class BGPChannelHandler extends IdleStateAwareChannelHandler {
+class BgpChannelHandler extends IdleStateAwareChannelHandler {
 
-    private static final Logger log = LoggerFactory.getLogger(BGPChannelHandler.class);
+    private static final Logger log = LoggerFactory.getLogger(BgpChannelHandler.class);
     static final int BGP_MIN_HOLDTIME = 3;
     static final int BGP_MAX_KEEPALIVE_INTERVAL = 3;
-    private BGPPeer bgpPeer;
-    private BGPId thisbgpId;
+    private BgpPeer bgpPeer;
+    private BgpId thisbgpId;
     private Channel channel;
-    private BGPKeepAliveTimer keepAliveTimer = null;
+    private BgpKeepAliveTimer keepAliveTimer = null;
     private short peerHoldTime = 0;
     private short negotiatedHoldTime = 0;
     private long peerAsNum;
     private int peerIdentifier;
-    private BGPPacketStatsImpl bgpPacketStats;
+    private BgpPacketStatsImpl bgpPacketStats;
     static final int MAX_WRONG_COUNT_PACKET = 5;
     static final byte MULTI_PROTOCOL_EXTN_CAPA_TYPE = 1;
     static final byte FOUR_OCTET_AS_NUM_CAPA_TYPE = 65;
@@ -97,30 +97,30 @@
     // peer state for the older (still connected) peer
     private volatile Boolean duplicateBGPIdFound;
     // Indicates the bgp version used by this bgp peer
-    protected BGPVersion bgpVersion;
-    private BGPController bgpController;
-    protected BGPFactory factory4;
+    protected BgpVersion bgpVersion;
+    private BgpController bgpController;
+    protected BgpFactory factory4;
     private boolean isIbgpSession;
     private BgpSessionInfoImpl sessionInfo;
-    private BGPPeerManagerImpl peerManager;
+    private BgpPeerManagerImpl peerManager;
     private InetSocketAddress inetAddress;
     private IpAddress ipAddress;
     private SocketAddress address;
     private String peerAddr;
-    private BGPCfg bgpconfig;
+    private BgpCfg bgpconfig;
 
     /**
      * Create a new unconnected BGPChannelHandler.
      *
      * @param bgpController bgp controller
      */
-    BGPChannelHandler(BGPController bgpController) {
+    BgpChannelHandler(BgpController bgpController) {
         this.bgpController = bgpController;
-        this.peerManager = (BGPPeerManagerImpl) bgpController.peerManager();
+        this.peerManager = (BgpPeerManagerImpl) bgpController.peerManager();
         this.state = ChannelState.IDLE;
-        this.factory4 = Controller.getBGPMessageFactory4();
+        this.factory4 = Controller.getBgpMessageFactory4();
         this.duplicateBGPIdFound = Boolean.FALSE;
-        this.bgpPacketStats = new BGPPacketStatsImpl();
+        this.bgpPacketStats = new BgpPacketStatsImpl();
         this.bgpconfig = bgpController.getConfig();
     }
 
@@ -147,25 +147,25 @@
 
         OPENSENT(false) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("message received in OPENSENT state");
                 // check for OPEN message
-                if (m.getType() != BGPType.OPEN) {
+                if (m.getType() != BgpType.OPEN) {
                     // When the message type is not keep alive message increment the wrong packet statistics
-                    h.processUnknownMsg(BGPErrorType.FINITE_STATE_MACHINE_ERROR,
-                                        BGPErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENSENT_STATE,
+                    h.processUnknownMsg(BgpErrorType.FINITE_STATE_MACHINE_ERROR,
+                                        BgpErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENSENT_STATE,
                                         m.getType().getType());
                     log.debug("Message is not OPEN message");
                 } else {
                     log.debug("Sending keep alive message in OPENSENT state");
                     h.bgpPacketStats.addInPacket();
 
-                    BGPOpenMsg pOpenmsg = (BGPOpenMsg) m;
+                    BgpOpenMsg pOpenmsg = (BgpOpenMsg) m;
                     h.peerIdentifier = pOpenmsg.getBgpId();
 
                     // validate capabilities and open msg
                     if (h.openMsgValidation(h, pOpenmsg)) {
-                        if (h.connectionCollisionDetection(BGPPeerCfg.State.OPENCONFIRM,
+                        if (h.connectionCollisionDetection(BgpPeerCfg.State.OPENCONFIRM,
                                                            h.peerIdentifier, h.peerAddr)) {
                             h.channel.close();
                             return;
@@ -181,7 +181,7 @@
                         if (h.peerHoldTime < h.bgpconfig.getHoldTime()) {
                             h.channel.getPipeline().replace("holdTime",
                                                             "holdTime",
-                                                            new ReadTimeoutHandler(BGPPipelineFactory.TIMER,
+                                                            new ReadTimeoutHandler(BgpPipelineFactory.TIMER,
                                                                                    h.peerHoldTime));
                         }
 
@@ -195,31 +195,31 @@
                     h.sendKeepAliveMessage();
                     h.bgpPacketStats.addOutPacket();
                     h.setState(OPENCONFIRM);
-                    h.bgpconfig.setPeerConnState(h.peerAddr, BGPPeerCfg.State.OPENCONFIRM);
+                    h.bgpconfig.setPeerConnState(h.peerAddr, BgpPeerCfg.State.OPENCONFIRM);
                 }
             }
         },
 
         OPENWAIT(false) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("Message received in OPEN WAIT State");
 
                 // check for open message
-                if (m.getType() != BGPType.OPEN) {
+                if (m.getType() != BgpType.OPEN) {
                     // When the message type is not open message increment the wrong packet statistics
-                    h.processUnknownMsg(BGPErrorType.FINITE_STATE_MACHINE_ERROR, BGPErrorType.UNSPECIFIED_ERROR,
+                    h.processUnknownMsg(BgpErrorType.FINITE_STATE_MACHINE_ERROR, BgpErrorType.UNSPECIFIED_ERROR,
                                         m.getType().getType());
                     log.debug("Message is not OPEN message");
                 } else {
                     h.bgpPacketStats.addInPacket();
 
-                    BGPOpenMsg pOpenmsg = (BGPOpenMsg) m;
+                    BgpOpenMsg pOpenmsg = (BgpOpenMsg) m;
                     h.peerIdentifier = pOpenmsg.getBgpId();
 
                     // Validate open message
                     if (h.openMsgValidation(h, pOpenmsg)) {
-                        if (h.connectionCollisionDetection(BGPPeerCfg.State.OPENSENT,
+                        if (h.connectionCollisionDetection(BgpPeerCfg.State.OPENSENT,
                                                            h.peerIdentifier, h.peerAddr)) {
                             h.channel.close();
                             return;
@@ -235,7 +235,7 @@
                         if (h.peerHoldTime < h.bgpconfig.getHoldTime()) {
                             h.channel.getPipeline().replace("holdTime",
                                                             "holdTime",
-                                                            new ReadTimeoutHandler(BGPPipelineFactory.TIMER,
+                                                            new ReadTimeoutHandler(BgpPipelineFactory.TIMER,
                                                                                    h.peerHoldTime));
                         }
 
@@ -247,7 +247,7 @@
                         h.sendHandshakeOpenMessage();
                         h.bgpPacketStats.addOutPacket();
                         h.setState(OPENCONFIRM);
-                        h.bgpconfig.setPeerConnState(h.peerAddr, BGPPeerCfg.State.OPENCONFIRM);
+                        h.bgpconfig.setPeerConnState(h.peerAddr, BgpPeerCfg.State.OPENCONFIRM);
                     }
                 }
             }
@@ -255,13 +255,13 @@
 
         OPENCONFIRM(false) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("Message received in OPENCONFIRM state");
                 // check for keep alive message
-                if (m.getType() != BGPType.KEEP_ALIVE) {
+                if (m.getType() != BgpType.KEEP_ALIVE) {
                     // When the message type is not keep alive message handle the wrong packet
-                    h.processUnknownMsg(BGPErrorType.FINITE_STATE_MACHINE_ERROR,
-                                        BGPErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENCONFIRM_STATE,
+                    h.processUnknownMsg(BgpErrorType.FINITE_STATE_MACHINE_ERROR,
+                                        BgpErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENCONFIRM_STATE,
                                         m.getType().getType());
                     log.debug("Message is not KEEPALIVE message");
                 } else {
@@ -271,7 +271,7 @@
                     log.debug("Sending keep alive message in OPENCONFIRM state");
 
                     final InetSocketAddress inetAddress = (InetSocketAddress) h.address;
-                    h.thisbgpId = BGPId.bgpId(IpAddress.valueOf(inetAddress.getAddress()));
+                    h.thisbgpId = BgpId.bgpId(IpAddress.valueOf(inetAddress.getAddress()));
 
                     // set session parameters
                     h.negotiatedHoldTime = (h.peerHoldTime < h.bgpconfig.getHoldTime()) ? h.peerHoldTime
@@ -279,7 +279,7 @@
                     h.sessionInfo = new BgpSessionInfoImpl(h.thisbgpId, h.bgpVersion, h.peerAsNum, h.peerHoldTime,
                                                            h.peerIdentifier, h.negotiatedHoldTime, h.isIbgpSession);
 
-                    h.bgpPeer = h.peerManager.getBGPPeerInstance(h.bgpController, h.sessionInfo, h.bgpPacketStats);
+                    h.bgpPeer = h.peerManager.getBgpPeerInstance(h.bgpController, h.sessionInfo, h.bgpPacketStats);
                     // set the status of bgp as connected
                     h.bgpPeer.setConnected(true);
                     h.bgpPeer.setChannel(h.channel);
@@ -291,7 +291,7 @@
                      */
 
                     if (h.negotiatedHoldTime != 0) {
-                        h.keepAliveTimer = new BGPKeepAliveTimer(h,
+                        h.keepAliveTimer = new BgpKeepAliveTimer(h,
                                                                 (h.negotiatedHoldTime / BGP_MAX_KEEPALIVE_INTERVAL));
                     } else {
                         h.sendKeepAliveMessage();
@@ -306,7 +306,7 @@
                         disconnectDuplicate(h);
                     } else {
                         h.setState(ESTABLISHED);
-                        h.bgpconfig.setPeerConnState(h.peerAddr, BGPPeerCfg.State.ESTABLISHED);
+                        h.bgpconfig.setPeerConnState(h.peerAddr, BgpPeerCfg.State.ESTABLISHED);
                     }
                 }
             }
@@ -314,7 +314,7 @@
 
         ESTABLISHED(true) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("Message received in established state " + m.getType());
                 // dispatch the message
                 h.dispatchMessage(m);
@@ -341,7 +341,7 @@
          *
          * @param h channel handler
          */
-        protected void disconnectDuplicate(BGPChannelHandler h) {
+        protected void disconnectDuplicate(BgpChannelHandler h) {
             log.error("Duplicated BGP IP or incompleted cleanup - " + "" + "disconnecting channel {}",
                       h.getPeerInfoString());
             h.duplicateBGPIdFound = Boolean.TRUE;
@@ -353,8 +353,8 @@
             this.handshakeComplete = handshakeComplete;
         }
 
-        void processBGPMessage(BGPChannelHandler bgpChannelHandler, BGPMessage pm)
-                throws IOException, BGPParseException {
+        void processBgpMessage(BgpChannelHandler bgpChannelHandler, BgpMessage pm)
+                throws IOException, BgpParseException {
             // TODO Auto-generated method stub
             log.debug("BGP message stub");
         }
@@ -377,8 +377,8 @@
         }
 
         // Connection should establish only if local ip and Autonomous system number is configured.
-        if (bgpconfig.getState() != BGPCfg.State.IP_AS_CONFIGURED) {
-            sendNotification(BGPErrorType.CEASE, BGPErrorType.CONNECTION_REJECTED, null);
+        if (bgpconfig.getState() != BgpCfg.State.IP_AS_CONFIGURED) {
+            sendNotification(BgpErrorType.CEASE, BgpErrorType.CONNECTION_REJECTED, null);
             channel.close();
             log.info("BGP local AS and router ID not configured");
             return;
@@ -390,13 +390,13 @@
         // if peer is not configured disconnect session
         if (!bgpconfig.isPeerConfigured(peerAddr)) {
             log.debug("Peer is not configured {}", peerAddr);
-            sendNotification(BGPErrorType.CEASE, BGPErrorType.CONNECTION_REJECTED, null);
+            sendNotification(BgpErrorType.CEASE, BgpErrorType.CONNECTION_REJECTED, null);
             channel.close();
             return;
         }
 
         // if connection is already established close channel
-        if (peerManager.isPeerConnected(BGPId.bgpId(IpAddress.valueOf(peerAddr)))) {
+        if (peerManager.isPeerConnected(BgpId.bgpId(IpAddress.valueOf(peerAddr)))) {
             log.debug("Duplicate connection received, peer {}", peerAddr);
             channel.close();
             return;
@@ -412,7 +412,7 @@
             sendHandshakeOpenMessage();
             bgpPacketStats.addOutPacket();
             setState(ChannelState.OPENSENT);
-            bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.OPENSENT);
+            bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.OPENSENT);
         }
     }
 
@@ -446,20 +446,20 @@
                 // Retry connection if connection is lost to bgp speaker/peer
                 if ((channel != null) && (null != channel.getPipeline().get("ActiveHandler"))) {
                     BgpConnectPeerImpl connectPeer;
-                    BGPPeerCfg.State peerCfgState;
+                    BgpPeerCfg.State peerCfgState;
 
                     peerCfgState = bgpconfig.getPeerConnState(peerAddr);
                     // on session disconnect using configuration, do not retry
-                    if (!peerCfgState.equals(BGPPeerCfg.State.IDLE)) {
+                    if (!peerCfgState.equals(BgpPeerCfg.State.IDLE)) {
                         log.debug("Connection reset by peer, retry, STATE:{}", peerCfgState);
-                        BGPPeerConfig peerConfig = (BGPPeerConfig) bgpconfig.displayPeers(peerAddr);
+                        BgpPeerConfig peerConfig = (BgpPeerConfig) bgpconfig.displayPeers(peerAddr);
 
-                        bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.IDLE);
+                        bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.IDLE);
                         connectPeer = new BgpConnectPeerImpl(bgpController, peerAddr, Controller.getBgpPortNum());
                         peerConfig.setConnectPeer(connectPeer);
                     }
                 } else {
-                    bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.IDLE);
+                    bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.IDLE);
                 }
             } else {
                 // A duplicate was disconnected on this ChannelHandler,
@@ -473,7 +473,7 @@
                 keepAliveTimer.getKeepAliveTimer().cancel();
             }
         } else {
-            bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.IDLE);
+            bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.IDLE);
             log.warn("No bgp ip in channelHandler registered for " + "disconnected peer {}", getPeerInfoString());
         }
     }
@@ -487,14 +487,14 @@
             if ((ChannelState.OPENWAIT == state) || (ChannelState.OPENSENT == state)) {
 
                 // When ReadTimeout timer is expired in OPENWAIT/OPENSENT state, it is considered
-                sendNotification(BGPErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
+                sendNotification(BgpErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
                 channel.close();
                 state = ChannelState.IDLE;
                 return;
             } else if (ChannelState.OPENCONFIRM == state) {
 
                 // When ReadTimeout timer is expired in OPENCONFIRM state.
-                sendNotification(BGPErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
+                sendNotification(BgpErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
                 channel.close();
                 state = ChannelState.IDLE;
                 return;
@@ -508,9 +508,9 @@
                 log.debug("StackTrace for previous Exception: ", e.getCause());
             }
             channel.close();
-        } else if (e.getCause() instanceof BGPParseException) {
+        } else if (e.getCause() instanceof BgpParseException) {
             byte[] data = new byte[] {};
-            BGPParseException errMsg = (BGPParseException) e.getCause();
+            BgpParseException errMsg = (BgpParseException) e.getCause();
             byte errorCode = errMsg.getErrorCode();
             byte errorSubCode = errMsg.getErrorSubCode();
             ChannelBuffer tempCb = errMsg.getData();
@@ -537,13 +537,13 @@
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         if (e.getMessage() instanceof List) {
             @SuppressWarnings("Unchecked")
-            List<BGPMessage> msglist = (List<BGPMessage>) e.getMessage();
-            for (BGPMessage pm : msglist) {
+            List<BgpMessage> msglist = (List<BgpMessage>) e.getMessage();
+            for (BgpMessage pm : msglist) {
                 // Do the actual packet processing
-                state.processBGPMessage(this, pm);
+                state.processBgpMessage(this, pm);
             }
         } else {
-            state.processBGPMessage(this, (BGPMessage) e.getMessage());
+            state.processBgpMessage(this, (BgpMessage) e.getMessage());
         }
     }
 
@@ -554,22 +554,22 @@
      * @param peerIdentifier BGP peer identifier
      * @param peerAddr BGP peer address
      * @return true if bgp spreakers initiated connection
-     * @throws BGPParseException on error while procession collision detection
+     * @throws BgpParseException on error while procession collision detection
      * @throws IOException on error while procession collision detection
      */
-    public boolean connectionCollisionDetection(BGPPeerCfg.State state, int peerIdentifier, String peerAddr)
-            throws IOException, BGPParseException {
+    public boolean connectionCollisionDetection(BgpPeerCfg.State state, int peerIdentifier, String peerAddr)
+            throws IOException, BgpParseException {
         /*
          * RFC 4271, Section 6.8, Based on the value of the BGP identifier, a convention is established for detecting
          * which BGP connection is to be preserved when a collision occurs. The convention is to compare the BGP
          * Identifiers of the peers involved in the collision and to retain only the connection initiated by the BGP
          * speaker with the higher-valued BGP Identifier..
          */
-        BGPPeerCfg.State currentState = bgpconfig.getPeerConnState(peerAddr);
+        BgpPeerCfg.State currentState = bgpconfig.getPeerConnState(peerAddr);
         if (currentState.equals(state)) {
             if (((Ip4Address.valueOf(bgpconfig.getRouterId())).compareTo(Ip4Address.valueOf(peerIdentifier))) > 0) {
                 // send notification
-                sendNotification(BGPErrorType.CEASE, BGPErrorType.CONNECTION_COLLISION_RESOLUTION, null);
+                sendNotification(BgpErrorType.CEASE, BgpErrorType.CONNECTION_COLLISION_RESOLUTION, null);
                 log.debug("Connection collision detected, local id: {},  peer id: {}, peer state:{}, in state:{}",
                           (Ip4Address.valueOf(bgpconfig.getRouterId())), (Ip4Address.valueOf(peerIdentifier)),
                           currentState, state);
@@ -605,9 +605,9 @@
      * To handle the BGP message.
      *
      * @param m bgp message
-     * @throws BGPParseException throw exception
+     * @throws BgpParseException throw exception
      */
-    private void dispatchMessage(BGPMessage m) throws BGPParseException {
+    private void dispatchMessage(BgpMessage m) throws BgpParseException {
         bgpPacketStats.addInPacket();
         bgpController.processBGPPacket(thisbgpId, m);
     }
@@ -648,20 +648,20 @@
      *
      * @return packet statistics
      */
-    public BGPPacketStatsImpl getBgpPacketStats() {
+    public BgpPacketStatsImpl getBgpPacketStats() {
         return bgpPacketStats;
     }
 
     /**
      * Send handshake open message to the peer.
      *
-     * @throws IOException, BGPParseException
+     * @throws IOException, BgpParseException
      */
-    private void sendHandshakeOpenMessage() throws IOException, BGPParseException {
+    private void sendHandshakeOpenMessage() throws IOException, BgpParseException {
         int bgpId;
 
         bgpId = Ip4Address.valueOf(bgpconfig.getRouterId()).toInt();
-        BGPMessage msg = factory4.openMessageBuilder().setAsNumber((short) bgpconfig.getAsNumber())
+        BgpMessage msg = factory4.openMessageBuilder().setAsNumber((short) bgpconfig.getAsNumber())
                 .setHoldTime(bgpconfig.getHoldTime()).setBgpId(bgpId).setLsCapabilityTlv(bgpconfig.getLsCapability())
                 .setLargeAsCapabilityTlv(bgpconfig.getLargeASCapability()).build();
         log.debug("Sending open message to {}", channel.getRemoteAddress());
@@ -675,11 +675,11 @@
      * @param errorCode error code send in notification
      * @param errorSubCode sub error code send in notification
      * @param data data to send in notification
-     * @throws IOException, BGPParseException while building message
+     * @throws IOException, BgpParseException while building message
      */
     private void sendNotification(byte errorCode, byte errorSubCode, byte[] data)
-                                                                           throws IOException, BGPParseException {
-        BGPMessage msg = factory4.notificationMessageBuilder().setErrorCode(errorCode)
+                                                                           throws IOException, BgpParseException {
+        BgpMessage msg = factory4.notificationMessageBuilder().setErrorCode(errorCode)
                                                               .setErrorSubCode(errorSubCode).setData(data).build();
         log.debug("Sending notification message to {}", channel.getRemoteAddress());
         channel.write(Collections.singletonList(msg));
@@ -689,11 +689,11 @@
      * Send keep alive message.
      *
      * @throws IOException when channel is disconnected
-     * @throws BGPParseException while building keep alive message
+     * @throws BgpParseException while building keep alive message
      */
-    synchronized void sendKeepAliveMessage() throws IOException, BGPParseException {
+    synchronized void sendKeepAliveMessage() throws IOException, BgpParseException {
 
-        BGPMessage msg = factory4.keepaliveMessageBuilder().build();
+        BgpMessage msg = factory4.keepaliveMessageBuilder().build();
         log.debug("Sending keepalive message to {}", channel.getRemoteAddress());
         channel.write(Collections.singletonList(msg));
     }
@@ -704,10 +704,10 @@
      * @param errorCode error code
      * @param errorSubCode error sub code
      * @param data message type
-     * @throws BGPParseException while processing error messsage
+     * @throws BgpParseException while processing error messsage
      * @throws IOException while processing error message
      */
-    public void processUnknownMsg(byte errorCode, byte errorSubCode, byte data) throws BGPParseException, IOException {
+    public void processUnknownMsg(byte errorCode, byte errorSubCode, byte data) throws BgpParseException, IOException {
         log.debug("UNKNOWN message received");
         byte[] byteArray = new byte[1];
         byteArray[0] = data;
@@ -721,26 +721,26 @@
      * @param h channel handler
      * @param openMsg open message
      * @return true if valid message, otherwise false
-     * @throws BGPParseException throw exception
+     * @throws BgpParseException throw exception
      */
-    public boolean openMsgValidation(BGPChannelHandler h, BGPOpenMsg openMsg) throws BGPParseException {
+    public boolean openMsgValidation(BgpChannelHandler h, BgpOpenMsg openMsg) throws BgpParseException {
         boolean result;
 
         // Validate BGP ID
         result = bgpIdValidation(openMsg);
         if (!result) {
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_BGP_IDENTIFIER, null);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_BGP_IDENTIFIER, null);
         }
 
         // Validate AS number
         result = asNumberValidation(h, openMsg);
         if (!result) {
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_PEER_AS, null);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_PEER_AS, null);
         }
 
         // Validate hold timer
         if ((openMsg.getHoldTime() != 0) && (openMsg.getHoldTime() < BGP_MIN_HOLDTIME)) {
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.UNACCEPTABLE_HOLD_TIME, null);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.UNACCEPTABLE_HOLD_TIME, null);
         }
 
         // Validate capabilities
@@ -754,25 +754,25 @@
      * @param h channel handler
      * @param openmsg open message
      * @return success or failure
-     * @throws BGPParseException
+     * @throws BgpParseException
      */
-    private boolean capabilityValidation(BGPChannelHandler h, BGPOpenMsg openmsg) throws BGPParseException {
+    private boolean capabilityValidation(BgpChannelHandler h, BgpOpenMsg openmsg) throws BgpParseException {
         log.debug("capabilityValidation");
 
         boolean isMultiProtocolcapabilityExists = false;
         boolean isFourOctetCapabilityExits = false;
         int capAsNum = 0;
 
-        List<BGPValueType> capabilityTlv = openmsg.getCapabilityTlv();
-        ListIterator<BGPValueType> listIterator = capabilityTlv.listIterator();
-        List<BGPValueType> unSupportedCapabilityTlv = new LinkedList<>();
-        ListIterator<BGPValueType> unSupportedCaplistIterator = unSupportedCapabilityTlv.listIterator();
-        BGPValueType tempTlv;
+        List<BgpValueType> capabilityTlv = openmsg.getCapabilityTlv();
+        ListIterator<BgpValueType> listIterator = capabilityTlv.listIterator();
+        List<BgpValueType> unSupportedCapabilityTlv = new LinkedList<>();
+        ListIterator<BgpValueType> unSupportedCaplistIterator = unSupportedCapabilityTlv.listIterator();
+        BgpValueType tempTlv;
         boolean isLargeAsCapabilityCfg = h.bgpconfig.getLargeASCapability();
         boolean isLsCapabilityCfg = h.bgpconfig.getLsCapability();
 
         while (listIterator.hasNext()) {
-            BGPValueType tlv = listIterator.next();
+            BgpValueType tlv = listIterator.next();
             if (tlv.getType() == MULTI_PROTOCOL_EXTN_CAPA_TYPE) {
                 isMultiProtocolcapabilityExists = true;
             }
@@ -785,11 +785,11 @@
         if (isFourOctetCapabilityExits) {
             if (capAsNum > MAX_AS2_NUM) {
                 if (openmsg.getAsNumber() != AS_TRANS) {
-                    throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_PEER_AS, null);
+                    throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_PEER_AS, null);
                 }
             } else {
                 if (capAsNum != openmsg.getAsNumber()) {
-                    throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_PEER_AS, null);
+                    throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_PEER_AS, null);
                 }
             }
         }
@@ -811,10 +811,10 @@
         if (unSupportedCaplistIterator.hasNext()) {
             ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
             while (unSupportedCaplistIterator.hasNext()) {
-                BGPValueType tlv = unSupportedCaplistIterator.next();
+                BgpValueType tlv = unSupportedCaplistIterator.next();
                 tlv.write(buffer);
             }
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.UNSUPPORTED_CAPABILITY, buffer);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.UNSUPPORTED_CAPABILITY, buffer);
         } else {
             return true;
         }
@@ -827,18 +827,18 @@
      * @param openMsg open message
      * @return true or false
      */
-    private boolean asNumberValidation(BGPChannelHandler h, BGPOpenMsg openMsg) {
+    private boolean asNumberValidation(BgpChannelHandler h, BgpOpenMsg openMsg) {
         log.debug("AS Num validation");
 
         int capAsNum = 0;
         boolean isFourOctetCapabilityExits = false;
 
-        BGPPeerCfg peerCfg = h.bgpconfig.displayPeers(peerAddr);
-        List<BGPValueType> capabilityTlv = openMsg.getCapabilityTlv();
-        ListIterator<BGPValueType> listIterator = capabilityTlv.listIterator();
+        BgpPeerCfg peerCfg = h.bgpconfig.displayPeers(peerAddr);
+        List<BgpValueType> capabilityTlv = openMsg.getCapabilityTlv();
+        ListIterator<BgpValueType> listIterator = capabilityTlv.listIterator();
 
         while (listIterator.hasNext()) {
-            BGPValueType tlv = listIterator.next();
+            BgpValueType tlv = listIterator.next();
             if (tlv.getType() == FOUR_OCTET_AS_NUM_CAPA_TYPE) {
                 isFourOctetCapabilityExits = true;
                 capAsNum = ((FourOctetAsNumCapabilityTlv) tlv).getInt();
@@ -894,7 +894,7 @@
      * @param openMsg open message
      * @return true or false
      */
-    private boolean bgpIdValidation(BGPOpenMsg openMsg) {
+    private boolean bgpIdValidation(BgpOpenMsg openMsg) {
         String openMsgBgpId = Ip4Address.valueOf(openMsg.getBgpId()).toString();
 
         InetAddress ipAddress;
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPConfig.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
similarity index 83%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPConfig.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
index 56877a1..716cc0c 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPConfig.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
@@ -21,17 +21,17 @@
 import java.util.TreeMap;
 
 import org.onlab.packet.Ip4Address;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPPeerCfg;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpPeerCfg;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Provides BGP configuration of this BGP speaker.
  */
-public class BGPConfig implements BGPCfg {
+public class BgpConfig implements BgpCfg {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPConfig.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpConfig.class);
 
     private static final short DEFAULT_HOLD_TIMER = 120;
     private static final short DEFAULT_CONN_RETRY_TIME = 120;
@@ -47,12 +47,12 @@
     private int maxConnRetryCount;
 
     private Ip4Address routerId = null;
-    private TreeMap<String, BGPPeerCfg> bgpPeerTree = new TreeMap<>();
+    private TreeMap<String, BgpPeerCfg> bgpPeerTree = new TreeMap<>();
 
     /**
      * Constructor to initialize the values.
      */
-    public BGPConfig() {
+    public BgpConfig() {
 
         this.holdTime = DEFAULT_HOLD_TIMER;
         this.maxConnRetryTime = DEFAULT_CONN_RETRY_TIME;
@@ -142,13 +142,13 @@
 
     @Override
     public boolean addPeer(String routerid, int remoteAs, short holdTime) {
-        BGPPeerConfig lspeer = new BGPPeerConfig();
+        BgpPeerConfig lspeer = new BgpPeerConfig();
         if (this.bgpPeerTree.get(routerid) == null) {
 
             lspeer.setPeerRouterId(routerid);
             lspeer.setAsNumber(remoteAs);
             lspeer.setHoldtime(holdTime);
-            lspeer.setState(BGPPeerCfg.State.IDLE);
+            lspeer.setState(BgpPeerCfg.State.IDLE);
             lspeer.setSelfInnitConnection(false);
 
             if (this.getAsNumber() == remoteAs) {
@@ -168,7 +168,7 @@
 
     @Override
     public boolean connectPeer(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
             lspeer.setSelfInnitConnection(true);
@@ -181,7 +181,7 @@
 
     @Override
     public boolean removePeer(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
 
@@ -200,12 +200,12 @@
 
     @Override
     public boolean disconnectPeer(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
 
             //TODO DISCONNECT PEER
-            lspeer.setState(BGPPeerCfg.State.IDLE);
+            lspeer.setState(BgpPeerCfg.State.IDLE);
             lspeer.setSelfInnitConnection(false);
             log.debug("Disconnected : " + routerid + " successfully");
 
@@ -217,8 +217,8 @@
     }
 
     @Override
-    public void setPeerConnState(String routerid, BGPPeerCfg.State state) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+    public void setPeerConnState(String routerid, BgpPeerCfg.State state) {
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
             lspeer.setState(state);
@@ -232,21 +232,21 @@
     }
 
     @Override
-    public BGPPeerCfg.State getPeerConnState(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+    public BgpPeerCfg.State getPeerConnState(String routerid) {
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
             return lspeer.getState();
         } else {
-            return BGPPeerCfg.State.INVALID; //No instance
+            return BgpPeerCfg.State.INVALID; //No instance
         }
     }
 
     @Override
     public boolean isPeerConnectable(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
-        if ((lspeer != null) && lspeer.getState().equals(BGPPeerCfg.State.IDLE)) {
+        if ((lspeer != null) && lspeer.getState().equals(BgpPeerCfg.State.IDLE)) {
             return true;
         }
 
@@ -254,21 +254,21 @@
     }
 
     @Override
-    public TreeMap<String, BGPPeerCfg> getPeerTree() {
+    public TreeMap<String, BgpPeerCfg> getPeerTree() {
         return this.bgpPeerTree;
     }
 
     @Override
-    public TreeMap<String, BGPPeerCfg> displayPeers() {
+    public TreeMap<String, BgpPeerCfg> displayPeers() {
         if (this.bgpPeerTree.isEmpty()) {
             log.debug("There are no BGP peers");
         } else {
-            Set<Entry<String, BGPPeerCfg>> set = this.bgpPeerTree.entrySet();
-            Iterator<Entry<String, BGPPeerCfg>> list = set.iterator();
-            BGPPeerCfg lspeer;
+            Set<Entry<String, BgpPeerCfg>> set = this.bgpPeerTree.entrySet();
+            Iterator<Entry<String, BgpPeerCfg>> list = set.iterator();
+            BgpPeerCfg lspeer;
 
             while (list.hasNext()) {
-                Entry<String, BGPPeerCfg> me = list.next();
+                Entry<String, BgpPeerCfg> me = list.next();
                 lspeer = me.getValue();
                 log.debug("Peer neighbor IP :" + me.getKey());
                 log.debug(", AS Number : " + lspeer.getAsNumber());
@@ -280,10 +280,10 @@
     }
 
     @Override
-    public BGPPeerCfg displayPeers(String routerid) {
+    public BgpPeerCfg displayPeers(String routerid) {
 
         if (this.bgpPeerTree.isEmpty()) {
-            log.debug("There are no BGP peers");
+            log.debug("There are no Bgp peers");
         } else {
             return this.bgpPeerTree.get(routerid);
         }
@@ -312,7 +312,7 @@
 
     @Override
     public boolean isPeerConfigured(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
         return (lspeer != null) ? true : false;
     }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java
index b6d88fc..27db618 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java
@@ -21,9 +21,9 @@
 import org.jboss.netty.channel.ChannelFuture;
 import org.jboss.netty.channel.ChannelFutureListener;
 import org.jboss.netty.channel.ChannelPipelineFactory;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPPeerCfg;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpPeerCfg;
 import org.onosproject.bgp.controller.BgpConnectPeer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,7 +42,7 @@
     private int connectRetryTime;
     private ChannelPipelineFactory pfact;
     private ClientBootstrap peerBootstrap;
-    private BGPCfg bgpconfig;
+    private BgpCfg bgpconfig;
 
     /**
      * Initialize timer and initiate pipeline factory.
@@ -51,10 +51,10 @@
      * @param remoteHost remote host to connect
      * @param remotePort remote port to connect
      */
-    public BgpConnectPeerImpl(BGPController bgpController, String remoteHost, int remotePort) {
+    public BgpConnectPeerImpl(BgpController bgpController, String remoteHost, int remotePort) {
 
         this.bgpconfig = bgpController.getConfig();
-        this.pfact = new BGPPipelineFactory(bgpController, false);
+        this.pfact = new BgpPipelineFactory(bgpController, false);
         this.peerBootstrap = Controller.peerBootstrap();
         this.peerBootstrap.setPipelineFactory(pfact);
         this.peerHost = remoteHost;
@@ -98,12 +98,12 @@
             InetSocketAddress connectToSocket = new InetSocketAddress(peerHost, peerPort);
 
             try {
-                bgpconfig.setPeerConnState(peerHost, BGPPeerCfg.State.CONNECT);
+                bgpconfig.setPeerConnState(peerHost, BgpPeerCfg.State.CONNECT);
                 peerBootstrap.connect(connectToSocket).addListener(new ChannelFutureListener() {
                     @Override
                     public void operationComplete(ChannelFuture future) throws Exception {
                         if (!future.isSuccess()) {
-                            bgpconfig.setPeerConnState(peerHost, BGPPeerCfg.State.ACTIVE);
+                            bgpconfig.setPeerConnState(peerHost, BgpPeerCfg.State.ACTIVE);
                             connectRetryCounter++;
                             log.error("Connection failed, ConnectRetryCounter {} remote host {}", connectRetryCounter,
                                       peerHost);
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPControllerImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
similarity index 76%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPControllerImpl.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
index 042e2da..e540824 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPControllerImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
@@ -26,34 +26,34 @@
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Service;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPId;
-import org.onosproject.bgp.controller.BGPPeer;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpId;
+import org.onosproject.bgp.controller.BgpPeer;
 import org.onosproject.bgp.controller.BgpLinkListener;
 import org.onosproject.bgp.controller.BgpNodeListener;
 import org.onosproject.bgp.controller.BgpPeerManager;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Component(immediate = true)
 @Service
-public class BGPControllerImpl implements BGPController {
+public class BgpControllerImpl implements BgpController {
 
-    private static final Logger log = LoggerFactory.getLogger(BGPControllerImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(BgpControllerImpl.class);
 
-    protected ConcurrentHashMap<BGPId, BGPPeer> connectedPeers = new ConcurrentHashMap<BGPId, BGPPeer>();
+    protected ConcurrentHashMap<BgpId, BgpPeer> connectedPeers = new ConcurrentHashMap<BgpId, BgpPeer>();
 
-    protected BGPPeerManagerImpl peerManager = new BGPPeerManagerImpl();
+    protected BgpPeerManagerImpl peerManager = new BgpPeerManagerImpl();
 
     protected Set<BgpNodeListener> bgpNodeListener = new CopyOnWriteArraySet<>();
     protected Set<BgpLinkListener> bgpLinkListener = new CopyOnWriteArraySet<>();
 
     final Controller ctrl = new Controller(this);
 
-    private BGPConfig bgpconfig = new BGPConfig();
+    private BgpConfig bgpconfig = new BgpConfig();
 
     @Activate
     public void activate() {
@@ -70,12 +70,12 @@
     }
 
     @Override
-    public Iterable<BGPPeer> getPeers() {
+    public Iterable<BgpPeer> getPeers() {
         return this.connectedPeers.values();
     }
 
     @Override
-    public BGPPeer getPeer(BGPId bgpId) {
+    public BgpPeer getPeer(BgpId bgpId) {
         return this.connectedPeers.get(bgpId);
     }
 
@@ -110,12 +110,12 @@
     }
 
     @Override
-    public void writeMsg(BGPId bgpId, BGPMessage msg) {
+    public void writeMsg(BgpId bgpId, BgpMessage msg) {
         this.getPeer(bgpId).sendMessage(msg);
     }
 
     @Override
-    public void processBGPPacket(BGPId bgpId, BGPMessage msg) throws BGPParseException {
+    public void processBGPPacket(BgpId bgpId, BgpMessage msg) throws BgpParseException {
 
         switch (msg.getType()) {
         case OPEN:
@@ -138,8 +138,8 @@
 
     @Override
     public void closeConnectedPeers() {
-        BGPPeer bgpPeer;
-        for (BGPId id : this.connectedPeers.keySet()) {
+        BgpPeer bgpPeer;
+        for (BgpId id : this.connectedPeers.keySet()) {
             bgpPeer = getPeer(id);
             bgpPeer.disconnectPeer();
         }
@@ -149,13 +149,13 @@
      * Implementation of an BGP Peer which is responsible for keeping track of connected peers and the state in which
      * they are.
      */
-    public class BGPPeerManagerImpl implements BgpPeerManager {
+    public class BgpPeerManagerImpl implements BgpPeerManager {
 
-        private final Logger log = LoggerFactory.getLogger(BGPPeerManagerImpl.class);
+        private final Logger log = LoggerFactory.getLogger(BgpPeerManagerImpl.class);
         private final Lock peerLock = new ReentrantLock();
 
         @Override
-        public boolean addConnectedPeer(BGPId bgpId, BGPPeer bgpPeer) {
+        public boolean addConnectedPeer(BgpId bgpId, BgpPeer bgpPeer) {
 
             if (connectedPeers.get(bgpId) != null) {
                 this.log.error("Trying to add connectedPeer but found previous " + "value for bgp ip: {}",
@@ -169,7 +169,7 @@
         }
 
         @Override
-        public boolean isPeerConnected(BGPId bgpId) {
+        public boolean isPeerConnected(BgpId bgpId) {
             if (connectedPeers.get(bgpId) == null) {
                 this.log.error("Is peer connected: bgpIp {}.", bgpId.toString());
                 return false;
@@ -179,12 +179,12 @@
         }
 
         @Override
-        public void removeConnectedPeer(BGPId bgpId) {
+        public void removeConnectedPeer(BgpId bgpId) {
             connectedPeers.remove(bgpId);
         }
 
         @Override
-        public BGPPeer getPeer(BGPId bgpId) {
+        public BgpPeer getPeer(BgpId bgpId) {
             return connectedPeers.get(bgpId);
         }
 
@@ -196,9 +196,9 @@
          * @param pktStats packet statistics.
          * @return BGPPeer peer instance.
          */
-        public BGPPeer getBGPPeerInstance(BGPController bgpController, BgpSessionInfoImpl sessionInfo,
-                                          BGPPacketStatsImpl pktStats) {
-            BGPPeer bgpPeer = new BGPPeerImpl(bgpController, sessionInfo, pktStats);
+        public BgpPeer getBgpPeerInstance(BgpController bgpController, BgpSessionInfoImpl sessionInfo,
+                                          BgpPacketStatsImpl pktStats) {
+            BgpPeer bgpPeer = new BgpPeerImpl(bgpController, sessionInfo, pktStats);
             return bgpPeer;
         }
 
@@ -214,17 +214,17 @@
     }
 
     @Override
-    public ConcurrentHashMap<BGPId, BGPPeer> connectedPeers() {
+    public ConcurrentHashMap<BgpId, BgpPeer> connectedPeers() {
         return connectedPeers;
     }
 
     @Override
-    public BGPPeerManagerImpl peerManager() {
+    public BgpPeerManagerImpl peerManager() {
         return peerManager;
     }
 
     @Override
-    public BGPCfg getConfig() {
+    public BgpCfg getConfig() {
         return this.bgpconfig;
     }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPKeepAliveTimer.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpKeepAliveTimer.java
similarity index 89%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPKeepAliveTimer.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpKeepAliveTimer.java
index 1c95804..524ac4c 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPKeepAliveTimer.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpKeepAliveTimer.java
@@ -25,11 +25,11 @@
 /**
  * Implement sending keepalive message to connected peer periodically based on negotiated holdtime.
  */
-public class BGPKeepAliveTimer {
+public class BgpKeepAliveTimer {
 
     private Timer keepAliveTimer;
-    private BGPChannelHandler handler;
-    private static final Logger log = LoggerFactory.getLogger(BGPKeepAliveTimer.class);
+    private BgpChannelHandler handler;
+    private static final Logger log = LoggerFactory.getLogger(BgpKeepAliveTimer.class);
 
     /**
      * Gets keepalive timer object.
@@ -46,7 +46,7 @@
      * @param h channel handler
      * @param seconds time interval.
      */
-    public BGPKeepAliveTimer(BGPChannelHandler h, int seconds) {
+    public BgpKeepAliveTimer(BgpChannelHandler h, int seconds) {
         this.handler = h;
         this.keepAliveTimer = new Timer();
         this.keepAliveTimer.schedule(new SendKeepAlive(), 0, seconds * 1000);
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageDecoder.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageDecoder.java
similarity index 75%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageDecoder.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageDecoder.java
index 636b78c..431c621 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageDecoder.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageDecoder.java
@@ -22,20 +22,20 @@
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.handler.codec.frame.FrameDecoder;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.onlab.util.HexDump;
-import org.onosproject.bgpio.protocol.BGPFactories;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.protocol.BgpFactories;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.types.BgpHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Decode an bgp message from a Channel, for use in a netty pipeline.
  */
-public class BGPMessageDecoder extends FrameDecoder {
+public class BgpMessageDecoder extends FrameDecoder {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPMessageDecoder.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpMessageDecoder.class);
 
     @Override
     protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
@@ -47,12 +47,12 @@
 
         HexDump.dump(buffer);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        List<BGPMessage> msgList = new LinkedList<BGPMessage>();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        List<BgpMessage> msgList = new LinkedList<BgpMessage>();
 
         while (buffer.readableBytes() > 0) {
-            BGPHeader bgpHeader = new BGPHeader();
-            BGPMessage message = reader.readFrom(buffer, bgpHeader);
+            BgpHeader bgpHeader = new BgpHeader();
+            BgpMessage message = reader.readFrom(buffer, bgpHeader);
             msgList.add(message);
         }
         return msgList;
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageEncoder.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageEncoder.java
similarity index 87%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageEncoder.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageEncoder.java
index f0d38c3..3e56d6f 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageEncoder.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageEncoder.java
@@ -22,7 +22,7 @@
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.onlab.util.HexDump;
 
 import org.slf4j.Logger;
@@ -32,8 +32,8 @@
  * Encode an bgp message for output into a ChannelBuffer, for use in a
  * netty pipeline.
  */
-public class BGPMessageEncoder extends OneToOneEncoder {
-    protected static final Logger log = LoggerFactory.getLogger(BGPMessageEncoder.class);
+public class BgpMessageEncoder extends OneToOneEncoder {
+    protected static final Logger log = LoggerFactory.getLogger(BgpMessageEncoder.class);
 
     @Override
     protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
@@ -44,12 +44,12 @@
         }
 
         @SuppressWarnings("unchecked")
-        List<BGPMessage> msglist = (List<BGPMessage>) msg;
+        List<BgpMessage> msglist = (List<BgpMessage>) msg;
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
 
         log.debug("SENDING MESSAGE");
-        for (BGPMessage pm : msglist) {
+        for (BgpMessage pm : msglist) {
             pm.writeTo(buf);
         }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPacketStatsImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPacketStatsImpl.java
similarity index 94%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPacketStatsImpl.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPacketStatsImpl.java
index 09f4d45..7494c81 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPacketStatsImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPacketStatsImpl.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.bgp.controller.impl;
 
-import org.onosproject.bgp.controller.BGPPacketStats;
+import org.onosproject.bgp.controller.BgpPacketStats;
 
 /**
  * A representation of a packet context which allows any provider
@@ -23,7 +23,7 @@
  * event if blocked has been called. This packet context can be used
  * to react to the packet in event with a packet out.
  */
-public class BGPPacketStatsImpl implements BGPPacketStats {
+public class BgpPacketStatsImpl implements BgpPacketStats {
 
     private int inPacketCount;
     private int outPacketCount;
@@ -33,7 +33,7 @@
     /**
      * Resets parameter.
      */
-    public BGPPacketStatsImpl() {
+    public BgpPacketStatsImpl() {
         this.inPacketCount = 0;
         this.outPacketCount = 0;
         this.wrongPacketCount = 0;
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerConfig.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
similarity index 95%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerConfig.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
index 14a68cf6..a8eaee3 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerConfig.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
@@ -17,12 +17,12 @@
 
 import org.onlab.packet.Ip4Address;
 import org.onosproject.bgp.controller.BgpConnectPeer;
-import org.onosproject.bgp.controller.BGPPeerCfg;
+import org.onosproject.bgp.controller.BgpPeerCfg;
 
 /**
  * BGP Peer configuration information.
  */
-public class BGPPeerConfig  implements BGPPeerCfg {
+public class BgpPeerConfig  implements BgpPeerCfg {
     private int asNumber;
     private short holdTime;
     private boolean isIBgp;
@@ -34,7 +34,7 @@
     /**
      * Constructor to initialize the values.
      */
-    BGPPeerConfig() {
+    BgpPeerConfig() {
         state = State.IDLE;
         selfInitiated = false;
     }
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
similarity index 84%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerImpl.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
index 45f7463..8bcd5a0 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
@@ -24,12 +24,12 @@
 
 import org.jboss.netty.channel.Channel;
 import org.onlab.packet.IpAddress;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPPeer;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpPeer;
 import org.onosproject.bgp.controller.BgpSessionInfo;
-import org.onosproject.bgpio.protocol.BGPFactories;
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.protocol.BgpFactories;
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,19 +38,19 @@
 /**
  * BGPPeerImpl implements BGPPeer, maintains peer information and store updates in RIB .
  */
-public class BGPPeerImpl implements BGPPeer {
+public class BgpPeerImpl implements BgpPeer {
 
-    protected final Logger log = LoggerFactory.getLogger(BGPPeerImpl.class);
+    protected final Logger log = LoggerFactory.getLogger(BgpPeerImpl.class);
 
     private static final String SHUTDOWN_MSG = "Worker has already been shutdown";
 
-    private BGPController bgpController;
+    private BgpController bgpController;
     private Channel channel;
     protected String channelId;
     private boolean connected;
     protected boolean isHandShakeComplete = false;
     private BgpSessionInfo sessionInfo;
-    private BGPPacketStatsImpl pktStats;
+    private BgpPacketStatsImpl pktStats;
 
 
     @Override
@@ -65,7 +65,7 @@
      *@param sessionInfo bgp session info
      *@param pktStats packet statistics
      */
-    public BGPPeerImpl(BGPController bgpController, BgpSessionInfo sessionInfo, BGPPacketStatsImpl pktStats) {
+    public BgpPeerImpl(BgpController bgpController, BgpSessionInfo sessionInfo, BgpPacketStatsImpl pktStats) {
         this.bgpController = bgpController;
         this.sessionInfo = sessionInfo;
         this.pktStats = pktStats;
@@ -81,7 +81,7 @@
     }
 
     @Override
-    public final void sendMessage(BGPMessage m) {
+    public final void sendMessage(BgpMessage m) {
         log.debug("Sending message to {}", channel.getRemoteAddress());
         try {
             channel.write(Collections.singletonList(m));
@@ -95,7 +95,7 @@
     }
 
     @Override
-    public final void sendMessage(List<BGPMessage> msgs) {
+    public final void sendMessage(List<BgpMessage> msgs) {
         try {
             channel.write(msgs);
             this.pktStats.addOutPacket(msgs.size());
@@ -143,8 +143,8 @@
     }
 
     @Override
-    public BGPFactory factory() {
-        return BGPFactories.getFactory(sessionInfo.remoteBgpVersion());
+    public BgpFactory factory() {
+        return BgpFactories.getFactory(sessionInfo.remoteBgpVersion());
     }
 
     @Override
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPipelineFactory.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPipelineFactory.java
similarity index 85%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPipelineFactory.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPipelineFactory.java
index e6f09f2..28e1041 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPipelineFactory.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPipelineFactory.java
@@ -23,18 +23,18 @@
 import org.jboss.netty.util.ExternalResourceReleasable;
 import org.jboss.netty.util.HashedWheelTimer;
 import org.jboss.netty.util.Timer;
-import org.onosproject.bgp.controller.BGPController;
+import org.onosproject.bgp.controller.BgpController;
 
 /**
  * Creates a ChannelPipeline for a server-side bgp channel.
  */
-public class BGPPipelineFactory
+public class BgpPipelineFactory
     implements ChannelPipelineFactory, ExternalResourceReleasable {
 
     static final Timer TIMER = new HashedWheelTimer();
     protected ReadTimeoutHandler readTimeoutHandler;
     private boolean isBgpServ;
-    private BGPController bgpController;
+    private BgpController bgpController;
 
     /**
      * Constructor to initialize the values.
@@ -42,7 +42,7 @@
      * @param bgpController parent controller
      * @param isBgpServ if it is a server or remote peer
      */
-    public BGPPipelineFactory(BGPController bgpController, boolean isBgpServ) {
+    public BgpPipelineFactory(BgpController bgpController, boolean isBgpServ) {
         super();
         this.isBgpServ = isBgpServ;
         this.bgpController = bgpController;
@@ -52,11 +52,11 @@
 
     @Override
     public ChannelPipeline getPipeline() throws Exception {
-        BGPChannelHandler handler = new BGPChannelHandler(bgpController);
+        BgpChannelHandler handler = new BgpChannelHandler(bgpController);
 
         ChannelPipeline pipeline = Channels.pipeline();
-        pipeline.addLast("bgpmessagedecoder", new BGPMessageDecoder());
-        pipeline.addLast("bgpmessageencoder", new BGPMessageEncoder());
+        pipeline.addLast("bgpmessagedecoder", new BgpMessageDecoder());
+        pipeline.addLast("bgpmessageencoder", new BgpMessageEncoder());
         pipeline.addLast("holdTime", readTimeoutHandler);
         if (isBgpServ) {
             pipeline.addLast("PassiveHandler", handler);
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java
index 6705b46..33623dc 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java
@@ -13,9 +13,9 @@
 
 package org.onosproject.bgp.controller.impl;
 
-import org.onosproject.bgp.controller.BGPId;
+import org.onosproject.bgp.controller.BgpId;
 import org.onosproject.bgp.controller.BgpSessionInfo;
-import org.onosproject.bgpio.protocol.BGPVersion;
+import org.onosproject.bgpio.protocol.BgpVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -25,8 +25,8 @@
 public class BgpSessionInfoImpl implements BgpSessionInfo {
 
     protected final Logger log = LoggerFactory.getLogger(BgpSessionInfoImpl.class);
-    private BGPId remoteBgpId;
-    private BGPVersion remoteBgpVersion;
+    private BgpId remoteBgpId;
+    private BgpVersion remoteBgpVersion;
     private long remoteBgpASNum;
     private short remoteBgpholdTime;
     private int remoteBgpIdentifier;
@@ -44,7 +44,7 @@
      *@param negotiatedholdTime negotiated hold time
      *@param isIbgpSession session type ibgp/ebgp
      */
-    public BgpSessionInfoImpl(BGPId remoteBgpId, BGPVersion remoteBgpVersion, long remoteBgpASNum,
+    public BgpSessionInfoImpl(BgpId remoteBgpId, BgpVersion remoteBgpVersion, long remoteBgpASNum,
                               short remoteBgpholdTime, int remoteBgpIdentifier, short negotiatedholdTime,
                               boolean isIbgpSession) {
         this.remoteBgpId = remoteBgpId;
@@ -67,12 +67,12 @@
     }
 
     @Override
-    public BGPId remoteBgpId() {
+    public BgpId remoteBgpId() {
         return remoteBgpId;
     }
 
     @Override
-    public BGPVersion remoteBgpVersion() {
+    public BgpVersion remoteBgpVersion() {
         return remoteBgpVersion;
     }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java
index 95eebb4..f02cee8 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java
@@ -32,10 +32,10 @@
 import org.jboss.netty.channel.group.DefaultChannelGroup;
 import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
 import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgpio.protocol.BGPFactories;
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPVersion;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgpio.protocol.BgpFactories;
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +47,7 @@
 
     private static final Logger log = LoggerFactory.getLogger(Controller.class);
 
-    private static final BGPFactory FACTORY4 = BGPFactories.getFactory(BGPVersion.BGP_4);
+    private static final BgpFactory FACTORY4 = BgpFactories.getFactory(BgpVersion.BGP_4);
 
     private ChannelGroup cg;
     public Channel serverChannel;
@@ -65,7 +65,7 @@
     private NioServerSocketChannelFactory serverExecFactory;
     private NioClientSocketChannelFactory peerExecFactory;
     private static ClientBootstrap peerBootstrap;
-    private BGPController bgpController;
+    private BgpController bgpController;
 
     // Perf. related configuration
     private static final int SEND_BUFFER_SIZE = 4 * 1024 * 1024;
@@ -75,7 +75,7 @@
      *
      * @param bgpController bgp controller instance
      */
-    public Controller(BGPController bgpController) {
+    public Controller(BgpController bgpController) {
         this.bgpController = bgpController;
     }
 
@@ -84,7 +84,7 @@
      *
      * @return instance of factory version
      */
-    static BGPFactory getBGPMessageFactory4() {
+    static BgpFactory getBgpMessageFactory4() {
         return FACTORY4;
     }
 
@@ -118,7 +118,7 @@
             bootstrap.setOption("child.tcpNoDelay", true);
             bootstrap.setOption("child.sendBufferSize", Controller.SEND_BUFFER_SIZE);
 
-            ChannelPipelineFactory pfact = new BGPPipelineFactory(bgpController, true);
+            ChannelPipelineFactory pfact = new BgpPipelineFactory(bgpController, true);
 
             bootstrap.setPipelineFactory(pfact);
             InetSocketAddress sa = new InetSocketAddress(getBgpPortNum());
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java
index a8740c4..8a9ea91 100644
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java
@@ -19,13 +19,13 @@
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.onosproject.bgpio.protocol.BGPLSNlri;
-import org.onosproject.bgpio.protocol.linkstate.BGPLinkLSIdentifier;
+import org.onosproject.bgpio.protocol.BgpLSNlri;
+import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSIdentifier;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixIPv4LSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 
@@ -35,22 +35,22 @@
  * Implementation of Adj-RIB-In with VPN for each peer.
  */
 public class VpnAdjRibIn {
-    private Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
-    private Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
-    private Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
+    private Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
+    private Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
+    private Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
 
-    private Map<RouteDistinguisher, Map<BGPNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree
+    private Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree
                                                                                                      = new TreeMap<>();
-    private Map<RouteDistinguisher, Map<BGPLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree
+    private Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree
                                                                                                      = new TreeMap<>();
-    private Map<RouteDistinguisher, Map<BGPPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree
+    private Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree
                                                                                                      = new TreeMap<>();
     /**
      * Returns the adjacency node.
      *
      * @return node adjacency RIB node
      */
-    public Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
+    public Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
         return nodeTree;
     }
 
@@ -59,7 +59,7 @@
      *
      * @return link adjacency RIB node
      */
-    public Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
+    public Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
         return linkTree;
     }
 
@@ -68,7 +68,7 @@
      *
      * @return prefix adjacency RIB node
      */
-    public Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
+    public Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
         return prefixTree;
     }
 
@@ -77,7 +77,7 @@
      *
      * @return vpnNode adjacency RIB node
      */
-    public Map<RouteDistinguisher, Map<BGPNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree() {
+    public Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree() {
         return vpnNodeTree;
     }
 
@@ -86,7 +86,7 @@
      *
      * @return vpnLink adjacency RIB node
      */
-    public Map<RouteDistinguisher, Map<BGPLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree() {
+    public Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree() {
         return vpnLinkTree;
     }
 
@@ -95,7 +95,7 @@
      *
      * @return vpnPrefix adjacency RIB node
      */
-    public Map<RouteDistinguisher, Map<BGPPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree() {
+    public Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree() {
         return vpnPrefixTree;
     }
 
@@ -105,23 +105,23 @@
      * @param nlri NLRI info
      * @param details has pathattribute , protocolID and identifier
      */
-    public void add(BGPLSNlri nlri, PathAttrNlriDetails details) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
-            BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+    public void add(BgpLSNlri nlri, PathAttrNlriDetails details) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
+            BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
             if (nodeTree.containsKey(nodeLSIdentifier)) {
                 nodeTree.replace(nodeLSIdentifier, details);
             } else {
                 nodeTree.put(nodeLSIdentifier, details);
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
-            BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+            BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
             if (linkTree.containsKey(linkLSIdentifier)) {
                 linkTree.replace(linkLSIdentifier, details);
             } else {
                 linkTree.put(linkLSIdentifier, details);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
-            BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
+            BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
             if (prefixTree.containsKey(prefixIdentifier)) {
                 prefixTree.replace(prefixIdentifier, details);
             } else {
@@ -138,9 +138,9 @@
      * @param details has pathattribute , protocolID and identifier
      * @param routeDistinguisher unique for for each vpn
      */
-    public void addVpn(BGPLSNlri nlri, PathAttrNlriDetails details, RouteDistinguisher routeDistinguisher) {
+    public void addVpn(BgpLSNlri nlri, PathAttrNlriDetails details, RouteDistinguisher routeDistinguisher) {
         add(nlri, details);
-        if (nlri instanceof BGPNodeLSNlriVer4) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
             if (!vpnNodeTree.containsKey(routeDistinguisher)) {
                 vpnNodeTree.put(routeDistinguisher, nodeTree);
             }
@@ -148,7 +148,7 @@
             if (!vpnLinkTree.containsKey(routeDistinguisher)) {
                 vpnLinkTree.put(routeDistinguisher, linkTree);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
             if (!vpnPrefixTree.containsKey(routeDistinguisher)) {
                 vpnPrefixTree.put(routeDistinguisher, prefixTree);
             }
@@ -161,10 +161,10 @@
      * @param nlri NLRI Info
      * @param routeDistinguisher unique for for each vpn
      */
-    public void removeVpn(BGPLSNlri nlri, RouteDistinguisher routeDistinguisher) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
+    public void removeVpn(BgpLSNlri nlri, RouteDistinguisher routeDistinguisher) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
             if (vpnNodeTree.containsKey(routeDistinguisher)) {
-                BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+                BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
                 if (nodeTree.containsKey(nodeLSIdentifier)) {
                     nodeTree.remove(nodeLSIdentifier);
                 }
@@ -174,7 +174,7 @@
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
             if (vpnLinkTree.containsKey(routeDistinguisher)) {
-                BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+                BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
                 if (linkTree.containsKey(linkLSIdentifier)) {
                     linkTree.remove(linkLSIdentifier);
                 }
@@ -182,9 +182,9 @@
                     vpnLinkTree.remove(routeDistinguisher);
                 }
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
             if (vpnPrefixTree.containsKey(routeDistinguisher)) {
-                BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+                BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
                 if (prefixTree.containsKey(prefixIdentifier)) {
                     prefixTree.remove(prefixIdentifier);
                 }
