diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuth.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuth.java
new file mode 100644
index 0000000..3257353
--- /dev/null
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuth.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2018-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 org.onosproject.openstacknode.api.OpenstackAuth;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+public class DefaultOpenstackAuth implements OpenstackAuth {
+
+    private final String version;
+    private final Integer port;
+    private final Protocol protocol;
+    private final String username;
+    private final String password;
+    private final String project;
+    private final Perspective perspective;
+
+    private static final String NOT_NULL_MSG = "% cannot be null";
+
+    /**
+     * A default constructor of keystone authentication instance.
+     *
+     * @param version       version number
+     * @param port          endpoint port number
+     * @param protocol      endpoint protocol type
+     * @param username      keystone username
+     * @param password      keystone password
+     * @param project       project name
+     * @param perspective   user perspective
+     */
+    protected DefaultOpenstackAuth(String version, Integer port, Protocol protocol,
+                                   String username, String password, String project,
+                                   Perspective perspective) {
+
+        this.version = version;
+        this.port = port;
+        this.protocol = protocol;
+        this.username = username;
+        this.password = password;
+        this.project = project;
+        this.perspective = perspective;
+    }
+
+    @Override
+    public String version() {
+        return version;
+    }
+
+    @Override
+    public Integer port() {
+        return port;
+    }
+
+    @Override
+    public Protocol protocol() {
+        return protocol;
+    }
+
+    @Override
+    public String username() {
+        return username;
+    }
+
+    @Override
+    public String password() {
+        return password;
+    }
+
+    @Override
+    public String project() {
+        return project;
+    }
+
+    @Override
+    public Perspective perspective() {
+        return perspective;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof DefaultOpenstackAuth) {
+            DefaultOpenstackAuth that = (DefaultOpenstackAuth) obj;
+            return Objects.equals(version, that.version) &&
+                    Objects.equals(port, that.port) &&
+                    Objects.equals(protocol, that.protocol) &&
+                    Objects.equals(username, that.username) &&
+                    Objects.equals(password, that.password) &&
+                    Objects.equals(project, that.project) &&
+                    Objects.equals(perspective, that.perspective);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(version,
+                port,
+                protocol,
+                username,
+                password,
+                project,
+                perspective);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("version", version)
+                .add("port", port)
+                .add("protocol", protocol)
+                .add("username", username)
+                .add("password", password)
+                .add("project", project)
+                .add("perspective", perspective)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return keystone authentication instance builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * A builder class for openstack authentication.
+     */
+    public static final class Builder implements OpenstackAuth.Builder {
+
+        private String version;
+        private Integer port;
+        private Protocol protocol;
+        private String username;
+        private String password;
+        private String project;
+        private Perspective perspective;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public OpenstackAuth build() {
+            checkArgument(version != null, NOT_NULL_MSG, "version");
+            checkArgument(port != null, NOT_NULL_MSG, "port");
+            checkArgument(protocol != null, NOT_NULL_MSG, "protocol");
+            checkArgument(username != null, NOT_NULL_MSG, "username");
+            checkArgument(password != null, NOT_NULL_MSG, "password");
+            checkArgument(project != null, NOT_NULL_MSG, "project");
+
+            return new DefaultOpenstackAuth(version,
+                    port,
+                    protocol,
+                    username,
+                    password,
+                    project,
+                    perspective);
+        }
+
+        @Override
+        public Builder version(String version) {
+            this.version = version;
+            return this;
+        }
+
+        @Override
+        public Builder port(Integer port) {
+            this.port = port;
+            return this;
+        }
+
+        @Override
+        public Builder protocol(Protocol protocol) {
+            this.protocol = protocol;
+            return this;
+        }
+
+        @Override
+        public Builder username(String username) {
+            this.username = username;
+            return this;
+        }
+
+        @Override
+        public Builder password(String password) {
+            this.password = password;
+            return this;
+        }
+
+        @Override
+        public Builder project(String project) {
+            this.project = project;
+            return this;
+        }
+
+        @Override
+        public Builder perspective(Perspective perspective) {
+            this.perspective = perspective;
+            return this;
+        }
+    }
+}
