diff --git a/drivers/fujitsu/BUCK b/drivers/fujitsu/BUCK
index 2ab5166..2eeaa33 100644
--- a/drivers/fujitsu/BUCK
+++ b/drivers/fujitsu/BUCK
@@ -2,6 +2,7 @@
     '//lib:CORE_DEPS',
     '//drivers/utilities:onos-drivers-utilities',
     '//protocols/netconf/api:onos-protocols-netconf-api',
+    '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
     '//lib:org.apache.karaf.shell.console',
     '//cli:onos-cli',
     '//apps/optical-model:onos-apps-optical-model',
diff --git a/drivers/fujitsu/pom.xml b/drivers/fujitsu/pom.xml
index 431ef9f..d540252 100644
--- a/drivers/fujitsu/pom.xml
+++ b/drivers/fujitsu/pom.xml
@@ -56,6 +56,11 @@
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-ctl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
             <artifactId>onos-drivers-utilities</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -69,6 +74,11 @@
             <artifactId>org.apache.karaf.shell.console</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.4</version>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuDriverHandlerAdapter.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuDriverHandlerAdapter.java
new file mode 100644
index 0000000..6d7aad3
--- /dev/null
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuDriverHandlerAdapter.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.fujitsu;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.driver.Behaviour;
+import org.onosproject.net.driver.DefaultDriverHandler;
+import org.onosproject.net.driver.DriverData;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.mastership.MastershipServiceAdapter;
+import org.onosproject.netconf.NetconfController;
+
+
+/**
+ * Mock DefaultDriverHandler.
+ */
+public class FujitsuDriverHandlerAdapter extends DefaultDriverHandler {
+
+    private NetconfController controller;
+    private final MastershipService mastershipService = new InternalMastershipServiceMock();;
+
+    /**
+     * Creates new driver handler with the attached driver data.
+     *
+     * @param data driver data to attach
+     */
+    public FujitsuDriverHandlerAdapter(DriverData data) {
+        super(data);
+    }
+
+    @Override
+    public boolean hasBehaviour(Class<? extends Behaviour> behaviourClass) {
+        return true;
+    }
+
+    @Override
+    public <T> T get(Class<T> serviceClass) {
+        if (serviceClass == NetconfController.class) {
+            return (T) this.controller;
+        } else if (serviceClass == MastershipService.class) {
+            return (T) this.mastershipService;
+        }
+        return null;
+    }
+
+    /**
+     * Set up initial environment.
+     *
+     * @param controller NETCONF controller instance
+     */
+    public void setUp(NetconfController controller) {
+        this.controller = controller;
+    }
+
+    /**
+     * Mock MastershipServiceAdapter.
+     */
+    private class InternalMastershipServiceMock extends MastershipServiceAdapter {
+
+        @Override
+        public boolean isLocalMaster(DeviceId deviceId) {
+            return true;
+        }
+    }
+
+}
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfControllerMock.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfControllerMock.java
new file mode 100644
index 0000000..ee0c94c
--- /dev/null
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfControllerMock.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.fujitsu;
+
+import com.google.common.collect.ImmutableMap;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.driver.DefaultDriver;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.netconf.NetconfDevice;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.ctl.NetconfControllerImpl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+/**
+ * Mock NetconfControllerImpl.
+ */
+class FujitsuNetconfControllerMock extends NetconfControllerImpl {
+
+    private static final String VOLT_DRIVER_NAME = "fujitsu-volt-netconf";
+    private static final String VOLT_DEVICE_USERNAME = "abc";
+    private static final String VOLT_DEVICE_PASSWORD = "123";
+    private static final String VOLT_DEVICE_IP = "10.10.10.11";
+    private static final int VOLT_DEVICE_PORT = 830;
+
+    private Map<DeviceId, NetconfDevice> netconfDeviceMap = new ConcurrentHashMap<>();
+
+    @Override
+    public NetconfDevice getNetconfDevice(DeviceId deviceInfo) {
+        return netconfDeviceMap.get(deviceInfo);
+    }
+
+    @Override
+    public NetconfDevice getNetconfDevice(IpAddress ip, int port) {
+        for (DeviceId info : netconfDeviceMap.keySet()) {
+            if (info.uri().getSchemeSpecificPart().equals(ip.toString() + ":" + port)) {
+                return netconfDeviceMap.get(info);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public NetconfDevice connectDevice(DeviceId deviceId) throws NetconfException {
+        if (netconfDeviceMap.containsKey(deviceId)) {
+            log.debug("Device {} is already present", deviceId);
+            return netconfDeviceMap.get(deviceId);
+        } else {
+            log.debug("Creating NETCONF device {}", deviceId);
+            String ip;
+            int port;
+            String[] info = deviceId.toString().split(":");
+            if (info.length == 3) {
+                ip = info[1];
+                port = Integer.parseInt(info[2]);
+            } else {
+                ip = Arrays.asList(info).stream().filter(el -> !el.equals(info[0])
+                && !el.equals(info[info.length - 1]))
+                        .reduce((t, u) -> t + ":" + u)
+                        .get();
+                log.debug("ip v6 {}", ip);
+                port = Integer.parseInt(info[info.length - 1]);
+            }
+            try {
+                NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo(
+                                               VOLT_DEVICE_USERNAME,
+                                               VOLT_DEVICE_PASSWORD,
+                                               IpAddress.valueOf(ip),
+                                               port);
+                NetconfDevice netconfDevice = new FujitsuNetconfDeviceMock(deviceInfo);
+                netconfDeviceMap.put(deviceInfo.getDeviceId(), netconfDevice);
+                return netconfDevice;
+            } catch (NullPointerException e) {
+                throw new NetconfException("Cannot connect a device " + deviceId, e);
+            }
+        }
+    }
+
+    @Override
+    public void disconnectDevice(DeviceId deviceId, boolean remove) {
+        if (!netconfDeviceMap.containsKey(deviceId)) {
+            log.warn("Device {} is not present", deviceId);
+        } else {
+            netconfDeviceMap.remove(deviceId);
+        }
+    }
+
+    @Override
+    public Map<DeviceId, NetconfDevice> getDevicesMap() {
+        return netconfDeviceMap;
+    }
+
+    @Override
+    public Set<DeviceId> getNetconfDevices() {
+        return netconfDeviceMap.keySet();
+    }
+
+    @Override
+    public void removeDevice(DeviceId deviceId) {
+        if (!netconfDeviceMap.containsKey(deviceId)) {
+            log.warn("Device {} is not present", deviceId);
+        } else {
+            netconfDeviceMap.remove(deviceId);
+        }
+    }
+
+    /**
+     * Sets up initial test environment.
+     *
+     * @param listener listener to be added
+     * @return driver handler
+     * @throws NetconfException when there is a problem
+     */
+    public FujitsuDriverHandlerAdapter setUp(FujitsuNetconfSessionListenerTest listener) throws NetconfException {
+        try {
+            NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo(
+                    VOLT_DEVICE_USERNAME, VOLT_DEVICE_PASSWORD,
+                    IpAddress.valueOf(VOLT_DEVICE_IP), VOLT_DEVICE_PORT);
+
+            NetconfDevice netconfDevice = connectDevice(deviceInfo.getDeviceId());
+
+            FujitsuNetconfSessionMock session = (FujitsuNetconfSessionMock) netconfDevice.getSession();
+            session.setListener(listener);
+
+            DeviceId deviceId = deviceInfo.getDeviceId();
+            DefaultDriver driver = new DefaultDriver(
+                    VOLT_DRIVER_NAME, new ArrayList<>(),
+                    "Fujitsu", "1.0", "1.0",
+                    ImmutableMap.of(), ImmutableMap.of());
+
+            DefaultDriverData driverData = new DefaultDriverData(driver, deviceId);
+
+            FujitsuDriverHandlerAdapter driverHandler;
+            driverHandler = new FujitsuDriverHandlerAdapter(driverData);
+            driverHandler.setUp(this);
+
+            return driverHandler;
+        } catch (NetconfException e) {
+            throw new NetconfException("Cannot create a device ", e);
+        }
+    }
+
+}
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfDeviceMock.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfDeviceMock.java
new file mode 100644
index 0000000..c2c3e0a
--- /dev/null
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfDeviceMock.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.fujitsu;
+
+import org.onosproject.netconf.NetconfDevice;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+
+
+/**
+* Mock DefaultNetconfDevice.
+*/
+class FujitsuNetconfDeviceMock implements NetconfDevice {
+
+    private NetconfDeviceInfo netconfDeviceInfo;
+    private boolean deviceState = false;
+    private NetconfSession netconfSession;
+
+    /**
+     * Creates a new NETCONF device with the information provided.
+     *
+     * @param deviceInfo information about the device to be created.
+     * @throws NetconfException if there are problems in creating or establishing
+     * the underlying NETCONF connection and session.
+     */
+    public FujitsuNetconfDeviceMock(NetconfDeviceInfo deviceInfo) throws NetconfException {
+        netconfDeviceInfo = deviceInfo;
+        try {
+            netconfSession = new FujitsuNetconfSessionMock();
+            deviceState = true;
+        } catch (Exception e) {
+            throw new NetconfException("Cannot create Connection and Session");
+        }
+    }
+
+    @Override
+    public boolean isActive() {
+        return deviceState;
+    }
+
+    @Override
+    public NetconfSession getSession() {
+        return netconfSession;
+    }
+
+    @Override
+    public void disconnect() {
+        deviceState = false;
+        netconfSession = null;
+    }
+
+    @Override
+    public NetconfDeviceInfo getDeviceInfo() {
+        return netconfDeviceInfo;
+    }
+
+}
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfSessionListenerTest.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfSessionListenerTest.java
new file mode 100644
index 0000000..c35ee21
--- /dev/null
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfSessionListenerTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.fujitsu;
+
+
+public interface FujitsuNetconfSessionListenerTest {
+
+    /**
+     * Verify editConfig request arguments.
+     *
+     * @param newConfiguration    configuration to set
+     * @return true if everuthing as expected
+     */
+    boolean verifyEditConfig(String newConfiguration);
+
+    /**
+     * Verify editConfig request arguments.
+     *
+     * @param targetConfiguration the targetConfiguration to change
+     * @param mode                selected mode to change the configuration
+     * @param newConfiguration    configuration to set
+     * @return true if everuthing as expected
+     */
+    boolean verifyEditConfig(String targetConfiguration, String mode, String newConfiguration);
+
+    /**
+     * Verify get request arguments.
+     *
+     * @param filterSchema XML subtrees to include in the reply
+     * @param withDefaultsMode with-defaults mode
+     * @return true if everuthing as expected
+     */
+    boolean verifyGet(String filterSchema, String withDefaultsMode);
+
+    /**
+     * Build get RPC response if necessary.
+     *
+     * @return String or null if not support
+     */
+    String buildGetReply();
+
+    /**
+     * Verify rpc request arguments.
+     *
+     * @param request the XML containing the request to the server.
+     * @return true if everuthing as expected
+     */
+    boolean verifyWrappedRpc(String request);
+
+    /**
+     * Verify rpc request arguments.
+     *
+     * @param filterSchema XML subtrees to indicate specific notification
+     */
+    void verifyStartSubscription(String filterSchema);
+
+}
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfSessionMock.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfSessionMock.java
new file mode 100644
index 0000000..20c2dcd
--- /dev/null
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuNetconfSessionMock.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2015-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.fujitsu;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.netconf.NetconfDeviceOutputEventListener;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+
+/**
+ * Mock NetconfSessionImpl.
+ */
+public class FujitsuNetconfSessionMock implements NetconfSession {
+
+    private FujitsuNetconfSessionListenerTest listener;
+
+    /**
+     * Registers a listener to be invoked for verification.
+     *
+     * @param listener listener to be added
+     */
+    public void setListener(FujitsuNetconfSessionListenerTest listener) {
+        this.listener = listener;
+    }
+
+    @Override
+    public CompletableFuture<String> request(String request) throws NetconfException {
+        return null;
+    }
+
+    @Override
+    public String get(String request) throws NetconfException {
+        return null;
+    }
+
+    @Override
+    public String get(String filterSchema, String withDefaultsMode)
+            throws NetconfException {
+        boolean result = true;
+        String reply = null;
+        if (listener != null) {
+            result = listener.verifyGet(filterSchema, withDefaultsMode);
+            if (result) {
+                reply = listener.buildGetReply();
+            }
+        }
+        return result ?  ((reply == null) ? filterSchema : reply) : null;
+    }
+
+    @Override
+    public String doWrappedRpc(String request) throws NetconfException {
+        boolean result = true;
+        if (listener != null) {
+            result = listener.verifyWrappedRpc(request);
+        }
+        return result ? request : null;
+    }
+
+    @Override
+    public String requestSync(String request) throws NetconfException {
+        return null;
+    }
+
+    @Override
+    public String getConfig(String targetConfiguration) throws NetconfException {
+        return null;
+    }
+
+    @Override
+    public String getConfig(String targetConfiguration, String configurationFilterSchema)
+            throws NetconfException {
+        return null;
+    }
+
+    @Override
+    public boolean editConfig(String newConfiguration) throws NetconfException {
+        boolean result = true;
+        if (listener != null) {
+            result = listener.verifyEditConfig(newConfiguration);
+        }
+        return result;
+    }
+
+    @Override
+    public boolean editConfig(String targetConfiguration, String mode, String newConfiguration)
+            throws NetconfException {
+        boolean result = true;
+        if (listener != null) {
+            result = listener.verifyEditConfig(targetConfiguration, mode, newConfiguration);
+        }
+        return result;
+    }
+
+    @Override
+    public boolean copyConfig(String targetConfiguration, String newConfiguration)
+            throws NetconfException {
+        return false;
+    }
+
+    @Override
+    public boolean deleteConfig(String targetConfiguration) throws NetconfException {
+        return false;
+    }
+
+    @Override
+    public void startSubscription() throws NetconfException {
+    }
+
+    @Beta
+    @Override
+    public void startSubscription(String filterSchema) throws NetconfException {
+        if (listener != null) {
+            listener.verifyStartSubscription(filterSchema);
+        }
+        return;
+    }
+
+    @Override
+    public void endSubscription() throws NetconfException {
+    }
+
+    @Override
+    public boolean lock(String configType) throws NetconfException {
+        return false;
+    }
+
+    @Override
+    public boolean unlock(String configType) throws NetconfException {
+        return false;
+    }
+
+    @Override
+    public boolean lock() throws NetconfException {
+        return false;
+    }
+
+    @Override
+    public boolean unlock() throws NetconfException {
+        return false;
+    }
+
+    @Override
+    public boolean close() throws NetconfException {
+        return false;
+    }
+
+    @Override
+    public String getSessionId() {
+        return null;
+    }
+
+    @Override
+    public String getServerCapabilities() {
+        return null;
+    }
+
+    @Override
+    public void setDeviceCapabilities(List<String> capabilities) {
+    }
+
+    @Override
+    public void addDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
+    }
+
+    @Override
+    public void removeDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
+    }
+
+}
diff --git a/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltXmlUtilityMock.java b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltXmlUtilityMock.java
new file mode 100644
index 0000000..89d5ab9
--- /dev/null
+++ b/drivers/fujitsu/src/test/java/org/onosproject/drivers/fujitsu/FujitsuVoltXmlUtilityMock.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.fujitsu;
+
+/**
+ * Mock FujitsuVoltXmlUtility.
+ * This is to avoid using the same names/definitions
+ * in FujitsuVoltXmlUtility in test codes - not tied to actual codes.
+ */
+final class FujitsuVoltXmlUtilityMock {
+
+    public static final String TEST_COLON = ":";
+    public static final String TEST_DOT = ".";
+    public static final String TEST_HYPHEN = "-";
+    public static final String TEST_SLASH = "/";
+    public static final String TEST_SPACE = " ";
+    public static final String TEST_NEW_LINE = "\n";
+    public static final String TEST_ANGLE_LEFT = "<";
+    public static final String TEST_ANGLE_RIGHT = ">";
+
+    public static final String TEST_REPORT_ALL = "report-all";
+    public static final String TEST_RUNNING = "running";
+
+    public static final String TEST_VOLT_NE_NAMESPACE =
+            "xmlns=\"http://fujitsu.com/ns/volt/1.1\"";
+    public static final String TEST_VOLT_NE = "volt-ne";
+    public static final String TEST_PONLINK_ID = "ponlink-id";
+    public static final String TEST_ONU_ID = "onu-id";
+    public static final String TEST_ROOT = "fakeroot";
+
+    public static final String TEST_VOLT_NE_OPEN = TEST_ANGLE_LEFT + TEST_VOLT_NE + TEST_SPACE;
+    public static final String TEST_VOLT_NE_CLOSE = TEST_ANGLE_LEFT + TEST_SLASH + TEST_VOLT_NE + TEST_ANGLE_RIGHT;
+
+    public static final String TEST_BASE_NAMESPACE =
+            " xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n";
+
+    public static final String TEST_DUPLICATE_SPACES_REGEX = " +";
+    public static final String TEST_WHITESPACES_REGEX = "\\s+";
+    public static final String TEST_EMPTY_STRING = "";
+
+    public static final String TEST_VOLT_NAMESPACE = TEST_VOLT_NE_OPEN +
+            TEST_VOLT_NE_NAMESPACE;
+
+
+    private FujitsuVoltXmlUtilityMock() {
+    }
+
+    /**
+     * Builds XML start tag with name provided.
+     *
+     * @param name tag name
+     * @return string
+     */
+    public static String startTag(String name) {
+        return startTag(name, true);
+    }
+
+    /**
+     * Builds XML end tag with name provided.
+     *
+     * @param name tag name
+     * @return string
+     */
+    public static String endTag(String name) {
+        return endTag(name, true);
+    }
+
+    /**
+     * Builds XML empty tag with name provided.
+     *
+     * @param name tag name
+     * @return string
+     */
+    public static String emptyTag(String name) {
+        return emptyTag(name, true);
+    }
+
+    /**
+     * Builds XML start tag with name provided.
+     *
+     * @param name tag name
+     * @param addNewLine option to add new line character after tag
+     * @return string
+     */
+    public static String startTag(String name, boolean addNewLine) {
+        if (addNewLine) {
+            return (TEST_ANGLE_LEFT + name + TEST_ANGLE_RIGHT + TEST_NEW_LINE);
+        } else {
+            return (TEST_ANGLE_LEFT + name + TEST_ANGLE_RIGHT);
+        }
+    }
+
+    /**
+     * Builds XML end tag with name provided.
+     *
+     * @param name tag name
+     * @param addNewLine option to add new line character after tag
+     * @return string
+     */
+    public static String endTag(String name, boolean addNewLine) {
+        if (addNewLine) {
+            return (TEST_ANGLE_LEFT + TEST_SLASH + name + TEST_ANGLE_RIGHT + TEST_NEW_LINE);
+        } else {
+            return (TEST_ANGLE_LEFT + TEST_SLASH + name + TEST_ANGLE_RIGHT);
+        }
+    }
+
+    /**
+     * Builds XML empty element tag with name provided.
+     *
+     * @param name tag name
+     * @param addNewLine option to add new line character after tag
+     * @return string
+     */
+    public static String emptyTag(String name, boolean addNewLine) {
+        if (addNewLine) {
+            return (TEST_ANGLE_LEFT + name + TEST_SLASH + TEST_ANGLE_RIGHT + TEST_NEW_LINE);
+        } else {
+            return (TEST_ANGLE_LEFT + name + TEST_SLASH + TEST_ANGLE_RIGHT);
+        }
+    }
+
+}
