diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfig.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfig.java
index 07edd32..b50da5f 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfig.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfig.java
@@ -97,7 +97,7 @@
         if (mastershipService.isLocalMaster(ncDeviceId)) {
             try {
                 StringBuilder request = new StringBuilder();
-                request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE).append(">\n");
+                request.append(VOLT_NE_OPEN + VOLT_NE_NAMESPACE + ">\n");
                 request.append(buildEmptyTag(VOLT_OFCONFIG));
                 request.append(VOLT_NE_CLOSE);
 
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfig.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfig.java
index be16f55..8b2ad63 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfig.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfig.java
@@ -89,25 +89,25 @@
 
         try {
             StringBuilder request = new StringBuilder();
-            request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE);
-            request.append(ANGLE_RIGHT).append(NEW_LINE);
+            request.append(VOLT_NE_OPEN + VOLT_NE_NAMESPACE);
+            request.append(ANGLE_RIGHT + NEW_LINE);
             if (onuId != null) {
-                request.append(buildStartTag(VOLT_ONUS));
-                request.append(buildStartTag(ONUS_PERLINK));
-                request.append(buildStartTag(PONLINK_ID, false));
-                request.append(onuId[FIRST_PART]);
-                request.append(buildEndTag(PONLINK_ID));
+                request.append(buildStartTag(VOLT_ONUS))
+                    .append(buildStartTag(ONUS_PERLINK))
+                    .append(buildStartTag(PONLINK_ID, false))
+                    .append(onuId[FIRST_PART])
+                    .append(buildEndTag(PONLINK_ID));
                 if (onuId.length > ONE) {
-                    request.append(buildStartTag(ONUS_LIST));
-                    request.append(buildStartTag(ONU_INFO));
-                    request.append(buildStartTag(ONU_ID, false));
-                    request.append(onuId[SECOND_PART]);
-                    request.append(buildEndTag(ONU_ID));
-                    request.append(buildEndTag(ONU_INFO));
-                    request.append(buildEndTag(ONUS_LIST));
+                    request.append(buildStartTag(ONUS_LIST))
+                        .append(buildStartTag(ONU_INFO))
+                        .append(buildStartTag(ONU_ID, false))
+                        .append(onuId[SECOND_PART])
+                        .append(buildEndTag(ONU_ID))
+                        .append(buildEndTag(ONU_INFO))
+                        .append(buildEndTag(ONUS_LIST));
                 }
-                request.append(buildEndTag(ONUS_PERLINK));
-                request.append(buildEndTag(VOLT_ONUS));
+                request.append(buildEndTag(ONUS_PERLINK))
+                    .append(buildEndTag(VOLT_ONUS));
             } else {
                 request.append(buildEmptyTag(VOLT_ONUS));
             }
@@ -160,20 +160,20 @@
 
         try {
             StringBuilder request = new StringBuilder();
-            request.append(ANGLE_LEFT).append(ONU_SET_CONFIG).append(SPACE);
-            request.append(VOLT_NE_NAMESPACE).append(ANGLE_RIGHT).append(NEW_LINE);
-            request.append(buildStartTag(PONLINK_ID, false));
-            request.append(onuId[FIRST_PART]);
-            request.append(buildEndTag(PONLINK_ID));
-            request.append(buildStartTag(ONU_ID, false));
-            request.append(onuId[SECOND_PART]);
-            request.append(buildEndTag(ONU_ID));
-            request.append(buildStartTag(CONFIG_INFO));
-            request.append(buildStartTag(data[SECOND_PART], false));
-            request.append(data[THIRD_PART]);
-            request.append(buildEndTag(data[SECOND_PART]));
-            request.append(buildEndTag(CONFIG_INFO));
-            request.append(buildEndTag(ONU_SET_CONFIG));
+            request.append(ANGLE_LEFT + ONU_SET_CONFIG + SPACE);
+            request.append(VOLT_NE_NAMESPACE + ANGLE_RIGHT + NEW_LINE);
+            request.append(buildStartTag(PONLINK_ID, false))
+                .append(onuId[FIRST_PART])
+                .append(buildEndTag(PONLINK_ID))
+                .append(buildStartTag(ONU_ID, false))
+                .append(onuId[SECOND_PART])
+                .append(buildEndTag(ONU_ID))
+                .append(buildStartTag(CONFIG_INFO))
+                .append(buildStartTag(data[SECOND_PART], false))
+                .append(data[THIRD_PART])
+                .append(buildEndTag(data[SECOND_PART]))
+                .append(buildEndTag(CONFIG_INFO))
+                .append(buildEndTag(ONU_SET_CONFIG));
 
             reply = controller
                         .getDevicesMap()
@@ -213,42 +213,42 @@
 
         try {
             StringBuilder request = new StringBuilder();
-            request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE);
-            request.append(ANGLE_RIGHT).append(NEW_LINE);
+            request.append(VOLT_NE_OPEN + VOLT_NE_NAMESPACE);
+            request.append(ANGLE_RIGHT + NEW_LINE);
             request.append(buildStartTag(VOLT_STATISTICS));
             if (onuId != null) {
-                request.append(buildStartTag(ONU_STATISTICS));
-                request.append(buildStartTag(ONU_GEM_STATS));
-                request.append(buildStartTag(GEM_STATS));
-                request.append(buildStartTag(PONLINK_ID, false));
-                request.append(onuId[FIRST_PART]);
-                request.append(buildEndTag(PONLINK_ID));
+                request.append(buildStartTag(ONU_STATISTICS))
+                    .append(buildStartTag(ONU_GEM_STATS))
+                    .append(buildStartTag(GEM_STATS))
+                    .append(buildStartTag(PONLINK_ID, false))
+                    .append(onuId[FIRST_PART])
+                    .append(buildEndTag(PONLINK_ID));
                 if (onuId.length > ONE) {
-                    request.append(buildStartTag(ONU_ID, false));
-                    request.append(onuId[SECOND_PART]);
-                    request.append(buildEndTag(ONU_ID));
+                    request.append(buildStartTag(ONU_ID, false))
+                        .append(onuId[SECOND_PART])
+                        .append(buildEndTag(ONU_ID));
                 }
-                request.append(buildEndTag(GEM_STATS));
-                request.append(buildEndTag(ONU_GEM_STATS));
+                request.append(buildEndTag(GEM_STATS))
+                    .append(buildEndTag(ONU_GEM_STATS));
 
-                request.append(buildStartTag(ONU_ETH_STATS));
-                request.append(buildStartTag(ETH_STATS));
-                request.append(buildStartTag(PONLINK_ID, false));
-                request.append(onuId[FIRST_PART]);
-                request.append(buildEndTag(PONLINK_ID));
+                request.append(buildStartTag(ONU_ETH_STATS))
+                    .append(buildStartTag(ETH_STATS))
+                    .append(buildStartTag(PONLINK_ID, false))
+                    .append(onuId[FIRST_PART])
+                    .append(buildEndTag(PONLINK_ID));
                 if (onuId.length > ONE) {
-                    request.append(buildStartTag(ONU_ID, false));
-                    request.append(onuId[SECOND_PART]);
-                    request.append(buildEndTag(ONU_ID));
+                    request.append(buildStartTag(ONU_ID, false))
+                        .append(onuId[SECOND_PART])
+                        .append(buildEndTag(ONU_ID));
                 }
-                request.append(buildEndTag(ETH_STATS));
-                request.append(buildEndTag(ONU_ETH_STATS));
-                request.append(buildEndTag(ONU_STATISTICS));
+                request.append(buildEndTag(ETH_STATS))
+                    .append(buildEndTag(ONU_ETH_STATS))
+                    .append(buildEndTag(ONU_STATISTICS));
             } else  {
                 request.append(buildEmptyTag(ONU_STATISTICS));
             }
-            request.append(buildEndTag(VOLT_STATISTICS));
-            request.append(VOLT_NE_CLOSE);
+            request.append(buildEndTag(VOLT_STATISTICS))
+                .append(VOLT_NE_CLOSE);
 
             reply = controller
                         .getDevicesMap()
@@ -265,8 +265,7 @@
      * Verifies input string for ponlink-id{-onu-id}.
      *
      * @param target input data in string
-     * @return String array
-     * @return null if an error condition is detected
+     * @return String array containing IDs; may be null if an error is detected
      */
     private String[] checkIdString(String target) {
         String[] onuId = target.split(HYPHEN);
@@ -302,8 +301,7 @@
      *
      * @param name input data in string
      * @param value input data in string
-     * @return true if the parameter is valid
-     * @return false if the parameter is invalid
+     * @return true/false if the parameter is valid/invalid
      */
     private boolean checkSetParam(String name, String value) {
         if (!ONUCONFIGPARAMS.contains(name)) {
@@ -338,8 +336,7 @@
      * @param states input data in string for parameter state
      * @param name input data in string for parameter name
      * @param value input data in string for parameter value
-     * @return true if the param is valid
-     * @return false if the param is invalid
+     * @return true/false if the parameter is valid/invalid
      */
     private boolean validState(Set<String> states, String name, String value) {
         if (!states.contains(value)) {
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfig.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfig.java
index d8c64c6..1d6e145 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfig.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfig.java
@@ -100,8 +100,8 @@
 
         try {
             StringBuilder request = new StringBuilder();
-            request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE);
-            request.append(ANGLE_RIGHT).append(NEW_LINE);
+            request.append(VOLT_NE_OPEN + VOLT_NE_NAMESPACE);
+            request.append(ANGLE_RIGHT + NEW_LINE);
             request.append(buildStartTag(VOLT_PORTS));
             if (target != null) {
                 int pon;
@@ -115,14 +115,13 @@
                     log.error("Non-number input for ponlink-id:{}", target);
                     return null;
                 }
-                request.append(buildStartTag(GPON_PONLINK_PORTS));
-                request.append(buildStartTag(GPON_PONLINK_PORT));
-                request.append(buildStartTag(PONLINK_ID, false));
-                request.append(target);
-                request.append(buildEndTag(PONLINK_ID));
-
-                request.append(buildEndTag(GPON_PONLINK_PORT));
-                request.append(buildEndTag(GPON_PONLINK_PORTS));
+                request.append(buildStartTag(GPON_PONLINK_PORTS))
+                    .append(buildStartTag(GPON_PONLINK_PORT))
+                    .append(buildStartTag(PONLINK_ID, false))
+                    .append(target)
+                    .append(buildEndTag(PONLINK_ID))
+                    .append(buildEndTag(GPON_PONLINK_PORT))
+                    .append(buildEndTag(GPON_PONLINK_PORTS));
             } else {
                 request.append(buildEmptyTag(GPON_PONLINK_PORTS));
             }
@@ -164,23 +163,21 @@
         boolean result = false;
         try {
             StringBuilder request = new StringBuilder();
-            request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE);
-            request.append(ANGLE_RIGHT).append(NEW_LINE);
-            request.append(buildStartTag(VOLT_PORTS));
-            request.append(buildStartTag(GPON_PONLINK_PORTS));
-            request.append(buildStartTag(GPON_PONLINK_PORT));
-            request.append(buildStartTag(PONLINK_ID, false));
-            request.append(data[FIRST_PART]);
-            request.append(buildEndTag(PONLINK_ID));
-
-            request.append(buildStartTag(data[SECOND_PART], false));
-            request.append(data[THIRD_PART]);
-            request.append(buildEndTag(data[SECOND_PART]));
-
-            request.append(buildEndTag(GPON_PONLINK_PORT));
-            request.append(buildEndTag(GPON_PONLINK_PORTS));
-            request.append(buildEndTag(VOLT_PORTS));
-            request.append(VOLT_NE_CLOSE);
+            request.append(VOLT_NE_OPEN + VOLT_NE_NAMESPACE);
+            request.append(ANGLE_RIGHT + NEW_LINE);
+            request.append(buildStartTag(VOLT_PORTS))
+                .append(buildStartTag(GPON_PONLINK_PORTS))
+                .append(buildStartTag(GPON_PONLINK_PORT))
+                .append(buildStartTag(PONLINK_ID, false))
+                .append(data[FIRST_PART])
+                .append(buildEndTag(PONLINK_ID))
+                .append(buildStartTag(data[SECOND_PART], false))
+                .append(data[THIRD_PART])
+                .append(buildEndTag(data[SECOND_PART]))
+                .append(buildEndTag(GPON_PONLINK_PORT))
+                .append(buildEndTag(GPON_PONLINK_PORTS))
+                .append(buildEndTag(VOLT_PORTS))
+                .append(VOLT_NE_CLOSE);
 
             result = controller.getDevicesMap().get(ncDeviceId).getSession().
                     editConfig(RUNNING, null, request.toString());
@@ -194,8 +191,7 @@
      * Verifies input string for valid options.
      *
      * @param target input data in string
-     * @return String array
-     * @return null if an error condition is detected
+     * @return String array containing IDs; may be null if an error is detected
      */
     private String[] checkSetInput(String target) {
         String[] data = target.split(COLON);
@@ -273,8 +269,7 @@
      * @param states input data in string for parameter state
      * @param name input data in string for parameter name
      * @param value input data in string for parameter value
-     * @return true if the param is valid
-     * @return false if the param is invalid
+     * @return true/false if the param is valid/invalid
      */
     private boolean validState(Set<String> states, String name, String value) {
         if (!states.contains(value)) {
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltAlertConfigTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltAlertConfigTest.java
index 2cef69c..156aacc 100644
--- a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltAlertConfigTest.java
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltAlertConfigTest.java
@@ -161,12 +161,6 @@
             .append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        String regex = TEST_WHITESPACES_REGEX;
-        int index = rpc.indexOf(regex);
-        while (index >= ZERO) {
-            testRequest = rpc.replace(index, index + regex.length(), TEST_EMPTY_STRING).toString();
-            request = request.replaceAll(regex, TEST_EMPTY_STRING);
-        }
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
@@ -192,12 +186,6 @@
             .append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        String regex = TEST_WHITESPACES_REGEX;
-        int index = rpc.indexOf(regex);
-        while (index >= ZERO) {
-            testRequest = rpc.replace(index, index + regex.length(), TEST_EMPTY_STRING).toString();
-            request = request.replaceAll(regex, TEST_EMPTY_STRING);
-        }
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
@@ -292,14 +280,8 @@
             rpc.append(TEST_VOLT_NE_NAMESPACE + TEST_SLASH + TEST_ANGLE_RIGHT);
 
             String testRequest = rpc.toString();
-            String regex = TEST_WHITESPACES_REGEX;
-            int index = rpc.indexOf(regex);
-            while (index >= ZERO) {
-                testRequest = rpc.replace(index, index + regex.length(), TEST_EMPTY_STRING).toString();
-                filterSchema = filterSchema.replaceAll(regex, TEST_EMPTY_STRING);
-            }
-            assertTrue("Does not match with generated string",
-                    filterSchema.equals(testRequest));
+            boolean result = filterSchema.equals(testRequest);
+            assertTrue("Does not match with generated string", result);
         }
     }
 
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfigTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfigTest.java
index 4e52429..72697ee 100644
--- a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfigTest.java
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltControllerConfigTest.java
@@ -27,8 +27,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.HashMap;
-import java.util.Map;
 
 import java.nio.charset.StandardCharsets;
 import java.io.InputStream;
@@ -43,31 +41,27 @@
  */
 public class FujitsuVoltControllerConfigTest {
 
-    private FujitsuNetconfControllerMock controller;
-    private FujitsuDriverHandlerAdapter driverHandler;
-    private FujitsuVoltControllerConfig voltConfig;
-
     private final FujitsuNetconfSessionListenerTest listener = new InternalSessionListenerTest();
 
     private static final String TEST_VOLT_OFCONFIG = "volt-ofconfig";
     private static final String TEST_OFCONFIG_ID = "ofconfig-id";
     private static final String TEST_END_LICENSE_HEADER = "-->";
 
-    private static final Map<Integer, String> GET_CONTROLLERS = new HashMap<Integer, String>() {
-        {
-            put(1, "tcp:172.10.10.45:6633");
-            put(2, "tcp:100.0.0.22:5555");
-        }
+    private static final String[] GET_CONTROLLERS = {
+            "tcp:172.10.10.45:6633",
+            "tcp:100.0.0.22:5555",
     };
-    private static final Map<Integer, String> SET_CONTROLLERS = new HashMap<Integer, String>() {
-        {
-            put(1, "tcp:172.10.10.55:2222");
-            put(3, "tcp:172.20.33.11:6633");
-        }
+    private static final String[] SET_CONTROLLERS = {
+            "tcp:172.10.10.55:2222",
+            "tcp:172.20.33.11:6633",
     };
     private static final String GET_CONTROLLERS_RSP_FILE = "/getcontrollers.xml";
     private static final String SET_CONTROLLERS_REQ_FILE = "/setcontrollers.xml";
 
+    private Integer currentKey;
+    private FujitsuNetconfControllerMock controller;
+    private FujitsuDriverHandlerAdapter driverHandler;
+    private FujitsuVoltControllerConfig voltConfig;
 
     @Before
     public void setUp() throws Exception {
@@ -85,13 +79,14 @@
         List<ControllerInfo> controllers;
         List<ControllerInfo> expectedControllers = new ArrayList<>();
 
-        for (Integer key : GET_CONTROLLERS.keySet()) {
-            String target = GET_CONTROLLERS.get(key);
+        for (int i = ZERO; i < GET_CONTROLLERS.length; i++) {
+            String target = GET_CONTROLLERS[i];
             String[] data = target.split(TEST_COLON);
+            currentKey = i + ONE;
 
             Annotations annotations = DefaultAnnotations
                                           .builder()
-                                          .set(TEST_OFCONFIG_ID, key.toString())
+                                          .set(TEST_OFCONFIG_ID, currentKey.toString())
                                           .build();
             ControllerInfo controller = new ControllerInfo(
                     IpAddress.valueOf(data[SECOND_PART]),
@@ -111,13 +106,14 @@
     public void testSetControllers() throws Exception {
         List<ControllerInfo> controllers = new ArrayList<>();
 
-        for (Integer key : SET_CONTROLLERS.keySet()) {
-            String target = SET_CONTROLLERS.get(key);
+        for (int i = ZERO; i < SET_CONTROLLERS.length; i++) {
+            String target = SET_CONTROLLERS[i];
             String[] data = target.split(TEST_COLON);
+            currentKey = i + ONE;
 
             Annotations annotations = DefaultAnnotations
                                           .builder()
-                                          .set(TEST_OFCONFIG_ID, key.toString())
+                                          .set(TEST_OFCONFIG_ID, currentKey.toString())
                                           .build();
             ControllerInfo controller = new ControllerInfo(
                     IpAddress.valueOf(data[SECOND_PART]),
@@ -137,14 +133,12 @@
      */
     private boolean verifyGetRequest(String request) {
         StringBuilder rpc = new StringBuilder();
-        rpc.append(TEST_VOLT_NE_OPEN).append(TEST_VOLT_NE_NAMESPACE);
-        rpc.append(TEST_ANGLE_RIGHT).append(TEST_NEW_LINE);
-        rpc.append(emptyTag(TEST_VOLT_OFCONFIG));
-        rpc.append(endTag(TEST_VOLT_NE));
+        rpc.append(TEST_VOLT_NE_OPEN + TEST_VOLT_NE_NAMESPACE);
+        rpc.append(TEST_ANGLE_RIGHT + TEST_NEW_LINE);
+        rpc.append(emptyTag(TEST_VOLT_OFCONFIG))
+            .append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        testRequest = testRequest.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
-        request = request.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltFwdlConfigTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltFwdlConfigTest.java
index 0377070..3c97458 100644
--- a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltFwdlConfigTest.java
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltFwdlConfigTest.java
@@ -143,12 +143,6 @@
         rpc.append(endTag(TEST_ONDEMAND_FIRMWARE_UPGRADE));
 
         String testRequest = rpc.toString();
-        String regex = TEST_WHITESPACES_REGEX;
-        int index = rpc.indexOf(regex);
-        while (index >= ZERO) {
-            testRequest = rpc.replace(index, index + regex.length(), TEST_EMPTY_STRING).toString();
-            request = request.replaceAll(regex, TEST_EMPTY_STRING);
-        }
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltNeConfigTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltNeConfigTest.java
index 79f0042..9a85a81 100644
--- a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltNeConfigTest.java
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltNeConfigTest.java
@@ -65,12 +65,6 @@
         rpc.append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        String regex = TEST_WHITESPACES_REGEX;
-        int index = rpc.indexOf(regex);
-        while (index >= ZERO) {
-            testRequest = rpc.replace(index, index + regex.length(), TEST_EMPTY_STRING).toString();
-            request = request.replaceAll(regex, TEST_EMPTY_STRING);
-        }
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfigTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfigTest.java
index b18a5ab..172380b 100644
--- a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfigTest.java
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfigTest.java
@@ -19,9 +19,6 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertNotNull;
@@ -33,10 +30,6 @@
  */
 public class FujitsuVoltOnuConfigTest {
 
-    private FujitsuNetconfControllerMock controller;
-    private FujitsuDriverHandlerAdapter driverHandler;
-    private FujitsuVoltOnuConfig voltConfig;
-
     private final FujitsuNetconfSessionListenerTest listener = new InternalSessionListenerTest();
 
     private static final String TEST_VOLT_ONUS = "volt-onus";
@@ -56,63 +49,53 @@
             TEST_ANGLE_LEFT + TEST_ONU_SET_CONFIG + TEST_SPACE +
             TEST_VOLT_NE_NAMESPACE;
 
-    private static final Map<Integer, String> INVALID_GET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "a-b");
-            put(2, "--1-2");
-            put(3, "s-1");
-            put(4, "16-1-1");
-            put(5, "1 A-1");
-            put(6, "1*A-1");
-        }
+    private static final String[] INVALID_GET_TCS = {
+        "a-b",
+        "--1-2",
+        "s-1",
+        "16-1-1",
+        "1 A-1",
+        "1*A-1",
     };
-    private static final Map<Integer, String> VALID_GET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "1");
-            put(2, "1-2");
-            put(3, null);
-        }
+    private static final String[] VALID_GET_TCS = {
+        "1",
+        "1-2",
+        null,
     };
-    private static final Map<Integer, String> INVALID_SET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "-11-3:admin-state:enable");
-            put(2, "1-2:admin-state:false");
-            put(3, "1-2:pm-enable:123");
-            put(4, "^1-2:pm-enable:false");
-            put(5, "1-2:fec-enable:xyz");
-            put(6, "1-2:security-enable:123abc");
-            put(7, "2-3:password:-1&");
-            put(8, "2:admin-state:disable");
-        }
+    private static final String[] INVALID_SET_TCS = {
+        "-11-3:admin-state:enable",
+        "1-2:admin-state:false",
+        "1-2:pm-enable:123",
+        "^1-2:pm-enable:false",
+        "1-2:fec-enable:xyz",
+        "1-2:security-enable:123abc",
+        "2-3:password:-1&",
+        "2:admin-state:disable",
     };
-    private static final Map<Integer, String> VALID_SET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "1-11:admin-state:disable");
-            put(2, "8-1:pm-enable:true");
-            put(3, "1-1:fec-enable:true");
-            put(4, "1-21:security-enable:false");
-            put(5, "3-2:password:abc123");
-        }
+    private static final String[] VALID_SET_TCS = {
+        "1-11:admin-state:disable",
+        "8-1:pm-enable:true",
+        "1-1:fec-enable:true",
+        "1-21:security-enable:false",
+        "3-2:password:abc123",
     };
-    private static final Map<Integer, String> INVALID_GET_STATS_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "1-a");
-            put(2, "1:1");
-            put(3, "a-1");
-            put(4, "1-1-1");
-            put(5, "2 A-1");
-            put(6, "2/A-1");
-        }
+    private static final String[] INVALID_GET_STATS_TCS = {
+        "1-a",
+        "1:1",
+        "a-1",
+        "1-1-1",
+        "2 A-1",
+        "2/A-1",
     };
-    private static final Map<Integer, String> VALID_GET_STATS_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "1");
-            put(2, "3-12");
-            put(3, null);
-        }
+    private static final String[] VALID_GET_STATS_TCS = {
+        "1",
+        "3-12",
+        null,
     };
     private Integer currentKey;
-
+    private FujitsuNetconfControllerMock controller;
+    private FujitsuDriverHandlerAdapter driverHandler;
+    private FujitsuVoltOnuConfig voltConfig;
 
     @Before
     public void setUp() throws Exception {
@@ -130,10 +113,10 @@
         String reply;
         String target;
 
-        for (Integer key : INVALID_GET_TCS.keySet()) {
-            target = INVALID_GET_TCS.get(key);
+        for (int i = ZERO; i < INVALID_GET_TCS.length; i++) {
+            target = INVALID_GET_TCS[i];
             reply = voltConfig.getOnus(target);
-            assertNull("Incorrect response for " + target, reply);
+            assertNull("Incorrect response for INVALID_GET_TCS", reply);
         }
     }
 
@@ -145,11 +128,11 @@
         String reply;
         String target;
 
-        for (Integer key : VALID_GET_TCS.keySet()) {
-            target = VALID_GET_TCS.get(key);
-            currentKey = key;
+        for (int i = ZERO; i < VALID_GET_TCS.length; i++) {
+            target = VALID_GET_TCS[i];
+            currentKey = i;
             reply = voltConfig.getOnus(target);
-            assertNotNull("Incorrect response for " + target, reply);
+            assertNotNull("Incorrect response for VALID_GET_TCS", reply);
         }
     }
 
@@ -161,10 +144,10 @@
         String target;
         String reply;
 
-        for (Integer key : INVALID_SET_TCS.keySet()) {
-            target = INVALID_SET_TCS.get(key);
+        for (int i = ZERO; i < INVALID_SET_TCS.length; i++) {
+            target = INVALID_SET_TCS[i];
             reply = voltConfig.setOnu(target);
-            assertNull("Incorrect response for " + target, reply);
+            assertNull("Incorrect response for INVALID_SET_TCS", reply);
         }
     }
 
@@ -176,11 +159,11 @@
         String target;
         String reply;
 
-        for (Integer key : VALID_SET_TCS.keySet()) {
-            target = VALID_SET_TCS.get(key);
-            currentKey = key;
+        for (int i = ZERO; i < VALID_SET_TCS.length; i++) {
+            target = VALID_SET_TCS[i];
+            currentKey = i;
             reply = voltConfig.setOnu(target);
-            assertNotNull("Incorrect response for " + target, reply);
+            assertNotNull("Incorrect response for VALID_SET_TCS", reply);
         }
     }
 
@@ -192,10 +175,10 @@
         String reply;
         String target;
 
-        for (Integer key : INVALID_GET_STATS_TCS.keySet()) {
-            target = INVALID_GET_STATS_TCS.get(key);
+        for (int i = ZERO; i < INVALID_GET_STATS_TCS.length; i++) {
+            target = INVALID_GET_STATS_TCS[i];
             reply = voltConfig.getOnuStatistics(target);
-            assertNull("Incorrect response for " + target, reply);
+            assertNull("Incorrect response for INVALID_GET_STATS_TCS", reply);
         }
     }
 
@@ -207,11 +190,11 @@
         String reply;
         String target;
 
-        for (Integer key : VALID_GET_STATS_TCS.keySet()) {
-            target = VALID_GET_STATS_TCS.get(key);
-            currentKey = key;
+        for (int i = ZERO; i < VALID_GET_STATS_TCS.length; i++) {
+            target = VALID_GET_STATS_TCS[i];
+            currentKey = i;
             reply = voltConfig.getOnuStatistics(target);
-            assertNotNull("Incorrect response for " + target, reply);
+            assertNotNull("Incorrect response for VALID_GET_STATS_TCS", reply);
         }
     }
 
@@ -223,40 +206,38 @@
      */
     private boolean verifyGetRequest(String request) {
         StringBuilder rpc = new StringBuilder();
-        String target = VALID_GET_TCS.get(currentKey);
+        String target = VALID_GET_TCS[currentKey];
         String[] onuId = null;
 
         if (target != null) {
             onuId = target.split(TEST_HYPHEN);
         }
 
-        rpc.append(TEST_VOLT_NE_OPEN).append(TEST_VOLT_NE_NAMESPACE);
-        rpc.append(TEST_ANGLE_RIGHT).append(TEST_NEW_LINE);
+        rpc.append(TEST_VOLT_NE_OPEN + TEST_VOLT_NE_NAMESPACE);
+        rpc.append(TEST_ANGLE_RIGHT + TEST_NEW_LINE);
         if (onuId != null) {
-            rpc.append(startTag(TEST_VOLT_ONUS));
-            rpc.append(startTag(TEST_ONUS_PERLINK));
-            rpc.append(startTag(TEST_PONLINK_ID, false));
-            rpc.append(onuId[FIRST_PART]);
-            rpc.append(endTag(TEST_PONLINK_ID));
+            rpc.append(startTag(TEST_VOLT_ONUS))
+                .append(startTag(TEST_ONUS_PERLINK))
+                .append(startTag(TEST_PONLINK_ID, false))
+                .append(onuId[FIRST_PART])
+                .append(endTag(TEST_PONLINK_ID));
             if (onuId.length > ONE) {
-                rpc.append(startTag(TEST_ONUS_LIST));
-                rpc.append(startTag(TEST_ONU_INFO));
-                rpc.append(startTag(TEST_ONU_ID, false));
-                rpc.append(onuId[SECOND_PART]);
-                rpc.append(endTag(TEST_ONU_ID));
-                rpc.append(endTag(TEST_ONU_INFO));
-                rpc.append(endTag(TEST_ONUS_LIST));
+                rpc.append(startTag(TEST_ONUS_LIST))
+                    .append(startTag(TEST_ONU_INFO))
+                    .append(startTag(TEST_ONU_ID, false))
+                    .append(onuId[SECOND_PART])
+                    .append(endTag(TEST_ONU_ID))
+                    .append(endTag(TEST_ONU_INFO))
+                    .append(endTag(TEST_ONUS_LIST));
             }
-            rpc.append(endTag(TEST_ONUS_PERLINK));
-            rpc.append(endTag(TEST_VOLT_ONUS));
+            rpc.append(endTag(TEST_ONUS_PERLINK))
+                .append(endTag(TEST_VOLT_ONUS));
         } else {
             rpc.append(emptyTag(TEST_VOLT_ONUS));
         }
         rpc.append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        testRequest = testRequest.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
-        request = request.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
@@ -270,28 +251,26 @@
      */
     private boolean verifyWrappedRpcRequest(String request) {
         StringBuilder rpc = new StringBuilder();
-        String target = VALID_SET_TCS.get(currentKey);
+        String target = VALID_SET_TCS[currentKey];
         String[] data = target.split(TEST_COLON);
         String[] onuId = data[FIRST_PART].split(TEST_HYPHEN);
 
-        rpc.append(TEST_ANGLE_LEFT).append(TEST_ONU_SET_CONFIG).append(TEST_SPACE);
-        rpc.append(TEST_VOLT_NE_NAMESPACE).append(TEST_ANGLE_RIGHT).append(TEST_NEW_LINE);
-        rpc.append(startTag(TEST_PONLINK_ID, false));
-        rpc.append(onuId[FIRST_PART]);
-        rpc.append(endTag(TEST_PONLINK_ID));
-        rpc.append(startTag(TEST_ONU_ID, false));
-        rpc.append(onuId[SECOND_PART]);
-        rpc.append(endTag(TEST_ONU_ID));
-        rpc.append(startTag(TEST_CONFIG_INFO));
-        rpc.append(startTag(data[SECOND_PART], false));
-        rpc.append(data[THIRD_PART]);
-        rpc.append(endTag(data[SECOND_PART]));
-        rpc.append(endTag(TEST_CONFIG_INFO));
-        rpc.append(endTag(TEST_ONU_SET_CONFIG));
+        rpc.append(TEST_ANGLE_LEFT + TEST_ONU_SET_CONFIG + TEST_SPACE);
+        rpc.append(TEST_VOLT_NE_NAMESPACE + TEST_ANGLE_RIGHT + TEST_NEW_LINE);
+        rpc.append(startTag(TEST_PONLINK_ID, false))
+            .append(onuId[FIRST_PART])
+            .append(endTag(TEST_PONLINK_ID))
+            .append(startTag(TEST_ONU_ID, false))
+            .append(onuId[SECOND_PART])
+            .append(endTag(TEST_ONU_ID))
+            .append(startTag(TEST_CONFIG_INFO))
+            .append(startTag(data[SECOND_PART], false))
+            .append(data[THIRD_PART])
+            .append(endTag(data[SECOND_PART]))
+            .append(endTag(TEST_CONFIG_INFO))
+            .append(endTag(TEST_ONU_SET_CONFIG));
 
         String testRequest = rpc.toString();
-        testRequest = testRequest.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
-        request = request.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
@@ -305,53 +284,51 @@
      */
     private boolean verifyGetRequestForStats(String request) {
         StringBuilder rpc = new StringBuilder();
-        String target = VALID_GET_STATS_TCS.get(currentKey);
+        String target = VALID_GET_STATS_TCS[currentKey];
         String[] onuId = null;
 
         if (target != null) {
             onuId = target.split(TEST_HYPHEN);
         }
 
-        rpc.append(TEST_VOLT_NE_OPEN).append(TEST_VOLT_NE_NAMESPACE);
-        rpc.append(TEST_ANGLE_RIGHT).append(TEST_NEW_LINE);
+        rpc.append(TEST_VOLT_NE_OPEN + TEST_VOLT_NE_NAMESPACE);
+        rpc.append(TEST_ANGLE_RIGHT + TEST_NEW_LINE);
         rpc.append(startTag(TEST_VOLT_STATISTICS));
         if (onuId != null) {
-            rpc.append(startTag(TEST_ONU_STATISTICS));
-            rpc.append(startTag(TEST_ONU_GEM_STATS));
-            rpc.append(startTag(TEST_GEM_STATS));
-            rpc.append(startTag(TEST_PONLINK_ID, false));
-            rpc.append(onuId[FIRST_PART]);
-            rpc.append(endTag(TEST_PONLINK_ID));
+            rpc.append(startTag(TEST_ONU_STATISTICS))
+                .append(startTag(TEST_ONU_GEM_STATS))
+                .append(startTag(TEST_GEM_STATS))
+                .append(startTag(TEST_PONLINK_ID, false))
+                .append(onuId[FIRST_PART])
+                .append(endTag(TEST_PONLINK_ID));
             if (onuId.length > ONE) {
-                rpc.append(startTag(TEST_ONU_ID, false));
-                rpc.append(onuId[SECOND_PART]);
-                rpc.append(endTag(TEST_ONU_ID));
+                rpc.append(startTag(TEST_ONU_ID, false))
+                    .append(onuId[SECOND_PART])
+                    .append(endTag(TEST_ONU_ID));
             }
-            rpc.append(endTag(TEST_GEM_STATS));
-            rpc.append(endTag(TEST_ONU_GEM_STATS));
+            rpc.append(endTag(TEST_GEM_STATS))
+                .append(endTag(TEST_ONU_GEM_STATS));
 
-            rpc.append(startTag(TEST_ONU_ETH_STATS));
-            rpc.append(startTag(TEST_ETH_STATS));
-            rpc.append(startTag(TEST_PONLINK_ID, false));
-            rpc.append(onuId[FIRST_PART]);
-            rpc.append(endTag(TEST_PONLINK_ID));
+            rpc.append(startTag(TEST_ONU_ETH_STATS))
+                .append(startTag(TEST_ETH_STATS))
+                .append(startTag(TEST_PONLINK_ID, false))
+                .append(onuId[FIRST_PART])
+                .append(endTag(TEST_PONLINK_ID));
             if (onuId.length > ONE) {
-                rpc.append(startTag(TEST_ONU_ID, false));
-                rpc.append(onuId[SECOND_PART]);
-                rpc.append(endTag(TEST_ONU_ID));
+                rpc.append(startTag(TEST_ONU_ID, false))
+                    .append(onuId[SECOND_PART])
+                    .append(endTag(TEST_ONU_ID));
             }
-            rpc.append(endTag(TEST_ETH_STATS));
-            rpc.append(endTag(TEST_ONU_ETH_STATS));
-            rpc.append(endTag(TEST_ONU_STATISTICS));
+            rpc.append(endTag(TEST_ETH_STATS))
+                .append(endTag(TEST_ONU_ETH_STATS))
+                .append(endTag(TEST_ONU_STATISTICS));
         } else {
             rpc.append(emptyTag(TEST_ONU_STATISTICS));
         }
-        rpc.append(endTag(TEST_VOLT_STATISTICS));
-        rpc.append(TEST_VOLT_NE_CLOSE);
+        rpc.append(endTag(TEST_VOLT_STATISTICS))
+            .append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        testRequest = testRequest.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
-        request = request.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuOperConfigTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuOperConfigTest.java
index b6bf0de..a48a75d 100644
--- a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuOperConfigTest.java
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuOperConfigTest.java
@@ -167,12 +167,6 @@
             .append(endTag(TEST_ONU_REBOOT));
 
         String testRequest = rpc.toString();
-        String regex = TEST_WHITESPACES_REGEX;
-        int index = rpc.indexOf(regex);
-        while (index >= ZERO) {
-            testRequest = rpc.replace(index, index + regex.length(), TEST_EMPTY_STRING).toString();
-            request = request.replaceAll(regex, TEST_EMPTY_STRING);
-        }
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
@@ -210,12 +204,6 @@
         rpc.append(endTag(TEST_ONU_ETHPORT_LOOPBACK));
 
         String testRequest = rpc.toString();
-        String regex = TEST_WHITESPACES_REGEX;
-        int index = rpc.indexOf(regex);
-        while (index >= ZERO) {
-            testRequest = rpc.replace(index, index + regex.length(), TEST_EMPTY_STRING).toString();
-            request = request.replaceAll(regex, TEST_EMPTY_STRING);
-        }
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfigTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfigTest.java
index 399c521..829604d 100644
--- a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfigTest.java
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltPonLinkConfigTest.java
@@ -19,9 +19,6 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertNull;
@@ -33,64 +30,54 @@
  */
 public class FujitsuVoltPonLinkConfigTest {
 
-    private FujitsuNetconfControllerMock controller;
-    private FujitsuDriverHandlerAdapter driverHandler;
-    private FujitsuVoltPonLinkConfig voltConfig;
-
     private final FujitsuNetconfSessionListenerTest listener = new InternalSessionListenerTest();
 
     private static final String TEST_VOLT_PORTS = "volt-ports";
     private static final String TEST_GPON_PONLINK_PORTS = "gpon-ponlink-ports";
     private static final String TEST_GPON_PONLINK_PORT = "gpon-ponlink-port";
 
-    private static final Map<Integer, String> INVALID_GET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "a-b-c");
-            put(2, "--1");
-            put(3, "s-1");
-            put(4, "1-1");
-            put(5, "1 A");
-            put(6, "1*A");
-        }
+    private static final String[] INVALID_GET_TCS = {
+        "a-b-c",
+        "--1",
+        "s-1",
+        "1-1",
+        "1 A",
+        "1*A",
     };
-    private static final Map<Integer, String> VALID_GET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "1");
-            put(2, null);
-        }
+    private static final String[] VALID_GET_TCS = {
+        "1",
+        null,
     };
-    private static final Map<Integer, String> INVALID_SET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "-11:admin-state:enable");
-            put(2, "1:admin-state:false");
-            put(3, "2-1:onu-discovery-mode:manual");
-            put(4, "2:onu-discovery-mode:abcdef");
-            put(5, "3:a:onu-discovery-interval:8");
-            put(6, "3:onu-discovery-interval:-1");
-            put(7, "3:onu-discovery-interval:s1");
-            put(8, "4:dba-cycle-time:41");
-            put(9, "5*8:mac-age-time:30000");
-            put(10, "8:mac-age-time:3699999");
-            put(11, "1:lof-threshold:111");
-            put(12, "2:los-threshold:22");
-            put(13, "3:pm-enable:xyz");
-            put(14, "3:abc-enable:xyz");
-        }
+    private static final String[] INVALID_SET_TCS = {
+        "-11:admin-state:enable",
+        "1:admin-state:false",
+        "2-1:onu-discovery-mode:manual",
+        "2:onu-discovery-mode:abcdef",
+        "3:a:onu-discovery-interval:8",
+        "3:onu-discovery-interval:-1",
+        "3:onu-discovery-interval:s1",
+        "4:dba-cycle-time:41",
+        "5*8:mac-age-time:30000",
+        "8:mac-age-time:3699999",
+        "1:lof-threshold:111",
+        "2:los-threshold:22",
+        "3:pm-enable:xyz",
+        "3:abc-enable:xyz",
     };
-    private static final Map<Integer, String> VALID_SET_TCS = new HashMap<Integer, String>() {
-        {
-            put(1, "1:admin-state:disable");
-            put(2, "2:onu-discovery-mode:manual");
-            put(3, "3:onu-discovery-interval:8");
-            put(4, "4:dba-cycle-time:8");
-            put(5, "5:mac-age-time:33333");
-            put(6, "6:lof-threshold:7");
-            put(7, "7:los-threshold:5");
-            put(8, "8:pm-enable:true");
-        }
+    private static final String[] VALID_SET_TCS = {
+        "1:admin-state:disable",
+        "2:onu-discovery-mode:manual",
+        "3:onu-discovery-interval:8",
+        "4:dba-cycle-time:8",
+        "5:mac-age-time:33333",
+        "6:lof-threshold:7",
+        "7:los-threshold:5",
+        "8:pm-enable:true",
     };
     private Integer currentKey;
-
+    private FujitsuNetconfControllerMock controller;
+    private FujitsuDriverHandlerAdapter driverHandler;
+    private FujitsuVoltPonLinkConfig voltConfig;
 
     @Before
     public void setUp() throws Exception {
@@ -108,10 +95,10 @@
         String reply;
         String target;
 
-        for (Integer key : INVALID_GET_TCS.keySet()) {
-            target = INVALID_GET_TCS.get(key);
+        for (int i = ZERO; i < INVALID_GET_TCS.length; i++) {
+            target = INVALID_GET_TCS[i];
             reply = voltConfig.getPonLinks(target);
-            assertNull("Incorrect response for " + target, reply);
+            assertNull("Incorrect response for INVALID_GET_TCS", reply);
         }
     }
 
@@ -123,11 +110,11 @@
         String reply;
         String target;
 
-        for (Integer key : VALID_GET_TCS.keySet()) {
-            target = VALID_GET_TCS.get(key);
-            currentKey = key;
+        for (int i = ZERO; i < VALID_GET_TCS.length; i++) {
+            target = VALID_GET_TCS[i];
+            currentKey = i;
             reply = voltConfig.getPonLinks(target);
-            assertNotNull("Incorrect response for " + target, reply);
+            assertNotNull("Incorrect response for VALID_GET_TCS", reply);
         }
     }
 
@@ -139,10 +126,10 @@
         String target;
         boolean result;
 
-        for (Integer key : INVALID_SET_TCS.keySet()) {
-            target = INVALID_SET_TCS.get(key);
+        for (int i = ZERO; i < INVALID_SET_TCS.length; i++) {
+            target = INVALID_SET_TCS[i];
             result = voltConfig.setPonLink(target);
-            assertFalse("Incorrect response for ", result);
+            assertFalse("Incorrect response for INVALID_SET_TCS", result);
         }
     }
 
@@ -154,11 +141,11 @@
         String target;
         boolean result;
 
-        for (Integer key : VALID_SET_TCS.keySet()) {
-            target = VALID_SET_TCS.get(key);
-            currentKey = key;
+        for (int i = ZERO; i < VALID_SET_TCS.length; i++) {
+            target = VALID_SET_TCS[i];
+            currentKey = i;
             result = voltConfig.setPonLink(target);
-            assertTrue("Incorrect response for ", result);
+            assertTrue("Incorrect response for VALID_SET_TCS", result);
         }
     }
 
@@ -170,28 +157,26 @@
      */
     private boolean verifyGetRequest(String request) {
         StringBuilder rpc = new StringBuilder();
-        String target = VALID_GET_TCS.get(currentKey);
+        String target = VALID_GET_TCS[currentKey];
 
-        rpc.append(TEST_VOLT_NE_OPEN).append(TEST_VOLT_NE_NAMESPACE);
-        rpc.append(TEST_ANGLE_RIGHT).append(TEST_NEW_LINE);
+        rpc.append(TEST_VOLT_NE_OPEN + TEST_VOLT_NE_NAMESPACE);
+        rpc.append(TEST_ANGLE_RIGHT + TEST_NEW_LINE);
         rpc.append(startTag(TEST_VOLT_PORTS));
         if (target != null) {
-            rpc.append(startTag(TEST_GPON_PONLINK_PORTS));
-            rpc.append(startTag(TEST_GPON_PONLINK_PORT));
-            rpc.append(startTag(TEST_PONLINK_ID, false));
-            rpc.append(target);
-            rpc.append(endTag(TEST_PONLINK_ID));
-            rpc.append(endTag(TEST_GPON_PONLINK_PORT));
-            rpc.append(endTag(TEST_GPON_PONLINK_PORTS));
+            rpc.append(startTag(TEST_GPON_PONLINK_PORTS))
+                .append(startTag(TEST_GPON_PONLINK_PORT))
+                .append(startTag(TEST_PONLINK_ID, false))
+                .append(target)
+                .append(endTag(TEST_PONLINK_ID))
+                .append(endTag(TEST_GPON_PONLINK_PORT))
+                .append(endTag(TEST_GPON_PONLINK_PORTS));
         } else {
             rpc.append(emptyTag(TEST_GPON_PONLINK_PORTS));
         }
-        rpc.append(endTag(TEST_VOLT_PORTS));
-        rpc.append(TEST_VOLT_NE_CLOSE);
+        rpc.append(endTag(TEST_VOLT_PORTS))
+            .append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        testRequest = testRequest.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
-        request = request.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
@@ -205,28 +190,26 @@
      */
     private boolean verifyEditConfigRequest(String request) {
         StringBuilder rpc = new StringBuilder();
-        String target = VALID_SET_TCS.get(currentKey);
+        String target = VALID_SET_TCS[currentKey];
         String[] data = target.split(TEST_COLON);
 
-        rpc.append(TEST_VOLT_NE_OPEN).append(TEST_VOLT_NE_NAMESPACE);
-        rpc.append(TEST_ANGLE_RIGHT).append(TEST_NEW_LINE);
-        rpc.append(startTag(TEST_VOLT_PORTS));
-        rpc.append(startTag(TEST_GPON_PONLINK_PORTS));
-        rpc.append(startTag(TEST_GPON_PONLINK_PORT));
-        rpc.append(startTag(TEST_PONLINK_ID, false));
-        rpc.append(data[FIRST_PART]);
-        rpc.append(endTag(TEST_PONLINK_ID));
-        rpc.append(startTag(data[SECOND_PART], false));
-        rpc.append(data[THIRD_PART]);
-        rpc.append(endTag(data[SECOND_PART]));
-        rpc.append(endTag(TEST_GPON_PONLINK_PORT));
-        rpc.append(endTag(TEST_GPON_PONLINK_PORTS));
-        rpc.append(endTag(TEST_VOLT_PORTS));
-        rpc.append(TEST_VOLT_NE_CLOSE);
+        rpc.append(TEST_VOLT_NE_OPEN + TEST_VOLT_NE_NAMESPACE);
+        rpc.append(TEST_ANGLE_RIGHT + TEST_NEW_LINE);
+        rpc.append(startTag(TEST_VOLT_PORTS))
+            .append(startTag(TEST_GPON_PONLINK_PORTS))
+            .append(startTag(TEST_GPON_PONLINK_PORT))
+            .append(startTag(TEST_PONLINK_ID, false))
+            .append(data[FIRST_PART])
+            .append(endTag(TEST_PONLINK_ID))
+            .append(startTag(data[SECOND_PART], false))
+            .append(data[THIRD_PART])
+            .append(endTag(data[SECOND_PART]))
+            .append(endTag(TEST_GPON_PONLINK_PORT))
+            .append(endTag(TEST_GPON_PONLINK_PORTS))
+            .append(endTag(TEST_VOLT_PORTS))
+            .append(TEST_VOLT_NE_CLOSE);
 
         String testRequest = rpc.toString();
-        testRequest = testRequest.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
-        request = request.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
         boolean result = request.equals(testRequest);
         assertTrue("Does not match with generated string", result);
         return result;
diff --git a/drivers/fujitsu/src/test/resources/setcontrollers.xml b/drivers/fujitsu/src/test/resources/setcontrollers.xml
index 6311281..dcf001b 100644
--- a/drivers/fujitsu/src/test/resources/setcontrollers.xml
+++ b/drivers/fujitsu/src/test/resources/setcontrollers.xml
@@ -32,9 +32,9 @@
               </controller-info>
             </of-controller>
             <of-controller>
-              <ofconfig-id>3</ofconfig-id>
+              <ofconfig-id>2</ofconfig-id>
               <controller-info>
-                <id>3</id>
+                <id>2</id>
                 <ip-address>172.20.33.11</ip-address>
                 <port>6633</port>
                 <protocol>tcp</protocol>
