diff --git a/src/main/java/org/opencord/cordvtn/api/config/CordVtnConfig.java b/src/main/java/org/opencord/cordvtn/api/config/CordVtnConfig.java
index 0789d51..3f2b094 100644
--- a/src/main/java/org/opencord/cordvtn/api/config/CordVtnConfig.java
+++ b/src/main/java/org/opencord/cordvtn/api/config/CordVtnConfig.java
@@ -248,4 +248,17 @@
                              getConfig(jsonNode, USER),
                              getConfig(jsonNode, PASSWORD));
     }
+
+    /**
+     * Returns OpenStack API endpoint and credential configuration.
+     *
+     * @return openstack api configuration
+     */
+    public OpenStackConfig openStackConfig() {
+        JsonNode jsonNode = object.get(OPENSTACK);
+        return new OpenStackConfig(jsonNode.path(ENDPOINT).asText(),
+                                   jsonNode.path(TENANT).asText(),
+                                   jsonNode.path(USER).asText(),
+                                   jsonNode.path(PASSWORD).asText());
+    }
 }
diff --git a/src/main/java/org/opencord/cordvtn/api/config/OpenStackConfig.java b/src/main/java/org/opencord/cordvtn/api/config/OpenStackConfig.java
new file mode 100644
index 0000000..913b5e8
--- /dev/null
+++ b/src/main/java/org/opencord/cordvtn/api/config/OpenStackConfig.java
@@ -0,0 +1,83 @@
+/*
+ * 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.opencord.cordvtn.api.config;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+/**
+ * Representation of OpenStack API access configuration.
+ */
+public final class OpenStackConfig extends AbstractApiConfig {
+
+    private final String tenant;
+
+    /**
+     * Default constructor.
+     *
+     * @param endpoint api endpoint
+     * @param tenant   tenant name
+     * @param user     user name
+     * @param password password of the user
+     */
+    public OpenStackConfig(String endpoint, String tenant, String user,
+                           String password) {
+        super(endpoint, user, password);
+        this.tenant = tenant;
+    }
+
+    /**
+     * Returns the tenant name.
+     *
+     * @return tenant name
+     */
+    public String tenant() {
+        return tenant;
+    }
+
+    @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 OpenStackConfig)) {
+            OpenStackConfig that = (OpenStackConfig) 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/src/main/java/org/opencord/cordvtn/impl/external/OpenStackNetworking.java b/src/main/java/org/opencord/cordvtn/impl/external/OpenStackNetworking.java
new file mode 100644
index 0000000..59a080d
--- /dev/null
+++ b/src/main/java/org/opencord/cordvtn/impl/external/OpenStackNetworking.java
@@ -0,0 +1,225 @@
+/*
+ * 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.opencord.cordvtn.impl.external;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import org.opencord.cordvtn.api.net.NetworkId;
+import org.opencord.cordvtn.api.net.NetworkService;
+import org.opencord.cordvtn.api.net.PortId;
+import org.opencord.cordvtn.api.net.SubnetId;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.api.exceptions.AuthenticationException;
+import org.openstack4j.model.identity.Access;
+import org.openstack4j.model.network.Network;
+import org.openstack4j.model.network.Port;
+import org.openstack4j.model.network.Subnet;
+import org.openstack4j.openstack.OSFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Implementation of {@link NetworkService} with OpenStack networking service.
+ */
+public final class OpenStackNetworking implements NetworkService {
+
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String ERR_AUTH = "OpenStack authentication failure";
+
+    private final String endpoint;
+    private final String tenant;
+    private final String user;
+    private final String password;
+    private final Access osAcess;
+
+    private OpenStackNetworking(String endpoint,
+                                String tenant,
+                                String user,
+                                String password) {
+        this.endpoint = endpoint;
+        this.tenant = tenant;
+        this.user = user;
+        this.password = password;
+
+        try {
+            this.osAcess = OSFactory.builder()
+                    .endpoint(this.endpoint)
+                    .tenantName(this.tenant)
+                    .credentials(this.user, this.password)
+                    .authenticate()
+                    .getAccess();
+        } catch (AuthenticationException e) {
+            throw new IllegalArgumentException(ERR_AUTH);
+        }
+    }
+
+    @Override
+    public Network network(NetworkId netId) {
+        OSClient osClient = OSFactory.clientFromAccess(osAcess);
+        return osClient.networking().network().get(netId.id());
+    }
+
+    @Override
+    public Set<Network> networks() {
+        OSClient osClient = OSFactory.clientFromAccess(osAcess);
+        return ImmutableSet.copyOf(osClient.networking().network().list());
+    }
+
+    @Override
+    public Port port(PortId portId) {
+        OSClient osClient = OSFactory.clientFromAccess(osAcess);
+        return osClient.networking().port().get(portId.id());
+    }
+
+    @Override
+    public Set<Port> ports() {
+        OSClient osClient = OSFactory.clientFromAccess(osAcess);
+        return ImmutableSet.copyOf(osClient.networking().port().list());
+    }
+
+    @Override
+    public Subnet subnet(SubnetId subnetId) {
+        OSClient osClient = OSFactory.clientFromAccess(osAcess);
+        return osClient.networking().subnet().get(subnetId.id());
+    }
+
+    @Override
+    public Set<Subnet> subnets() {
+        OSClient osClient = OSFactory.clientFromAccess(osAcess);
+        return ImmutableSet.copyOf(osClient.networking().subnet().list());
+    }
+
+    /**
+     * Returns endpoint url for the OpenStack networking API access.
+     *
+     * @return endpoint url as a string
+     */
+    public String endpoint() {
+        return endpoint;
+    }
+
+    /**
+     * Returns tenant for the OpenStack networking API access.
+     *
+     * @return tenant name as a string
+     */
+    public String tenant() {
+        return tenant;
+    }
+
+    /**
+     * Returns user name for the OpenStack networking API access.
+     *
+     * @return user name as a string
+     */
+    public String user() {
+        return this.user;
+    }
+
+    /**
+     * Returns password for the OpenStack networking API access.
+     *
+     * @return password as a string
+     */
+    public String password() {
+        return this.password;
+    }
+
+    /**
+     * Returns new OpenStack networking builder instance.
+     * @return openstack networking builder instance
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Builder of the OpenStack networking entities.
+     */
+    public static final class Builder {
+
+        private String endpoint;
+        private String tenant;
+        private String user;
+        private String password;
+
+        private Builder() {
+        }
+
+        /**
+         * Builds immutable OpenStack networking instance.
+         *
+         * @return openstack networking instance
+         */
+        public OpenStackNetworking build() {
+            checkArgument(!Strings.isNullOrEmpty(endpoint));
+            checkArgument(!Strings.isNullOrEmpty(tenant));
+            checkArgument(!Strings.isNullOrEmpty(user));
+            checkArgument(!Strings.isNullOrEmpty(password));
+
+            return new OpenStackNetworking(endpoint, tenant, user, password);
+        }
+
+        /**
+         * Returns OpenStack networking builder with the supplied endpoint.
+         *
+         * @param endpoint endpoint url as a string
+         * @return openstack networking builder
+         */
+        public Builder endpoint(String endpoint) {
+            this.endpoint = endpoint;
+            return this;
+        }
+
+        /**
+         * Returns OpenStack networking builder with the supplied tenant name.
+         *
+         * @param tenant tenant name as a string
+         * @return openstack networking builder
+         */
+        public Builder tenant(String tenant) {
+            this.tenant = tenant;
+            return this;
+        }
+
+        /**
+         * Returns OpenStack networking builder with the supplied user name.
+         *
+         * @param user user name as a string
+         * @return openstack networking builder
+         */
+        public Builder user(String user) {
+            this.user = user;
+            return this;
+        }
+
+        /**
+         * Returns OpenStack networking builder with the supplied password.
+         *
+         * @param password password as a string
+         * @return openstack networking builder
+         */
+        public Builder password(String password) {
+            this.password = password;
+            return this;
+        }
+    }
+}
