diff --git a/src/main/java/net/onrc/onos/apps/bgproute/Ptree.java b/src/main/java/net/onrc/onos/apps/bgproute/Ptree.java
index 8159b57..3959986 100644
--- a/src/main/java/net/onrc/onos/apps/bgproute/Ptree.java
+++ b/src/main/java/net/onrc/onos/apps/bgproute/Ptree.java
@@ -17,9 +17,9 @@
     private PtreeNode top;
     private byte[] maskBits = {(byte) 0x00, (byte) 0x80, (byte) 0xc0, (byte) 0xe0, (byte) 0xf0, (byte) 0xf8, (byte) 0xfc, (byte) 0xfe, (byte) 0xff};
 
-    public Ptree(int max_key_bits) {
-        maxKeyBits = max_key_bits;
-        maxKeyOctets = bit_to_octet(max_key_bits);
+    public Ptree(int maxKeyBits) {
+        this.maxKeyBits = maxKeyBits;
+        maxKeyOctets = bit_to_octet(maxKeyBits);
         //refCount = 0;
     }
 
@@ -27,8 +27,8 @@
         return acquire(key, maxKeyBits);
     }
 
-    public synchronized PtreeNode acquire(byte[] key, int key_bits) {
-        if (key_bits > maxKeyBits) {
+    public synchronized PtreeNode acquire(byte[] key, int keyBits) {
+        if (keyBits > maxKeyBits) {
             return null;
         }
 
@@ -36,9 +36,9 @@
         PtreeNode match = null;
 
         while (node != null
-                && node.keyBits <= key_bits
-                && key_match(node.key, node.keyBits, key, key_bits) == true) {
-            if (node.keyBits == key_bits) {
+                && node.keyBits <= keyBits
+                && key_match(node.key, node.keyBits, key, keyBits) == true) {
+            if (node.keyBits == keyBits) {
                 return addReference(node);
             }
 
@@ -54,7 +54,7 @@
         PtreeNode add = null;
 
         if (node == null) {
-            add = new PtreeNode(key, key_bits, maxKeyOctets);
+            add = new PtreeNode(key, keyBits, maxKeyOctets);
 
             if (match != null) {
                 node_link(match, add);
@@ -62,7 +62,7 @@
                 top = add;
             }
         } else {
-            add = node_common(node, key, key_bits);
+            add = node_common(node, key, keyBits);
 
             if (match != null) {
                 node_link(match, add);
@@ -71,10 +71,10 @@
             }
             node_link(add, node);
 
-            if (add.keyBits != key_bits) {
+            if (add.keyBits != keyBits) {
                 match = add;
 
-                add = new PtreeNode(key, key_bits, maxKeyOctets);
+                add = new PtreeNode(key, keyBits, maxKeyOctets);
                 node_link(match, add);
             }
         }
@@ -82,17 +82,17 @@
         return addReference(add);
     }
 
-    public synchronized PtreeNode lookup(byte[] key, int key_bits) {
-        if (key_bits > maxKeyBits) {
+    public synchronized PtreeNode lookup(byte[] key, int keyBits) {
+        if (keyBits > maxKeyBits) {
             return null;
         }
 
         PtreeNode node = top;
 
         while (node != null
-                && node.keyBits <= key_bits
-                && key_match(node.key, node.keyBits, key, key_bits) == true) {
-            if (node.keyBits == key_bits) {
+                && node.keyBits <= keyBits
+                && key_match(node.key, node.keyBits, key, keyBits) == true) {
+            if (node.keyBits == keyBits) {
                 return addReference(node);
             }
 
@@ -105,8 +105,8 @@
         return null;
     }
 
-    public synchronized PtreeNode match(byte[] key, int key_bits) {
-        if (key_bits > maxKeyBits) {
+    public synchronized PtreeNode match(byte[] key, int keyBits) {
+        if (keyBits > maxKeyBits) {
             return null;
         }
         PtreeNode node = top;
@@ -115,8 +115,8 @@
         if (node != null) {
 
             while (node != null
-                    && node.keyBits <= key_bits
-                    && key_match(node.key, node.keyBits, key, key_bits) == true) {
+                    && node.keyBits <= keyBits
+                    && key_match(node.key, node.keyBits, key, keyBits) == true) {
                 matched = node;
 
                 if (bit_check(key, node.keyBits) == true) {
@@ -173,8 +173,8 @@
         return null;
     }
 
-    public static int bit_to_octet(int key_bits) {
-        return Math.max((key_bits + 7) / 8, 1);
+    public static int bit_to_octet(int keyBits) {
+        return Math.max((keyBits + 7) / 8, 1);
     }
 
     private PtreeNode addReference(PtreeNode node) {
@@ -191,16 +191,16 @@
         }
     }
 
-    private boolean key_match(byte[] key1, int key1_len, byte[] key2, int key2_len) {
+    private boolean key_match(byte[] key1, int key1Len, byte[] key2, int key2Len) {
         int offset;
         int shift;
 
-        if (key1_len > key2_len) {
+        if (key1Len > key2Len) {
             return false;
         }
 
-        offset = (Math.min(key1_len, key2_len)) / 8;
-        shift = (Math.min(key1_len, key2_len)) % 8;
+        offset = (Math.min(key1Len, key2Len)) / 8;
+        shift = (Math.min(key1Len, key2Len)) % 8;
 
         if (shift != 0) {
             if ((maskBits[shift] & (key1[offset] ^ key2[offset])) != 0) {
@@ -217,9 +217,9 @@
         return true;
     }
 
-    private boolean bit_check(byte[] key, int key_bits) {
-        int offset = key_bits / 8;
-        int shift = 7 - (key_bits % 8);
+    private boolean bit_check(byte[] key, int keyBits) {
+        int offset = keyBits / 8;
+        int shift = 7 - (keyBits % 8);
         int bit = key[offset] & 0xff;
 
         bit >>= shift;
@@ -242,9 +242,9 @@
         add.parent = node;
     }
 
-    private PtreeNode node_common(PtreeNode node, byte[] key, int key_bits) {
+    private PtreeNode node_common(PtreeNode node, byte[] key, int keyBits) {
         int i;
-        int limit = Math.min(node.keyBits, key_bits) / 8;
+        int limit = Math.min(node.keyBits, keyBits) / 8;
 
         for (i = 0; i < limit; i++) {
             if (node.key[i] != key[i]) {
@@ -255,12 +255,12 @@
         int commonLen = i * 8;
         int boundary = 0;
 
-        if (commonLen != key_bits) {
+        if (commonLen != keyBits) {
             byte diff = (byte) (node.key[i] ^ key[i]);
             byte mask = (byte) 0x80;
             int shiftMask = 0;
 
-            while (commonLen < key_bits && ((mask & diff) == 0)) {
+            while (commonLen < keyBits && ((mask & diff) == 0)) {
                 boundary = 1;
 
                 shiftMask = (mask & 0xff);
diff --git a/src/main/java/net/onrc/onos/apps/bgproute/PtreeNode.java b/src/main/java/net/onrc/onos/apps/bgproute/PtreeNode.java
index 0c0358d..b5e4716 100644
--- a/src/main/java/net/onrc/onos/apps/bgproute/PtreeNode.java
+++ b/src/main/java/net/onrc/onos/apps/bgproute/PtreeNode.java
@@ -16,18 +16,18 @@
     public RibEntry rib;
     private static final Logger log = LoggerFactory.getLogger(BgpRoute.class);
 
-    PtreeNode(byte[] key, int key_bits, int max_key_octet) {
+    PtreeNode(byte[] key, int keyBits, int maxKeyOctet) {
         parent = null;
         left = null;
         right = null;
         refCount = 0;
         rib = null;
-        this.key = new byte[max_key_octet];
-        this.keyBits = key_bits;
-        log.debug("inside Ptreenode constructor key {} bits {}", key, key_bits);
+        this.key = new byte[maxKeyOctet];
+        this.keyBits = keyBits;
+        log.debug("inside Ptreenode constructor key {} bits {}", key, keyBits);
 
-        int octet = Ptree.bit_to_octet(key_bits);
-        for (int i = 0; i < max_key_octet; i++) {
+        int octet = Ptree.bit_to_octet(keyBits);
+        for (int i = 0; i < maxKeyOctet; i++) {
             if (i < octet) {
                 if (key != null) {
                     log.debug(octet + ": filling key[{}] {}", i, key[i]);
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
index ed1f306..2e4d079 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
@@ -75,10 +75,10 @@
     private final SwitchPort dst;
     private STATUS status;
 
-    public static byte[] getLinkID(final Long src_dpid, final Long src_port_no,
-                                   final Long dst_dpid, final Long dst_port_no) {
-        return LinkEvent.getLinkID(src_dpid, src_port_no, dst_dpid,
-                dst_port_no).array();
+    public static byte[] getLinkID(final Long srcDpid, final Long srcPortNo,
+                                   final Long dstDpid, final Long dstPortNo) {
+        return LinkEvent.getLinkID(srcDpid, srcPortNo, dstDpid,
+                dstPortNo).array();
     }
 
     public static long[] getLinkTupleFromKey(final byte[] key) {
@@ -102,13 +102,13 @@
         return tuple;
     }
 
-    public KVLink(final Long src_dpid, final Long src_port_no,
-                  final Long dst_dpid, final Long dst_port_no) {
-        super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME), getLinkID(src_dpid,
-                src_port_no, dst_dpid, dst_port_no));
+    public KVLink(final Long srcDpid, final Long srcPortNo,
+                  final Long dstDpid, final Long dstPortNo) {
+        super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME), getLinkID(srcDpid,
+                srcPortNo, dstDpid, dstPortNo));
 
-        src = new SwitchPort(src_dpid, src_port_no);
-        dst = new SwitchPort(dst_dpid, dst_port_no);
+        src = new SwitchPort(srcDpid, srcPortNo);
+        dst = new SwitchPort(dstDpid, dstPortNo);
         status = STATUS.INACTIVE;
     }
 
diff --git a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
index 48b2a60..18a5753 100644
--- a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
+++ b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
@@ -360,10 +360,10 @@
          *
          * @param sw      Switch to which messages will be sent.
          * @param queue   Queue of messages.
-         * @param max_msg Limitation of number of messages to be sent. If set to 0,
+         * @param maxMsg Limitation of number of messages to be sent. If set to 0,
          *                all messages in queue will be sent.
          */
-        private void processQueue(IOFSwitch sw, SwitchQueue queue, int max_msg) {
+        private void processQueue(IOFSwitch sw, SwitchQueue queue, int maxMsg) {
             // check sending rate and determine it to be sent or not
             long currentTime = System.currentTimeMillis();
             long size = 0;
@@ -372,7 +372,7 @@
                 int i = 0;
                 while (queue.hasMessageToSend()) {
                     // Number of messages excess the limit
-                    if (0 < max_msg && max_msg <= i) {
+                    if (0 < maxMsg && maxMsg <= i) {
                         break;
                     }
                     ++i;
@@ -430,13 +430,13 @@
     /**
      * Initialize object with threads of given number.
      *
-     * @param number_thread Number of threads to handle messages.
+     * @param numberThreadValue Number of threads to handle messages.
      */
-    public FlowPusher(int number_thread) {
-        if (number_thread > 0) {
-            this.numberThread = number_thread;
+    public FlowPusher(int numberThreadValue) {
+        if (numberThreadValue > 0) {
+            numberThread = numberThreadValue;
         } else {
-            this.numberThread = DEFAULT_NUMBER_THREAD;
+            numberThread = DEFAULT_NUMBER_THREAD;
         }
     }
 
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
index fbf686a..40d7400 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
@@ -22,10 +22,10 @@
         dst = null;
     }
 
-    public LinkEvent(Long src_dpid, Long src_port_no, Long dst_dpid,
-                     Long dst_port_no) {
-        src = new SwitchPort(src_dpid, src_port_no);
-        dst = new SwitchPort(dst_dpid, dst_port_no);
+    public LinkEvent(Long srcDpid, Long srcPortNo, Long dstDpid,
+                     Long dstPortNo) {
+        src = new SwitchPort(srcDpid, srcPortNo);
+        dst = new SwitchPort(dstDpid, dstPortNo);
     }
 
     public LinkEvent(Link link) {
@@ -50,11 +50,11 @@
 
     public static final int LINKID_BYTES = 2 + PortEvent.PORTID_BYTES * 2;
 
-    public static ByteBuffer getLinkID(Long src_dpid, Long src_port_no,
-                                       Long dst_dpid, Long dst_port_no) {
+    public static ByteBuffer getLinkID(Long srcDpid, Long srcPortNo,
+                                       Long dstDpid, Long dstPortNo) {
         return (ByteBuffer) ByteBuffer.allocate(LinkEvent.LINKID_BYTES).putChar('L')
-                .put(PortEvent.getPortID(src_dpid, src_port_no))
-                .put(PortEvent.getPortID(dst_dpid, dst_port_no)).flip();
+                .put(PortEvent.getPortID(srcDpid, srcPortNo))
+                .put(PortEvent.getPortID(dstDpid, dstPortNo)).flip();
     }
 
     public byte[] getID() {
