diff --git a/drivers/ciena/waveserver/BUCK b/drivers/ciena/waveserver/BUCK
new file mode 100644
index 0000000..0f3e825
--- /dev/null
+++ b/drivers/ciena/waveserver/BUCK
@@ -0,0 +1,44 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:JACKSON',
+    '//lib:javax.ws.rs-api',
+    '//incubator/api:onos-incubator-api',
+    '//utils/rest:onlab-rest',
+    '//drivers/utilities:onos-drivers-utilities',
+    '//protocols/rest/api:onos-protocols-rest-api',
+    '//apps/optical-model:onos-apps-optical-model',
+    '//drivers/optical:onos-drivers-optical',
+]
+
+TEST_DEPS = [
+    '//lib:TEST_ADAPTERS',
+    '//core/api:onos-api-tests',
+]
+
+BUNDLES = [
+    ':onos-drivers-ciena-waveserver',
+    '//drivers/utilities:onos-drivers-utilities',
+]
+
+REQUIRED_APPS = [
+    'org.onosproject.restsb',
+    'org.onosproject.optical-model',
+    'org.onosproject.drivers.optical',
+]
+
+osgi_jar_with_tests (
+    deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
+    resources_root = 'src/main/resources',
+    resources = glob(['src/main/resources/**']),
+)
+
+onos_app (
+    app_name = 'org.onosproject.drivers.ciena.waveserver.rest',
+    title = 'Ciena Waveserver Drivers',
+    category = 'Drivers',
+    url = 'http://onosproject.org',
+    description = 'Adds support for Ciena Waveserver devices.',
+    included_bundles = BUNDLES,
+    required_apps = REQUIRED_APPS,
+)
diff --git a/drivers/ciena/waveserver/README.md b/drivers/ciena/waveserver/README.md
new file mode 100644
index 0000000..aef0dc9
--- /dev/null
+++ b/drivers/ciena/waveserver/README.md
@@ -0,0 +1,61 @@
+# Ciena Waveserver
+
+This driver allows connection to the Ciena Waveserver
+
+The User Guide for this product is available on request from Ciena, and gives a full explanation of the theory of operation, functionality and how all functions can be accessed through the REST interface.
+
+Currently only a subset of it's functionality is supported through ONOS, but this will expand to full functionality in future releases.
+
+## Compile and Installation
+
+Currently this driver is built using BUCK and uses version 2.1 of onos-yang-tools<br/>
+
+All that is required to activate the driver is to run the following at the ONOS CLI
+
+```bash
+app activate org.onosproject.drivers.ciena.waveserver.rest
+```
+
+## Usage
+
+### Creating Devices
+
+Ciena Waveserver Devices are not Openflow devices. The connectivity is initiated from ONOS. They have to be created through the network/configuration REST interface in ONOS.
+
+* The name must follow the format **rest:ipaddr:port**
+* The **ip** and **port** must correspond to the ip and port in the name (above).
+
+```bash
+curl -X POST
+  http://onos-ip:8181/onos/v1/network/configuration
+  -H 'Authorization: Basic b25vczpyb2Nrcw==' \
+  -H 'Content-Type: application/json' \
+  -d '{
+    "devices": {
+      "rest:10.181.66.217:443": {
+        "rest": {
+          "port": 443,
+          "ip": "10.181.66.217",
+          "username": "su",
+          "password": "cws",
+          "protocol": "https",
+          "url": "/yang-api/datastore/"
+        },
+        "basic": {
+          "driver": "ciena-waveserver-rest"
+        }
+      }
+    }
+}'
+```
+
+
+
+#### Verify Connected Device
+
+When the Waveserver is configured and connected is should be visible in ONOS through the `devices` command.
+
+```bash 
+onos> devices 
+id=rest:10.181.66.217:443, available=true, local-status=connected 32s ago, role=MASTER, type=SWITCH, mfr=unknown, hw=unknown, sw=unknown, serial=unknown, driver=ciena-waveserver-rest, ipaddress=10.181.66.217, locType=geo, name=rest:10.181.66.217:443, protocol=REST
+```
diff --git a/drivers/ciena/waveserver/features.xml b/drivers/ciena/waveserver/features.xml
new file mode 100644
index 0000000..0611588
--- /dev/null
+++ b/drivers/ciena/waveserver/features.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ Copyright 2016-present Open Networking Foundation
+  ~
+  ~ 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.
+  -->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+    <feature name="${project.artifactId}" version="${project.version}"
+             description="${project.description}">
+        <feature>onos-api</feature>
+        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
+
+        <bundle>mvn:${project.groupId}/onos-restsb-api/${project.version}</bundle>
+
+        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
+    </feature>
+</features>
diff --git a/drivers/ciena/waveserver/pom.xml b/drivers/ciena/waveserver/pom.xml
new file mode 100644
index 0000000..ee214e6
--- /dev/null
+++ b/drivers/ciena/waveserver/pom.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016-present Open Networking Foundation
+  ~
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>onos-drivers-general</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.13.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>onos-drivers-ciena-waveserver-rest</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>Ciena Waveserver device drivers</description>
+
+    <properties>
+        <onos.app.name>org.onosproject.drivers.ciena.waveserver.rest</onos.app.name>
+        <onos.app.origin>ONOS Community</onos.app.origin>
+        <onos.app.title>Ciena Waveserver Device Drivers</onos.app.title>
+        <onos.app.category>Drivers</onos.app.category>
+        <onos.app.url>http://onosproject.org</onos.app.url>
+        <onos.app.requires>
+            org.onosproject.restsb,
+            org.onosproject.optical-model
+        </onos.app.requires>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-optical-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-utilities</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-restsb-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-optical</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaDriversLoader.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaDriversLoader.java
new file mode 100644
index 0000000..11e3fc5
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaDriversLoader.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import org.apache.felix.scr.annotations.Component;
+import org.onosproject.net.driver.AbstractDriverLoader;
+import org.onosproject.net.optical.OpticalDevice;
+
+/**
+ * Loader for Ciena device drivers.
+ */
+@Component(immediate = true)
+public class CienaDriversLoader extends AbstractDriverLoader {
+
+    // OSGI: help bundle plugin discover runtime package dependency.
+    @SuppressWarnings("unused")
+    private OpticalDevice optical;
+
+    public CienaDriversLoader() {
+        super("/ciena-drivers.xml");
+    }
+}
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaFlowRuleProgrammable.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaFlowRuleProgrammable.java
new file mode 100644
index 0000000..6dc0400
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaFlowRuleProgrammable.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.OchSignal;
+import org.onosproject.net.PortNumber;
+import org.onosproject.driver.optical.flowrule.CrossConnectFlowRule;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleProgrammable;
+
+import org.slf4j.Logger;
+
+
+import java.util.List;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+public class CienaFlowRuleProgrammable extends AbstractHandlerBehaviour implements FlowRuleProgrammable {
+    private CienaRestDevice restCiena;
+    private final Logger log = getLogger(getClass());
+
+    @Override
+    public Collection<FlowEntry> getFlowEntries() {
+        DeviceId deviceId = handler().data().deviceId();
+        log.debug("getting flow entries for device {}", deviceId);
+        try {
+            restCiena = new CienaRestDevice(handler());
+        } catch (NullPointerException e) {
+            log.error("unable to create CienaRestDevice:\n{}", e);
+            return Collections.emptyList();
+        }
+        return restCiena.getFlowEntries();
+    }
+
+    @Override
+    public Collection<FlowRule> applyFlowRules(Collection<FlowRule> rules) {
+        log.debug("installing flow rules: {}", rules);
+        try {
+            restCiena = new CienaRestDevice(handler());
+        } catch (NullPointerException e) {
+            log.error("unable to create CienaRestDevice:\n{}", e);
+            return Collections.emptyList();
+        }
+        // Apply the valid rules on the device
+        Collection<FlowRule> added = rules.stream()
+                .map(this::createCrossConnectFlowRule)
+                .filter(this::installCrossConnect)
+                .collect(Collectors.toList());
+        restCiena.setCrossConnectCache(added);
+        return added;
+    }
+
+    @Override
+    public Collection<FlowRule> removeFlowRules(Collection<FlowRule> rules) {
+        log.debug("removing flow rules: {}", rules);
+        try {
+            restCiena = new CienaRestDevice(handler());
+        } catch (NullPointerException e) {
+            log.error("unable to create CienaRestDevice:\n{}", e);
+            return Collections.emptyList();
+        }
+        Collection<FlowRule> removed = rules.stream()
+                .map(this::createCrossConnectFlowRule)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        restCiena.removeCrossConnectCache(removed);
+        return removed;
+    }
+
+    private CrossConnectFlowRule createCrossConnectFlowRule(FlowRule r) {
+        List<PortNumber> linePorts = CienaRestDevice.getLinesidePortId().stream()
+                .map(PortNumber::portNumber)
+                .collect(Collectors.toList());
+        try {
+            return new CrossConnectFlowRule(r, linePorts);
+        } catch (IllegalArgumentException e) {
+            log.debug("unable to create cross connect for rule:\n{}", r);
+        }
+        return null;
+    }
+
+    private boolean installCrossConnect(CrossConnectFlowRule xc) {
+        if (xc == null) {
+            return false;
+        }
+        // only handling lineside rule
+        if (xc.isAddRule()) {
+            PortNumber outPort = xc.addDrop();
+            OchSignal signal = xc.ochSignal();
+            return install(outPort, signal);
+        }
+        return false;
+    }
+
+    private boolean removeCrossConnect(CrossConnectFlowRule xc) {
+        //for now setting channel to 0 for remove rule
+        if (xc == null) {
+            return false;
+        }
+        // only handling lineside rule
+        if (xc.isAddRule()) {
+            PortNumber outPort = xc.addDrop();
+            OchSignal signal = OchSignal.newDwdmSlot(xc.ochSignal().channelSpacing(), 0);
+            return install(outPort, signal);
+        }
+        return false;
+    }
+
+    private boolean install(PortNumber outPort, OchSignal signal) {
+        /*
+         * rule is installed in three steps
+         * 1- disable port
+         * 2- change frequency
+         * 3- enable port
+         */
+        try {
+            restCiena = new CienaRestDevice(handler());
+        } catch (NullPointerException e) {
+            log.error("unable to create CienaRestDevice, {}", e);
+            return false;
+        }
+        //1- disable port
+        //blindly disabling port
+        if (!restCiena.disablePort(outPort)) {
+            return false;
+        }
+        //2- change frequency
+        if (!restCiena.changeFrequency(signal, outPort)) {
+            return false;
+        }
+        //3- enable port
+        if (!restCiena.enablePort(outPort)) {
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaRestDevice.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaRestDevice.java
new file mode 100644
index 0000000..ea02de3
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaRestDevice.java
@@ -0,0 +1,446 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang3.tuple.Pair;
+import org.onlab.util.Frequency;
+import org.onlab.util.Spectrum;
+import org.onosproject.driver.optical.flowrule.CrossConnectCache;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEntityId;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmId;
+import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
+import org.onosproject.net.ChannelSpacing;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.OchSignal;
+import org.onosproject.net.OchSignalType;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.flow.DefaultFlowEntry;
+import org.onosproject.net.flow.DefaultFlowRule;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.FlowId;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.protocol.rest.RestSBController;
+import org.slf4j.Logger;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+public class CienaRestDevice {
+    private static final Frequency CENTER_FREQUENCY = Frequency.ofGHz(195_950);
+    private static final String ENABLED = "enabled";
+    private static final String DISABLED = "disabled";
+    private static final String VALUE = "value";
+    private static final String STATE = "state";
+    private static final String ADMIN_STATE = "admin-state";
+    private static final String WAVELENGTH = "wavelength";
+    private static final String DATA = "data";
+    private static final String ACTIVE = "active";
+    private static final String ACKNOWLEDGE = "acknowledged";
+    private static final String SEVERITY = "severity";
+    private static final String DESCRIPTION = "description";
+    private static final String INSTANCE = "instance";
+    private static final String PORT = "port";
+    private static final String PTP = "ptp";
+    private static final String UTC = "UTC";
+    private static final String OTHER = "other";
+    private static final String DATE_TIME_FORMAT = "EEE MMM [ ]d HH:mm:ss yyyy";
+    //keys
+    private static final String ALARM_KEY = "ws-alarms";
+    private static final String ALARM_INSTANCE_ID = "alarm-instance-id";
+    private static final String ALARM_TABLE_ID = "alarm-table-id";
+    private static final String ALARM_LOCAL_DATE_TIME = "local-date-time";
+    private static final String LINE_SYSTEM_CHANNEL_NUMBER = "ciena-ws-ptp-modem:line-system-channel-number";
+    private static final String FREQUENCY_KEY = "ciena-ws-ptp-modem:frequency";
+    //URIs
+    private static final String PORT_URI = "ws-ptps/ptps/%s";
+    private static final String TRANSMITTER_URI = PORT_URI + "/properties/transmitter";
+    private static final String PORT_STATE_URI = PORT_URI + "/" + STATE;
+    private static final String WAVELENGTH_URI = TRANSMITTER_URI + "/" + WAVELENGTH;
+    private static final String FREQUENCY_URI = TRANSMITTER_URI + "/" + FREQUENCY_KEY;
+    private static final String CHANNEL_URI = TRANSMITTER_URI + "/" + LINE_SYSTEM_CHANNEL_NUMBER;
+    private static final String ACTIVE_ALARMS_URL = ALARM_KEY + "/" + ACTIVE;
+    private static final List<String> LINESIDE_PORT_ID = ImmutableList.of("4", "48");
+    private static final ChannelSpacing CHANNEL_SPACING = ChannelSpacing.CHL_50GHZ;
+
+    private final Logger log = getLogger(getClass());
+
+    private DeviceId deviceId;
+    private RestSBController controller;
+    private CrossConnectCache crossConnectCache;
+    private DeviceService deviceService;
+
+
+    public CienaRestDevice(DriverHandler handler) throws NullPointerException {
+        deviceId = handler.data().deviceId();
+        controller = checkNotNull(handler.get(RestSBController.class));
+        crossConnectCache = checkNotNull(handler.get(CrossConnectCache.class));
+        deviceService = checkNotNull(handler.get(DeviceService.class));
+    }
+
+    /**
+     * return the Line side ports.
+     *
+     * @return List of Line side ports.
+     */
+    public static List<String> getLinesidePortId() {
+        return LINESIDE_PORT_ID;
+    }
+
+    /**
+     * add the given flow rules to cross connect-cache.
+     *
+     * @param flowRules flow rules that needs to be cached.
+     */
+    public void setCrossConnectCache(Collection<FlowRule> flowRules) {
+        flowRules.forEach(xc -> crossConnectCache.set(
+                Objects.hash(deviceId, xc.selector(), xc.treatment()),
+                xc.id(),
+                xc.priority()));
+    }
+
+    /**
+     * remove the given flow rules form the cross-connect cache.
+     *
+     * @param flowRules flow rules that needs to be removed from cache.
+     */
+    public void removeCrossConnectCache(Collection<FlowRule> flowRules) {
+        flowRules.forEach(xc -> crossConnectCache.remove(Objects.hash(deviceId, xc.selector(), xc.treatment())));
+    }
+
+    private final String genPortStateRequest(String state) {
+        String request = "{\n" +
+                "\"" + STATE + "\": {\n" +
+                "\"" + ADMIN_STATE + "\": \"" + state + "\"\n}\n}";
+        log.debug("generated request: \n{}", request);
+        return request;
+    }
+
+    private String genWavelengthChangeRequest(String wavelength) {
+        String request = "{\n" +
+                "\"" + WAVELENGTH + "\": {\n" +
+                "\"" + VALUE + "\": " + wavelength + "\n" +
+                "}\n" +
+                "}";
+        log.debug("request:\n{}", request);
+        return request;
+
+    }
+
+    private String genFrequencyChangeRequest(double frequency) {
+        String request = "{\n" +
+                "\"" + FREQUENCY_KEY + "\": {\n" +
+                "\"" + VALUE + "\": " + Double.toString(frequency) + "\n" +
+                "}\n" +
+                "}";
+        log.debug("request:\n{}", request);
+        return request;
+
+    }
+
+    private String genChannelChangeRequest(int channel) {
+        String request = "{\n" +
+                "\"" + LINE_SYSTEM_CHANNEL_NUMBER + "\": " +
+                Integer.toString(channel) + "\n}";
+        log.debug("request:\n{}", request);
+        return request;
+
+    }
+
+
+    private final String genUri(String uriFormat, PortNumber port) {
+        return String.format(uriFormat, port.name());
+    }
+
+    private boolean isPortState(PortNumber number, String state) {
+        log.debug("checking port {} state is {} or not on device {}", number, state, deviceId);
+        String uri = genUri(PORT_STATE_URI, number);
+        JsonNode jsonNode;
+        try {
+            jsonNode = get(uri);
+        } catch (IOException e) {
+            log.error("unable to get port state on device {}", deviceId);
+            return false;
+        }
+        return jsonNode.get(STATE).get(ADMIN_STATE).asText().equals(state);
+
+    }
+
+    private boolean confirmPortState(long timePeriodInMillis, int iterations, PortNumber number, String state) {
+        for (int i = 0; i < iterations; i++) {
+            log.debug("looping for port state with time period {}ms on device {}. try number {}/{}",
+                    timePeriodInMillis, deviceId, i + 1, iterations);
+            if (isPortState(number, state)) {
+                return true;
+            }
+            try {
+                Thread.sleep(timePeriodInMillis);
+            } catch (InterruptedException e) {
+                log.error("unable to sleep thread for device {}\n", deviceId, e);
+                Thread.currentThread().interrupt();
+                return false;
+            }
+        }
+        return false;
+    }
+
+    private boolean changePortState(PortNumber number, String state) {
+        log.debug("changing the port {} on device {} state to {}", number, deviceId, state);
+        String uri = genUri(PORT_STATE_URI, number);
+        String request = genPortStateRequest(state);
+
+        boolean response = putNoReply(uri, request);
+        if (!response) {
+            log.error("unable to change port {} on device {} state to {}", number, deviceId, state);
+        }
+
+        // 5 tries with 2 sec delay
+        long timePeriod = 2000;
+        int iterations = 5;
+        return confirmPortState(timePeriod, iterations, number, state);
+    }
+
+    public boolean disablePort(PortNumber number) {
+        return changePortState(number, DISABLED);
+    }
+
+    public boolean enablePort(PortNumber number) {
+        return changePortState(number, ENABLED);
+    }
+
+    public final boolean changeFrequency(OchSignal signal, PortNumber outPort) {
+        String uri = genUri(FREQUENCY_URI, outPort);
+        double frequency = signal.centralFrequency().asGHz();
+        String request = genFrequencyChangeRequest(frequency);
+        boolean response = putNoReply(uri, request);
+        if (!response) {
+            log.error("unable to change frequency of port {} on device {}", outPort, deviceId);
+        }
+        return response;
+    }
+
+    public final boolean changeChannel(OchSignal signal, PortNumber outPort) {
+        String uri = genUri(CHANNEL_URI, outPort);
+        int channel = signal.spacingMultiplier();
+        log.debug("channel is {} for port {} on device {}", channel, outPort.name(), deviceId);
+        String request = genChannelChangeRequest(channel);
+        boolean response = putNoReply(uri, request);
+        if (!response) {
+            log.error("unable to change channel to {} for port {} on device {}",
+                    channel, outPort.name(), deviceId);
+        }
+        return response;
+    }
+
+    private int getChannel(PortNumber port) {
+        try {
+            String uri = genUri(CHANNEL_URI, port);
+            JsonNode response = get(uri);
+            return response.get(LINE_SYSTEM_CHANNEL_NUMBER).asInt();
+        } catch (IOException e) {
+            // this is expected for client side ports as they don't contain channel data
+            log.error("unable to get channel for port {} on device {}:\n{}", port, deviceId, e);
+            return -1;
+        }
+
+    }
+
+    private int getChannelFromFrequency(Frequency frequency) {
+        return (int) frequency.subtract(Spectrum.CENTER_FREQUENCY)
+                .floorDivision(CHANNEL_SPACING.frequency().asHz()).asHz();
+
+    }
+
+    private Frequency getFrequency(PortNumber port) {
+        try {
+            String uri = genUri(FREQUENCY_URI, port);
+            JsonNode response = get(uri);
+            return Frequency.ofGHz(response.get(FREQUENCY_KEY).get(VALUE).asDouble());
+        } catch (IOException e) {
+            // this is expected for client side ports as they don't contain frequency data
+            log.error("unable to get frequency for port {} on device {}:\n{}", port, deviceId, e);
+            return null;
+        }
+
+    }
+
+    private AlarmEntityId getAlarmSource(String instance) {
+        AlarmEntityId source;
+        if (instance.contains(PORT)) {
+            source = AlarmEntityId.alarmEntityId(instance.replace("-", ":"));
+        } else if (instance.contains(PTP)) {
+            source = AlarmEntityId.alarmEntityId(instance.replace(PTP + "-", PORT + ":"));
+        } else {
+            source = AlarmEntityId.alarmEntityId(OTHER + ":" + instance);
+        }
+        return source;
+    }
+
+    private long parseAlarmTime(String time) {
+        /*
+         * expecting WaveServer time to be set to UTC.
+         */
+        try {
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT);
+            LocalDateTime localDateTime = LocalDateTime.parse(time, formatter);
+            return localDateTime.atZone(ZoneId.of(UTC)).toInstant().toEpochMilli();
+        } catch (DateTimeParseException e2) {
+            log.error("unable to parse time {}, using system time", time);
+            return System.currentTimeMillis();
+        }
+    }
+
+    private Alarm newAlarmFromJsonNode(JsonNode jsonNode) {
+        try {
+            AlarmId alarmId = AlarmId.alarmId(checkNotNull(jsonNode.get(ALARM_INSTANCE_ID)).asText());
+            String time = checkNotNull(jsonNode.get(ALARM_LOCAL_DATE_TIME)).asText();
+            String instance = checkNotNull(jsonNode.get(INSTANCE).asText()).toLowerCase();
+            String description = checkNotNull(jsonNode.get(DESCRIPTION)).asText() + " - " + instance + " - " + time;
+            AlarmEntityId source = getAlarmSource(instance);
+            Alarm.SeverityLevel severity = Alarm.SeverityLevel.valueOf(checkNotNull(
+                    jsonNode.get(SEVERITY)).asText().toUpperCase());
+
+            long timeRaised = parseAlarmTime(time);
+            boolean isAcknowledged = checkNotNull(jsonNode.get(ACKNOWLEDGE)).asBoolean();
+
+            return new DefaultAlarm.Builder(alarmId, deviceId, description, severity, timeRaised)
+                    .withAcknowledged(isAcknowledged)
+                    .forSource(source)
+                    .build();
+
+        } catch (NullPointerException e) {
+            log.error("got exception while parsing alarm json node {} for device {}:\n", jsonNode, deviceId, e);
+            return null;
+        }
+
+    }
+
+    private List<Alarm> getActiveAlarms() {
+        log.debug("getting active alarms for device {}", deviceId);
+        try {
+            List<JsonNode> alarms = Lists.newArrayList(get(ACTIVE_ALARMS_URL).get(ACTIVE).elements());
+            return alarms.stream()
+                    .map(this::newAlarmFromJsonNode)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toList());
+        } catch (IOException e) {
+            log.error("unable to get active alarms for device {}:\n", deviceId, e);
+            return null;
+        }
+    }
+
+    public Collection<FlowEntry> getFlowEntries() {
+        List<Port> ports = deviceService.getPorts(deviceId);
+        //driver only handles lineSide ports
+        //TODO: handle client ports as well
+        return ports.stream()
+                .filter(p -> LINESIDE_PORT_ID.contains(p.number().name()))
+                .map(p -> fetchRule(p.number()))
+                .filter(Objects::nonNull)
+                .map(fr -> new DefaultFlowEntry(fr, FlowEntry.FlowEntryState.ADDED, 0, 0, 0))
+                .collect(Collectors.toList());
+    }
+
+    private FlowRule fetchRule(PortNumber port) {
+        Frequency frequency = getFrequency(port);
+        if (frequency == null) {
+            return null;
+        }
+        int channel = getChannelFromFrequency(frequency);
+        /*
+         * both inPort and outPort will be same as WaveServer only deal with same port ptp-indexes
+         * channel and spaceMultiplier are same.
+         * TODO: find a way to get both inPort and outPort for future when inPort may not be equal to outPort
+         */
+
+        TrafficSelector selector = DefaultTrafficSelector.builder()
+                .matchInPort(port)
+                .add(Criteria.matchOchSignalType(OchSignalType.FIXED_GRID))
+                .add(Criteria.matchLambda(OchSignal.newDwdmSlot(CHANNEL_SPACING, channel)))
+                .build();
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setOutput(port)
+                .build();
+
+        int hash = Objects.hash(deviceId, selector, treatment);
+        Pair<FlowId, Integer> lookup = crossConnectCache.get(hash);
+        if (lookup == null) {
+            return null;
+        }
+
+        return DefaultFlowRule.builder()
+                .forDevice(deviceId)
+                .makePermanent()
+                .withSelector(selector)
+                .withTreatment(treatment)
+                .withPriority(lookup.getRight())
+                .withCookie(lookup.getLeft().value())
+                .build();
+    }
+
+    public List<Alarm> getAlarms() {
+        log.debug("getting alarms for device {}", deviceId);
+        return getActiveAlarms();
+    }
+
+    private JsonNode get(String uri) throws IOException {
+        InputStream response = controller.get(deviceId, uri, MediaType.valueOf(MediaType.APPLICATION_JSON));
+        ObjectMapper om = new ObjectMapper();
+        final ObjectReader reader = om.reader();
+        // all waveserver responses contain data node, which contains the requested data
+        return reader.readTree(response).get(DATA);
+    }
+
+    private int put(String uri, String request) {
+        InputStream payload = new ByteArrayInputStream(request.getBytes(StandardCharsets.UTF_8));
+        int response = controller.put(deviceId, uri, payload, MediaType.valueOf(MediaType.APPLICATION_JSON));
+        log.debug("response: {}", response);
+        return response;
+    }
+
+    private boolean putNoReply(String uri, String request) {
+        return put(uri, request) == Response.Status.NO_CONTENT.getStatusCode();
+    }
+
+}
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveServerAlarmConsumer.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveServerAlarmConsumer.java
new file mode 100644
index 0000000..c1a6767
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveServerAlarmConsumer.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmConsumer;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.slf4j.Logger;
+
+import java.util.List;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Ciena Wave Server Alarm Consumer.
+ */
+public class CienaWaveServerAlarmConsumer extends AbstractHandlerBehaviour implements AlarmConsumer {
+    CienaRestDevice restCiena;
+
+    private final Logger log = getLogger(getClass());
+
+    @Override
+    public List<Alarm> consumeAlarms() {
+        try {
+            restCiena = new CienaRestDevice(handler());
+        } catch (NullPointerException e) {
+            log.error("unable to create CienaRestDevice:\n", e);
+            return null;
+        }
+        return restCiena.getAlarms();
+    }
+}
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveServerLambdaQuery.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveServerLambdaQuery.java
new file mode 100644
index 0000000..cb5d452
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveServerLambdaQuery.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import org.onosproject.net.ChannelSpacing;
+import org.onosproject.net.OchSignal;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.LambdaQuery;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Set;
+import java.util.stream.IntStream;
+
+/**
+ * Ciena WaveServer Lambda query.
+ * 88 50GHz flex grid channels with 6.25 slot width, starting from 0 to 87.
+ */
+public class CienaWaveServerLambdaQuery extends AbstractHandlerBehaviour implements LambdaQuery {
+
+    @Override
+    public Set<OchSignal> queryLambdas(PortNumber port) {
+        // 88 channels of 50 GHz with 6.25 GHz slothWidth
+        int slots = (int) (ChannelSpacing.CHL_50GHZ.frequency().asHz() /
+                ChannelSpacing.CHL_6P25GHZ.frequency().asHz());
+        int channels = 88;
+        // total lambdas are equal to: channels * slots
+        return IntStream.rangeClosed(0, channels * slots)
+                .mapToObj(OchSignal::newFlexGridSlot)
+                .collect(ImmutableSet.toImmutableSet());
+    }
+
+}
+
+
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveserverDeviceDescription.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveserverDeviceDescription.java
new file mode 100644
index 0000000..0cd3b2b
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveserverDeviceDescription.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.onlab.packet.ChassisId;
+import org.onosproject.drivers.utilities.XmlConfigParser;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.ChannelSpacing;
+import org.onosproject.net.CltSignalType;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.GridType;
+import org.onosproject.net.OchSignal;
+import org.onosproject.net.OduSignalType;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.device.DefaultDeviceDescription;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortDescription;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.protocol.rest.RestSBController;
+import org.slf4j.Logger;
+
+import javax.ws.rs.core.MediaType;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
+import static org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDescription;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Discovers the ports from a Ciena WaveServer Rest device.
+ */
+//TODO: Use CienaRestDevice
+public class CienaWaveserverDeviceDescription extends AbstractHandlerBehaviour
+        implements DeviceDescriptionDiscovery {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String PORT_ID = "ptp-index";
+    private static final String XML = "xml";
+    private static final String ENABLED = "enabled";
+    private static final String ADMIN_STATE = "state.admin-state";
+    private static final String PORTS = "ws-ptps.ptps";
+    private static final String PORT_IN = "properties.line-system.cmd.port-in";
+    private static final String PORT_OUT = "properties.line-system.cmd.port-out";
+
+    private static final String CHANNEL_ID =
+            "properties.transmitter.line-system-channel-number";
+
+    private static final String PORT_REQUEST =
+            "ciena-ws-ptp:ws-ptps?config=true&format=xml&depth=unbounded";
+
+    @Override
+    public DeviceDescription discoverDeviceDetails() {
+        log.debug("getting device description");
+        DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
+        DeviceId deviceId = handler().data().deviceId();
+        Device device = deviceService.getDevice(deviceId);
+
+        if (device == null) {
+            return new DefaultDeviceDescription(deviceId.uri(),
+                                                Device.Type.OTN,
+                                                "Ciena",
+                                                "WaveServer",
+                                                "Unknown",
+                                                "Unknown",
+                                                new ChassisId());
+        } else {
+            return new DefaultDeviceDescription(device.id().uri(),
+                                                Device.Type.OTN,
+                                                device.manufacturer(),
+                                                device.hwVersion(),
+                                                device.swVersion(),
+                                                device.serialNumber(),
+                                                device.chassisId());
+        }
+    }
+
+    @Override
+    public List<PortDescription> discoverPortDetails() {
+        return getPorts();
+    }
+
+    private List<PortDescription> getPorts() {
+        /*
+         * Relationship between ptp-index and port number shown in Ciena Wave Server
+         * CLI:
+         *      ptp-index = 4 * port_number (without decimal) + decimal
+         *      e.g
+         *          if port_number is 5 then ptp-index = 5 * 4 + 0 = 20
+         *          if port_number is 5.1 then ptp-index = 5 * 4 + 1 = 21
+         *
+         * Relationship between channelId and in/out port:
+         *      in_port = channelId * 2
+         *      out_port = channelId * 2 -1
+         */
+        List<PortDescription> ports = Lists.newArrayList();
+        RestSBController controller = checkNotNull(handler().get(RestSBController.class));
+        DeviceId deviceId = handler().data().deviceId();
+
+        HierarchicalConfiguration config = XmlConfigParser.
+                loadXml(controller.get(deviceId, PORT_REQUEST, MediaType.APPLICATION_XML_TYPE));
+        List<HierarchicalConfiguration> portsConfig =
+                parseWaveServerCienaPorts(config);
+        portsConfig.forEach(sub -> {
+            String portId = sub.getString(PORT_ID);
+            DefaultAnnotations.Builder annotations = DefaultAnnotations.builder();
+            if (CienaRestDevice.getLinesidePortId().contains(portId)) {
+                annotations.set(AnnotationKeys.CHANNEL_ID, sub.getString(CHANNEL_ID));
+                // TX/OUT and RX/IN ports
+                annotations.set(AnnotationKeys.PORT_OUT, sub.getString(PORT_OUT));
+                annotations.set(AnnotationKeys.PORT_IN, sub.getString(PORT_IN));
+                ports.add(parseWaveServerCienaOchPorts(
+                        Long.valueOf(portId),
+                        sub,
+                        annotations.build()));
+
+            } else if (!portId.equals("5") && !portId.equals("49")) {
+                DefaultAnnotations.builder()
+                        .set(AnnotationKeys.PORT_NAME, portId);
+                //FIXME change when all optical types have two way information methods, see jira tickets
+                ports.add(oduCltPortDescription(PortNumber.portNumber(sub.getLong(PORT_ID)),
+                                                sub.getString(ADMIN_STATE).equals(ENABLED),
+                                                CltSignalType.CLT_100GBE, annotations.build()));
+            }
+        });
+        return ImmutableList.copyOf(ports);
+    }
+
+    public static List<HierarchicalConfiguration> parseWaveServerCienaPorts(HierarchicalConfiguration cfg) {
+        return cfg.configurationsAt(PORTS);
+    }
+
+    public static PortDescription parseWaveServerCienaOchPorts(long portNumber,
+                                                               HierarchicalConfiguration config,
+                                                               SparseAnnotations annotations) {
+        final List<String> tunableType = Lists.newArrayList("performance-optimized", "accelerated");
+        final String flexGrid = "flex-grid";
+        final String state = "properties.transmitter.state";
+        final String tunable = "properties.modem.tx-tuning-mode";
+        final String spacing = "properties.line-system.wavelength-spacing";
+        final String frequency = "properties.transmitter.frequency.value";
+
+        boolean isEnabled = config.getString(state).equals(ENABLED);
+        boolean isTunable = tunableType.contains(config.getString(tunable));
+
+        GridType gridType = config.getString(spacing).equals(flexGrid) ? GridType.FLEX : null;
+        ChannelSpacing chSpacing = gridType == GridType.FLEX ? ChannelSpacing.CHL_6P25GHZ : null;
+
+        //Working in Ghz //(Nominal central frequency - 193.1)/channelSpacing = spacingMultiplier
+        final int baseFrequency = 193100;
+        long spacingFrequency = chSpacing == null ? baseFrequency : chSpacing.frequency().asHz();
+        int spacingMult = ((int) (toGbps(((int) config.getDouble(frequency) -
+                baseFrequency)) / toGbpsFromHz(spacingFrequency))); //FIXME is there a better way ?
+
+        return ochPortDescription(PortNumber.portNumber(portNumber), isEnabled, OduSignalType.ODU4, isTunable,
+                                  new OchSignal(gridType, chSpacing, spacingMult, 1), annotations);
+    }
+
+    //FIXME remove when all optical types have two way information methods, see jira tickets
+    private static long toGbps(long speed) {
+        return speed * 1000;
+    }
+
+    private static long toGbpsFromHz(long speed) {
+        return speed / 1000;
+    }
+}
+
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveserverPortAdmin.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveserverPortAdmin.java
new file mode 100644
index 0000000..d3895c1
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/CienaWaveserverPortAdmin.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import org.onlab.util.Tools;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.PortAdmin;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.slf4j.Logger;
+
+import java.util.concurrent.CompletableFuture;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+
+public class CienaWaveserverPortAdmin extends AbstractHandlerBehaviour
+        implements PortAdmin {
+    private CienaRestDevice restCiena;
+    private final Logger log = getLogger(getClass());
+
+    @Override
+    public CompletableFuture<Boolean> disable(PortNumber number) {
+        try {
+            restCiena = new CienaRestDevice(handler());
+        } catch (NullPointerException e) {
+            log.error("unable to create CienaRestDevice, {}", e);
+            return CompletableFuture.completedFuture(false);
+        }
+        return CompletableFuture.completedFuture(restCiena.disablePort(number));
+    }
+
+    @Override
+    public CompletableFuture<Boolean> enable(PortNumber number) {
+        try {
+            restCiena = new CienaRestDevice(handler());
+        } catch (NullPointerException e) {
+            log.error("unable to create CienaRestDevice, {}", e);
+            return CompletableFuture.completedFuture(false);
+        }
+        return CompletableFuture.completedFuture(restCiena.enablePort(number));
+    }
+
+    @Override
+    public CompletableFuture<Boolean> isEnabled(PortNumber number) {
+        return Tools.exceptionalFuture(
+                new UnsupportedOperationException("isEnabled is not supported"));
+
+    }
+}
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/package-info.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/package-info.java
new file mode 100644
index 0000000..220063b
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/rest/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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 for Ciena device drivers.
+ */
+package org.onosproject.drivers.ciena.waveserver.rest;
\ No newline at end of file
diff --git a/drivers/ciena/waveserver/src/main/resources/ciena-drivers.xml b/drivers/ciena/waveserver/src/main/resources/ciena-drivers.xml
new file mode 100644
index 0000000..1a779b1
--- /dev/null
+++ b/drivers/ciena/waveserver/src/main/resources/ciena-drivers.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016-present Open Networking Foundation
+  ~
+  ~ 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.
+  -->
+<drivers>
+    <!-- Waveserver supports flex grid, although this driver only enables 50 GHz fixed grid. -->
+    <driver name="ciena-waveserver-rest" manufacturer="Ciena" hwVersion="1.0.0" swVersion="1.0.0">
+        <behaviour api="org.onosproject.net.optical.OpticalDevice"
+                   impl="org.onosproject.net.optical.DefaultOpticalDevice"/>
+        <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
+                   impl="org.onosproject.drivers.ciena.waveserver.rest.CienaWaveserverDeviceDescription"/>
+        <behaviour api="org.onosproject.net.behaviour.PortAdmin"
+                   impl="org.onosproject.drivers.ciena.waveserver.rest.CienaWaveserverPortAdmin"/>
+        <behaviour api="org.onosproject.net.flow.FlowRuleProgrammable"
+                   impl="org.onosproject.drivers.ciena.waveserver.rest.CienaFlowRuleProgrammable"/>
+        <behaviour api="org.onosproject.net.behaviour.LambdaQuery"
+                   impl="org.onosproject.drivers.ciena.waveserver.rest.CienaWaveServerLambdaQuery"/>
+        <behaviour api="org.onosproject.incubator.net.faultmanagement.alarm.AlarmConsumer"
+                   impl="org.onosproject.drivers.ciena.waveserver.rest.CienaWaveServerAlarmConsumer"/>
+    </driver>
+</drivers>
+
diff --git a/drivers/ciena/waveserver/src/test/java/org/onosproject/drivers/ciena/waveserver/rest/CienaDriversLoaderTest.java b/drivers/ciena/waveserver/src/test/java/org/onosproject/drivers/ciena/waveserver/rest/CienaDriversLoaderTest.java
new file mode 100644
index 0000000..3a2786f
--- /dev/null
+++ b/drivers/ciena/waveserver/src/test/java/org/onosproject/drivers/ciena/waveserver/rest/CienaDriversLoaderTest.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.ciena.waveserver.rest;
+
+import org.junit.Before;
+import org.onosproject.net.driver.AbstractDriverLoaderTest;
+
+/**
+ * Ciena drivers loader test.
+ */
+public class CienaDriversLoaderTest extends AbstractDriverLoaderTest {
+
+    @Before
+    public void setUp() {
+        loader = new CienaDriversLoader();
+    }
+}
