diff --git a/apps/pom.xml b/apps/pom.xml
index ab56021..e75bd6f 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -73,7 +73,6 @@
         <module>influxdbmetrics</module>
         <module>gangliametrics</module>
         <module>graphitemetrics</module>
-        <module>xosclient</module>
         <module>scalablegateway</module>
         <module>bmv2-demo</module>
         <module>yms</module>
diff --git a/apps/xosclient/BUCK b/apps/xosclient/BUCK
deleted file mode 100644
index b403541..0000000
--- a/apps/xosclient/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:javax.ws.rs-api',
-    '//lib:openstack4j-core',
-    '//lib:openstack4j-http-connector',
-    '//lib:openstack4j-httpclient',
-    '//lib:jersey-client',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'XOS Client App',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'XOS client service',
-)
diff --git a/apps/xosclient/pom.xml b/apps/xosclient/pom.xml
deleted file mode 100644
index c87ebb5..0000000
--- a/apps/xosclient/pom.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  -->
-<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">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>onos-apps</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.10.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>onos-app-xos-client</artifactId>
-    <packaging>bundle</packaging>
-
-    <description>XOS client service</description>
-
-    <properties>
-        <onos.app.name>org.onosproject.xosclient</onos.app.name>
-        <onos.app.title>XOS Client App</onos.app.title>
-        <onos.app.category>Utility</onos.app.category>
-        <onos.app.url>http://onosproject.org</onos.app.url>
-        <onos.app.readme>XOS Client Application.</onos.app.readme>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onlab-misc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.core</groupId>
-            <artifactId>jersey-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.pacesys</groupId>
-            <artifactId>openstack4j-core</artifactId>
-            <version>2.11</version>
-        </dependency>
-        <dependency>
-            <groupId>org.pacesys.openstack4j.connectors</groupId>
-            <artifactId>openstack4j-http-connector</artifactId>
-            <version>2.11</version>
-        </dependency>
-        <dependency>
-            <groupId>org.pacesys.openstack4j.connectors</groupId>
-            <artifactId>openstack4j-httpclient</artifactId>
-            <version>2.11</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Import-Package>
-                            !org.apache.http.*,
-                            !com.fasterxml.jackson.dataformat.*,
-                            !javax.annotation,*
-                        </Import-Package>
-                        <Embed-Dependency>
-                            openstack4j-core,
-                            openstack4j-http-connector,
-                            openstack4j-httpclient
-                        </Embed-Dependency>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/OpenStackAccess.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/OpenStackAccess.java
deleted file mode 100644
index 259ba55..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/OpenStackAccess.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import com.google.common.base.MoreObjects;
-
-import java.util.Objects;
-
-/**
- * Object holding OpenStack API access information.
- */
-// TODO remove this when XOS provides this information
-public class OpenStackAccess {
-
-    private final String endpoint;
-    private final String tenant;
-    private final String user;
-    private final String password;
-
-    /**
-     * Default constructor.
-     *
-     * @param endpoint Keystone endpoint
-     * @param tenant tenant name
-     * @param user user name
-     * @param password password
-     */
-    public OpenStackAccess(String endpoint, String tenant, String user, String password) {
-        this.endpoint = endpoint;
-        this.tenant = tenant;
-        this.user = user;
-        this.password = password;
-    }
-
-    /**
-     * Returns OpenStack API endpoint.
-     *
-     * @return endpoint
-     */
-    public String endpoint() {
-        return this.endpoint;
-    }
-
-    /**
-     * Returns OpenStack tenant name.
-     *
-     * @return tenant name
-     */
-    public String tenant() {
-        return this.tenant;
-    }
-
-    /**
-     * Returns OpenStack user.
-     *
-     * @return user name
-     */
-    public String user() {
-        return this.user;
-    }
-
-    /**
-     * Returns OpenStack password for the user.
-     *
-     * @return password
-     */
-    public String password() {
-        return this.password;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(endpoint, tenant, user, password);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if ((obj instanceof OpenStackAccess)) {
-            OpenStackAccess that = (OpenStackAccess) obj;
-            if (Objects.equals(endpoint, that.endpoint) &&
-                    Objects.equals(tenant, that.tenant) &&
-                    Objects.equals(user, that.user) &&
-                    Objects.equals(password, that.password)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("endpoint", endpoint)
-                .add("tenant", tenant)
-                .add("user", user)
-                .add("password", password)
-                .toString();
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPort.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPort.java
deleted file mode 100644
index 9dae6e9..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPort.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableMap;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-
-import java.util.Map;
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Representation of port in a CORD VTN controlled network, it can be for VM
- * or container.
- */
-public final class VtnPort {
-
-    private final VtnPortId id;
-    private final String name;
-    private final VtnServiceId serviceId;
-    private final MacAddress mac;
-    private final IpAddress ip;
-    // TODO remove this when XOS provides vSG information
-    private final Map<IpAddress, MacAddress> addressPairs;
-
-   private VtnPort(VtnPortId id,
-                   String name,
-                   VtnServiceId serviceId,
-                   MacAddress mac,
-                   IpAddress ip,
-                   Map<IpAddress, MacAddress> addressPairs) {
-        this.id = id;
-        this.name = name;
-        this.serviceId = serviceId;
-        this.mac = mac;
-        this.ip = ip;
-        this.addressPairs = addressPairs;
-    }
-
-    /**
-     * Returns vtn port ID.
-     *
-     * @return vtn port id
-     */
-    public VtnPortId id() {
-        return id;
-    }
-
-    /**
-     * Returns vtn port name.
-     *
-     * @return vtn port name
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Returns the ID of the service this port is in.
-     *
-     * @return vtn service id
-     */
-    public VtnServiceId serviceId() {
-        return serviceId;
-    }
-
-    /**
-     * Returns MAC address of this port.
-     *
-     * @return mac address
-     */
-    public MacAddress mac() {
-        return mac;
-    }
-
-    /**
-     * Returns IP address of this port.
-     *
-     * @return ip address
-     */
-    public IpAddress ip() {
-        return ip;
-    }
-
-    /**
-     * Returns address pairs of the nested containers inside.
-     *
-     * @return map of ip and address
-     */
-    public Map<IpAddress, MacAddress> addressPairs() {
-        return addressPairs;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof VtnPort)) {
-            return false;
-        }
-        final VtnPort other = (VtnPort) obj;
-        return Objects.equals(this.id, other.id);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("id", id)
-                .add("name", name)
-                .add("serviceId", serviceId)
-                .add("mac", mac)
-                .add("ip", ip)
-                .add("addressPairs", addressPairs)
-                .toString();
-    }
-
-    /**
-     * Returns a new vtn port builder instance.
-     *
-     * @return new vtn port builder
-     */
-    public static final Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Builder of VTN port entities.
-     */
-    public static final class Builder {
-
-        private VtnPortId id;
-        private String name;
-        private VtnServiceId serviceId;
-        private MacAddress mac;
-        private IpAddress ip;
-        // TODO remove this when XOS provides vSG information
-        private Map<IpAddress, MacAddress> addressPairs;
-
-        private Builder() {
-        }
-
-        /**
-         * Builds an immutable VTN port.
-         *
-         * @return vtn port instance
-         */
-        public VtnPort build() {
-            checkNotNull(id, "VTN port ID cannot be null");
-            checkNotNull(serviceId, "VTN port service ID cannot be null");
-            checkNotNull(mac, "VTN port MAC address cannot be null");
-            checkNotNull(ip, "VTN port IP address cannot be null");
-            addressPairs = addressPairs == null ? ImmutableMap.of() : addressPairs;
-
-            return new VtnPort(id,
-                               name,
-                               serviceId,
-                               mac,
-                               ip,
-                               addressPairs);
-        }
-
-        /**
-         * Returns VTN port builder with the supplied port ID.
-         *
-         * @param id port identifier
-         * @return vtn port builder
-         */
-        public Builder id(VtnPortId id) {
-            this.id = id;
-            return this;
-        }
-
-        /**
-         * Returns VTN port builder with the supplied port name.
-         * Port name can be null.
-         *
-         * @param name port name
-         * @return vtn port builder
-         */
-        public Builder name(String name) {
-            this.name = name;
-            return this;
-        }
-
-        /**
-         * Returns VTN port builder with the supplied service ID.
-         *
-         * @param serviceId vtn port service id
-         * @return vtn port builder
-         */
-        public Builder serviceId(VtnServiceId serviceId) {
-            this.serviceId = serviceId;
-            return this;
-        }
-
-        /**
-         * Returns VTN port builder with the supplied MAC address.
-         *
-         * @param mac mac address
-         * @return vtn port builder
-         */
-        public Builder mac(MacAddress mac) {
-            if (mac == null) {
-                final String msg = "VTN port MAC address cannot be null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.mac = mac;
-            return this;
-        }
-
-        /**
-         * Returns VTN port builder with the supplied MAC address.
-         *
-         * @param mac mac address as a string
-         * @return vtn port builder
-         */
-        public Builder mac(String mac) {
-            try {
-                return mac(MacAddress.valueOf(mac));
-            } catch (IllegalArgumentException | NullPointerException e) {
-                final String msg = "Malformed MAC address string " + mac +
-                        " for VTN port MAC address";
-                throw new IllegalArgumentException(msg);
-            }
-        }
-
-        /**
-         * Returns VTN port builder with the supplied IP address.
-         *
-         * @param ip ip address
-         * @return vtn port builder
-         */
-        public Builder ip(IpAddress ip) {
-            if (ip == null) {
-                final String msg = "VTN port IP address cannot be null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.ip = ip;
-            return this;
-        }
-
-        /**
-         * Returns VTN port builder with the supplied IP address.
-         *
-         * @param ip ip address as a string
-         * @return vtn port builder
-         */
-        public Builder ip(String ip) {
-            try {
-                return ip(IpAddress.valueOf(ip));
-            } catch (IllegalArgumentException | NullPointerException e) {
-                final String msg = "Malformed IP address string " + ip +
-                        " for VTN port IP address";
-                throw new IllegalArgumentException(msg);
-            }
-        }
-
-        /**
-         * Returns VTN port builder with the supplied address pairs.
-         *
-         * @param addressPairs address pairs
-         * @return vtn port builder
-         */
-        public Builder addressPairs(Map<IpAddress, MacAddress> addressPairs) {
-            if (addressPairs == null) {
-                final String msg = "VTN address pairs cannot be null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.addressPairs = addressPairs;
-            return this;
-        }
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortApi.java
deleted file mode 100644
index 56835f4..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortApi.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import java.util.Set;
-
-/**
- * Service for interacting with XOS VTN ports.
- */
-public interface VtnPortApi {
-
-    /**
-     * Returns all ports.
-     *
-     * @return set of ports
-     */
-    Set<VtnPort> vtnPorts();
-
-    /**
-     * Returns all ports with a given service.
-     *
-     * @param serviceId service id
-     * @return set of ports
-     */
-    Set<VtnPort> vtnPorts(VtnServiceId serviceId);
-
-    /**
-     * Returns port information with port id.
-     *
-     * @param portId port id
-     * @return vtn port; null if it fails to get port information
-     */
-    VtnPort vtnPort(VtnPortId portId);
-
-    /**
-     * Returns port information from OpenStack with port id.
-     *
-     * @param portId port id
-     * @param osAccess OpenStack address for OS access
-     * @return vtn port; null if it fails to get port information
-     */
-    // TODO remove this when XOS provides port information
-    VtnPort vtnPort(VtnPortId portId, OpenStackAccess osAccess);
-
-    /**
-     * Returns port information from OpenStack with port name.
-     *
-     * @param portName port name
-     * @param osAccess OpenStack address for OS access
-     * @return vtn port; null if it fails to get port information
-     */
-    // TODO remove this when XOS provides port information
-    VtnPort vtnPort(String portName, OpenStackAccess osAccess);
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortId.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortId.java
deleted file mode 100644
index eaf7ac1..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortId.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import com.google.common.base.Strings;
-import org.onlab.util.Identifier;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Representation of VTN port ID.
- */
-public final class VtnPortId extends Identifier<String> {
-
-    private VtnPortId(String id) {
-        super(id);
-    }
-
-    /**
-     * Returns vtn port identifier with value.
-     *
-     * @param id id
-     * @return instance port id
-     */
-    public static VtnPortId of(String id) {
-        checkArgument(!Strings.isNullOrEmpty(id), "VTN port ID cannot be null");
-        return new VtnPortId(id);
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnService.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnService.java
deleted file mode 100644
index 3e7b100..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnService.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.xosclient.api.VtnServiceApi.NetworkType;
-import org.onosproject.xosclient.api.VtnServiceApi.ServiceType;
-
-import java.util.Objects;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Representation of CORD VTN controlled network service.
- */
-public final class VtnService {
-
-    private final VtnServiceId id;
-    private final String name;
-    private final ServiceType serviceType;
-    private final NetworkType networkType;
-    private final long vni;
-    private final IpPrefix subnet;
-    private final IpAddress serviceIp;
-    private final Set<VtnServiceId> providerServices;
-    private final Set<VtnServiceId> tenantServices;
-
-    private VtnService(VtnServiceId id,
-                       String name,
-                       ServiceType serviceType,
-                       NetworkType networkType,
-                       long vni,
-                       IpPrefix subnet,
-                       IpAddress serviceIp,
-                       Set<VtnServiceId> providerServices,
-                       Set<VtnServiceId> tenantServices) {
-        this.id = id;
-        this.name = name;
-        this.serviceType = serviceType;
-        this.networkType = networkType;
-        this.vni = vni;
-        this.subnet = subnet;
-        this.serviceIp = serviceIp;
-        this.providerServices = providerServices;
-        this.tenantServices = tenantServices;
-    }
-
-    /**
-     * Returns service ID.
-     *
-     * @return service id
-     */
-    public VtnServiceId id() {
-        return id;
-    }
-
-    /**
-     * Returns service name.
-     *
-     * @return name
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Returns service type.
-     *
-     * @return service type
-     */
-    public ServiceType serviceType() {
-        return serviceType;
-    }
-
-    /**
-     * Returns segmentation ID of this service.
-     *
-     * @return segmentation id
-     */
-    public long vni() {
-        return vni;
-    }
-
-    /**
-     * Returns network type.
-     *
-     * @return network type
-     */
-    public NetworkType networkType() {
-        return networkType;
-    }
-
-    /**
-     * Returns service IP range.
-     *
-     * @return subnet cidr
-     */
-    public IpPrefix subnet() {
-        return subnet;
-    }
-
-    /**
-     * Returns service IP address.
-     *
-     * @return ip address
-     */
-    public IpAddress serviceIp() {
-        return serviceIp;
-    }
-
-    /**
-     * Returns provider service IDs.
-     *
-     * @return list of provider service id
-     */
-    public Set<VtnServiceId> providerServices() {
-        return providerServices;
-    }
-
-    /**
-     * Returns tenant service IDs.
-     *
-     * @return list of tenant service id
-     */
-    public Set<VtnServiceId> tenantServices() {
-        return tenantServices;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof VtnService)) {
-            return false;
-        }
-        final VtnService other = (VtnService) obj;
-        return Objects.equals(this.id, other.id);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("id", id)
-                .add("name", name)
-                .add("serviceType", serviceType)
-                .add("networkType", networkType)
-                .add("vni", vni)
-                .add("subnet", subnet)
-                .add("serviceIp", serviceIp)
-                .add("providerServices", providerServices)
-                .add("tenantServices", tenantServices)
-                .toString();
-    }
-
-    /**
-     * Returns a new builder instance.
-     *
-     * @return new builder
-     */
-    public static final Builder build() {
-        return new Builder();
-    }
-
-    /**
-     * Builder of VTN service entities.
-     */
-    public static final class Builder {
-
-        private VtnServiceId id;
-        private String name;
-        private ServiceType serviceType;
-        private NetworkType networkType;
-        private long vni = -1;
-        private IpPrefix subnet;
-        private IpAddress serviceIp;
-        private Set<VtnServiceId> providerServices;
-        private Set<VtnServiceId> tenantServices;
-
-        private Builder() {
-        }
-
-        /**
-         * Builds an immutable VTN service.
-         *
-         * @return vtn service instance
-         */
-        public VtnService build() {
-            checkNotNull(id, "VTN service ID cannot be null");
-            checkArgument(!Strings.isNullOrEmpty(name), "VTN service name cannot be null");
-            checkNotNull(serviceType, "VTN service type cannot be null");
-            checkNotNull(networkType, "VTN network type cannot be null");
-            checkArgument(vni > 0, "VTN network VNI is not set");
-            checkNotNull(subnet, "VTN subnet cannot be null");
-            checkNotNull(serviceIp, "VTN service IP cannot be null");
-
-            providerServices = providerServices == null ? ImmutableSet.of() : providerServices;
-            tenantServices = tenantServices == null ? ImmutableSet.of() : tenantServices;
-
-            return new VtnService(id,
-                                  name,
-                                  serviceType,
-                                  networkType,
-                                  vni,
-                                  subnet,
-                                  serviceIp,
-                                  providerServices,
-                                  tenantServices);
-        }
-
-        /**
-         * Returns VTN service builder with the supplied service ID.
-         *
-         * @param id service identifier
-         * @return vtn service builder
-         */
-        public Builder id(VtnServiceId id) {
-            this.id = id;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied service name.
-         *
-         * @param name service name
-         * @return vtn service builder
-         */
-        public Builder name(String name) {
-            if (Strings.isNullOrEmpty(name)) {
-                final String msg = "VTN service name cannot be null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.name = name;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied service type.
-         *
-         * @param serviceType service type
-         * @return vtn service builder
-         */
-        public Builder serviceType(ServiceType serviceType) {
-            this.serviceType = serviceType;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied network type.
-         *
-         * @param networkType network type
-         * @return vtn service builder
-         */
-        public Builder networkType(NetworkType networkType) {
-            this.networkType = networkType;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied VNI.
-         *
-         * @param vni vni of the service network
-         * @return vtn service builder
-         */
-        public Builder vni(long vni) {
-            if (vni < 0 || vni > 16777215) {
-                final String msg = "VNI " + vni + " is out of range";
-                throw new IllegalArgumentException(msg);
-            }
-            this.vni = vni;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied VNI.
-         *
-         * @param vni vni of the service network as a string
-         * @return vtn service builder
-         */
-        public Builder vni(String vni) {
-            try {
-                return vni(Long.parseLong(vni));
-            } catch (NumberFormatException | NullPointerException e) {
-                final String msg = "Malformed number string " + vni +
-                        " for VTN network VNI";
-                throw new IllegalArgumentException(msg);
-            }
-        }
-
-        /**
-         * Returns VTN service builder with the supplied subnet.
-         *
-         * @param subnet subnet of the service network
-         * @return vtn service builder
-         */
-        public Builder subnet(IpPrefix subnet) {
-            if (subnet == null) {
-                final String msg = "VTN service subnet is null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.subnet = subnet;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied subnet.
-         *
-         * @param subnet subnet of the service network as a string
-         * @return vtn service builder
-         */
-        public Builder subnet(String subnet) {
-            try {
-                return subnet(IpPrefix.valueOf(subnet));
-            } catch (IllegalArgumentException | NullPointerException e) {
-                final String msg = "Malformed IP prefix string " + subnet +
-                        " for VTN service subnet";
-                throw new IllegalArgumentException(msg);
-            }
-        }
-
-        /**
-         * Returns VTN service builder with the supplied service IP address.
-         *
-         * @param serviceIp service ip address
-         * @return vtn service builder
-         */
-        public Builder serviceIp(IpAddress serviceIp) {
-            if (serviceIp == null) {
-                final String msg = "VTN service IP cannot be null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.serviceIp = serviceIp;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied service IP address.
-         *
-         * @param serviceIp service ip address as a string
-         * @return vtn service builder
-         */
-        public Builder serviceIp(String serviceIp) {
-            try {
-                return serviceIp(IpAddress.valueOf(serviceIp));
-            } catch (IllegalArgumentException | NullPointerException e) {
-                final String msg = "Malformed IP address string " + serviceIp +
-                        " for VTN service IP address";
-                throw new IllegalArgumentException(msg);
-            }
-        }
-
-        /**
-         * Returns VTN service builder with the supplied provider services.
-         *
-         * @param pServices provider services
-         * @return vtn service builder
-         */
-        public Builder providerServices(Set<VtnServiceId> pServices) {
-            if (pServices == null) {
-                final String msg = "Provider services cannot be null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.providerServices = pServices;
-            return this;
-        }
-
-        /**
-         * Returns VTN service builder with the supplied tenant services.
-         *
-         * @param tServices tenant services
-         * @return vtn service builder
-         */
-        public Builder tenantServices(Set<VtnServiceId> tServices) {
-            if (tServices == null) {
-                final String msg = "Tenant services cannot be null";
-                throw new IllegalArgumentException(msg);
-            }
-            this.tenantServices = tServices;
-            return this;
-        }
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceApi.java
deleted file mode 100644
index d65f60e..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceApi.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import java.util.Set;
-
-/**
- * Service for interacting with XOS VTN service and service dependency.
- */
-public interface VtnServiceApi {
-
-    // TODO move network type to VtnNetwork later
-    enum NetworkType {
-        PRIVATE,
-        PUBLIC,
-        MANAGEMENT_HOSTS,
-        MANAGEMENT_LOCAL
-    }
-
-    enum ServiceType {
-        VSG,
-        ACCESS_AGENT,
-        MANAGEMENT,
-        DEFAULT
-    }
-
-    /**
-     * Returns all services list.
-     *
-     * @return service list
-     */
-    Set<VtnServiceId> services();
-
-    /**
-     * Returns VTN service.
-     *
-     * @param serviceId service id
-     * @return vtn service
-     */
-    VtnService service(VtnServiceId serviceId);
-
-    /**
-     * Returns dependent tenant services of a given provider service.
-     *
-     * @param pServiceId vtn service id
-     * @return set of service ids
-     */
-    Set<VtnServiceId> tenantServices(VtnServiceId pServiceId);
-
-    /**
-     * Returns dependent provider services of a given tenant service.
-     *
-     * @param tServiceId vtn service id
-     * @return set of service ids
-     */
-    Set<VtnServiceId> providerServices(VtnServiceId tServiceId);
-
-    /**
-     * Returns VTN service from OpenStack.
-     *
-     * @param serviceId service id
-     * @param osAccess openstack access
-     * @return vtn service
-     */
-    // TODO remove this when XOS provides service information
-    VtnService service(VtnServiceId serviceId, OpenStackAccess osAccess);
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceId.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceId.java
deleted file mode 100644
index 6fc4a43..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceId.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import com.google.common.base.Strings;
-import org.onlab.util.Identifier;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Representation of VTN service identifier.
- */
-public final class VtnServiceId extends Identifier<String> {
-    /**
-     * Default constructor.
-     *
-     * @param id service identifier
-     */
-    private VtnServiceId(String id) {
-        super(id);
-    }
-
-    /**
-     * Returns the VtnServiceId with value.
-     *
-     * @param id service id
-     * @return CordServiceId
-     */
-    public static VtnServiceId of(String id) {
-        checkArgument(!Strings.isNullOrEmpty(id), "VTN service ID cannot be null");
-        return new VtnServiceId(id);
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosAccess.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosAccess.java
deleted file mode 100644
index fa2728a..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosAccess.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import com.google.common.base.MoreObjects;
-
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Objects holding XOS API access information.
- */
-public class XosAccess {
-
-    private final String endpoint;
-    private final String username;
-    private final String password;
-
-    /**
-     * Default constructor.
-     *
-     * @param endpoint XOS service endpoint
-     * @param adminUser admin user name
-     * @param adminPassword admin password
-     */
-    public XosAccess(String endpoint, String adminUser, String adminPassword) {
-        this.endpoint = checkNotNull(endpoint);
-        this.username = checkNotNull(adminUser);
-        this.password = checkNotNull(adminPassword);
-    }
-
-    /**
-     * Returns XOS service endpoint.
-     *
-     * @return endpoint
-     */
-    public String endpoint() {
-        return this.endpoint;
-    }
-
-    /**
-     * Returns admin user name.
-     *
-     * @return user name
-     */
-    public String username() {
-        return this.username;
-    }
-
-    /**
-     * Returns admin password.
-     *
-     * @return password
-     */
-    public String password() {
-        return this.password;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(endpoint, username, password);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if ((obj instanceof XosAccess)) {
-            XosAccess that = (XosAccess) obj;
-            if (Objects.equals(endpoint, that.endpoint) &&
-                    Objects.equals(username, that.username) &&
-                    Objects.equals(password, that.password)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("endpoint", endpoint)
-                .add("username", username)
-                .add("password", password)
-                .toString();
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosAccessConfig.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosAccessConfig.java
deleted file mode 100644
index e55b584..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosAccessConfig.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.xosclient.api;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.config.Config;
-import org.slf4j.Logger;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * XOS API access information.
- */
-public class XosAccessConfig extends Config<ApplicationId> {
-
-    protected final Logger log = getLogger(getClass());
-
-    private static final String XOS_SERVICE_ENDPOINT = "serviceEndpoint";
-    private static final String XOS_ADMIN_USER = "adminUser";
-    private static final String XOS_ADMIN_PASSWORD = "adminPassword";
-
-    /**
-     * Returns XOS access information.
-     *
-     * @return XOS access, or null
-     */
-    public XosAccess xosAccess() {
-        try {
-            return new XosAccess(getConfig(object, XOS_SERVICE_ENDPOINT),
-                                 getConfig(object, XOS_ADMIN_USER),
-                                 getConfig(object, XOS_ADMIN_PASSWORD));
-        } catch (NullPointerException e) {
-            log.error("Failed to get XOS access");
-            return null;
-        }
-    }
-
-    /**
-     * Returns value of a given path. If the path is missing, show log and return
-     * null.
-     *
-     * @param path path
-     * @return value or null
-     */
-    private String getConfig(JsonNode jsonNode, String path) {
-        jsonNode = jsonNode.path(path);
-
-        if (jsonNode.isMissingNode()) {
-            log.error("{} is not configured", path);
-            return null;
-        } else {
-            return jsonNode.asText();
-        }
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosClientService.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosClientService.java
deleted file mode 100644
index c198a94..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/XosClientService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.xosclient.api;
-
-/**
- * Provides interactions with XOS.
- */
-public interface XosClientService {
-
-    /**
-     * Returns XOS API access information of the client.
-     *
-     * @return xos access
-     */
-    XosAccess access();
-
-    /**
-     * Returns XOS client with access.
-     *
-     * @param xosAccess xos access information
-     * @return xos client; null if access fails authentication
-     */
-    XosClientService getClient(XosAccess xosAccess);
-
-    /**
-     * Returns CORD VTN service and service dependency API.
-     *
-     * @return cord vtn service api
-     */
-    VtnServiceApi vtnService();
-
-    /**
-     * Returns CORD VTN port API.
-     *
-     * @return cord vtn port api
-     */
-    VtnPortApi vtnPort();
-
-    /*
-     * adds more XOS service APIs below.
-     */
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/package-info.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/package-info.java
deleted file mode 100644
index 9c2a847..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * XOS client application API.
- */
-package org.onosproject.xosclient.api;
\ No newline at end of file
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
deleted file mode 100644
index 1061b27..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.xosclient.impl;
-
-import com.google.common.collect.Maps;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.xosclient.api.OpenStackAccess;
-import org.onosproject.xosclient.api.VtnPort;
-import org.onosproject.xosclient.api.VtnPortApi;
-import org.onosproject.xosclient.api.VtnPortId;
-import org.onosproject.xosclient.api.VtnServiceId;
-import org.onosproject.xosclient.api.XosAccess;
-import org.openstack4j.api.OSClient;
-import org.openstack4j.api.exceptions.AuthenticationException;
-import org.openstack4j.model.network.IP;
-import org.openstack4j.model.network.Port;
-import org.openstack4j.openstack.OSFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Map;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Provides CORD VTN port APIs.
- */
-public final class DefaultVtnPortApi extends XosApi implements VtnPortApi {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    /**
-     * Default constructor.
-     *
-     * @param baseUrl base url
-     * @param access xos access
-     */
-    public DefaultVtnPortApi(String baseUrl, XosAccess access) {
-        super(baseUrl, access);
-    }
-
-    @Override
-    public Set<VtnPort> vtnPorts() {
-        // TODO implement this when XOS provides this information
-        return null;
-    }
-
-    @Override
-    public Set<VtnPort> vtnPorts(VtnServiceId serviceId) {
-        // TODO implement this when XOS provides this information
-        return null;
-    }
-
-    @Override
-    public VtnPort vtnPort(VtnPortId portId) {
-        // TODO implement this when XOS provides this information
-        return null;
-    }
-
-    @Override
-    // TODO remove this when XOS provides this information
-    public VtnPort vtnPort(String portName, OpenStackAccess osAccess) {
-        checkNotNull(osAccess);
-
-        OSClient osClient = getOpenStackClient(osAccess);
-        Port osPort = osClient.networking().port().list()
-                .stream()
-                .filter(p -> p.getId().contains(portName.substring(3)))
-                .findFirst().orElse(null);
-        if (osPort == null) {
-            log.warn("Failed to get OpenStack port for {}", portName);
-            return null;
-        }
-        return getVtnPort(osPort);
-    }
-
-    @Override
-    // TODO remove this when XOS provides this information
-    public VtnPort vtnPort(VtnPortId portId, OpenStackAccess osAccess) {
-        checkNotNull(osAccess);
-
-        OSClient osClient = getOpenStackClient(osAccess);
-        Port osPort = osClient.networking().port().get(portId.id());
-        if (osPort == null) {
-            log.warn("Failed to get OpenStack port {}", portId);
-            return null;
-        }
-        return getVtnPort(osPort);
-    }
-
-    // TODO remove this when XOS provides this information
-    private VtnPort getVtnPort(Port osPort) {
-        checkNotNull(osPort);
-
-        // assumes all vtn port has single IP address
-        IP ipAddr = osPort.getFixedIps().stream().findFirst().orElse(null);
-        if (ipAddr == null) {
-            log.warn("Failed to get IP address for {}", osPort);
-            return null;
-        }
-
-        Map<IpAddress, MacAddress> addressPairs = Maps.newHashMap();
-        osPort.getAllowedAddressPairs().forEach(
-                pair -> addressPairs.put(IpAddress.valueOf(pair.getIpAddress()),
-                        MacAddress.valueOf(pair.getMacAddress())));
-
-        return VtnPort.builder()
-                .id(VtnPortId.of(osPort.getId()))
-                .name(osPort.getName())
-                .serviceId(VtnServiceId.of(osPort.getNetworkId()))
-                .mac(osPort.getMacAddress())
-                .ip(ipAddr.getIpAddress())
-                .addressPairs(addressPairs)
-                .build();
-    }
-
-    // TODO remove this when XOS provides this information
-    private OSClient getOpenStackClient(OpenStackAccess osAccess) {
-        checkNotNull(osAccess);
-
-        // creating a client every time must be inefficient, but this method
-        // will be removed once XOS provides equivalent APIs
-        try {
-            return OSFactory.builder()
-                    .endpoint(osAccess.endpoint())
-                    .credentials(osAccess.user(), osAccess.password())
-                    .tenantName(osAccess.tenant())
-                    .authenticate();
-        } catch (AuthenticationException e) {
-            log.warn("Failed to authenticate OpenStack API with {}", osAccess);
-            return null;
-        }
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
deleted file mode 100644
index 25f5740..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * 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.xosclient.impl;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Strings;
-import com.google.common.collect.Sets;
-import org.onosproject.xosclient.api.OpenStackAccess;
-import org.onosproject.xosclient.api.VtnServiceApi;
-import org.onosproject.xosclient.api.XosAccess;
-import org.onosproject.xosclient.api.VtnService;
-import org.onosproject.xosclient.api.VtnServiceId;
-
-import org.openstack4j.api.OSClient;
-import org.openstack4j.api.exceptions.AuthenticationException;
-import org.openstack4j.model.network.Network;
-import org.openstack4j.model.network.Subnet;
-import org.openstack4j.openstack.OSFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkArgument;
-import static org.onosproject.xosclient.api.VtnServiceApi.NetworkType.*;
-import static org.onosproject.xosclient.api.VtnServiceApi.ServiceType.*;
-
-/**
- * Provides CORD VTN service and service dependency APIs.
- */
-public final class DefaultVtnServiceApi extends XosApi implements VtnServiceApi {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    /**
-     * Default constructor.
-     *
-     * @param baseUrl base url
-     * @param access xos access
-     */
-    public DefaultVtnServiceApi(String baseUrl, XosAccess access) {
-        super(baseUrl, access);
-    }
-
-    @Override
-    public Set<VtnServiceId> services() {
-        String response = restGet(EMPTY_STRING);
-        log.trace("Get services {}", response);
-
-        ObjectMapper mapper = new ObjectMapper();
-        Set<VtnServiceId> services = Sets.newHashSet();
-
-        try {
-            JsonNode nodes = mapper.readTree(response);
-            nodes.fieldNames().forEachRemaining(id -> services.add(VtnServiceId.of(id)));
-        } catch (IOException e) {
-            log.warn("Failed to get service list");
-        }
-        return services;
-    }
-
-    @Override
-    public VtnService service(VtnServiceId serviceId) {
-        // TODO implement this when XOS provides this API
-        return null;
-    }
-
-    @Override
-    public Set<VtnServiceId> providerServices(VtnServiceId tServiceId) {
-        checkNotNull(tServiceId);
-
-        String response = restGet(tServiceId.id());
-        log.trace("Get provider services {}", response);
-
-        ObjectMapper mapper = new ObjectMapper();
-        Set<VtnServiceId> pServices = Sets.newHashSet();
-
-        try {
-            JsonNode nodes = mapper.readTree(response);
-            nodes.forEach(node -> pServices.add(VtnServiceId.of(node.asText())));
-        } catch (IOException e) {
-            log.warn("Failed to get service dependency");
-        }
-        return pServices;
-    }
-
-    @Override
-    public Set<VtnServiceId> tenantServices(VtnServiceId tServiceId) {
-        checkNotNull(tServiceId);
-
-        String response = restGet(EMPTY_STRING);
-        log.trace("Get tenant services {}", response);
-
-        ObjectMapper mapper = new ObjectMapper();
-        Set<VtnServiceId> tServices = Sets.newHashSet();
-
-        try {
-            JsonNode nodes = mapper.readTree(response);
-            nodes.fields().forEachRemaining(entry -> entry.getValue().forEach(
-                    pService -> {
-                        if (pService.asText().equals(tServiceId.id())) {
-                            tServices.add(VtnServiceId.of(entry.getKey()));
-                        }
-                    }));
-        } catch (IOException e) {
-            log.warn("Failed to get service list");
-        }
-        return tServices;
-    }
-
-    @Override
-    // TODO remove this when XOS provides this information
-    public VtnService service(VtnServiceId serviceId, OpenStackAccess osAccess) {
-        checkNotNull(osAccess);
-
-        OSClient osClient = getOpenStackClient(osAccess);
-        Network osNet = osClient.networking().network().get(serviceId.id());
-        if (osNet == null) {
-            log.warn("Failed to get OpenStack network {}", serviceId);
-            return null;
-        }
-
-        // assumes all cord service networks has single subnet
-        Subnet osSubnet = osNet.getNeutronSubnets().stream()
-                .findFirst().orElse(null);
-        if (osSubnet == null) {
-            log.warn("Failed to get OpenStack subnet of network {}", serviceId);
-            return null;
-        }
-
-        return VtnService.build()
-                .id(serviceId)
-                .name(osNet.getName())
-                .serviceType(serviceType(osNet.getName()))
-                .networkType(networkType(osNet.getName()))
-                .vni(osNet.getProviderSegID())
-                .subnet(osSubnet.getCidr())
-                .serviceIp(osSubnet.getGateway())
-                .providerServices(providerServices(serviceId))
-                .tenantServices(tenantServices(serviceId))
-                .build();
-    }
-
-    // TODO remove this when XOS provides this information
-    private OSClient getOpenStackClient(OpenStackAccess osAccess) {
-        checkNotNull(osAccess);
-
-        // creating a client every time must be inefficient, but this method
-        // will be removed once XOS provides equivalent APIs
-        try {
-            return OSFactory.builder()
-                    .endpoint(osAccess.endpoint())
-                    .credentials(osAccess.user(), osAccess.password())
-                    .tenantName(osAccess.tenant())
-                    .authenticate();
-        } catch (AuthenticationException e) {
-            log.warn("Failed to authenticate OpenStack API with {}", osAccess);
-            return null;
-        }
-    }
-
-    // TODO remove this when XOS provides this information
-    private NetworkType networkType(String netName) {
-        checkArgument(!Strings.isNullOrEmpty(netName), "VTN network name cannot be null");
-
-        String name = netName.toUpperCase();
-        if (name.contains(PUBLIC.name())) {
-            return PUBLIC;
-        } else if (name.contains(MANAGEMENT_HOSTS.name())) {
-            return MANAGEMENT_HOSTS;
-        } else if (name.contains("MANAGEMENT")) {
-            return MANAGEMENT_LOCAL;
-        } else {
-            return PRIVATE;
-        }
-    }
-
-    // TODO remove this when XOS provides this information
-    private ServiceType serviceType(String netName) {
-        checkArgument(!Strings.isNullOrEmpty(netName), "VTN network name cannot be null");
-
-        String name = netName.toUpperCase();
-        if (name.contains(VSG.name())) {
-            return VSG;
-        } else if (name.contains(ACCESS_AGENT.name())) {
-            return ACCESS_AGENT;
-        } else if (name.contains(ServiceType.MANAGEMENT.name())) {
-            return ServiceType.MANAGEMENT;
-        } else {
-            return DEFAULT;
-        }
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosApi.java
deleted file mode 100644
index 47738e7..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosApi.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.xosclient.impl;
-
-import org.glassfish.jersey.client.ClientProperties;
-import org.onosproject.xosclient.api.XosAccess;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Response;
-
-import static com.google.common.net.MediaType.JSON_UTF_8;
-import static java.net.HttpURLConnection.HTTP_OK;
-
-/**
- * XOS common REST API implementation.
- */
-public class XosApi {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    protected static final String EMPTY_STRING = "";
-    protected static final String EMPTY_JSON_STRING = "{}";
-
-    protected final String baseUrl;
-    protected final XosAccess access;
-    protected final Client client;
-
-    private static final int DEFAULT_TIMEOUT_MS = 2000;
-
-    /**
-     * Default constructor.
-     *
-     * @param baseUrl base url of this api
-     * @param xosAccess xos access
-     */
-    public XosApi(String baseUrl, XosAccess xosAccess) {
-        this.baseUrl = baseUrl;
-        this.access = xosAccess;
-        this.client = ClientBuilder.newClient();
-
-        client.property(ClientProperties.CONNECT_TIMEOUT, DEFAULT_TIMEOUT_MS);
-        client.property(ClientProperties.READ_TIMEOUT, DEFAULT_TIMEOUT_MS);
-    }
-
-    /**
-     * Returns the access of this api.
-     *
-     * @return xos access
-     */
-    public XosAccess access() {
-        return this.access;
-    }
-
-    /**
-     * Returns the base url of this api.
-     *
-     * @return base url
-     */
-    public String baseUrl() {
-        return this.baseUrl;
-    }
-
-    /**
-     * Returns response of the REST get operation with a given additional path.
-     *
-     * @param path path or null
-     * @return response json string
-     */
-    public String restGet(String path) {
-        WebTarget wt = client.target(access.endpoint() + baseUrl).path(path);
-        Invocation.Builder builder = wt.request(JSON_UTF_8.toString());
-        try {
-            Response response = builder.get();
-            if (response.getStatus() != HTTP_OK) {
-                log.warn("Failed to get resource {}", access.endpoint() + baseUrl + path);
-                return EMPTY_JSON_STRING;
-            }
-        } catch (javax.ws.rs.ProcessingException e) {
-            return EMPTY_JSON_STRING;
-        }
-        return builder.get(String.class);
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosClient.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosClient.java
deleted file mode 100644
index 61643af..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosClient.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * 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.xosclient.impl;
-
-import com.google.common.base.Strings;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Modified;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.util.Tools;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.config.ConfigFactory;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigRegistry;
-import org.onosproject.net.config.basics.SubjectFactories;
-import org.onosproject.xosclient.api.VtnPortApi;
-import org.onosproject.xosclient.api.VtnServiceApi;
-import org.onosproject.xosclient.api.XosAccess;
-import org.onosproject.xosclient.api.XosAccessConfig;
-import org.onosproject.xosclient.api.XosClientService;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-
-import java.util.Dictionary;
-import java.util.Objects;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Provides interactions with XOS.
- */
-@Component(immediate = true)
-@Service
-public class XosClient implements XosClientService {
-
-    protected final Logger log = getLogger(getClass());
-
-    private static final String VTN_SERVICE_URL = "vtnServiceBaseUrl";
-    private static final String DEFAULT_VTN_SERVICE_URL = "/api/service/vtn/services/";
-
-    private static final String VTN_PORT_URL = "vtnPortBaseUrl";
-    private static final String DEFAULT_VTN_PORT_URL = "/api/service/vtn/ports/";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ComponentConfigService componentConfigService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected NetworkConfigRegistry configRegistry;
-
-    @Property(name = VTN_SERVICE_URL, value = DEFAULT_VTN_SERVICE_URL,
-            label = "XOS VTN service API base url")
-    private String vtnServiceUrl = DEFAULT_VTN_SERVICE_URL;
-
-    @Property(name = VTN_PORT_URL, value = DEFAULT_VTN_PORT_URL,
-            label = "XOS VTN port API base url")
-    private String vtnPortUrl = DEFAULT_VTN_PORT_URL;
-
-    private final ConfigFactory configFactory =
-            new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, XosAccessConfig.class, "xosclient") {
-                @Override
-                public XosAccessConfig createConfig() {
-                    return new XosAccessConfig();
-                }
-            };
-
-    private final NetworkConfigListener configListener = new InternalConfigListener();
-
-    private ApplicationId appId;
-    private XosAccess access = null;
-
-    private VtnServiceApi vtnServiceApi = null;
-    private VtnPortApi vtnPortApi = null;
-
-    /*
-     * adds more XOS service APIs below.
-     */
-
-    @Activate
-    protected void activate(ComponentContext context) {
-        appId = coreService.registerApplication("org.onosproject.xosclient");
-
-        componentConfigService.registerProperties(getClass());
-        modified(context);
-
-        configRegistry.registerConfigFactory(configFactory);
-        configRegistry.addListener(configListener);
-
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        configRegistry.unregisterConfigFactory(configFactory);
-        configRegistry.removeListener(configListener);
-
-        log.info("Stopped");
-    }
-
-    @Modified
-    protected void modified(ComponentContext context) {
-        Dictionary<?, ?> properties = context.getProperties();
-        String updatedUrl;
-
-        updatedUrl = Tools.get(properties, VTN_SERVICE_URL);
-        if (!Strings.isNullOrEmpty(updatedUrl) && !updatedUrl.equals(vtnServiceUrl)) {
-            vtnServiceUrl = updatedUrl;
-            vtnServiceApi = new DefaultVtnServiceApi(vtnServiceUrl, access);
-        }
-
-       updatedUrl = Tools.get(properties, VTN_PORT_URL);
-        if (!Strings.isNullOrEmpty(updatedUrl) && !updatedUrl.equals(vtnPortUrl)) {
-            vtnPortUrl = updatedUrl;
-            vtnPortApi = new DefaultVtnPortApi(vtnPortUrl, access);
-        }
-
-        log.info("Modified");
-    }
-
-    @Override
-    public XosAccess access() {
-        return access;
-    }
-
-    @Override
-    public synchronized XosClient getClient(XosAccess access) {
-        checkNotNull(access);
-
-        if (!Objects.equals(this.access, access)) {
-            // TODO do authentication before return
-            this.access = access;
-
-            vtnServiceApi = new DefaultVtnServiceApi(vtnServiceUrl, access);
-            vtnPortApi = new DefaultVtnPortApi(vtnPortUrl, access);
-        }
-        return this;
-    }
-
-    @Override
-    public VtnServiceApi vtnService() {
-        checkNotNull(vtnServiceApi, "VtnServiceApi is null");
-        return vtnServiceApi;
-    }
-
-    @Override
-    public VtnPortApi vtnPort() {
-        checkNotNull(vtnPortApi, "VtnPortApi is null");
-        return vtnPortApi;
-    }
-
-    /*
-     * adds more XOS service APIs below.
-     */
-
-    private void readConfiguration() {
-        XosAccessConfig config = configRegistry.getConfig(appId, XosAccessConfig.class);
-        if (config == null) {
-            log.debug("No configuration found");
-            return;
-        }
-        getClient(config.xosAccess());
-    }
-
-    private class InternalConfigListener implements NetworkConfigListener {
-
-        @Override
-        public void event(NetworkConfigEvent event) {
-            if (!event.configClass().equals(XosAccessConfig.class)) {
-                return;
-            }
-
-            switch (event.type()) {
-                case CONFIG_ADDED:
-                case CONFIG_UPDATED:
-                    log.info("Network configuration changed");
-                    readConfiguration();
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/package-info.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/package-info.java
deleted file mode 100644
index 3939420..0000000
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * XOS client application.
- */
-package org.onosproject.xosclient.impl;
\ No newline at end of file
diff --git a/modules.defs b/modules.defs
index 452f04a..f534cab 100644
--- a/modules.defs
+++ b/modules.defs
@@ -173,7 +173,6 @@
     '//apps/faultmanagement:onos-apps-faultmanagement-oar',
     '//apps/openstacknode:onos-apps-openstacknode-oar',
     '//apps/cpman/app:onos-apps-cpman-app-oar',
-    '//apps/xosclient:onos-apps-xosclient-oar',
     '//apps/scalablegateway:onos-apps-scalablegateway-oar',
     '//apps/castor:onos-apps-castor-oar',
     '//apps/yms:onos-apps-yms-oar',
