diff --git a/conf/checkstyle/sun_checks.xml b/conf/checkstyle/sun_checks.xml
index 0ea6a75..5baa022 100644
--- a/conf/checkstyle/sun_checks.xml
+++ b/conf/checkstyle/sun_checks.xml
@@ -127,11 +127,7 @@
         </module>
 
         <module name="PackageName"/>
-
-        <module name="ParameterName">
-          <property name="severity" value="warning"/>
-        </module>
-
+        <module name="ParameterName"/>
         <module name="StaticVariableName"/>
         <module name="TypeName"/>
 
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() {
