diff --git a/conf/checkstyle/sun_checks.xml b/conf/checkstyle/sun_checks.xml
index 9ab4e94..975350e 100644
--- a/conf/checkstyle/sun_checks.xml
+++ b/conf/checkstyle/sun_checks.xml
@@ -122,13 +122,9 @@
         </module>
         <module name="LocalFinalVariableName"/>
 
-        <module name="LocalVariableName">
-          <property name="severity" value="warning"/>
-        </module>
+        <module name="LocalVariableName"/>
 
-        <module name="MemberName">
-          <property name="severity" value="warning"/>
-        </module>
+        <module name="MemberName"/>
 
         <module name="MethodName">
           <property name="severity" value="warning"/>
diff --git a/src/main/java/net/onrc/onos/apps/bgproute/BgpRoute.java b/src/main/java/net/onrc/onos/apps/bgproute/BgpRoute.java
index b2fcbc0..3c588f2 100644
--- a/src/main/java/net/onrc/onos/apps/bgproute/BgpRoute.java
+++ b/src/main/java/net/onrc/onos/apps/bgproute/BgpRoute.java
@@ -93,21 +93,21 @@
 
     //We need to identify our flows somehow. But like it says in LearningSwitch.java,
     //the controller/OS should hand out cookie IDs to prevent conflicts.
-    private final long APP_COOKIE = 0xa0000000000000L;
+    private static final long APP_COOKIE = 0xa0000000000000L;
     //Cookie for flows that do L2 forwarding within SDN domain to egress routers
-    private final long L2_FWD_COOKIE = APP_COOKIE + 1;
+    private static final long L2_FWD_COOKIE = APP_COOKIE + 1;
     //Cookie for flows in ingress switches that rewrite the MAC address
-    private final long MAC_RW_COOKIE = APP_COOKIE + 2;
+    private static final long MAC_RW_COOKIE = APP_COOKIE + 2;
     //Cookie for flows that setup BGP paths
-    private final long BGP_COOKIE = APP_COOKIE + 3;
+    private static final long BGP_COOKIE = APP_COOKIE + 3;
     //Forwarding uses priority 0, and the mac rewrite entries in ingress switches
     //need to be higher priority than this otherwise the rewrite may not get done
-    private final short SDNIP_PRIORITY = 10;
-    private final short ARP_PRIORITY = 20;
+    private static final short SDNIP_PRIORITY = 10;
+    private static final short ARP_PRIORITY = 20;
 
-    private final short BGP_PORT = 179;
+    private static final short BGP_PORT = 179;
 
-    private final int TOPO_DETECTION_WAIT = 2; //seconds
+    private static final int TOPO_DETECTION_WAIT = 2; //seconds
 
     //Configuration stuff
     private List<String> switches;
@@ -347,17 +347,17 @@
 
         response = response.replaceAll("\"", "'");
         JSONObject jsonObj = (JSONObject) JSONSerializer.toJSON(response);
-        JSONArray rib_json_array = jsonObj.getJSONArray("rib");
-        String router_id = jsonObj.getString("router-id");
+        JSONArray ribJsonArray = jsonObj.getJSONArray("rib");
+        String routerId = jsonObj.getString("router-id");
 
-        int size = rib_json_array.size();
+        int size = ribJsonArray.size();
 
         log.info("Retrived RIB of {} entries from BGPd", size);
 
         for (int j = 0; j < size; j++) {
-            JSONObject second_json_object = rib_json_array.getJSONObject(j);
-            String prefix = second_json_object.getString("prefix");
-            String nexthop = second_json_object.getString("nexthop");
+            JSONObject secondJsonObject = ribJsonArray.getJSONObject(j);
+            String prefix = secondJsonObject.getString("prefix");
+            String nexthop = secondJsonObject.getString("nexthop");
 
             //insert each rib entry into the local rib;
             String[] substring = prefix.split("/");
@@ -375,7 +375,7 @@
                 continue;
             }
 
-            RibEntry rib = new RibEntry(router_id, nexthop);
+            RibEntry rib = new RibEntry(routerId, nexthop);
 
             try {
                 ribUpdates.put(new RibUpdate(Operation.UPDATE, p, rib));
@@ -873,18 +873,18 @@
             // Reversed BGP flow path for src-TCP-port
             flowPath.setFlowId(new FlowId());
 
-            DataPath reverse_dataPath = new DataPath();
+            DataPath reverseDataPath = new DataPath();
 
-            SwitchPort reverse_dstPort = new SwitchPort();
-            reverse_dstPort.setDpid(bgpdAttachmentPoint.dpid());
-            reverse_dstPort.setPort(bgpdAttachmentPoint.port());
-            reverse_dataPath.setDstPort(reverse_dstPort);
+            SwitchPort reverseDstPort = new SwitchPort();
+            reverseDstPort.setDpid(bgpdAttachmentPoint.dpid());
+            reverseDstPort.setPort(bgpdAttachmentPoint.port());
+            reverseDataPath.setDstPort(reverseDstPort);
 
-            SwitchPort reverse_srcPort = new SwitchPort();
-            reverse_srcPort.setDpid(new Dpid(peerInterface.getDpid()));
-            reverse_srcPort.setPort(new Port(peerInterface.getSwitchPort().port()));
-            reverse_dataPath.setSrcPort(reverse_srcPort);
-            flowPath.setDataPath(reverse_dataPath);
+            SwitchPort reverseSrcPort = new SwitchPort();
+            reverseSrcPort.setDpid(new Dpid(peerInterface.getDpid()));
+            reverseSrcPort.setPort(new Port(peerInterface.getSwitchPort().port()));
+            reverseDataPath.setSrcPort(reverseSrcPort);
+            flowPath.setDataPath(reverseDataPath);
 
             // reverse the dst IP and src IP addresses
             flowEntryMatch.enableDstIPv4Net(srcIPv4Net);
@@ -940,7 +940,7 @@
 
             flowPath.setFlowEntryMatch(flowEntryMatch);
 
-            flowPath.setDataPath(reverse_dataPath);
+            flowPath.setDataPath(reverseDataPath);
 
             log.debug("Reversed ICMP FlowPath: {}", flowPath.toString());
 
diff --git a/src/main/java/net/onrc/onos/apps/bgproute/PatriciaTrie.java b/src/main/java/net/onrc/onos/apps/bgproute/PatriciaTrie.java
index 817e571..0650012 100644
--- a/src/main/java/net/onrc/onos/apps/bgproute/PatriciaTrie.java
+++ b/src/main/java/net/onrc/onos/apps/bgproute/PatriciaTrie.java
@@ -320,22 +320,22 @@
             }
         }
 
-        int common_len = i * 8;
+        int commonLen = i * 8;
         int boundary = 0;
 
-        if (common_len != key_bits) {
+        if (commonLen != key_bits) {
             byte diff = (byte) (node.prefix.getAddress()[i] ^ key[i]);
             byte mask = (byte) 0x80;
-            int shift_mask = 0;
+            int shiftMask = 0;
 
-            while (common_len < key_bits && ((mask & diff) == 0)) {
+            while (commonLen < key_bits && ((mask & diff) == 0)) {
                 boundary = 1;
 
-                shift_mask = (mask & 0xff);
-                shift_mask >>= 1;
-                mask = (byte) shift_mask;
+                shiftMask = (mask & 0xff);
+                shiftMask >>= 1;
+                mask = (byte) shiftMask;
 
-                common_len++;
+                commonLen++;
             }
         }
 
@@ -356,10 +356,10 @@
             newPrefix[j] = node.prefix.getAddress()[j];
 
         if (boundary != 0)
-            newPrefix[j] = (byte) (node.prefix.getAddress()[j] & maskBits[common_len % 8]);
+            newPrefix[j] = (byte) (node.prefix.getAddress()[j] & maskBits[commonLen % 8]);
 
         //return new Node(new Prefix(newPrefix, common_len), null);
-        return new Node(new Prefix(newPrefix, common_len));
+        return new Node(new Prefix(newPrefix, commonLen));
         //return add;
     }
 
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 b56fa0c..b34364b 100644
--- a/src/main/java/net/onrc/onos/apps/bgproute/Ptree.java
+++ b/src/main/java/net/onrc/onos/apps/bgproute/Ptree.java
@@ -254,26 +254,26 @@
             }
         }
 
-        int common_len = i * 8;
+        int commonLen = i * 8;
         int boundary = 0;
 
-        if (common_len != key_bits) {
+        if (commonLen != key_bits) {
             byte diff = (byte) (node.key[i] ^ key[i]);
             byte mask = (byte) 0x80;
-            int shift_mask = 0;
+            int shiftMask = 0;
 
-            while (common_len < key_bits && ((mask & diff) == 0)) {
+            while (commonLen < key_bits && ((mask & diff) == 0)) {
                 boundary = 1;
 
-                shift_mask = (mask & 0xff);
-                shift_mask >>= 1;
-                mask = (byte) shift_mask;
+                shiftMask = (mask & 0xff);
+                shiftMask >>= 1;
+                mask = (byte) shiftMask;
 
-                common_len++;
+                commonLen++;
             }
         }
 
-        PtreeNode add = new PtreeNode(null, common_len, maxKeyOctets);
+        PtreeNode add = new PtreeNode(null, commonLen, maxKeyOctets);
 
         int j;
         for (j = 0; j < i; j++)
diff --git a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
index 2ed8ba5..68bfaff 100644
--- a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
@@ -65,7 +65,7 @@
         IForwardingService, IEventChannelListener<Long, IntentStateList> {
     private final static Logger log = LoggerFactory.getLogger(Forwarding.class);
 
-    private final int SLEEP_TIME_FOR_DB_DEVICE_INSTALLED = 100; // milliseconds
+    private static final int SLEEP_TIME_FOR_DB_DEVICE_INSTALLED = 100; // milliseconds
     private final static int NUMBER_OF_THREAD_FOR_EXECUTOR = 1;
 
     private final static ScheduledExecutorService executor = Executors.newScheduledThreadPool(NUMBER_OF_THREAD_FOR_EXECUTOR);
diff --git a/src/main/java/net/onrc/onos/core/datagrid/web/IntentResource.java b/src/main/java/net/onrc/onos/core/datagrid/web/IntentResource.java
index fccea27..4dbebe8 100755
--- a/src/main/java/net/onrc/onos/core/datagrid/web/IntentResource.java
+++ b/src/main/java/net/onrc/onos/core/datagrid/web/IntentResource.java
@@ -39,7 +39,7 @@
 public class IntentResource extends ServerResource {
     private final static Logger log = LoggerFactory.getLogger(IntentResource.class);
     // TODO need to assign proper application id.
-    private final String APPLN_ID = "1";
+    private static final String APPLN_ID = "1";
 
     @Post("json")
     public String store(String jsonIntent) throws IOException {
diff --git a/src/main/java/net/onrc/onos/core/datastore/serializers/Topology.java b/src/main/java/net/onrc/onos/core/datastore/serializers/Topology.java
index 06154f3..02a2734 100644
--- a/src/main/java/net/onrc/onos/core/datastore/serializers/Topology.java
+++ b/src/main/java/net/onrc/onos/core/datastore/serializers/Topology.java
@@ -74,7 +74,7 @@
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       initFields();
-      int mutable_bitField0_ = 0;
+      int mutableBitField0 = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -93,18 +93,18 @@
               break;
             }
             case 8: {
-              bitField0_ |= 0x00000001;
-              dpid_ = input.readInt64();
+              bitField0 |= 0x00000001;
+              dpid = input.readInt64();
               break;
             }
             case 16: {
-              bitField0_ |= 0x00000002;
-              status_ = input.readInt32();
+              bitField0 |= 0x00000002;
+              status = input.readInt32();
               break;
             }
             case 26: {
-              bitField0_ |= 0x00000004;
-              value_ = input.readBytes();
+              bitField0 |= 0x00000004;
+              value = input.readBytes();
               break;
             }
           }
@@ -121,12 +121,12 @@
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_SwitchProperty_descriptor;
+      return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologySwitchPropertyDescriptor;
     }
 
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_SwitchProperty_fieldAccessorTable
+      return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologySwitchPropertyFieldAccessorTable
           .ensureFieldAccessorsInitialized(
               net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty.class, net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty.Builder.class);
     }
@@ -146,59 +146,59 @@
       return PARSER;
     }
 
-    private int bitField0_;
+    private int bitField0;
     // required int64 dpid = 1;
     public static final int DPID_FIELD_NUMBER = 1;
-    private long dpid_;
+    private long dpid;
     /**
      * <code>required int64 dpid = 1;</code>
      */
     public boolean hasDpid() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
+      return ((bitField0 & 0x00000001) == 0x00000001);
     }
     /**
      * <code>required int64 dpid = 1;</code>
      */
     public long getDpid() {
-      return dpid_;
+      return dpid;
     }
 
     // required int32 status = 2;
     public static final int STATUS_FIELD_NUMBER = 2;
-    private int status_;
+    private int status;
     /**
      * <code>required int32 status = 2;</code>
      */
     public boolean hasStatus() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
+      return ((bitField0 & 0x00000002) == 0x00000002);
     }
     /**
      * <code>required int32 status = 2;</code>
      */
     public int getStatus() {
-      return status_;
+      return status;
     }
 
     // optional bytes value = 3;
     public static final int VALUE_FIELD_NUMBER = 3;
-    private com.google.protobuf.ByteString value_;
+    private com.google.protobuf.ByteString value;
     /**
      * <code>optional bytes value = 3;</code>
      */
     public boolean hasValue() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
+      return ((bitField0 & 0x00000004) == 0x00000004);
     }
     /**
      * <code>optional bytes value = 3;</code>
      */
     public com.google.protobuf.ByteString getValue() {
-      return value_;
+      return value;
     }
 
     private void initFields() {
-      dpid_ = 0L;
-      status_ = 0;
-      value_ = com.google.protobuf.ByteString.EMPTY;
+      dpid = 0L;
+      status = 0;
+      value = com.google.protobuf.ByteString.EMPTY;
     }
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
@@ -220,14 +220,14 @@
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeInt64(1, dpid_);
+      if (((bitField0 & 0x00000001) == 0x00000001)) {
+        output.writeInt64(1, dpid);
       }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeInt32(2, status_);
+      if (((bitField0 & 0x00000002) == 0x00000002)) {
+        output.writeInt32(2, status);
       }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(3, value_);
+      if (((bitField0 & 0x00000004) == 0x00000004)) {
+        output.writeBytes(3, value);
       }
       getUnknownFields().writeTo(output);
     }
@@ -238,17 +238,17 @@
       if (size != -1) return size;
 
       size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+      if (((bitField0 & 0x00000001) == 0x00000001)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(1, dpid_);
+          .computeInt64Size(1, dpid);
       }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+      if (((bitField0 & 0x00000002) == 0x00000002)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(2, status_);
+          .computeInt32Size(2, status);
       }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+      if (((bitField0 & 0x00000004) == 0x00000004)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, value_);
+          .computeBytesSize(3, value);
       }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
@@ -336,12 +336,12 @@
        implements net.onrc.onos.core.datastore.serializers.Topology.SwitchPropertyOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_SwitchProperty_descriptor;
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologySwitchPropertyDescriptor;
       }
 
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_SwitchProperty_fieldAccessorTable
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologySwitchPropertyFieldAccessorTable
             .ensureFieldAccessorsInitialized(
                 net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty.class, net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty.Builder.class);
       }
@@ -366,12 +366,12 @@
 
       public Builder clear() {
         super.clear();
-        dpid_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        status_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        value_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
+        dpid = 0L;
+        bitField0 = (bitField0 & ~0x00000001);
+        status = 0;
+        bitField0 = (bitField0 & ~0x00000002);
+        value = com.google.protobuf.ByteString.EMPTY;
+        bitField0 = (bitField0 & ~0x00000004);
         return this;
       }
 
@@ -381,7 +381,7 @@
 
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_SwitchProperty_descriptor;
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologySwitchPropertyDescriptor;
       }
 
       public net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty getDefaultInstanceForType() {
@@ -398,21 +398,21 @@
 
       public net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty buildPartial() {
         net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty result = new net.onrc.onos.core.datastore.serializers.Topology.SwitchProperty(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
+        int fromBitField0 = bitField0;
+        int toBitField0 = 0;
+        if (((fromBitField0 & 0x00000001) == 0x00000001)) {
+          toBitField0 |= 0x00000001;
         }
-        result.dpid_ = dpid_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
+        result.dpid = dpid;
+        if (((fromBitField0 & 0x00000002) == 0x00000002)) {
+          toBitField0 |= 0x00000002;
         }
-        result.status_ = status_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
+        result.status = status;
+        if (((fromBitField0 & 0x00000004) == 0x00000004)) {
+          toBitField0 |= 0x00000004;
         }
-        result.value_ = value_;
-        result.bitField0_ = to_bitField0_;
+        result.value = value;
+        result.bitField0 = toBitField0;
         onBuilt();
         return result;
       }
@@ -470,28 +470,28 @@
         }
         return this;
       }
-      private int bitField0_;
+      private int bitField0;
 
       // required int64 dpid = 1;
-      private long dpid_ ;
+      private long dpid;
       /**
        * <code>required int64 dpid = 1;</code>
        */
       public boolean hasDpid() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
+        return ((bitField0 & 0x00000001) == 0x00000001);
       }
       /**
        * <code>required int64 dpid = 1;</code>
        */
       public long getDpid() {
-        return dpid_;
+        return dpid;
       }
       /**
        * <code>required int64 dpid = 1;</code>
        */
       public Builder setDpid(long value) {
-        bitField0_ |= 0x00000001;
-        dpid_ = value;
+        bitField0 |= 0x00000001;
+        dpid = value;
         onChanged();
         return this;
       }
@@ -499,32 +499,32 @@
        * <code>required int64 dpid = 1;</code>
        */
       public Builder clearDpid() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        dpid_ = 0L;
+        bitField0 = (bitField0 & ~0x00000001);
+        dpid = 0L;
         onChanged();
         return this;
       }
 
       // required int32 status = 2;
-      private int status_ ;
+      private int status;
       /**
        * <code>required int32 status = 2;</code>
        */
       public boolean hasStatus() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
+        return ((bitField0 & 0x00000002) == 0x00000002);
       }
       /**
        * <code>required int32 status = 2;</code>
        */
       public int getStatus() {
-        return status_;
+        return status;
       }
       /**
        * <code>required int32 status = 2;</code>
        */
       public Builder setStatus(int value) {
-        bitField0_ |= 0x00000002;
-        status_ = value;
+        bitField0 |= 0x00000002;
+        status = value;
         onChanged();
         return this;
       }
@@ -532,25 +532,25 @@
        * <code>required int32 status = 2;</code>
        */
       public Builder clearStatus() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        status_ = 0;
+        bitField0 = (bitField0 & ~0x00000002);
+        status = 0;
         onChanged();
         return this;
       }
 
       // optional bytes value = 3;
-      private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY;
+      private com.google.protobuf.ByteString value = com.google.protobuf.ByteString.EMPTY;
       /**
        * <code>optional bytes value = 3;</code>
        */
       public boolean hasValue() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
+        return ((bitField0 & 0x00000004) == 0x00000004);
       }
       /**
        * <code>optional bytes value = 3;</code>
        */
       public com.google.protobuf.ByteString getValue() {
-        return value_;
+        return value;
       }
       /**
        * <code>optional bytes value = 3;</code>
@@ -559,8 +559,8 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000004;
-        value_ = value;
+  bitField0 |= 0x00000004;
+        this.value = value;
         onChanged();
         return this;
       }
@@ -568,8 +568,8 @@
        * <code>optional bytes value = 3;</code>
        */
       public Builder clearValue() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        value_ = getDefaultInstance().getValue();
+        bitField0 = (bitField0 & ~0x00000004);
+        value = getDefaultInstance().getValue();
         onChanged();
         return this;
       }
@@ -661,7 +661,7 @@
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       initFields();
-      int mutable_bitField0_ = 0;
+      int mutableBitField0 = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -680,23 +680,23 @@
               break;
             }
             case 8: {
-              bitField0_ |= 0x00000001;
-              dpid_ = input.readInt64();
+              bitField0 |= 0x00000001;
+              dpid = input.readInt64();
               break;
             }
             case 16: {
-              bitField0_ |= 0x00000002;
-              number_ = input.readInt64();
+              bitField0 |= 0x00000002;
+              number = input.readInt64();
               break;
             }
             case 24: {
-              bitField0_ |= 0x00000004;
-              status_ = input.readInt32();
+              bitField0 |= 0x00000004;
+              status = input.readInt32();
               break;
             }
             case 34: {
-              bitField0_ |= 0x00000008;
-              value_ = input.readBytes();
+              bitField0 |= 0x00000008;
+              value = input.readBytes();
               break;
             }
           }
@@ -713,12 +713,12 @@
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_PortProperty_descriptor;
+      return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyPortPropertyDescriptor;
     }
 
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_PortProperty_fieldAccessorTable
+      return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyPortPropertyFieldAccessorTable
           .ensureFieldAccessorsInitialized(
               net.onrc.onos.core.datastore.serializers.Topology.PortProperty.class, net.onrc.onos.core.datastore.serializers.Topology.PortProperty.Builder.class);
     }
@@ -738,76 +738,76 @@
       return PARSER;
     }
 
-    private int bitField0_;
+    private int bitField0;
     // required int64 dpid = 1;
     public static final int DPID_FIELD_NUMBER = 1;
-    private long dpid_;
+    private long dpid;
     /**
      * <code>required int64 dpid = 1;</code>
      */
     public boolean hasDpid() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
+      return ((bitField0 & 0x00000001) == 0x00000001);
     }
     /**
      * <code>required int64 dpid = 1;</code>
      */
     public long getDpid() {
-      return dpid_;
+      return dpid;
     }
 
     // required int64 number = 2;
     public static final int NUMBER_FIELD_NUMBER = 2;
-    private long number_;
+    private long number;
     /**
      * <code>required int64 number = 2;</code>
      */
     public boolean hasNumber() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
+      return ((bitField0 & 0x00000002) == 0x00000002);
     }
     /**
      * <code>required int64 number = 2;</code>
      */
     public long getNumber() {
-      return number_;
+      return number;
     }
 
     // required int32 status = 3;
     public static final int STATUS_FIELD_NUMBER = 3;
-    private int status_;
+    private int status;
     /**
      * <code>required int32 status = 3;</code>
      */
     public boolean hasStatus() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
+      return ((bitField0 & 0x00000004) == 0x00000004);
     }
     /**
      * <code>required int32 status = 3;</code>
      */
     public int getStatus() {
-      return status_;
+      return status;
     }
 
     // optional bytes value = 4;
     public static final int VALUE_FIELD_NUMBER = 4;
-    private com.google.protobuf.ByteString value_;
+    private com.google.protobuf.ByteString value;
     /**
      * <code>optional bytes value = 4;</code>
      */
     public boolean hasValue() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
+      return ((bitField0 & 0x00000008) == 0x00000008);
     }
     /**
      * <code>optional bytes value = 4;</code>
      */
     public com.google.protobuf.ByteString getValue() {
-      return value_;
+      return value;
     }
 
     private void initFields() {
-      dpid_ = 0L;
-      number_ = 0L;
-      status_ = 0;
-      value_ = com.google.protobuf.ByteString.EMPTY;
+      dpid = 0L;
+      number = 0L;
+      status = 0;
+      value = com.google.protobuf.ByteString.EMPTY;
     }
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
@@ -833,17 +833,17 @@
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeInt64(1, dpid_);
+      if (((bitField0 & 0x00000001) == 0x00000001)) {
+        output.writeInt64(1, dpid);
       }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeInt64(2, number_);
+      if (((bitField0 & 0x00000002) == 0x00000002)) {
+        output.writeInt64(2, number);
       }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeInt32(3, status_);
+      if (((bitField0 & 0x00000004) == 0x00000004)) {
+        output.writeInt32(3, status);
       }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeBytes(4, value_);
+      if (((bitField0 & 0x00000008) == 0x00000008)) {
+        output.writeBytes(4, value);
       }
       getUnknownFields().writeTo(output);
     }
@@ -854,21 +854,21 @@
       if (size != -1) return size;
 
       size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+      if (((bitField0 & 0x00000001) == 0x00000001)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(1, dpid_);
+          .computeInt64Size(1, dpid);
       }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+      if (((bitField0 & 0x00000002) == 0x00000002)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(2, number_);
+          .computeInt64Size(2, number);
       }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+      if (((bitField0 & 0x00000004) == 0x00000004)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(3, status_);
+          .computeInt32Size(3, status);
       }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+      if (((bitField0 & 0x00000008) == 0x00000008)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(4, value_);
+          .computeBytesSize(4, value);
       }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
@@ -956,12 +956,12 @@
        implements net.onrc.onos.core.datastore.serializers.Topology.PortPropertyOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_PortProperty_descriptor;
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyPortPropertyDescriptor;
       }
 
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_PortProperty_fieldAccessorTable
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyPortPropertyFieldAccessorTable
             .ensureFieldAccessorsInitialized(
                 net.onrc.onos.core.datastore.serializers.Topology.PortProperty.class, net.onrc.onos.core.datastore.serializers.Topology.PortProperty.Builder.class);
       }
@@ -986,14 +986,14 @@
 
       public Builder clear() {
         super.clear();
-        dpid_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        number_ = 0L;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        status_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        value_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000008);
+        dpid = 0L;
+        bitField0 = (bitField0 & ~0x00000001);
+        number = 0L;
+        bitField0 = (bitField0 & ~0x00000002);
+        status = 0;
+        bitField0 = (bitField0 & ~0x00000004);
+        value = com.google.protobuf.ByteString.EMPTY;
+        bitField0 = (bitField0 & ~0x00000008);
         return this;
       }
 
@@ -1003,7 +1003,7 @@
 
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_PortProperty_descriptor;
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyPortPropertyDescriptor;
       }
 
       public net.onrc.onos.core.datastore.serializers.Topology.PortProperty getDefaultInstanceForType() {
@@ -1020,25 +1020,25 @@
 
       public net.onrc.onos.core.datastore.serializers.Topology.PortProperty buildPartial() {
         net.onrc.onos.core.datastore.serializers.Topology.PortProperty result = new net.onrc.onos.core.datastore.serializers.Topology.PortProperty(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
+        int bitField0 = this.bitField0;
+        int toBitField0 = 0;
+        if (((bitField0 & 0x00000001) == 0x00000001)) {
+          toBitField0 |= 0x00000001;
         }
-        result.dpid_ = dpid_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
+        result.dpid = dpid;
+        if (((bitField0 & 0x00000002) == 0x00000002)) {
+          toBitField0 |= 0x00000002;
         }
-        result.number_ = number_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
+        result.number = number;
+        if (((bitField0 & 0x00000004) == 0x00000004)) {
+          toBitField0 |= 0x00000004;
         }
-        result.status_ = status_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
+        result.status = status;
+        if (((bitField0 & 0x00000008) == 0x00000008)) {
+          toBitField0 |= 0x00000008;
         }
-        result.value_ = value_;
-        result.bitField0_ = to_bitField0_;
+        result.value = value;
+        result.bitField0 = toBitField0;
         onBuilt();
         return result;
       }
@@ -1103,28 +1103,28 @@
         }
         return this;
       }
-      private int bitField0_;
+      private int bitField0;
 
       // required int64 dpid = 1;
-      private long dpid_ ;
+      private long dpid;
       /**
        * <code>required int64 dpid = 1;</code>
        */
       public boolean hasDpid() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
+        return ((bitField0 & 0x00000001) == 0x00000001);
       }
       /**
        * <code>required int64 dpid = 1;</code>
        */
       public long getDpid() {
-        return dpid_;
+        return dpid;
       }
       /**
        * <code>required int64 dpid = 1;</code>
        */
       public Builder setDpid(long value) {
-        bitField0_ |= 0x00000001;
-        dpid_ = value;
+        bitField0 |= 0x00000001;
+        dpid = value;
         onChanged();
         return this;
       }
@@ -1132,32 +1132,32 @@
        * <code>required int64 dpid = 1;</code>
        */
       public Builder clearDpid() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        dpid_ = 0L;
+        bitField0 = (bitField0 & ~0x00000001);
+        dpid = 0L;
         onChanged();
         return this;
       }
 
       // required int64 number = 2;
-      private long number_ ;
+      private long number;
       /**
        * <code>required int64 number = 2;</code>
        */
       public boolean hasNumber() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
+        return ((bitField0 & 0x00000002) == 0x00000002);
       }
       /**
        * <code>required int64 number = 2;</code>
        */
       public long getNumber() {
-        return number_;
+        return number;
       }
       /**
        * <code>required int64 number = 2;</code>
        */
       public Builder setNumber(long value) {
-        bitField0_ |= 0x00000002;
-        number_ = value;
+        bitField0 |= 0x00000002;
+        number = value;
         onChanged();
         return this;
       }
@@ -1165,32 +1165,32 @@
        * <code>required int64 number = 2;</code>
        */
       public Builder clearNumber() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        number_ = 0L;
+        bitField0 = (bitField0 & ~0x00000002);
+        number = 0L;
         onChanged();
         return this;
       }
 
       // required int32 status = 3;
-      private int status_ ;
+      private int status;
       /**
        * <code>required int32 status = 3;</code>
        */
       public boolean hasStatus() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
+        return ((bitField0 & 0x00000004) == 0x00000004);
       }
       /**
        * <code>required int32 status = 3;</code>
        */
       public int getStatus() {
-        return status_;
+        return status;
       }
       /**
        * <code>required int32 status = 3;</code>
        */
       public Builder setStatus(int value) {
-        bitField0_ |= 0x00000004;
-        status_ = value;
+        bitField0 |= 0x00000004;
+        status = value;
         onChanged();
         return this;
       }
@@ -1198,25 +1198,25 @@
        * <code>required int32 status = 3;</code>
        */
       public Builder clearStatus() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        status_ = 0;
+        bitField0 = (bitField0 & ~0x00000004);
+        status = 0;
         onChanged();
         return this;
       }
 
       // optional bytes value = 4;
-      private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY;
+      private com.google.protobuf.ByteString value = com.google.protobuf.ByteString.EMPTY;
       /**
        * <code>optional bytes value = 4;</code>
        */
       public boolean hasValue() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
+        return ((bitField0 & 0x00000008) == 0x00000008);
       }
       /**
        * <code>optional bytes value = 4;</code>
        */
       public com.google.protobuf.ByteString getValue() {
-        return value_;
+        return value;
       }
       /**
        * <code>optional bytes value = 4;</code>
@@ -1225,8 +1225,8 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000008;
-        value_ = value;
+  bitField0 |= 0x00000008;
+        this.value = value;
         onChanged();
         return this;
       }
@@ -1234,8 +1234,8 @@
        * <code>optional bytes value = 4;</code>
        */
       public Builder clearValue() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        value_ = getDefaultInstance().getValue();
+        bitField0 = (bitField0 & ~0x00000008);
+        value = getDefaultInstance().getValue();
         onChanged();
         return this;
       }
@@ -1347,7 +1347,7 @@
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       initFields();
-      int mutable_bitField0_ = 0;
+      int mutableBitField0 = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -1366,33 +1366,33 @@
               break;
             }
             case 10: {
-              bitField0_ |= 0x00000001;
-              srcSwId_ = input.readBytes();
+              bitField0 |= 0x00000001;
+              srcSwId = input.readBytes();
               break;
             }
             case 18: {
-              bitField0_ |= 0x00000002;
-              srcPortId_ = input.readBytes();
+              bitField0 |= 0x00000002;
+              srcPortId = input.readBytes();
               break;
             }
             case 26: {
-              bitField0_ |= 0x00000004;
-              dstSwId_ = input.readBytes();
+              bitField0 |= 0x00000004;
+              dstSwId = input.readBytes();
               break;
             }
             case 34: {
-              bitField0_ |= 0x00000008;
-              dstPortId_ = input.readBytes();
+              bitField0 |= 0x00000008;
+              dstPortId = input.readBytes();
               break;
             }
             case 40: {
-              bitField0_ |= 0x00000010;
-              status_ = input.readInt32();
+              bitField0 |= 0x00000010;
+              status = input.readInt32();
               break;
             }
             case 50: {
-              bitField0_ |= 0x00000020;
-              value_ = input.readBytes();
+              bitField0 |= 0x00000020;
+              value = input.readBytes();
               break;
             }
           }
@@ -1409,17 +1409,17 @@
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_LinkProperty_descriptor;
+      return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyLinkPropertyDescriptor;
     }
 
     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_LinkProperty_fieldAccessorTable
+      return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyLinkPropertyFieldAccessorTable
           .ensureFieldAccessorsInitialized(
               net.onrc.onos.core.datastore.serializers.Topology.LinkProperty.class, net.onrc.onos.core.datastore.serializers.Topology.LinkProperty.Builder.class);
     }
 
-    public static com.google.protobuf.Parser<LinkProperty> PARSER =
+    public static final com.google.protobuf.Parser<LinkProperty> PARSER =
         new com.google.protobuf.AbstractParser<LinkProperty>() {
       public LinkProperty parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
@@ -1434,110 +1434,110 @@
       return PARSER;
     }
 
-    private int bitField0_;
+    private int bitField0;
     // required bytes srcSwId = 1;
     public static final int SRCSWID_FIELD_NUMBER = 1;
-    private com.google.protobuf.ByteString srcSwId_;
+    private com.google.protobuf.ByteString srcSwId;
     /**
      * <code>required bytes srcSwId = 1;</code>
      */
     public boolean hasSrcSwId() {
-      return ((bitField0_ & 0x00000001) == 0x00000001);
+      return ((bitField0 & 0x00000001) == 0x00000001);
     }
     /**
      * <code>required bytes srcSwId = 1;</code>
      */
     public com.google.protobuf.ByteString getSrcSwId() {
-      return srcSwId_;
+      return srcSwId;
     }
 
     // required bytes srcPortId = 2;
     public static final int SRCPORTID_FIELD_NUMBER = 2;
-    private com.google.protobuf.ByteString srcPortId_;
+    private com.google.protobuf.ByteString srcPortId;
     /**
      * <code>required bytes srcPortId = 2;</code>
      */
     public boolean hasSrcPortId() {
-      return ((bitField0_ & 0x00000002) == 0x00000002);
+      return ((bitField0 & 0x00000002) == 0x00000002);
     }
     /**
      * <code>required bytes srcPortId = 2;</code>
      */
     public com.google.protobuf.ByteString getSrcPortId() {
-      return srcPortId_;
+      return srcPortId;
     }
 
     // required bytes dstSwId = 3;
     public static final int DSTSWID_FIELD_NUMBER = 3;
-    private com.google.protobuf.ByteString dstSwId_;
+    private com.google.protobuf.ByteString dstSwId;
     /**
      * <code>required bytes dstSwId = 3;</code>
      */
     public boolean hasDstSwId() {
-      return ((bitField0_ & 0x00000004) == 0x00000004);
+      return ((bitField0 & 0x00000004) == 0x00000004);
     }
     /**
      * <code>required bytes dstSwId = 3;</code>
      */
     public com.google.protobuf.ByteString getDstSwId() {
-      return dstSwId_;
+      return dstSwId;
     }
 
     // required bytes dstPortId = 4;
     public static final int DSTPORTID_FIELD_NUMBER = 4;
-    private com.google.protobuf.ByteString dstPortId_;
+    private com.google.protobuf.ByteString dstPortId;
     /**
      * <code>required bytes dstPortId = 4;</code>
      */
     public boolean hasDstPortId() {
-      return ((bitField0_ & 0x00000008) == 0x00000008);
+      return ((bitField0 & 0x00000008) == 0x00000008);
     }
     /**
      * <code>required bytes dstPortId = 4;</code>
      */
     public com.google.protobuf.ByteString getDstPortId() {
-      return dstPortId_;
+      return dstPortId;
     }
 
     // required int32 status = 5;
     public static final int STATUS_FIELD_NUMBER = 5;
-    private int status_;
+    private int status;
     /**
      * <code>required int32 status = 5;</code>
      */
     public boolean hasStatus() {
-      return ((bitField0_ & 0x00000010) == 0x00000010);
+      return ((bitField0 & 0x00000010) == 0x00000010);
     }
     /**
      * <code>required int32 status = 5;</code>
      */
     public int getStatus() {
-      return status_;
+      return status;
     }
 
     // optional bytes value = 6;
     public static final int VALUE_FIELD_NUMBER = 6;
-    private com.google.protobuf.ByteString value_;
+    private com.google.protobuf.ByteString value;
     /**
      * <code>optional bytes value = 6;</code>
      */
     public boolean hasValue() {
-      return ((bitField0_ & 0x00000020) == 0x00000020);
+      return ((bitField0 & 0x00000020) == 0x00000020);
     }
     /**
      * <code>optional bytes value = 6;</code>
      */
     public com.google.protobuf.ByteString getValue() {
-      return value_;
+      return value;
     }
 
     private void initFields() {
-      srcSwId_ = com.google.protobuf.ByteString.EMPTY;
-      srcPortId_ = com.google.protobuf.ByteString.EMPTY;
-      dstSwId_ = com.google.protobuf.ByteString.EMPTY;
-      dstPortId_ = com.google.protobuf.ByteString.EMPTY;
-      status_ = 0;
-      value_ = com.google.protobuf.ByteString.EMPTY;
+      srcSwId = com.google.protobuf.ByteString.EMPTY;
+      srcPortId = com.google.protobuf.ByteString.EMPTY;
+      dstSwId = com.google.protobuf.ByteString.EMPTY;
+      dstPortId = com.google.protobuf.ByteString.EMPTY;
+      status = 0;
+      value = com.google.protobuf.ByteString.EMPTY;
     }
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
@@ -1571,23 +1571,23 @@
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
       getSerializedSize();
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
-        output.writeBytes(1, srcSwId_);
+      if (((bitField0 & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, srcSwId);
       }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
-        output.writeBytes(2, srcPortId_);
+      if (((bitField0 & 0x00000002) == 0x00000002)) {
+        output.writeBytes(2, srcPortId);
       }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
-        output.writeBytes(3, dstSwId_);
+      if (((bitField0 & 0x00000004) == 0x00000004)) {
+        output.writeBytes(3, dstSwId);
       }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
-        output.writeBytes(4, dstPortId_);
+      if (((bitField0 & 0x00000008) == 0x00000008)) {
+        output.writeBytes(4, dstPortId);
       }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
-        output.writeInt32(5, status_);
+      if (((bitField0 & 0x00000010) == 0x00000010)) {
+        output.writeInt32(5, status);
       }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
-        output.writeBytes(6, value_);
+      if (((bitField0 & 0x00000020) == 0x00000020)) {
+        output.writeBytes(6, value);
       }
       getUnknownFields().writeTo(output);
     }
@@ -1598,29 +1598,29 @@
       if (size != -1) return size;
 
       size = 0;
-      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+      if (((bitField0 & 0x00000001) == 0x00000001)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(1, srcSwId_);
+          .computeBytesSize(1, srcSwId);
       }
-      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+      if (((bitField0 & 0x00000002) == 0x00000002)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(2, srcPortId_);
+          .computeBytesSize(2, srcPortId);
       }
-      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+      if (((bitField0 & 0x00000004) == 0x00000004)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(3, dstSwId_);
+          .computeBytesSize(3, dstSwId);
       }
-      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+      if (((bitField0 & 0x00000008) == 0x00000008)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(4, dstPortId_);
+          .computeBytesSize(4, dstPortId);
       }
-      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+      if (((bitField0 & 0x00000010) == 0x00000010)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(5, status_);
+          .computeInt32Size(5, status);
       }
-      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+      if (((bitField0 & 0x00000020) == 0x00000020)) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBytesSize(6, value_);
+          .computeBytesSize(6, value);
       }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
@@ -1708,12 +1708,12 @@
        implements net.onrc.onos.core.datastore.serializers.Topology.LinkPropertyOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_LinkProperty_descriptor;
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyLinkPropertyDescriptor;
       }
 
       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_LinkProperty_fieldAccessorTable
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyLinkPropertyFieldAccessorTable
             .ensureFieldAccessorsInitialized(
                 net.onrc.onos.core.datastore.serializers.Topology.LinkProperty.class, net.onrc.onos.core.datastore.serializers.Topology.LinkProperty.Builder.class);
       }
@@ -1738,18 +1738,18 @@
 
       public Builder clear() {
         super.clear();
-        srcSwId_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000001);
-        srcPortId_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000002);
-        dstSwId_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000004);
-        dstPortId_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000008);
-        status_ = 0;
-        bitField0_ = (bitField0_ & ~0x00000010);
-        value_ = com.google.protobuf.ByteString.EMPTY;
-        bitField0_ = (bitField0_ & ~0x00000020);
+        srcSwId = com.google.protobuf.ByteString.EMPTY;
+        bitField0 = (bitField0 & ~0x00000001);
+        srcPortId = com.google.protobuf.ByteString.EMPTY;
+        bitField0 = (bitField0 & ~0x00000002);
+        dstSwId = com.google.protobuf.ByteString.EMPTY;
+        bitField0 = (bitField0 & ~0x00000004);
+        dstPortId = com.google.protobuf.ByteString.EMPTY;
+        bitField0 = (bitField0 & ~0x00000008);
+        status = 0;
+        bitField0 = (bitField0 & ~0x00000010);
+        value = com.google.protobuf.ByteString.EMPTY;
+        bitField0 = (bitField0 & ~0x00000020);
         return this;
       }
 
@@ -1759,7 +1759,7 @@
 
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return net.onrc.onos.core.datastore.serializers.Topology.internal_static_topology_LinkProperty_descriptor;
+        return net.onrc.onos.core.datastore.serializers.Topology.internalStaticTopologyLinkPropertyDescriptor;
       }
 
       public net.onrc.onos.core.datastore.serializers.Topology.LinkProperty getDefaultInstanceForType() {
@@ -1776,33 +1776,33 @@
 
       public net.onrc.onos.core.datastore.serializers.Topology.LinkProperty buildPartial() {
         net.onrc.onos.core.datastore.serializers.Topology.LinkProperty result = new net.onrc.onos.core.datastore.serializers.Topology.LinkProperty(this);
-        int from_bitField0_ = bitField0_;
-        int to_bitField0_ = 0;
-        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
-          to_bitField0_ |= 0x00000001;
+        int fromBitField0 = bitField0;
+        int toBitField0 = 0;
+        if (((fromBitField0 & 0x00000001) == 0x00000001)) {
+          toBitField0 |= 0x00000001;
         }
-        result.srcSwId_ = srcSwId_;
-        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
-          to_bitField0_ |= 0x00000002;
+        result.srcSwId = srcSwId;
+        if (((fromBitField0 & 0x00000002) == 0x00000002)) {
+          toBitField0 |= 0x00000002;
         }
-        result.srcPortId_ = srcPortId_;
-        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
-          to_bitField0_ |= 0x00000004;
+        result.srcPortId = srcPortId;
+        if (((fromBitField0 & 0x00000004) == 0x00000004)) {
+          toBitField0 |= 0x00000004;
         }
-        result.dstSwId_ = dstSwId_;
-        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
-          to_bitField0_ |= 0x00000008;
+        result.dstSwId = dstSwId;
+        if (((fromBitField0 & 0x00000008) == 0x00000008)) {
+          toBitField0 |= 0x00000008;
         }
-        result.dstPortId_ = dstPortId_;
-        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
-          to_bitField0_ |= 0x00000010;
+        result.dstPortId = dstPortId;
+        if (((fromBitField0 & 0x00000010) == 0x00000010)) {
+          toBitField0 |= 0x00000010;
         }
-        result.status_ = status_;
-        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
-          to_bitField0_ |= 0x00000020;
+        result.status = status;
+        if (((fromBitField0 & 0x00000020) == 0x00000020)) {
+          toBitField0 |= 0x00000020;
         }
-        result.value_ = value_;
-        result.bitField0_ = to_bitField0_;
+        result.value = value;
+        result.bitField0 = toBitField0;
         onBuilt();
         return result;
       }
@@ -1881,21 +1881,21 @@
         }
         return this;
       }
-      private int bitField0_;
+      private int bitField0;
 
       // required bytes srcSwId = 1;
-      private com.google.protobuf.ByteString srcSwId_ = com.google.protobuf.ByteString.EMPTY;
+      private com.google.protobuf.ByteString srcSwId = com.google.protobuf.ByteString.EMPTY;
       /**
        * <code>required bytes srcSwId = 1;</code>
        */
       public boolean hasSrcSwId() {
-        return ((bitField0_ & 0x00000001) == 0x00000001);
+        return ((bitField0 & 0x00000001) == 0x00000001);
       }
       /**
        * <code>required bytes srcSwId = 1;</code>
        */
       public com.google.protobuf.ByteString getSrcSwId() {
-        return srcSwId_;
+        return srcSwId;
       }
       /**
        * <code>required bytes srcSwId = 1;</code>
@@ -1904,8 +1904,8 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000001;
-        srcSwId_ = value;
+  bitField0 |= 0x00000001;
+        srcSwId = value;
         onChanged();
         return this;
       }
@@ -1913,25 +1913,25 @@
        * <code>required bytes srcSwId = 1;</code>
        */
       public Builder clearSrcSwId() {
-        bitField0_ = (bitField0_ & ~0x00000001);
-        srcSwId_ = getDefaultInstance().getSrcSwId();
+        bitField0 = (bitField0 & ~0x00000001);
+        srcSwId = getDefaultInstance().getSrcSwId();
         onChanged();
         return this;
       }
 
       // required bytes srcPortId = 2;
-      private com.google.protobuf.ByteString srcPortId_ = com.google.protobuf.ByteString.EMPTY;
+      private com.google.protobuf.ByteString srcPortId = com.google.protobuf.ByteString.EMPTY;
       /**
        * <code>required bytes srcPortId = 2;</code>
        */
       public boolean hasSrcPortId() {
-        return ((bitField0_ & 0x00000002) == 0x00000002);
+        return ((bitField0 & 0x00000002) == 0x00000002);
       }
       /**
        * <code>required bytes srcPortId = 2;</code>
        */
       public com.google.protobuf.ByteString getSrcPortId() {
-        return srcPortId_;
+        return srcPortId;
       }
       /**
        * <code>required bytes srcPortId = 2;</code>
@@ -1940,8 +1940,8 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000002;
-        srcPortId_ = value;
+  bitField0 |= 0x00000002;
+        srcPortId = value;
         onChanged();
         return this;
       }
@@ -1949,25 +1949,25 @@
        * <code>required bytes srcPortId = 2;</code>
        */
       public Builder clearSrcPortId() {
-        bitField0_ = (bitField0_ & ~0x00000002);
-        srcPortId_ = getDefaultInstance().getSrcPortId();
+        bitField0 = (bitField0 & ~0x00000002);
+        srcPortId = getDefaultInstance().getSrcPortId();
         onChanged();
         return this;
       }
 
       // required bytes dstSwId = 3;
-      private com.google.protobuf.ByteString dstSwId_ = com.google.protobuf.ByteString.EMPTY;
+      private com.google.protobuf.ByteString dstSwId = com.google.protobuf.ByteString.EMPTY;
       /**
        * <code>required bytes dstSwId = 3;</code>
        */
       public boolean hasDstSwId() {
-        return ((bitField0_ & 0x00000004) == 0x00000004);
+        return ((bitField0 & 0x00000004) == 0x00000004);
       }
       /**
        * <code>required bytes dstSwId = 3;</code>
        */
       public com.google.protobuf.ByteString getDstSwId() {
-        return dstSwId_;
+        return dstSwId;
       }
       /**
        * <code>required bytes dstSwId = 3;</code>
@@ -1976,8 +1976,8 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000004;
-        dstSwId_ = value;
+  bitField0 |= 0x00000004;
+        dstSwId = value;
         onChanged();
         return this;
       }
@@ -1985,25 +1985,25 @@
        * <code>required bytes dstSwId = 3;</code>
        */
       public Builder clearDstSwId() {
-        bitField0_ = (bitField0_ & ~0x00000004);
-        dstSwId_ = getDefaultInstance().getDstSwId();
+        bitField0 = (bitField0 & ~0x00000004);
+        dstSwId = getDefaultInstance().getDstSwId();
         onChanged();
         return this;
       }
 
       // required bytes dstPortId = 4;
-      private com.google.protobuf.ByteString dstPortId_ = com.google.protobuf.ByteString.EMPTY;
+      private com.google.protobuf.ByteString dstPortId = com.google.protobuf.ByteString.EMPTY;
       /**
        * <code>required bytes dstPortId = 4;</code>
        */
       public boolean hasDstPortId() {
-        return ((bitField0_ & 0x00000008) == 0x00000008);
+        return ((bitField0 & 0x00000008) == 0x00000008);
       }
       /**
        * <code>required bytes dstPortId = 4;</code>
        */
       public com.google.protobuf.ByteString getDstPortId() {
-        return dstPortId_;
+        return dstPortId;
       }
       /**
        * <code>required bytes dstPortId = 4;</code>
@@ -2012,8 +2012,8 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000008;
-        dstPortId_ = value;
+  bitField0 |= 0x00000008;
+        dstPortId = value;
         onChanged();
         return this;
       }
@@ -2021,32 +2021,32 @@
        * <code>required bytes dstPortId = 4;</code>
        */
       public Builder clearDstPortId() {
-        bitField0_ = (bitField0_ & ~0x00000008);
-        dstPortId_ = getDefaultInstance().getDstPortId();
+        bitField0 = (bitField0 & ~0x00000008);
+        dstPortId = getDefaultInstance().getDstPortId();
         onChanged();
         return this;
       }
 
       // required int32 status = 5;
-      private int status_ ;
+      private int status;
       /**
        * <code>required int32 status = 5;</code>
        */
       public boolean hasStatus() {
-        return ((bitField0_ & 0x00000010) == 0x00000010);
+        return ((bitField0 & 0x00000010) == 0x00000010);
       }
       /**
        * <code>required int32 status = 5;</code>
        */
       public int getStatus() {
-        return status_;
+        return status;
       }
       /**
        * <code>required int32 status = 5;</code>
        */
       public Builder setStatus(int value) {
-        bitField0_ |= 0x00000010;
-        status_ = value;
+        bitField0 |= 0x00000010;
+        status = value;
         onChanged();
         return this;
       }
@@ -2054,25 +2054,25 @@
        * <code>required int32 status = 5;</code>
        */
       public Builder clearStatus() {
-        bitField0_ = (bitField0_ & ~0x00000010);
-        status_ = 0;
+        bitField0 = (bitField0 & ~0x00000010);
+        status = 0;
         onChanged();
         return this;
       }
 
       // optional bytes value = 6;
-      private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY;
+      private com.google.protobuf.ByteString value = com.google.protobuf.ByteString.EMPTY;
       /**
        * <code>optional bytes value = 6;</code>
        */
       public boolean hasValue() {
-        return ((bitField0_ & 0x00000020) == 0x00000020);
+        return ((bitField0 & 0x00000020) == 0x00000020);
       }
       /**
        * <code>optional bytes value = 6;</code>
        */
       public com.google.protobuf.ByteString getValue() {
-        return value_;
+        return value;
       }
       /**
        * <code>optional bytes value = 6;</code>
@@ -2081,8 +2081,8 @@
         if (value == null) {
     throw new NullPointerException();
   }
-  bitField0_ |= 0x00000020;
-        value_ = value;
+  bitField0 |= 0x00000020;
+        this.value = value;
         onChanged();
         return this;
       }
@@ -2090,8 +2090,8 @@
        * <code>optional bytes value = 6;</code>
        */
       public Builder clearValue() {
-        bitField0_ = (bitField0_ & ~0x00000020);
-        value_ = getDefaultInstance().getValue();
+        bitField0 = (bitField0 & ~0x00000020);
+        value = getDefaultInstance().getValue();
         onChanged();
         return this;
       }
@@ -2108,20 +2108,20 @@
   }
 
   private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_topology_SwitchProperty_descriptor;
+          internalStaticTopologySwitchPropertyDescriptor;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_topology_SwitchProperty_fieldAccessorTable;
+          internalStaticTopologySwitchPropertyFieldAccessorTable;
   private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_topology_PortProperty_descriptor;
+          internalStaticTopologyPortPropertyDescriptor;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_topology_PortProperty_fieldAccessorTable;
+          internalStaticTopologyPortPropertyFieldAccessorTable;
   private static com.google.protobuf.Descriptors.Descriptor
-    internal_static_topology_LinkProperty_descriptor;
+          internalStaticTopologyLinkPropertyDescriptor;
   private static
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
-      internal_static_topology_LinkProperty_fieldAccessorTable;
+          internalStaticTopologyLinkPropertyFieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -2146,23 +2146,23 @@
         public com.google.protobuf.ExtensionRegistry assignDescriptors(
             com.google.protobuf.Descriptors.FileDescriptor root) {
           descriptor = root;
-          internal_static_topology_SwitchProperty_descriptor =
+          internalStaticTopologySwitchPropertyDescriptor =
             getDescriptor().getMessageTypes().get(0);
-          internal_static_topology_SwitchProperty_fieldAccessorTable = new
+          internalStaticTopologySwitchPropertyFieldAccessorTable = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-              internal_static_topology_SwitchProperty_descriptor,
+                  internalStaticTopologySwitchPropertyDescriptor,
               new java.lang.String[] { "Dpid", "Status", "Value", });
-          internal_static_topology_PortProperty_descriptor =
+          internalStaticTopologyPortPropertyDescriptor =
             getDescriptor().getMessageTypes().get(1);
-          internal_static_topology_PortProperty_fieldAccessorTable = new
+          internalStaticTopologyPortPropertyFieldAccessorTable = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-              internal_static_topology_PortProperty_descriptor,
+                  internalStaticTopologyPortPropertyDescriptor,
               new java.lang.String[] { "Dpid", "Number", "Status", "Value", });
-          internal_static_topology_LinkProperty_descriptor =
+          internalStaticTopologyLinkPropertyDescriptor =
             getDescriptor().getMessageTypes().get(2);
-          internal_static_topology_LinkProperty_fieldAccessorTable = new
+          internalStaticTopologyLinkPropertyFieldAccessorTable = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
-              internal_static_topology_LinkProperty_descriptor,
+                  internalStaticTopologyLinkPropertyDescriptor,
               new java.lang.String[] { "SrcSwId", "SrcPortId", "DstSwId", "DstPortId", "Status", "Value", });
           return null;
         }
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 94c192d..5477dd3 100644
--- a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
+++ b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
@@ -114,22 +114,22 @@
      * @author Naoki Shiota
      */
     private class SwitchQueue {
-        List<Queue<SwitchQueueEntry>> raw_queues;
+        List<Queue<SwitchQueueEntry>> rawQueues;
         QueueState state;
 
         // Max rate of sending message (bytes/ms). 0 implies no limitation.
-        long max_rate = 0;    // 0 indicates no limitation
-        long last_sent_time = 0;
-        long last_sent_size = 0;
+        long maxRate = 0;    // 0 indicates no limitation
+        long lastSentTime = 0;
+        long lastSentSize = 0;
 
         // "To be deleted" flag
         boolean toBeDeleted = false;
 
         SwitchQueue() {
-            raw_queues = new ArrayList<Queue<SwitchQueueEntry>>(
+            rawQueues = new ArrayList<Queue<SwitchQueueEntry>>(
                     MsgPriority.values().length);
             for (int i = 0; i < MsgPriority.values().length; ++i) {
-                raw_queues.add(i, new ArrayDeque<SwitchQueueEntry>());
+                rawQueues.add(i, new ArrayDeque<SwitchQueueEntry>());
             }
 
             state = QueueState.READY;
@@ -142,18 +142,18 @@
          * @return true if within the rate
          */
         boolean isSendable(long current) {
-            if (max_rate == 0) {
+            if (maxRate == 0) {
                 // no limitation
                 return true;
             }
 
-            if (current == last_sent_time) {
+            if (current == lastSentTime) {
                 return false;
             }
 
             // Check if sufficient time (from aspect of rate) elapsed or not.
-            long rate = last_sent_size / (current - last_sent_time);
-            return (rate < max_rate);
+            long rate = lastSentSize / (current - lastSentTime);
+            return (rate < maxRate);
         }
 
         /**
@@ -163,8 +163,8 @@
          * @param size    Size of sent data (in bytes).
          */
         void logSentData(long current, long size) {
-            last_sent_time = current;
-            last_sent_size = size;
+            lastSentTime = current;
+            lastSentSize = size;
         }
 
         boolean add(SwitchQueueEntry entry, MsgPriority priority) {
@@ -184,8 +184,8 @@
         SwitchQueueEntry poll() {
             switch (state) {
                 case READY: {
-                    for (int i = 0; i < raw_queues.size(); ++i) {
-                        SwitchQueueEntry entry = raw_queues.get(i).poll();
+                    for (int i = 0; i < rawQueues.size(); ++i) {
+                        SwitchQueueEntry entry = rawQueues.get(i).poll();
                         if (entry != null) {
                             return entry;
                         }
@@ -212,7 +212,7 @@
         boolean hasMessageToSend() {
             switch (state) {
                 case READY:
-                    for (Queue<SwitchQueueEntry> queue : raw_queues) {
+                    for (Queue<SwitchQueueEntry> queue : rawQueues) {
                         if (!queue.isEmpty()) {
                             return true;
                         }
@@ -230,7 +230,7 @@
         }
 
         Queue<SwitchQueueEntry> getQueue(MsgPriority priority) {
-            return raw_queues.get(priority.ordinal());
+            return rawQueues.get(priority.ordinal());
         }
     }
 
@@ -294,7 +294,7 @@
     private Map<BarrierInfo, OFBarrierReplyFuture> barrierFutures
             = new ConcurrentHashMap<BarrierInfo, OFBarrierReplyFuture>();
 
-    private int number_thread;
+    private int numberThread;
 
     /**
      * Main thread that reads messages from queues and sends them to switches.
@@ -362,10 +362,10 @@
          */
         private void processQueue(IOFSwitch sw, SwitchQueue queue, int max_msg) {
             // check sending rate and determine it to be sent or not
-            long current_time = System.currentTimeMillis();
+            long currentTime = System.currentTimeMillis();
             long size = 0;
 
-            if (queue.isSendable(current_time)) {
+            if (queue.isSendable(currentTime)) {
                 int i = 0;
                 while (queue.hasMessageToSend()) {
                     // Number of messages excess the limit
@@ -393,7 +393,7 @@
                 }
 
                 sw.flush();
-                queue.logSentData(current_time, size);
+                queue.logSentData(currentTime, size);
             }
         }
 
@@ -421,7 +421,7 @@
      * Initialize object with one thread.
      */
     public FlowPusher() {
-        number_thread = DEFAULT_NUMBER_THREAD;
+        numberThread = DEFAULT_NUMBER_THREAD;
     }
 
     /**
@@ -431,9 +431,9 @@
      */
     public FlowPusher(int number_thread) {
         if (number_thread > 0) {
-            this.number_thread = number_thread;
+            this.numberThread = number_thread;
         } else {
-            this.number_thread = DEFAULT_NUMBER_THREAD;
+            this.numberThread = DEFAULT_NUMBER_THREAD;
         }
     }
 
@@ -479,7 +479,7 @@
         }
 
         threadMap = new HashMap<Long, FlowPusherThread>();
-        for (long i = 0; i < number_thread; ++i) {
+        for (long i = 0; i < numberThread; ++i) {
             FlowPusherThread thread = new FlowPusherThread();
 
             threadMap.put(i, thread);
@@ -563,7 +563,7 @@
         if (rate > 0) {
             log.debug("rate for {} is set to {}", sw.getId(), rate);
             synchronized (queue) {
-                queue.max_rate = rate;
+                queue.maxRate = rate;
             }
         }
     }
@@ -1039,7 +1039,7 @@
     protected long getHash(IOFSwitch sw) {
         // This code assumes DPID is sequentially assigned.
         // TODO consider equalization algorithm
-        return sw.getId() % number_thread;
+        return sw.getId() % numberThread;
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
index 59abceb..d8e8167 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -155,14 +155,14 @@
 
     // Link discovery task details.
     protected SingletonTask discoveryTask;
-    protected final int DISCOVERY_TASK_INTERVAL = 1;
-    protected final int LINK_TIMEOUT = 35; // original 35 secs, aggressive 5 secs
-    protected final int LLDP_TO_ALL_INTERVAL = 15; //original 15 seconds, aggressive 2 secs.
+    protected static final int DISCOVERY_TASK_INTERVAL = 1;
+    protected static final int LINK_TIMEOUT = 35; // original 35 secs, aggressive 5 secs
+    protected static final int LLDP_TO_ALL_INTERVAL = 15; //original 15 seconds, aggressive 2 secs.
     protected long lldpClock = 0;
     // This value is intentionally kept higher than LLDP_TO_ALL_INTERVAL.
     // If we want to identify link failures faster, we could decrease this
     // value to a small number, say 1 or 2 sec.
-    protected final int LLDP_TO_KNOWN_INTERVAL = 20; // LLDP frequency for known links
+    protected static final int LLDP_TO_KNOWN_INTERVAL = 20; // LLDP frequency for known links
 
     protected LLDPTLV controllerTLV;
     protected ReentrantReadWriteLock lock;
@@ -255,8 +255,8 @@
      * Quarantine task
      */
     protected SingletonTask bddpTask;
-    protected final int BDDP_TASK_INTERVAL = 100; // 100 ms.
-    protected final int BDDP_TASK_SIZE = 5;       // # of ports per iteration
+    protected static final int BDDP_TASK_INTERVAL = 100; // 100 ms.
+    protected static final int BDDP_TASK_SIZE = 5;       // # of ports per iteration
 
     /**
      * Map of broadcast domain ports and the last time a BDDP was either
diff --git a/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java b/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
index 1897631..884df0e 100755
--- a/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
+++ b/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
@@ -66,10 +66,10 @@
 
     private final String namespace = "onos";
     private final String switchLatchesPath = "/switches";
-    private final String CLUSTER_LEADER_PATH = "/cluster/leader";
+    private static final String CLUSTER_LEADER_PATH = "/cluster/leader";
 
-    private final String SERVICES_PATH = "/"; //i.e. the root of our namespace
-    private final String CONTROLLER_SERVICE_NAME = "controllers";
+    private static final String SERVICES_PATH = "/"; //i.e. the root of our namespace
+    private static final String CONTROLLER_SERVICE_NAME = "controllers";
 
     protected CuratorFramework client;
 
@@ -82,8 +82,8 @@
     protected ClusterLeaderListener clusterLeaderListener;
     private static final long CLUSTER_LEADER_ELECTION_RETRY_MS = 100;
 
-    private final String ID_COUNTER_PATH = "/flowidcounter";
-    private final Long ID_BLOCK_SIZE = 0x100000000L;
+    private static final String ID_COUNTER_PATH = "/flowidcounter";
+    private static final Long ID_BLOCK_SIZE = 0x100000000L;
     protected DistributedAtomicLong distributedIdCounter;
 
     //Zookeeper performance-related configuration
diff --git a/src/main/java/net/onrc/onos/core/util/PerformanceMonitor.java b/src/main/java/net/onrc/onos/core/util/PerformanceMonitor.java
index fa05536..5b2b52f 100644
--- a/src/main/java/net/onrc/onos/core/util/PerformanceMonitor.java
+++ b/src/main/java/net/onrc/onos/core/util/PerformanceMonitor.java
@@ -51,10 +51,10 @@
         Queue<Measurement> list = map.get(tag);
         if (list == null) {
             list = new ConcurrentLinkedQueue<Measurement>();
-            Queue<Measurement> existing_list = map.putIfAbsent(tag, list);
-            if (existing_list != null) {
+            Queue<Measurement> existingList = map.putIfAbsent(tag, list);
+            if (existingList != null) {
                 // someone concurrently added, using theirs
-                list = existing_list;
+                list = existingList;
             }
         }
         Measurement m = new Measurement();
