diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/HelloPduTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/HelloPduTest.java
index 1dcf031..2952a92 100644
--- a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/HelloPduTest.java
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/HelloPduTest.java
@@ -170,7 +170,7 @@
     }
 
     /**
-     * Tests areaAddres()  method.
+     * Tests areaAddress()  method.
      */
     @Test
     public void testAreaAddress() throws Exception {
@@ -321,4 +321,4 @@
         resultInt = pdu.hashCode();
         assertThat(resultInt, is(notNullValue()));
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlvTest.java
index 4855164..c33f5e4 100644
--- a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlvTest.java
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlvTest.java
@@ -33,7 +33,7 @@
  */
 public class AreaAddressTlvTest {
 
-    private final String areaAddres = "490001";
+    private final String areaAddress = "490001";
     private final byte[] tlv = {1, 49};
     private AreaAddressTlv areaAddressTlv;
     private TlvHeader tlvHeader;
@@ -59,7 +59,7 @@
      */
     @Test
     public void testAddAddress() throws Exception {
-        areaAddressTlv.addAddress(areaAddres);
+        areaAddressTlv.addAddress(areaAddress);
         result = areaAddressTlv.areaAddress();
         assertThat(result.size(), is(1));
     }
@@ -69,7 +69,7 @@
      */
     @Test
     public void testSetAreaAddress() throws Exception {
-        areaAddressTlv.addAddress(areaAddres);
+        areaAddressTlv.addAddress(areaAddress);
         result = areaAddressTlv.areaAddress();
         assertThat(result.size(), is(1));
     }
@@ -102,4 +102,4 @@
     public void testToString() throws Exception {
         assertThat(areaAddressTlv.toString(), is(notNullValue()));
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachabilityTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachabilityTest.java
index 28bcd15..3ece0e0 100644
--- a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachabilityTest.java
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachabilityTest.java
@@ -76,22 +76,22 @@
     }
 
     /**
-     * Tests getSubnetAddres() getter method.
+     * Tests getSubnetAddress() getter method.
      */
     @Test
     public void testGetSubnetAddres() throws Exception {
-        reachability.setSubnetAddres(ip4Address);
-        result = reachability.getSubnetAddres();
+        reachability.setSubnetAddress(ip4Address);
+        result = reachability.getSubnetAddress();
         assertThat(result, is(ip4Address));
     }
 
     /**
-     * Tests setSubnetAddres() setter method.
+     * Tests setSubnetAddress() setter method.
      */
     @Test
     public void testSetSubnetAddres() throws Exception {
-        reachability.setSubnetAddres(ip4Address);
-        result = reachability.getSubnetAddres();
+        reachability.setSubnetAddress(ip4Address);
+        result = reachability.getSubnetAddress();
         assertThat(result, is(ip4Address));
     }
 
@@ -343,4 +343,4 @@
     public void testToString() throws Exception {
         assertThat(reachability.toString(), is(notNullValue()));
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytesTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytesTest.java
index 0018820..7905eb5 100644
--- a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytesTest.java
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytesTest.java
@@ -111,7 +111,7 @@
         metricOfIntRea.setErrorMetricSupported(false);
         metricOfIntRea.setExpenseIsInternal(true);
         metricOfIntRea.setIpAddress(ip4Address);
-        metricOfIntRea.setSubnetAddres(ip4Address);
+        metricOfIntRea.setSubnetAddress(ip4Address);
         ipInterReacTlv.addInternalReachabilityMetric(metricOfIntRea);
         tlv = TlvsToBytes.tlvToBytes(ipInterReacTlv);
         assertThat(tlv, is(notNullValue()));
@@ -158,4 +158,4 @@
         tlv = TlvsToBytes.tlvToBytes(reachability);
         assertThat(tlv, is(notNullValue()));
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/IsisUtilTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/IsisUtilTest.java
index 4abd9c0..de96972 100644
--- a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/IsisUtilTest.java
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/IsisUtilTest.java
@@ -33,7 +33,7 @@
 
     private final String systemId = "2929.2929.2929";
     private final String lanId = "2929.2929.2929.01";
-    private final String areaAddres = "490001";
+    private final String areaAddress = "490001";
     private final byte[] l1Lsp = {
             -125, 27, 1, 0, 18, 1, 0, 0, 0, 86, 4, -81, 34, 34, 34,
             34, 34, 34, 0, 0, 0, 0, 0, 9, 99, 11, 1, 1, 4, 3, 73,
@@ -94,13 +94,13 @@
     }
 
     /**
-     * Tests areaAddres() method.
+     * Tests areaAddress() method.
      */
     @Test
     public void testAreaAddres() throws Exception {
-        result1 = IsisUtil.areaAddres(Bytes.toArray(
-                IsisUtil.areaAddressToBytes(areaAddres)));
-        assertThat(result1, is(areaAddres));
+        result1 = IsisUtil.areaAddress(Bytes.toArray(
+                IsisUtil.areaAddressToBytes(areaAddress)));
+        assertThat(result1, is(areaAddress));
     }
 
     /**
@@ -108,7 +108,7 @@
      */
     @Test
     public void testAreaAddressToBytes() throws Exception {
-        result2 = Bytes.toArray(IsisUtil.areaAddressToBytes(areaAddres));
+        result2 = Bytes.toArray(IsisUtil.areaAddressToBytes(areaAddress));
         assertThat(result2, is(notNullValue()));
     }
 
@@ -264,4 +264,4 @@
         result2 = IsisUtil.prefixToBytes(prefix);
         assertThat(result2, is(notNullValue()));
     }
-}
\ No newline at end of file
+}
