diff --git a/apps/openstacknode/app/BUCK b/apps/openstacknode/app/BUCK
index a80ba98..d670b42 100644
--- a/apps/openstacknode/app/BUCK
+++ b/apps/openstacknode/app/BUCK
@@ -25,6 +25,7 @@
 TEST_DEPS = [
     '//lib:TEST_ADAPTERS',
     '//core/api:onos-api-tests',
+    '//apps/openstacknode/api:onos-apps-openstacknode-api-tests',
     '//core/common:onos-core-common-tests',
     '//web/api:onos-rest-tests',
     '//lib:TEST_REST',
diff --git a/apps/openstacknode/app/pom.xml b/apps/openstacknode/app/pom.xml
index 401824f..4aacfc8 100644
--- a/apps/openstacknode/app/pom.xml
+++ b/apps/openstacknode/app/pom.xml
@@ -108,6 +108,14 @@
 
         <dependency>
             <groupId>org.onosproject</groupId>
+            <artifactId>onos-apps-openstacknode-api</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
             <artifactId>onos-api</artifactId>
             <classifier>tests</classifier>
             <scope>test</scope>
@@ -219,7 +227,6 @@
             <artifactId>jersey-hk2</artifactId>
             <scope>test</scope>
         </dependency>
-
     </dependencies>
 
     <build>
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
index 31f32bf..4f89c3c 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
@@ -26,7 +26,7 @@
 import org.onosproject.openstacknode.api.OpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackPhyInterface;
-import org.onosproject.openstacknode.impl.DefaultOpenstackNode;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.slf4j.Logger;
 
 import java.util.ArrayList;
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
deleted file mode 100644
index e6592b0..0000000
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * 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.openstacknode.impl;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import org.onlab.osgi.DefaultServiceDirectory;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.core.GroupId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.group.DefaultGroupKey;
-import org.onosproject.net.group.GroupKey;
-import org.onosproject.openstacknode.api.NodeState;
-import org.onosproject.openstacknode.api.OpenstackAuth;
-import org.onosproject.openstacknode.api.OpenstackNode;
-import org.onosproject.openstacknode.api.OpenstackPhyInterface;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Objects;
-import java.util.Optional;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static org.onosproject.net.AnnotationKeys.PORT_MAC;
-import static org.onosproject.net.AnnotationKeys.PORT_NAME;
-import static org.onosproject.openstacknode.api.Constants.DEFAULT_TUNNEL;
-import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
-
-/**
- * Representation of a openstack node.
- */
-public class DefaultOpenstackNode implements OpenstackNode {
-
-    private final String hostname;
-    private final NodeType type;
-    private final DeviceId intgBridge;
-    private final IpAddress managementIp;
-    private final IpAddress dataIp;
-    private final String vlanIntf;
-    private final String uplinkPort;
-    private final NodeState state;
-    private final Collection<OpenstackPhyInterface> phyIntfs;
-    private final OpenstackAuth auth;
-    private final String endPoint;
-
-    private static final String NOT_NULL_MSG = "Node % cannot be null";
-
-    private static final String OVSDB = "ovsdb:";
-
-    /**
-     * A default constructor of Openstack Node.
-     *
-     * @param hostname      hostname
-     * @param type          node type
-     * @param intgBridge    integration bridge
-     * @param managementIp  management IP address
-     * @param dataIp        data IP address
-     * @param vlanIntf      VLAN interface
-     * @param uplinkPort    uplink port name
-     * @param state         node state
-     * @param phyIntfs      physical interfaces
-     * @param auth          keystone authentication info
-     * @param endPoint      openstack endpoint URL
-     */
-    protected DefaultOpenstackNode(String hostname, NodeType type,
-                                   DeviceId intgBridge,
-                                   IpAddress managementIp,
-                                   IpAddress dataIp,
-                                   String vlanIntf,
-                                   String uplinkPort,
-                                   NodeState state,
-                                   Collection<OpenstackPhyInterface> phyIntfs,
-                                   OpenstackAuth auth,
-                                   String endPoint) {
-        this.hostname = hostname;
-        this.type = type;
-        this.intgBridge = intgBridge;
-        this.managementIp = managementIp;
-        this.dataIp = dataIp;
-        this.vlanIntf = vlanIntf;
-        this.uplinkPort = uplinkPort;
-        this.state = state;
-        this.phyIntfs = phyIntfs;
-        this.auth = auth;
-        this.endPoint = endPoint;
-    }
-
-    @Override
-    public String hostname() {
-        return hostname;
-    }
-
-    @Override
-    public NodeType type() {
-        return type;
-    }
-
-    @Override
-    public DeviceId ovsdb() {
-        return DeviceId.deviceId(OVSDB + managementIp().toString());
-    }
-
-    @Override
-    public DeviceId intgBridge() {
-        return intgBridge;
-    }
-
-    @Override
-    public IpAddress managementIp() {
-        return managementIp;
-    }
-
-    @Override
-    public IpAddress dataIp() {
-        return dataIp;
-    }
-
-    @Override
-    public String vlanIntf() {
-        return vlanIntf;
-    }
-
-    @Override
-    public String uplinkPort() {
-        return uplinkPort;
-    }
-
-    @Override
-    public NodeState state() {
-        return state;
-    }
-
-    @Override
-    public GroupKey gatewayGroupKey(NetworkMode mode) {
-        return new DefaultGroupKey(intgBridge.toString().concat(mode.name()).getBytes());
-    }
-
-    @Override
-    public PortNumber uplinkPortNum() {
-        if (uplinkPort == null) {
-            return null;
-        }
-
-        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
-        Port port = deviceService.getPorts(intgBridge).stream()
-                .filter(p -> p.isEnabled() &&
-                        Objects.equals(p.annotations().value(PORT_NAME), uplinkPort))
-                .findAny().orElse(null);
-
-        return port != null ? port.number() : null;
-
-    }
-    @Override
-    public PortNumber tunnelPortNum() {
-        if (dataIp == null) {
-            return null;
-        }
-        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
-        Port port = deviceService.getPorts(intgBridge).stream()
-                .filter(p -> p.isEnabled() &&
-                        Objects.equals(p.annotations().value(PORT_NAME), DEFAULT_TUNNEL))
-                .findAny().orElse(null);
-        return port != null ? port.number() : null;
-    }
-
-    @Override
-    public PortNumber vlanPortNum() {
-        if (vlanIntf == null) {
-            return null;
-        }
-        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
-        Port port = deviceService.getPorts(intgBridge).stream()
-                .filter(p -> p.isEnabled() &&
-                        Objects.equals(p.annotations().value(PORT_NAME), vlanIntf))
-                .findAny().orElse(null);
-        return port != null ? port.number() : null;
-    }
-
-    @Override
-    public PortNumber patchPortNum() {
-        if (type == NodeType.COMPUTE) {
-            return null;
-        }
-        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
-        Port port = deviceService.getPorts(intgBridge).stream()
-                .filter(p -> p.isEnabled() &&
-                        Objects.equals(p.annotations().value(PORT_NAME), PATCH_INTG_BRIDGE))
-                .findAny().orElse(null);
-        return port != null ? port.number() : null;
-    }
-
-    @Override
-    public MacAddress vlanPortMac() {
-        if (vlanIntf == null) {
-            return null;
-        }
-        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
-        Port port = deviceService.getPorts(intgBridge).stream()
-                .filter(p -> p.annotations().value(PORT_NAME).equals(vlanIntf))
-                .findAny().orElse(null);
-        return port != null ? MacAddress.valueOf(port.annotations().value(PORT_MAC)) : null;
-    }
-
-    @Override
-    public GroupId gatewayGroupId(NetworkMode mode) {
-        return new GroupId(intgBridge.toString().concat(mode.name()).hashCode());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj instanceof DefaultOpenstackNode) {
-            DefaultOpenstackNode that = (DefaultOpenstackNode) obj;
-            return Objects.equals(hostname, that.hostname) &&
-                    Objects.equals(type, that.type) &&
-                    Objects.equals(intgBridge, that.intgBridge) &&
-                    Objects.equals(managementIp, that.managementIp) &&
-                    Objects.equals(dataIp, that.dataIp) &&
-                    Objects.equals(uplinkPort, that.uplinkPort) &&
-                    Objects.equals(vlanIntf, that.vlanIntf) &&
-                    Objects.equals(phyIntfs, that.phyIntfs) &&
-                    Objects.equals(auth, that.auth) &&
-                    Objects.equals(endPoint, that.endPoint);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(hostname,
-                type,
-                intgBridge,
-                managementIp,
-                dataIp,
-                vlanIntf,
-                uplinkPort,
-                phyIntfs,
-                auth,
-                endPoint);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("hostname", hostname)
-                .add("type", type)
-                .add("integrationBridge", intgBridge)
-                .add("managementIp", managementIp)
-                .add("dataIp", dataIp)
-                .add("vlanIntf", vlanIntf)
-                .add("uplinkPort", uplinkPort)
-                .add("state", state)
-                .add("phyIntfs", phyIntfs)
-                .add("auth", auth)
-                .add("endpoint", endPoint)
-                .toString();
-    }
-
-    @Override
-    public OpenstackNode updateState(NodeState newState) {
-        return new Builder()
-                .type(type)
-                .hostname(hostname)
-                .intgBridge(intgBridge)
-                .managementIp(managementIp)
-                .dataIp(dataIp)
-                .vlanIntf(vlanIntf)
-                .uplinkPort(uplinkPort)
-                .state(newState)
-                .phyIntfs(phyIntfs)
-                .authentication(auth)
-                .endPoint(endPoint)
-                .build();
-    }
-
-    @Override
-    public Collection<OpenstackPhyInterface> phyIntfs() {
-
-        if (phyIntfs == null) {
-            return new ArrayList<>();
-        }
-
-        return phyIntfs;
-    }
-
-    @Override
-    public PortNumber phyIntfPortNum(String providerPhysnet) {
-        Optional<OpenstackPhyInterface> openstackPhyInterface =
-                phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
-
-        if (openstackPhyInterface.isPresent()) {
-            DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
-            Port port = deviceService.getPorts(intgBridge).stream()
-                    .filter(p -> p.isEnabled() &&
-                            Objects.equals(p.annotations().value(PORT_NAME), openstackPhyInterface.get().intf()))
-                    .findAny().orElse(null);
-
-            return port != null ? port.number() : null;
-        } else {
-            return null;
-        }
-
-    }
-
-    @Override
-    public OpenstackAuth authentication() {
-        return auth;
-    }
-
-    @Override
-    public String endPoint() {
-        return endPoint;
-    }
-
-    /**
-     * Returns new builder instance.
-     *
-     * @return openstack node builder
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Returns new builder instance with the given node as a default value.
-     *
-     * @param osNode openstack node
-     * @return openstack node builder
-     */
-    public static Builder from(OpenstackNode osNode) {
-        return new Builder()
-                .hostname(osNode.hostname())
-                .type(osNode.type())
-                .intgBridge(osNode.intgBridge())
-                .managementIp(osNode.managementIp())
-                .dataIp(osNode.dataIp())
-                .vlanIntf(osNode.vlanIntf())
-                .uplinkPort(osNode.uplinkPort())
-                .state(osNode.state())
-                .phyIntfs(osNode.phyIntfs())
-                .authentication(osNode.authentication())
-                .endPoint(osNode.endPoint());
-    }
-
-    /**
-     * A builder class for openstack Node.
-     */
-    public static final class Builder implements OpenstackNode.Builder {
-
-        private String hostname;
-        private NodeType type;
-        private DeviceId intgBridge;
-        private IpAddress managementIp;
-        private IpAddress dataIp;
-        private String vlanIntf;
-        private String uplinkPort;
-        private NodeState state;
-        private Collection<OpenstackPhyInterface> phyIntfs;
-        private OpenstackAuth auth;
-        private String endPoint;
-
-        // private constructor not intended to use from external
-        private Builder() {
-        }
-
-        @Override
-        public DefaultOpenstackNode build() {
-            checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
-            checkArgument(type != null, NOT_NULL_MSG, "type");
-            checkArgument(state != null, NOT_NULL_MSG, "state");
-            checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
-
-            if (type != NodeType.CONTROLLER) {
-                checkArgument(intgBridge != null, NOT_NULL_MSG, "integration bridge");
-
-                if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
-                    throw new IllegalArgumentException("Either data IP or VLAN interface is required");
-                }
-            } else {
-                checkArgument(endPoint != null, NOT_NULL_MSG, "endpoint URL");
-            }
-
-            if (type == NodeType.GATEWAY && uplinkPort == null) {
-                throw new IllegalArgumentException("Uplink port is required for gateway node");
-            }
-
-            return new DefaultOpenstackNode(hostname,
-                    type,
-                    intgBridge,
-                    managementIp,
-                    dataIp,
-                    vlanIntf,
-                    uplinkPort,
-                    state,
-                    phyIntfs,
-                    auth,
-                    endPoint);
-        }
-
-        @Override
-        public Builder hostname(String hostname) {
-            if (!Strings.isNullOrEmpty(hostname)) {
-                this.hostname = hostname;
-            }
-            return this;
-        }
-
-        @Override
-        public Builder type(NodeType type) {
-            this.type = type;
-            return this;
-        }
-
-        @Override
-        public Builder intgBridge(DeviceId intgBridge) {
-            this.intgBridge = intgBridge;
-            return this;
-        }
-
-        @Override
-        public Builder managementIp(IpAddress managementIp) {
-            this.managementIp = managementIp;
-            return this;
-        }
-
-        @Override
-        public Builder dataIp(IpAddress dataIp) {
-            this.dataIp = dataIp;
-            return this;
-        }
-
-        @Override
-        public Builder vlanIntf(String vlanIntf) {
-            this.vlanIntf = vlanIntf;
-            return this;
-        }
-
-        @Override
-        public Builder uplinkPort(String uplinkPort) {
-            this.uplinkPort = uplinkPort;
-            return this;
-        }
-
-        @Override
-        public Builder state(NodeState state) {
-            this.state = state;
-            return this;
-        }
-
-        @Override
-        public Builder phyIntfs(Collection<OpenstackPhyInterface> phyIntfs) {
-            this.phyIntfs = phyIntfs;
-            return this;
-        }
-
-        @Override
-        public Builder authentication(OpenstackAuth auth) {
-            this.auth = auth;
-            return this;
-        }
-
-        @Override
-        public Builder endPoint(String endPoint) {
-            this.endPoint = endPoint;
-            return this;
-        }
-    }
-}
-
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
index 4b40775..d766473 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
@@ -25,6 +25,7 @@
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeEvent;
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
index da4680c..3f9fcb4 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
@@ -33,7 +33,7 @@
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackPhyInterface;
 import org.onosproject.openstacknode.impl.DefaultOpenstackAuth;
-import org.onosproject.openstacknode.impl.DefaultOpenstackNode;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.impl.DefaultOpenstackPhyInterface;
 
 import java.io.IOException;
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
index b07044f..4305cc3 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
@@ -68,6 +68,7 @@
 import org.onosproject.net.flow.instructions.ExtensionTreatment;
 import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackNode;
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeTest.java
deleted file mode 100644
index 505b907..0000000
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.openstacknode.impl;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onosproject.net.Device;
-import org.onosproject.openstacknode.api.NodeState;
-import org.onosproject.openstacknode.api.OpenstackNode;
-
-/**
- * Unit tests for DefaultOpenstackNode.
- */
-public class DefaultOpenstackNodeTest extends OpenstackNodeTest {
-
-    private static final IpAddress TEST_IP = IpAddress.valueOf("10.100.0.3");
-
-    private static final String HOSTNAME_1 = "hostname_1";
-    private static final String HOSTNAME_2 = "hostname_2";
-    private static final Device DEVICE_1 = createDevice(1);
-    private static final Device DEVICE_2 = createDevice(2);
-    private static final OpenstackNode OS_NODE_1 = createNode(
-            HOSTNAME_1,
-            OpenstackNode.NodeType.COMPUTE,
-            DEVICE_1,
-            TEST_IP,
-            NodeState.INIT);
-    private static final OpenstackNode OS_NODE_2 = createNode(
-            HOSTNAME_1,
-            OpenstackNode.NodeType.COMPUTE,
-            DEVICE_1,
-            TEST_IP,
-            NodeState.COMPLETE);
-    private static final OpenstackNode OS_NODE_3 = createNode(
-            HOSTNAME_2,
-            OpenstackNode.NodeType.COMPUTE,
-            DEVICE_2,
-            TEST_IP,
-            NodeState.INIT);
-
-    /**
-     * Checks equals method works as expected.
-     */
-    @Test
-    public void testEquality() {
-        new EqualsTester().addEqualityGroup(OS_NODE_1, OS_NODE_2)
-                .addEqualityGroup(OS_NODE_3)
-                .testEquals();
-    }
-
-    /**
-     * Checks building a node without hostname fails with proper exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testBuildWithoutHostname() {
-        DefaultOpenstackNode.builder()
-                .type(OpenstackNode.NodeType.COMPUTE)
-                .intgBridge(DEVICE_1.id())
-                .managementIp(TEST_IP)
-                .dataIp(TEST_IP)
-                .state(NodeState.INIT)
-                .build();
-    }
-
-    /**
-     * Checks building a node without type fails with proper exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testBuildWithoutType() {
-        DefaultOpenstackNode.builder()
-                .hostname(HOSTNAME_1)
-                .intgBridge(DEVICE_1.id())
-                .managementIp(TEST_IP)
-                .dataIp(TEST_IP)
-                .state(NodeState.INIT)
-                .build();
-    }
-
-    /**
-     * Checks building a node without management IP address fails with
-     * proper exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testBuildWithoutManagementIp() {
-        DefaultOpenstackNode.builder()
-                .hostname(HOSTNAME_1)
-                .type(OpenstackNode.NodeType.COMPUTE)
-                .intgBridge(DEVICE_1.id())
-                .dataIp(TEST_IP)
-                .state(NodeState.INIT)
-                .build();
-    }
-
-    /**
-     * Checks building a node without data IP nor VLAN interface name
-     * fails with proper exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testBuildWithoutDataIpNorVlanIntf() {
-        DefaultOpenstackNode.builder()
-                .hostname(HOSTNAME_1)
-                .type(OpenstackNode.NodeType.COMPUTE)
-                .intgBridge(DEVICE_1.id())
-                .state(NodeState.INIT)
-                .build();
-    }
-}
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
index cb0a73e..a17060e 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
@@ -29,10 +29,12 @@
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.event.Event;
 import org.onosproject.net.Device;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeEvent;
 import org.onosproject.openstacknode.api.OpenstackNodeListener;
+import org.onosproject.openstacknode.api.OpenstackNodeTest;
 import org.onosproject.store.service.TestStorageService;
 
 import java.util.List;
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeTest.java
deleted file mode 100644
index 7deca06..0000000
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.openstacknode.impl;
-
-import org.onlab.packet.ChassisId;
-import org.onlab.packet.IpAddress;
-import org.onosproject.net.DefaultDevice;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.openstacknode.api.NodeState;
-import org.onosproject.openstacknode.api.OpenstackNode;
-import org.onosproject.openstacknode.api.OpenstackNode.NodeType;
-
-import static org.onosproject.net.Device.Type.SWITCH;
-
-/**
- * Provides a set of test OpenstackNode parameters for use with OpenstackNode related tests.
- */
-public abstract class OpenstackNodeTest {
-
-    public static Device createDevice(long devIdNum) {
-        return new DefaultDevice(new ProviderId("of", "foo"),
-                DeviceId.deviceId(String.format("of:%016d", devIdNum)),
-                SWITCH,
-                "manufacturer",
-                "hwVersion",
-                "swVersion",
-                "serialNumber",
-                new ChassisId(1));
-    }
-
-    public static OpenstackNode createNode(String hostname, NodeType type,
-                                              Device intgBridge, IpAddress ipAddr,
-                                              NodeState state) {
-        return DefaultOpenstackNode.builder()
-                .hostname(hostname)
-                .type(type)
-                .intgBridge(intgBridge.id())
-                .managementIp(ipAddr)
-                .dataIp(ipAddr)
-                .state(state)
-                .build();
-    }
-
-    public static OpenstackNode createNode(String hostname, NodeType type,
-                                              Device intgBridge, IpAddress ipAddr,
-                                              String uplinkPort, NodeState state) {
-        return DefaultOpenstackNode.builder()
-                .hostname(hostname)
-                .type(type)
-                .intgBridge(intgBridge.id())
-                .managementIp(ipAddr)
-                .dataIp(ipAddr)
-                .uplinkPort(uplinkPort)
-                .state(state)
-                .build();
-    }
-}
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/web/OpenstackNodeWebResourceTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/web/OpenstackNodeWebResourceTest.java
index 5ed0f1d..d912013 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/web/OpenstackNodeWebResourceTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/web/OpenstackNodeWebResourceTest.java
@@ -29,7 +29,7 @@
 import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
 import org.onosproject.openstacknode.codec.OpenstackNodeCodec;
-import org.onosproject.openstacknode.impl.DefaultOpenstackNode;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.rest.resources.ResourceTest;
 
 import javax.ws.rs.client.Entity;
