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
new file mode 100644
index 0000000..c38c46d
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuConfig.java
@@ -0,0 +1,281 @@
+/*
+ * 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.ImmutableSet;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.netconf.NetconfController;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.drivers.fujitsu.FujitsuVoltXmlUtility.*;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation to get and set parameters available in vOLT
+ * through the Netconf protocol.
+ */
+public class FujitsuVoltOnuConfig extends AbstractHandlerBehaviour
+        implements VoltOnuConfig {
+
+    private final Logger log = getLogger(FujitsuVoltOnuConfig.class);
+    private final Set<String> onuConfigParams = ImmutableSet.of(
+            "admin-state", "pm-enable", "fec-enable",
+            "security-enable", "password");
+    private static final String VOLT_ONUS = "volt-onus";
+    private static final String ONUS_PERLINK = "onus-perlink";
+    private static final String ONUS_LIST = "onus-list";
+    private static final String ONU_INFO = "onu-info";
+    private static final String ONU_SET_CONFIG = "onu-set-config";
+    private static final String CONFIG_INFO = "config-info";
+    private static final String VOLT_STATISTICS = "volt-statistics";
+    private static final String ONU_STATISTICS = "onu-statistics";
+    private static final String ONU_ETH_STATS = "onu-eth-stats";
+    private static final String ETH_STATS = "eth-stats";
+    private static final String ONU_GEM_STATS = "onu-gem-stats";
+    private static final String GEM_STATS = "gem-stats";
+    private int pon;
+    private int onu;
+
+
+    @Override
+    public String getOnus(String target) {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+        MastershipService mastershipService = handler.get(MastershipService.class);
+        DeviceId ncDeviceId = handler.data().deviceId();
+        checkNotNull(controller, "Netconf controller is null");
+        String reply = null;
+        String[] onuId = null;
+
+        if (!mastershipService.isLocalMaster(ncDeviceId)) {
+            log.warn("Not master for {} Use {} to execute command",
+                     ncDeviceId,
+                     mastershipService.getMasterFor(ncDeviceId));
+            return reply;
+        }
+
+        if (target != null) {
+            onuId = target.split(HYPHEN);
+            if (onuId.length > 2) {
+                log.error("Invalid number of arguments");
+                return reply;
+            }
+            try {
+                pon = Integer.parseInt(onuId[0]);
+                if (onuId.length > 1) {
+                    onu = Integer.parseInt(onuId[1]);
+                }
+            } catch (NumberFormatException e) {
+                log.error("Non-number input");
+                return reply;
+            }
+        }
+
+        try {
+            StringBuilder request = new StringBuilder();
+            request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE);
+            request.append(ANGLE_RIGHT).append(NEW_LINE);
+            if (onuId != null) {
+                request.append(buildStartTag(VOLT_ONUS));
+                request.append(buildStartTag(ONUS_PERLINK));
+                request.append(buildStartTag(PONLINK_ID, false));
+                request.append(onuId[0]);
+                request.append(buildEndTag(PONLINK_ID));
+                if (onuId.length > 1) {
+                    request.append(buildStartTag(ONUS_LIST));
+                    request.append(buildStartTag(ONU_INFO));
+                    request.append(buildStartTag(ONU_ID, false));
+                    request.append(onuId[1]);
+                    request.append(buildEndTag(ONU_ID));
+                    request.append(buildEndTag(ONU_INFO));
+                    request.append(buildEndTag(ONUS_LIST));
+                }
+                request.append(buildEndTag(ONUS_PERLINK));
+                request.append(buildEndTag(VOLT_ONUS));
+            } else {
+                request.append(buildEmptyTag(VOLT_ONUS));
+            }
+            request.append(VOLT_NE_CLOSE);
+
+            reply = controller.
+                    getDevicesMap().get(ncDeviceId).getSession().
+                    get(request.toString(), REPORT_ALL);
+        } catch (IOException e) {
+            log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
+        }
+        return reply;
+    }
+
+    @Override
+    public String setOnu(String target) {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+        MastershipService mastershipService = handler.get(MastershipService.class);
+        DeviceId ncDeviceId = handler.data().deviceId();
+        checkNotNull(controller, "Netconf controller is null");
+        String reply = null;
+
+        if (!mastershipService.isLocalMaster(ncDeviceId)) {
+            log.warn("Not master for {} Use {} to execute command",
+                     ncDeviceId,
+                     mastershipService.getMasterFor(ncDeviceId));
+            return reply;
+        }
+
+        String[] data = target.split(COLON);
+        if (data.length != 3) {
+            log.error("Invalid number of arguments");
+            return reply;
+        }
+
+        String[] onuId = data[0].split(HYPHEN);
+        if (onuId.length != 2) {
+            log.error("Invalid ONU identifier");
+            return reply;
+        }
+
+        try {
+            pon = Integer.parseInt(onuId[0]);
+            onu = Integer.parseInt(onuId[1]);
+        } catch (NumberFormatException e) {
+            log.error("Non-number input");
+            return reply;
+        }
+
+        if (!onuConfigParams.contains(data[1])) {
+            log.error("Unsupported parameter: " + data[1]);
+            return reply;
+        }
+
+        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[0]);
+            request.append(buildEndTag(PONLINK_ID));
+            request.append(buildStartTag(ONU_ID, false));
+            request.append(onuId[1]);
+            request.append(buildEndTag(ONU_ID));
+            request.append(buildStartTag(CONFIG_INFO));
+            request.append(buildStartTag(data[1], false));
+            request.append(data[2]);
+            request.append(buildEndTag(data[1]));
+            request.append(buildEndTag(CONFIG_INFO));
+            request.append(buildEndTag(ONU_SET_CONFIG));
+
+            reply = controller.
+                    getDevicesMap().get(ncDeviceId).getSession().
+                    doWrappedRpc(request.toString());
+        } catch (IOException e) {
+            log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
+        }
+        return reply;
+    }
+
+    @Override
+    public String getOnuStatistics(String target) {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+        MastershipService mastershipService = handler.get(MastershipService.class);
+        DeviceId ncDeviceId = handler.data().deviceId();
+        checkNotNull(controller, "Netconf controller is null");
+        String reply = null;
+        String[] onuId = null;
+
+        if (!mastershipService.isLocalMaster(ncDeviceId)) {
+            log.warn("Not master for {} Use {} to execute command",
+                     ncDeviceId,
+                     mastershipService.getMasterFor(ncDeviceId));
+            return reply;
+        }
+
+        if (target != null) {
+            onuId = target.split(HYPHEN);
+            if (onuId.length > 2) {
+                log.error("Invalid number of arguments:" + onuId.length);
+                return reply;
+            }
+            try {
+                pon = Integer.parseInt(onuId[0]);
+                if (onuId.length > 1) {
+                    onu = Integer.parseInt(onuId[1]);
+                }
+            } catch (NumberFormatException e) {
+                log.error("Non-number input");
+                return reply;
+            }
+        }
+
+        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_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[0]);
+                request.append(buildEndTag(PONLINK_ID));
+                if (onuId.length > 1) {
+                    request.append(buildStartTag(ONU_ID, false));
+                    request.append(onuId[1]);
+                    request.append(buildEndTag(ONU_ID));
+                }
+                request.append(buildEndTag(GEM_STATS));
+                request.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[0]);
+                request.append(buildEndTag(PONLINK_ID));
+                if (onuId.length > 1) {
+                    request.append(buildStartTag(ONU_ID, false));
+                    request.append(onuId[1]);
+                    request.append(buildEndTag(ONU_ID));
+                }
+                request.append(buildEndTag(ETH_STATS));
+                request.append(buildEndTag(ONU_ETH_STATS));
+
+                request.append(buildEndTag(ONU_STATISTICS));
+            } else {
+                request.append(buildEmptyTag(ONU_STATISTICS));
+            }
+            request.append(buildEndTag(VOLT_STATISTICS));
+            request.append(VOLT_NE_CLOSE);
+
+            reply = controller.
+                    getDevicesMap().get(ncDeviceId).getSession().
+                    get(request.toString(), REPORT_ALL);
+        } catch (IOException e) {
+            log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
+        }
+        return reply;
+    }
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuOperConfig.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuOperConfig.java
new file mode 100644
index 0000000..67f1db2
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltOnuOperConfig.java
@@ -0,0 +1,155 @@
+/*
+ * 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.mastership.MastershipService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.netconf.NetconfController;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.drivers.fujitsu.FujitsuVoltXmlUtility.*;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation to take actions on ONU available in vOLT
+ * through the Netconf protocol.
+ */
+public class FujitsuVoltOnuOperConfig extends AbstractHandlerBehaviour
+        implements VoltOnuOperConfig {
+
+    private final Logger log = getLogger(FujitsuVoltOnuOperConfig.class);
+    private static final String ONU_REBOOT = "onu-reboot";
+    private static final String ONU_ETHPORT_LOOPBACK = "onu-ethport-loopback";
+    private static final String ETHPORT_ID = "ethport-id";
+    private int pon;
+    private int onu;
+    private int eth;
+
+
+    @Override
+    public String rebootOnu(String target) {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+        MastershipService mastershipService = handler.get(MastershipService.class);
+        DeviceId ncDeviceId = handler.data().deviceId();
+        checkNotNull(controller, "Netconf controller is null");
+        String reply = null;
+        String[] onuId = null;
+
+        if (!mastershipService.isLocalMaster(ncDeviceId)) {
+            log.warn("Not master for {} Use {} to execute command",
+                     ncDeviceId,
+                     mastershipService.getMasterFor(ncDeviceId));
+            return reply;
+        }
+
+        onuId = target.split(HYPHEN);
+        if (onuId.length != 2) {
+            log.error("Invalid number of arguments");
+            return reply;
+        }
+        try {
+            pon = Integer.parseInt(onuId[0]);
+            onu = Integer.parseInt(onuId[1]);
+        } catch (NumberFormatException e) {
+            log.error("Non-number input");
+            return reply;
+        }
+
+        try {
+            StringBuilder request = new StringBuilder();
+            request.append(ANGLE_LEFT).append(ONU_REBOOT).append(SPACE);
+            request.append(VOLT_NE_NAMESPACE).append(ANGLE_RIGHT).append(NEW_LINE);
+            request.append(buildStartTag(PONLINK_ID, false));
+            request.append(onuId[0]);
+            request.append(buildEndTag(PONLINK_ID));
+            request.append(buildStartTag(ONU_ID, false));
+            request.append(onuId[1]);
+            request.append(buildEndTag(ONU_ID));
+            request.append(buildEndTag(ONU_REBOOT));
+
+            reply = controller.
+                    getDevicesMap().get(ncDeviceId).getSession().
+                    doWrappedRpc(request.toString());
+        } catch (IOException e) {
+            log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
+        }
+        return reply;
+    }
+
+    @Override
+    public String loopbackEthOnu(String target) {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+        MastershipService mastershipService = handler.get(MastershipService.class);
+        DeviceId ncDeviceId = handler.data().deviceId();
+        checkNotNull(controller, "Netconf controller is null");
+        String reply = null;
+        String[] ethId = null;
+
+        if (!mastershipService.isLocalMaster(ncDeviceId)) {
+            log.warn("Not master for {} Use {} to execute command",
+                     ncDeviceId,
+                     mastershipService.getMasterFor(ncDeviceId));
+            return reply;
+        }
+
+        ethId = target.split(HYPHEN);
+        if (ethId.length != 3) {
+            log.error("Invalid number of arguments");
+            return reply;
+        }
+        try {
+            pon = Integer.parseInt(ethId[0]);
+            onu = Integer.parseInt(ethId[1]);
+            eth = Integer.parseInt(ethId[2]);
+        } catch (NumberFormatException e) {
+            log.error("Non-number input");
+            return reply;
+        }
+
+        try {
+            StringBuilder request = new StringBuilder();
+            request.append(ANGLE_LEFT).append(ONU_ETHPORT_LOOPBACK).append(SPACE);
+            request.append(VOLT_NE_NAMESPACE).append(ANGLE_RIGHT).append(NEW_LINE);
+            request.append(buildStartTag(PONLINK_ID, false));
+            request.append(ethId[0]);
+            request.append(buildEndTag(PONLINK_ID));
+            request.append(buildStartTag(ONU_ID, false));
+            request.append(ethId[1]);
+            request.append(buildEndTag(ONU_ID));
+            request.append(buildStartTag(ETHPORT_ID, false));
+            request.append(ethId[2]);
+            request.append(buildEndTag(ETHPORT_ID));
+            request.append(buildEndTag(ONU_ETHPORT_LOOPBACK));
+
+            reply = controller.
+                    getDevicesMap().get(ncDeviceId).getSession().
+                    doWrappedRpc(request.toString());
+        } catch (IOException e) {
+            log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
+        }
+        return reply;
+    }
+
+}
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 662c1ee..6978803 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
@@ -18,7 +18,7 @@
 
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.behaviour.VoltPonLinkConfig;
+import org.onosproject.drivers.fujitsu.behaviour.VoltPonLinkConfig;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.netconf.NetconfController;
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltOnuConfig.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltOnuConfig.java
new file mode 100644
index 0000000..ab77877
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltOnuConfig.java
@@ -0,0 +1,51 @@
+/*
+ * 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.behaviour;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.driver.HandlerBehaviour;
+
+/**
+ * Device behaviour to obtain and set parameters of ONUs in vOLT.
+ */
+@Beta
+public interface VoltOnuConfig extends HandlerBehaviour {
+
+    /**
+     * Obtain all ONUs or a specific ONU in the device.
+     *
+     * @param target input data in string
+     * @return response string
+     */
+    String getOnus(String target);
+
+    /**
+     * Set a parameter value of an ONU in the device.
+     *
+     * @param target input data in string
+     * @return response string
+     */
+    String setOnu(String target);
+
+    /**
+     * Obtain all or a specific ONU statistics in the device.
+     *
+     * @param target input data in string
+     * @return response string
+     */
+    String getOnuStatistics(String target);
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltOnuOperConfig.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltOnuOperConfig.java
new file mode 100644
index 0000000..996d5ca
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltOnuOperConfig.java
@@ -0,0 +1,41 @@
+/*
+ * 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.behaviour;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.driver.HandlerBehaviour;
+
+/**
+ * Device behaviour to perform actions in an ONU in vOLT.
+ */
+@Beta
+public interface VoltOnuOperConfig extends HandlerBehaviour {
+
+    /**
+     * Reboot an ONU in the device.
+     *
+     * @param target input data in string
+     */
+    String rebootOnu(String target);
+
+    /**
+     * Operate/release loopback on Ethernet port an ONU in the device.
+     *
+     * @param target input data in string
+     */
+    String loopbackEthOnu(String target);
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltPonLinkConfig.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltPonLinkConfig.java
new file mode 100644
index 0000000..dfd2812
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltPonLinkConfig.java
@@ -0,0 +1,43 @@
+/*
+ * 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.behaviour;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.driver.HandlerBehaviour;
+
+/**
+ * Device behaviour to obtain and set parameters of PON links in vOLT.
+ */
+@Beta
+public interface VoltPonLinkConfig extends HandlerBehaviour {
+
+    /**
+     * Obtain all GPON PON links or a specific PON link in the device.
+     *
+     * @param target input data in string
+     * @return response string
+     */
+    String getPonLinks(String target);
+
+    /**
+     * Set a parameter value of PON link in the device.
+     *
+     * @param target input data in string
+     *
+     */
+    void setPonLink(String target);
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/package-info.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/package-info.java
new file mode 100644
index 0000000..c9b3256
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+
+/**
+ * Abstractions of various device configuration or device adaptation behaviours;
+ * counterpart to the device driver subsystem. -vOLT
+ */
+package org.onosproject.drivers.fujitsu.behaviour;
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltEthLoopbackCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltEthLoopbackCommand.java
new file mode 100644
index 0000000..630a546
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltEthLoopbackCommand.java
@@ -0,0 +1,57 @@
+/*
+ * 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.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+
+/**
+ * Operates/releases loopback on Ethernet port of an ONU in vOLT.
+ */
+@Command(scope = "onos", name = "volt-ethloopback",
+        description = "Operates/releases loopback on Ethernet port of an ONU in vOLT")
+public class VoltEthLoopbackCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+            required = true, multiValued = false)
+    String uri = null;
+
+    @Argument(index = 1, name = "target", description = "PON link ID-ONU ID-Eth port ID[:(operate:release)]",
+            required = true, multiValued = false)
+    String target = null;
+
+    private DeviceId deviceId;
+
+    @Override
+    protected void execute() {
+        DriverService service = get(DriverService.class);
+        deviceId = DeviceId.deviceId(uri);
+        DriverHandler h = service.createHandler(deviceId);
+        VoltOnuOperConfig volt = h.behaviour(VoltOnuOperConfig.class);
+        String reply = volt.loopbackEthOnu(target);
+        if (reply != null) {
+            print("%s", reply);
+        } else {
+            print("No reply from %s", deviceId.toString());
+        }
+    }
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnuStatsCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnuStatsCommand.java
new file mode 100644
index 0000000..0888af1
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnuStatsCommand.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2016-present Open tworking 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.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+
+/**
+ * Gets ONU statistics in vOLT.
+ */
+@Command(scope = "onos", name = "volt-onustats",
+        description = "Gets ONU statistics in vOLT")
+public class VoltGetOnuStatsCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+            required = true, multiValued = false)
+    String uri = null;
+
+    @Argument(index = 1, name = "target", description = "PON link ID-ONU ID",
+            required = false, multiValued = false)
+    String target = null;
+
+    private DeviceId deviceId;
+
+    @Override
+    protected void execute() {
+        DriverService service = get(DriverService.class);
+        deviceId = DeviceId.deviceId(uri);
+        DriverHandler h = service.createHandler(deviceId);
+        VoltOnuConfig volt = h.behaviour(VoltOnuConfig.class);
+        String reply = volt.getOnuStatistics(target);
+        if (reply != null) {
+            print("%s", reply);
+        } else {
+            print("No reply from %s", deviceId.toString());
+        }
+    }
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnusCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnusCommand.java
new file mode 100644
index 0000000..cd8076f
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnusCommand.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2016-present Open tworking 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.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+
+/**
+ * Gets ONUs available in vOLT.
+ */
+@Command(scope = "onos", name = "volt-onus",
+        description = "Gets ONUs available in vOLT")
+public class VoltGetOnusCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+            required = true, multiValued = false)
+    String uri = null;
+
+    @Argument(index = 1, name = "target", description = "PON link ID or PON link ID-ONU ID",
+            required = false, multiValued = false)
+    String target = null;
+
+    private DeviceId deviceId;
+
+    @Override
+    protected void execute() {
+        DriverService service = get(DriverService.class);
+        deviceId = DeviceId.deviceId(uri);
+        DriverHandler h = service.createHandler(deviceId);
+        VoltOnuConfig volt = h.behaviour(VoltOnuConfig.class);
+        String reply = volt.getOnus(target);
+        if (reply != null) {
+            print("%s", reply);
+        } else {
+            print("No reply from %s", deviceId.toString());
+        }
+    }
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java
index 2aacf15..9129d94 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java
@@ -19,7 +19,7 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.behaviour.VoltPonLinkConfig;
+import org.onosproject.drivers.fujitsu.behaviour.VoltPonLinkConfig;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltRebootOnuCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltRebootOnuCommand.java
new file mode 100644
index 0000000..2d973dd
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltRebootOnuCommand.java
@@ -0,0 +1,57 @@
+/*
+ * 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.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+
+/**
+ * Reboots an ONU in vOLT.
+ */
+@Command(scope = "onos", name = "volt-rebootonu",
+        description = "Reboots an ONU in vOLT")
+public class VoltRebootOnuCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+            required = true, multiValued = false)
+    String uri = null;
+
+    @Argument(index = 1, name = "target", description = "PON link ID-ONU ID",
+            required = true, multiValued = false)
+    String target = null;
+
+    private DeviceId deviceId;
+
+    @Override
+    protected void execute() {
+        DriverService service = get(DriverService.class);
+        deviceId = DeviceId.deviceId(uri);
+        DriverHandler h = service.createHandler(deviceId);
+        VoltOnuOperConfig volt = h.behaviour(VoltOnuOperConfig.class);
+        String reply = volt.rebootOnu(target);
+        if (reply != null) {
+            print("%s", reply);
+        } else {
+            print("No reply from %s", deviceId.toString());
+        }
+    }
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetOnuCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetOnuCommand.java
new file mode 100644
index 0000000..4b82cd3
--- /dev/null
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetOnuCommand.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2016-present Open tworking 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.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+
+/**
+ * Sets a parameter value of an ONU in vOLT.
+ */
+@Command(scope = "onos", name = "volt-setonu",
+        description = "Sets a parameter value of an ONU in vOLT")
+public class VoltSetOnuCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+            required = true, multiValued = false)
+    String uri = null;
+
+    @Argument(index = 1, name = "target", description = "PON link ID-ONU ID:parameter:value",
+            required = true, multiValued = false)
+    String target = null;
+
+    private DeviceId deviceId;
+
+    @Override
+    protected void execute() {
+        DriverService service = get(DriverService.class);
+        deviceId = DeviceId.deviceId(uri);
+        DriverHandler h = service.createHandler(deviceId);
+        VoltOnuConfig volt = h.behaviour(VoltOnuConfig.class);
+        String reply = volt.setOnu(target);
+        if (reply != null) {
+            print("%s", reply);
+        } else {
+            print("No reply from %s", deviceId.toString());
+        }
+    }
+
+}
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java
index 46b7f9c..94565c5 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java
@@ -19,7 +19,7 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.behaviour.VoltPonLinkConfig;
+import org.onosproject.drivers.fujitsu.behaviour.VoltPonLinkConfig;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 
diff --git a/drivers/fujitsu/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/drivers/fujitsu/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 4b65abf..1f72cc6 100644
--- a/drivers/fujitsu/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/drivers/fujitsu/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -23,13 +23,42 @@
             <ref component-id="deviceIdCompleter"/>
         </completers>
         </command>
-
         <command>
             <action class="org.onosproject.drivers.fujitsu.cli.VoltSetPonLinkCommand"/>
         <completers>
             <ref component-id="deviceIdCompleter"/>
         </completers>
         </command>
+        <command>
+            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetOnusCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
+        </command>
+        <command>
+            <action class="org.onosproject.drivers.fujitsu.cli.VoltSetOnuCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
+        </command>
+        <command>
+            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetOnuStatsCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
+        </command>
+        <command>
+            <action class="org.onosproject.drivers.fujitsu.cli.VoltEthLoopbackCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
+        </command>
+        <command>
+            <action class="org.onosproject.drivers.fujitsu.cli.VoltRebootOnuCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
+        </command>
     </command-bundle>
 
     <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
diff --git a/drivers/fujitsu/src/main/resources/fujitsu-drivers.xml b/drivers/fujitsu/src/main/resources/fujitsu-drivers.xml
index d4666e3..46cb697 100644
--- a/drivers/fujitsu/src/main/resources/fujitsu-drivers.xml
+++ b/drivers/fujitsu/src/main/resources/fujitsu-drivers.xml
@@ -24,7 +24,11 @@
     <driver name="fujitsu-volt-netconf" manufacturer="Fujitsu" hwVersion="svkOLT" swVersion="v1.0">
         <behaviour api="org.onosproject.net.behaviour.ControllerConfig"
                    impl="org.onosproject.drivers.fujitsu.FujitsuVoltControllerConfig"/>
-        <behaviour api="org.onosproject.net.behaviour.VoltPonLinkConfig"
+        <behaviour api="org.onosproject.drivers.fujitsu.behaviour.VoltPonLinkConfig"
                    impl="org.onosproject.drivers.fujitsu.FujitsuVoltPonLinkConfig"/>
+        <behaviour api="org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig"
+                   impl="org.onosproject.drivers.fujitsu.FujitsuVoltOnuConfig"/>
+        <behaviour api="org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig"
+                   impl="org.onosproject.drivers.fujitsu.FujitsuVoltOnuOperConfig"/>
     </driver>
 </drivers>
\ No newline at end of file
