diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultKeystoneConfig.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultKeystoneConfig.java
new file mode 100644
index 0000000..b324759
--- /dev/null
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultKeystoneConfig.java
@@ -0,0 +1,119 @@
+/*
+ * 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.api;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Implementation class of keystone config.
+ */
+public final class DefaultKeystoneConfig implements KeystoneConfig {
+
+    private final String endpoint;
+    private final OpenstackAuth auth;
+
+    private static final String NOT_NULL_MSG = "% cannot be null";
+
+    private DefaultKeystoneConfig(String endpoint, OpenstackAuth auth) {
+        this.endpoint = endpoint;
+        this.auth = auth;
+    }
+
+    @Override
+    public String endpoint() {
+        return endpoint;
+    }
+
+    @Override
+    public OpenstackAuth authentication() {
+        return auth;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o instanceof DefaultKeystoneConfig) {
+            DefaultKeystoneConfig that = (DefaultKeystoneConfig) o;
+            return Objects.equals(endpoint, that.endpoint) &&
+                    Objects.equals(auth, that.auth);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+
+        return Objects.hash(endpoint, auth);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("endpoint", endpoint)
+                .add("auth", auth)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return keystone config instance builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * A builder class for keystone config.
+     */
+    public static final class Builder implements KeystoneConfig.Builder {
+
+        private String endpoint;
+        private OpenstackAuth auth;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public KeystoneConfig build() {
+            checkArgument(endpoint != null, NOT_NULL_MSG, "endpoint");
+            checkArgument(auth != null, NOT_NULL_MSG, "auth");
+
+            return new DefaultKeystoneConfig(endpoint, auth);
+        }
+
+        @Override
+        public Builder endpoint(String endpoint) {
+            this.endpoint = endpoint;
+            return this;
+        }
+
+        @Override
+        public Builder authentication(OpenstackAuth auth) {
+            this.auth = auth;
+            return this;
+        }
+    }
+}
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultNeutronConfig.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultNeutronConfig.java
new file mode 100644
index 0000000..acb5a3d
--- /dev/null
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultNeutronConfig.java
@@ -0,0 +1,119 @@
+/*
+ * 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.api;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Implementation class of neutron config.
+ */
+public final class DefaultNeutronConfig implements NeutronConfig {
+
+    private final boolean useMetadataProxy;
+    private final String metadataProxySecret;
+
+    private static final String NOT_NULL_MSG = "% cannot be null";
+
+    private DefaultNeutronConfig(boolean useMetadataProxy, String metadataProxySecret) {
+        this.useMetadataProxy = useMetadataProxy;
+        this.metadataProxySecret = metadataProxySecret;
+    }
+
+    @Override
+    public boolean useMetadataProxy() {
+        return useMetadataProxy;
+    }
+
+    @Override
+    public String metadataProxySecret() {
+        return metadataProxySecret;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o instanceof DefaultNeutronConfig) {
+            DefaultNeutronConfig that = (DefaultNeutronConfig) o;
+            return Objects.equals(useMetadataProxy, that.useMetadataProxy) &&
+                    Objects.equals(metadataProxySecret, that.metadataProxySecret);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+
+        return Objects.hash(useMetadataProxy, metadataProxySecret);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("useMetadataProxy", useMetadataProxy)
+                .add("metadataProxySecret", metadataProxySecret)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return neutron config instance builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * A builder class for neutron config.
+     */
+    public static final class Builder implements NeutronConfig.Builder {
+
+        private boolean useMetadataProxy;
+        private String metadataProxySecret;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public NeutronConfig build() {
+            checkArgument(metadataProxySecret != null,
+                                        NOT_NULL_MSG, "metadataProxySecret");
+
+            return new DefaultNeutronConfig(useMetadataProxy, metadataProxySecret);
+        }
+
+        @Override
+        public NeutronConfig.Builder useMetadataProxy(boolean useMetadataProxy) {
+            this.useMetadataProxy = useMetadataProxy;
+            return this;
+        }
+
+        @Override
+        public NeutronConfig.Builder metadataProxySecret(String metadataProxySecret) {
+            this.metadataProxySecret = metadataProxySecret;
+            return this;
+        }
+    }
+}
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java
index 94afc4e..ec811b3 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackNode.java
@@ -53,10 +53,10 @@
     private final NodeState state;
     private final Collection<OpenstackPhyInterface> phyIntfs;
     private final Collection<ControllerInfo> controllers;
-    private final OpenstackAuth auth;
-    private final String endpoint;
     private final OpenstackSshAuth sshAuth;
     private final DpdkConfig dpdkConfig;
+    private final KeystoneConfig keystoneConfig;
+    private final NeutronConfig neutronConfig;
 
     private static final String NOT_NULL_MSG = "Node % cannot be null";
 
@@ -65,20 +65,20 @@
     /**
      * 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 controllers   customized controllers
-     * @param auth          keystone authentication info
-     * @param endpoint      openstack endpoint URL
-     * @param sshAuth       ssh authentication info
-     * @param dpdkConfig    dpdk config
+     * @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 controllers       customized controllers
+     * @param sshAuth           ssh authentication info
+     * @param dpdkConfig        dpdk config
+     * @param keystoneConfig    keystone config
+     * @param neutronConfig     neutron config
      */
     protected DefaultOpenstackNode(String hostname, NodeType type,
                                    DeviceId intgBridge,
@@ -89,10 +89,10 @@
                                    NodeState state,
                                    Collection<OpenstackPhyInterface> phyIntfs,
                                    Collection<ControllerInfo> controllers,
-                                   OpenstackAuth auth,
-                                   String endpoint,
                                    OpenstackSshAuth sshAuth,
-                                   DpdkConfig dpdkConfig) {
+                                   DpdkConfig dpdkConfig,
+                                   KeystoneConfig keystoneConfig,
+                                   NeutronConfig neutronConfig) {
         this.hostname = hostname;
         this.type = type;
         this.intgBridge = intgBridge;
@@ -103,10 +103,10 @@
         this.state = state;
         this.phyIntfs = phyIntfs;
         this.controllers = controllers;
-        this.auth = auth;
-        this.endpoint = endpoint;
         this.sshAuth = sshAuth;
         this.dpdkConfig = dpdkConfig;
+        this.keystoneConfig = keystoneConfig;
+        this.neutronConfig = neutronConfig;
     }
 
     @Override
@@ -253,10 +253,10 @@
                     Objects.equals(vlanIntf, that.vlanIntf) &&
                     Objects.equals(phyIntfs, that.phyIntfs) &&
                     Objects.equals(controllers, that.controllers) &&
-                    Objects.equals(auth, that.auth) &&
-                    Objects.equals(endpoint, that.endpoint) &&
                     Objects.equals(sshAuth, that.sshAuth) &&
-                    Objects.equals(dpdkConfig, that.dpdkConfig);
+                    Objects.equals(dpdkConfig, that.dpdkConfig) &&
+                    Objects.equals(keystoneConfig, that.keystoneConfig) &&
+                    Objects.equals(neutronConfig, that.neutronConfig);
         }
         return false;
     }
@@ -272,10 +272,10 @@
                 uplinkPort,
                 phyIntfs,
                 controllers,
-                auth,
-                endpoint,
                 sshAuth,
-                dpdkConfig);
+                dpdkConfig,
+                keystoneConfig,
+                neutronConfig);
     }
 
     @Override
@@ -291,10 +291,10 @@
                 .add("state", state)
                 .add("phyIntfs", phyIntfs)
                 .add("controllers", controllers)
-                .add("auth", auth)
-                .add("endpoint", endpoint)
                 .add("sshAuth", sshAuth)
-                .add("datapathType", dpdkConfig)
+                .add("dpdkConfig", dpdkConfig)
+                .add("keystoneConfig", keystoneConfig)
+                .add("neutronConfig", neutronConfig)
                 .toString();
     }
 
@@ -311,10 +311,10 @@
                 .state(newState)
                 .phyIntfs(phyIntfs)
                 .controllers(controllers)
-                .authentication(auth)
-                .endpoint(endpoint)
                 .sshAuthInfo(sshAuth)
                 .dpdkConfig(dpdkConfig)
+                .keystoneConfig(keystoneConfig)
+                .neutronConfig(neutronConfig)
                 .build();
     }
 
@@ -330,11 +330,10 @@
                 .uplinkPort(uplinkPort)
                 .state(state)
                 .phyIntfs(phyIntfs)
-                .controllers(controllers)
-                .authentication(auth)
-                .endpoint(endpoint)
                 .sshAuthInfo(sshAuth)
                 .dpdkConfig(dpdkConfig)
+                .keystoneConfig(keystoneConfig)
+                .neutronConfig(neutronConfig)
                 .build();
     }
 
@@ -368,6 +367,16 @@
     }
 
     @Override
+    public KeystoneConfig keystoneConfig() {
+        return keystoneConfig;
+    }
+
+    @Override
+    public NeutronConfig neutronConfig() {
+        return neutronConfig;
+    }
+
+    @Override
     public PortNumber phyIntfPortNum(String providerPhysnet) {
         Optional<OpenstackPhyInterface> openstackPhyInterface =
                 phyIntfs.stream().filter(p -> p.network().equals(providerPhysnet)).findAny();
@@ -386,16 +395,6 @@
 
     }
 
-    @Override
-    public OpenstackAuth authentication() {
-        return auth;
-    }
-
-    @Override
-    public String endpoint() {
-        return endpoint;
-    }
-
     /**
      * Returns new builder instance.
      *
@@ -423,10 +422,10 @@
                 .state(osNode.state())
                 .phyIntfs(osNode.phyIntfs())
                 .controllers(osNode.controllers())
-                .authentication(osNode.authentication())
-                .endpoint(osNode.endpoint())
                 .sshAuthInfo(osNode.sshAuthInfo())
-                .dpdkConfig(osNode.dpdkConfig());
+                .dpdkConfig(osNode.dpdkConfig())
+                .keystoneConfig(osNode.keystoneConfig())
+                .neutronConfig(osNode.neutronConfig());
     }
 
     /**
@@ -444,10 +443,10 @@
         private NodeState state;
         private Collection<OpenstackPhyInterface> phyIntfs;
         private Collection<ControllerInfo> controllers;
-        private OpenstackAuth auth;
-        private String endpoint;
         private OpenstackSshAuth sshAuth;
         private DpdkConfig dpdkConfig;
+        private KeystoneConfig keystoneConfig;
+        private NeutronConfig neutronConfig;
 
         // private constructor not intended to use from external
         private Builder() {
@@ -465,7 +464,7 @@
                     throw new IllegalArgumentException("Either data IP or VLAN interface is required");
                 }
             } else {
-                checkArgument(endpoint != null, NOT_NULL_MSG, "endpoint URL");
+                checkArgument(keystoneConfig != null, NOT_NULL_MSG, "keystone config");
             }
 
             if (type == NodeType.GATEWAY && uplinkPort == null) {
@@ -482,10 +481,10 @@
                     state,
                     phyIntfs,
                     controllers,
-                    auth,
-                    endpoint,
                     sshAuth,
-                    dpdkConfig);
+                    dpdkConfig,
+                    keystoneConfig,
+                    neutronConfig);
         }
 
         @Override
@@ -551,18 +550,6 @@
         }
 
         @Override
-        public Builder authentication(OpenstackAuth auth) {
-            this.auth = auth;
-            return this;
-        }
-
-        @Override
-        public Builder endpoint(String endpoint) {
-            this.endpoint = endpoint;
-            return this;
-        }
-
-        @Override
         public Builder sshAuthInfo(OpenstackSshAuth sshAuth) {
             this.sshAuth = sshAuth;
             return this;
@@ -573,6 +560,18 @@
             this.dpdkConfig = dpdkConfig;
             return this;
         }
+
+        @Override
+        public Builder keystoneConfig(KeystoneConfig keystoneConfig) {
+            this.keystoneConfig = keystoneConfig;
+            return this;
+        }
+
+        @Override
+        public Builder neutronConfig(NeutronConfig neutronConfig) {
+            this.neutronConfig = neutronConfig;
+            return this;
+        }
     }
 }
 
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/KeystoneConfig.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/KeystoneConfig.java
new file mode 100644
index 0000000..6407993
--- /dev/null
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/KeystoneConfig.java
@@ -0,0 +1,66 @@
+/*
+ * 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.api;
+
+/**
+ * Representation of openstack keystone config information.
+ */
+public interface KeystoneConfig {
+
+    /**
+     * Returns the endpoint URL info.
+     *
+     * @return keystone authentication info
+     */
+    String endpoint();
+
+    /**
+     * Returns the keystone authentication info.
+     *
+     * @return keystone authentication info
+     */
+    OpenstackAuth authentication();
+
+    /**
+     * Builder of new keystone config entity.
+     */
+    interface Builder {
+
+        /**
+         * Builds an immutable keystone config instance.
+         *
+         * @return keystone config instance
+         */
+        KeystoneConfig build();
+
+        /**
+         * Returns keystone config builder with supplied endpoint.
+         *
+         * @param endpoint endpoint of keystone
+         * @return keystone config builder
+         */
+        Builder endpoint(String endpoint);
+
+        /**
+         * Returns keystone config builder with supplied authentication info.
+         *
+         * @param auth authentication info
+         * @return keystone config builder
+         */
+        Builder authentication(OpenstackAuth auth);
+    }
+}
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NeutronConfig.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NeutronConfig.java
new file mode 100644
index 0000000..86ea2a9
--- /dev/null
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NeutronConfig.java
@@ -0,0 +1,67 @@
+/*
+ * 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.api;
+
+/**
+ * Representation of openstack neutron config information.
+ */
+public interface NeutronConfig {
+
+    /**
+     * Returns whether to use metadata proxy service.
+     * Note that SONA will behave as a metadata proxy server
+     *
+     * @return true if metadata proxy service is enabled, false otherwise
+     */
+    boolean useMetadataProxy();
+
+    /**
+     * Returns metadata proxy secret.
+     *
+     * @return metadata proxy secret
+     */
+    String metadataProxySecret();
+
+    /**
+     * Builder of neutron config.
+     */
+    interface Builder {
+
+        /**
+         * Builds an immutable neutron config instance.
+         *
+         * @return neutron config instance
+         */
+        NeutronConfig build();
+
+        /**
+         * Returns neutron config with supplied useMetadataProxy flag.
+         *
+         * @param useMetadataProxy useMetadataProxy flag
+         * @return neutron config builder
+         */
+        Builder useMetadataProxy(boolean useMetadataProxy);
+
+        /**
+         * Returns neutron config with supplied metadataProxySecret.
+         *
+         * @param metadataProxySecret metadata proxy secret
+         * @return neutron config builder
+         */
+        Builder metadataProxySecret(String metadataProxySecret);
+    }
+}
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
index 3ffdda9..a2000ee 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
@@ -192,20 +192,6 @@
     PortNumber phyIntfPortNum(String providerPhysnet);
 
     /**
-     * Returns the keystone authentication info.
-     *
-     * @return keystone authentication info
-     */
-    OpenstackAuth authentication();
-
-    /**
-     * Returns the endpoint URL info.
-     *
-     * @return keystone authentication info
-     */
-    String endpoint();
-
-    /**
      * Returns a collection of customized controllers.
      *
      * @return customized controllers
@@ -227,6 +213,20 @@
     DpdkConfig dpdkConfig();
 
     /**
+     * Returns the keystone config info.
+     *
+     * @return keystone config
+     */
+    KeystoneConfig keystoneConfig();
+
+    /**
+     * Returns the neutron config info.
+     *
+     * @return neutron config
+     */
+    NeutronConfig neutronConfig();
+
+    /**
      * Builder of new node entities.
      */
     interface Builder {
@@ -319,22 +319,6 @@
         Builder controllers(Collection<ControllerInfo> controllers);
 
         /**
-         * Returns openstack node builder with supplied authentication info.
-         *
-         * @param auth keystone authentication info
-         * @return openstack node builder
-         */
-        Builder authentication(OpenstackAuth auth);
-
-        /**
-         * Returns openstack node builder with supplied endpoint info.
-         *
-         * @param endpoint endpoint info
-         * @return openstack node builder
-         */
-        Builder endpoint(String endpoint);
-
-        /**
          * Returns openstack node builder with supplied ssh authentication info.
          *
          * @param sshAuth ssh authentication info
@@ -349,6 +333,22 @@
          * @return openstack node builder
          */
         Builder dpdkConfig(DpdkConfig dpdkConfig);
+
+        /**
+         * Returns openstack node builder with supplied keystone config info.
+         *
+         * @param keystoneConfig keystone config
+         * @return openstack node builder
+         */
+        Builder keystoneConfig(KeystoneConfig keystoneConfig);
+
+        /**
+         * Returns openstack node builder with supplied neutron config info.
+         *
+         * @param neutronConfig neutron config
+         * @return openstack node builder
+         */
+        Builder neutronConfig(NeutronConfig neutronConfig);
     }
 }
 
