diff --git a/docker/centos/binary/nova-controller/nova-api/Dockerfile b/docker/centos/binary/nova-controller/nova-api/Dockerfile
index 7abd32087da3a5bafc216d600e7d2634deb89ef3..fb0581dceeb46b6e01f21b311068084be0ef888f 100644
--- a/docker/centos/binary/nova-controller/nova-api/Dockerfile
+++ b/docker/centos/binary/nova-controller/nova-api/Dockerfile
@@ -7,4 +7,6 @@ RUN yum -y install \
 ADD ./start.sh /start.sh
 ADD ./check.sh /check.sh
 
+COPY config-internal.sh config-external.sh /opt/kolla/
+
 CMD ["/start.sh"]
diff --git a/docker/centos/binary/nova-controller/nova-api/config-external.sh b/docker/centos/binary/nova-controller/nova-api/config-external.sh
new file mode 120000
index 0000000000000000000000000000000000000000..a2a68471d274e37d9ecd19a557f7dbdad3d81cdc
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-api/config-external.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-api/config-external.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-api/config-internal.sh b/docker/centos/binary/nova-controller/nova-api/config-internal.sh
new file mode 120000
index 0000000000000000000000000000000000000000..cde9e26459dc49e2fd641ea0cea520fc2326f044
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-api/config-internal.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-api/config-internal.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-conductor/Dockerfile b/docker/centos/binary/nova-controller/nova-conductor/Dockerfile
index f91113bad95708ec2dd9cad96351e95c868e7263..0f4b104b89656ccc8a1ebddd9b486608c51368b9 100644
--- a/docker/centos/binary/nova-controller/nova-conductor/Dockerfile
+++ b/docker/centos/binary/nova-controller/nova-conductor/Dockerfile
@@ -5,4 +5,7 @@ RUN yum -y install \
         openstack-nova-conductor && yum clean all
 
 ADD ./start.sh /start.sh
+
+COPY config-internal.sh config-external.sh /opt/kolla/
+
 CMD ["/start.sh"]
diff --git a/docker/centos/binary/nova-controller/nova-conductor/config-external.sh b/docker/centos/binary/nova-controller/nova-conductor/config-external.sh
new file mode 120000
index 0000000000000000000000000000000000000000..4cb26e83e44f9ee0b99c1d033ac58412f7f7aa7b
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-conductor/config-external.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-conductor/config-external.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-conductor/config-internal.sh b/docker/centos/binary/nova-controller/nova-conductor/config-internal.sh
new file mode 120000
index 0000000000000000000000000000000000000000..836b544364bb948e63ab6fa2833678250780d28d
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-conductor/config-internal.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-conductor/config-internal.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-consoleauth/Dockerfile b/docker/centos/binary/nova-controller/nova-consoleauth/Dockerfile
index 576c91b5a1451f392d8d81c86d0f9f065a5339eb..51331353cb465c14c8cb926ad9589ca735937b9f 100644
--- a/docker/centos/binary/nova-controller/nova-consoleauth/Dockerfile
+++ b/docker/centos/binary/nova-controller/nova-consoleauth/Dockerfile
@@ -5,4 +5,6 @@ RUN yum -y install openstack-nova-console && yum clean all
 
 ADD start.sh /start.sh
 
+COPY config-internal.sh config-external.sh /opt/kolla/
+
 CMD ["/start.sh"]
diff --git a/docker/centos/binary/nova-controller/nova-consoleauth/config-external.sh b/docker/centos/binary/nova-controller/nova-consoleauth/config-external.sh
new file mode 120000
index 0000000000000000000000000000000000000000..78785fe3e184a7e61e5b0e854c2111de61c2bc46
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-consoleauth/config-external.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-consoleauth/config-external.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-consoleauth/config-internal.sh b/docker/centos/binary/nova-controller/nova-consoleauth/config-internal.sh
new file mode 120000
index 0000000000000000000000000000000000000000..07b75b62dbefbca4eb7330e12caadd664f4dc2a4
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-consoleauth/config-internal.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-consoleauth/config-internal.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-novncproxy/Dockerfile b/docker/centos/binary/nova-controller/nova-novncproxy/Dockerfile
index 68262585382e83852effdc83f5f5058ce69ede4a..3fb1d31ad2b18c7e6a807d3aceedebf76cba34e5 100644
--- a/docker/centos/binary/nova-controller/nova-novncproxy/Dockerfile
+++ b/docker/centos/binary/nova-controller/nova-novncproxy/Dockerfile
@@ -7,4 +7,6 @@ RUN yum -y install \
 
 ADD start.sh /start.sh
 
+COPY config-internal.sh config-external.sh /opt/kolla/
+
 CMD ["/start.sh"]
diff --git a/docker/centos/binary/nova-controller/nova-novncproxy/config-external.sh b/docker/centos/binary/nova-controller/nova-novncproxy/config-external.sh
new file mode 120000
index 0000000000000000000000000000000000000000..8755ef4552646c6e64ccd8f9bfdbbfa621ad696e
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-novncproxy/config-external.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-novncproxy/config-external.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-novncproxy/config-internal.sh b/docker/centos/binary/nova-controller/nova-novncproxy/config-internal.sh
new file mode 120000
index 0000000000000000000000000000000000000000..ddfde08326e36bcc251f142c6913cbd833b72732
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-novncproxy/config-internal.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-novncproxy/config-internal.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-scheduler/Dockerfile b/docker/centos/binary/nova-controller/nova-scheduler/Dockerfile
index 2eec4755429bef3c90f50efa47a66bc0d4b9962a..49f34f66b06fdc3e164d81948d2ec7fa443313dd 100644
--- a/docker/centos/binary/nova-controller/nova-scheduler/Dockerfile
+++ b/docker/centos/binary/nova-controller/nova-scheduler/Dockerfile
@@ -5,4 +5,7 @@ RUN yum -y install \
         openstack-nova-scheduler && yum clean all
 
 ADD ./start.sh /start.sh
+
+COPY config-internal.sh config-external.sh /opt/kolla/
+
 CMD ["/start.sh"]
diff --git a/docker/centos/binary/nova-controller/nova-scheduler/config-external.sh b/docker/centos/binary/nova-controller/nova-scheduler/config-external.sh
new file mode 120000
index 0000000000000000000000000000000000000000..502d246b03872f22fc433414557a730cf987afef
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-scheduler/config-external.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-scheduler/config-external.sh
\ No newline at end of file
diff --git a/docker/centos/binary/nova-controller/nova-scheduler/config-internal.sh b/docker/centos/binary/nova-controller/nova-scheduler/config-internal.sh
new file mode 120000
index 0000000000000000000000000000000000000000..4b4808a79ea2d2b840c873e05d671f01b0bcb8a7
--- /dev/null
+++ b/docker/centos/binary/nova-controller/nova-scheduler/config-internal.sh
@@ -0,0 +1 @@
+../../../../common/nova-controller/nova-scheduler/config-internal.sh
\ No newline at end of file
diff --git a/docker/common/nova-controller/nova-api/config-external.sh b/docker/common/nova-controller/nova-api/config-external.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d0859893d9ac2d0201996b69f149f61ce219429d
--- /dev/null
+++ b/docker/common/nova-controller/nova-api/config-external.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+SOURCE="/opt/kolla/nova-api/nova.conf"
+TARGET="/etc/nova/nova.conf"
+OWNER="nova"
+
+if [[ -f "$SOURCE" ]]; then
+    cp $SOURCE $TARGET
+    chown ${OWNER}: $TARGET
+    chmod 0644 $TARGET
+fi
diff --git a/docker/common/nova-controller/nova-api/config-internal.sh b/docker/common/nova-controller/nova-api/config-internal.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7928370a46324521bc85bb6d0cde7800f8b22e22
--- /dev/null
+++ b/docker/common/nova-controller/nova-api/config-internal.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova.sh
+
+check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
+                    NOVA_KEYSTONE_USER NOVA_KEYSTONE_PASSWORD \
+                    ADMIN_TENANT_NAME NOVA_API_SERVICE_HOST \
+                    NOVA_EC2_API_SERVICE_HOST PUBLIC_IP NOVA_DB_NAME
+fail_unless_os_service_running keystone
+fail_unless_db $NOVA_DB_NAME
+
+export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
+export SERVICE_ENDPOINT="http://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
+
+cfg=/etc/nova/nova.conf
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_API_LOG_FILE}"
+
+crux user-create --update \
+    -n "${NOVA_KEYSTONE_USER}" \
+    -p "${NOVA_KEYSTONE_PASSWORD}" \
+    -t "${ADMIN_TENANT_NAME}" \
+    -r admin
+
+crux endpoint-create --remove-all \
+    -n ec2 -t ec2 \
+    -I "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Cloud" \
+    -P "http://${PUBLIC_IP}:8773/services/Cloud" \
+    -A "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Admin"
+
+crux endpoint-create --remove-all \
+    -n nova -t compute \
+    -I "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s" \
+    -P "http://${PUBLIC_IP}:8774/v2/\$(tenant_id)s" \
+    -A "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s"
+
+crux endpoint-create --remove-all \
+    -n novav3 -t computev3 \
+    -I "http://${NOVA_API_SERVICE_HOST}:8774/v3" \
+    -P "http://${PUBLIC_IP}:8774/v3" \
+    -A "http://${NOVA_API_SERVICE_HOST}:8774/v3"
+
+exec /usr/bin/nova-api --config-file /etc/nova/nova.conf
diff --git a/docker/common/nova-controller/nova-api/start.sh b/docker/common/nova-controller/nova-api/start.sh
index 7928370a46324521bc85bb6d0cde7800f8b22e22..0737ba0b766550282470043cb6f578ddda641255 100755
--- a/docker/common/nova-controller/nova-api/start.sh
+++ b/docker/common/nova-controller/nova-api/start.sh
@@ -1,46 +1,13 @@
 #!/bin/bash
+set -o errexit
 
-set -e
+CMD="/usr/bin/nova-api"
+ARGS=""
 
-. /opt/kolla/config-nova.sh
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
 
-check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
-                    NOVA_KEYSTONE_USER NOVA_KEYSTONE_PASSWORD \
-                    ADMIN_TENANT_NAME NOVA_API_SERVICE_HOST \
-                    NOVA_EC2_API_SERVICE_HOST PUBLIC_IP NOVA_DB_NAME
-fail_unless_os_service_running keystone
-fail_unless_db $NOVA_DB_NAME
+# Config-internal script exec out of this function, it does not return here.
+set_configs
 
-export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"
-export SERVICE_ENDPOINT="http://${KEYSTONE_ADMIN_SERVICE_HOST}:35357/v2.0"
-
-cfg=/etc/nova/nova.conf
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_API_LOG_FILE}"
-
-crux user-create --update \
-    -n "${NOVA_KEYSTONE_USER}" \
-    -p "${NOVA_KEYSTONE_PASSWORD}" \
-    -t "${ADMIN_TENANT_NAME}" \
-    -r admin
-
-crux endpoint-create --remove-all \
-    -n ec2 -t ec2 \
-    -I "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Cloud" \
-    -P "http://${PUBLIC_IP}:8773/services/Cloud" \
-    -A "http://${NOVA_EC2_API_SERVICE_HOST}:8773/services/Admin"
-
-crux endpoint-create --remove-all \
-    -n nova -t compute \
-    -I "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s" \
-    -P "http://${PUBLIC_IP}:8774/v2/\$(tenant_id)s" \
-    -A "http://${NOVA_API_SERVICE_HOST}:8774/v2/\$(tenant_id)s"
-
-crux endpoint-create --remove-all \
-    -n novav3 -t computev3 \
-    -I "http://${NOVA_API_SERVICE_HOST}:8774/v3" \
-    -P "http://${PUBLIC_IP}:8774/v3" \
-    -A "http://${NOVA_API_SERVICE_HOST}:8774/v3"
-
-exec /usr/bin/nova-api --config-file /etc/nova/nova.conf
+exec $CMD $ARGS
diff --git a/docker/common/nova-controller/nova-conductor/config-external.sh b/docker/common/nova-controller/nova-conductor/config-external.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ea3b123ec783bdbbebe1ff5e9905485c89034047
--- /dev/null
+++ b/docker/common/nova-controller/nova-conductor/config-external.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+SOURCE="/opt/kolla/nova-conductor/nova.conf"
+TARGET="/etc/nova/nova.conf"
+OWNER="nova"
+
+if [[ -f "$SOURCE" ]]; then
+    cp $SOURCE $TARGET
+    chown ${OWNER}: $TARGET
+    chmod 0644 $TARGET
+fi
diff --git a/docker/common/nova-controller/nova-conductor/config-internal.sh b/docker/common/nova-controller/nova-conductor/config-internal.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3bba8cf3a0649fe9ef6a0c4849d7e64dd158e595
--- /dev/null
+++ b/docker/common/nova-controller/nova-conductor/config-internal.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova.sh
+
+check_required_vars NOVA_DB_NAME NOVA_DB_USER NOVA_DB_PASSWORD \
+                    INIT_NOVA_DB
+fail_unless_db
+
+cfg=/etc/nova/nova.conf
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_CONDUCTOR_LOG_FILE}"
+
+if [ "${INIT_NOVA_DB}" == "true" ]; then
+    mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
+CREATE DATABASE IF NOT EXISTS ${NOVA_DB_NAME};
+GRANT ALL PRIVILEGES ON ${NOVA_DB_NAME}.* TO
+       '${NOVA_DB_USER}'@'%' IDENTIFIED BY '${NOVA_DB_PASSWORD}'
+EOF
+
+    nova-manage db sync
+fi
+
+exec /usr/bin/nova-conductor --config-file /etc/nova/nova.conf
diff --git a/docker/common/nova-controller/nova-conductor/start.sh b/docker/common/nova-controller/nova-conductor/start.sh
index 3bba8cf3a0649fe9ef6a0c4849d7e64dd158e595..e3a322719709b2d0cb02caaf78733dd2beddd21e 100755
--- a/docker/common/nova-controller/nova-conductor/start.sh
+++ b/docker/common/nova-controller/nova-conductor/start.sh
@@ -1,26 +1,20 @@
 #!/bin/bash
+set -o errexit
 
-set -e
+CMD="/usr/bin/nova-conductor"
+ARGS=""
 
-. /opt/kolla/config-nova.sh
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
 
-check_required_vars NOVA_DB_NAME NOVA_DB_USER NOVA_DB_PASSWORD \
-                    INIT_NOVA_DB
-fail_unless_db
+# Config-internal script exec out of this function, it does not return here.
+set_configs
 
-cfg=/etc/nova/nova.conf
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_CONDUCTOR_LOG_FILE}"
-
-if [ "${INIT_NOVA_DB}" == "true" ]; then
-    mysql -h ${MARIADB_SERVICE_HOST} -u root -p${DB_ROOT_PASSWORD} mysql <<EOF
-CREATE DATABASE IF NOT EXISTS ${NOVA_DB_NAME};
-GRANT ALL PRIVILEGES ON ${NOVA_DB_NAME}.* TO
-       '${NOVA_DB_USER}'@'%' IDENTIFIED BY '${NOVA_DB_PASSWORD}'
-EOF
-
-    nova-manage db sync
+# Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases
+# of the KOLLA_BOOTSTRAP variable being set, including empty.
+if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
+    su -s /bin/sh -c "nova-manage db sync" nova
+    exit 0
 fi
 
-exec /usr/bin/nova-conductor --config-file /etc/nova/nova.conf
+exec $CMD $ARGS
diff --git a/docker/common/nova-controller/nova-consoleauth/config-external.sh b/docker/common/nova-controller/nova-consoleauth/config-external.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1da10d83f26f8d25b3fc96115769b95469819a85
--- /dev/null
+++ b/docker/common/nova-controller/nova-consoleauth/config-external.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+SOURCE="/opt/kolla/nova-consoleauth/nova.conf"
+TARGET="/etc/nova/nova.conf"
+OWNER="nova"
+
+if [[ -f "$SOURCE" ]]; then
+    cp $SOURCE $TARGET
+    chown ${OWNER}: $TARGET
+    chmod 0644 $TARGET
+fi
diff --git a/docker/common/nova-controller/nova-consoleauth/config-internal.sh b/docker/common/nova-controller/nova-consoleauth/config-internal.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a1b0864ac3253e1132f31c216aa1031c0b02609f
--- /dev/null
+++ b/docker/common/nova-controller/nova-consoleauth/config-internal.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -e
+
+. /opt/kolla/config-nova.sh
+
+cfg=/etc/nova/nova.conf
+
+crudini --set $cfg DEFAULT log_file "${NOVA_CONSOLEAUTH_LOG_FILE}"
+
+echo Starting nova-consoleauth
+exec /usr/bin/nova-consoleauth
diff --git a/docker/common/nova-controller/nova-consoleauth/start.sh b/docker/common/nova-controller/nova-consoleauth/start.sh
index a1b0864ac3253e1132f31c216aa1031c0b02609f..88f1b7a6ba0e25769b52b2259938b68a2210ae10 100755
--- a/docker/common/nova-controller/nova-consoleauth/start.sh
+++ b/docker/common/nova-controller/nova-consoleauth/start.sh
@@ -1,11 +1,13 @@
 #!/bin/bash
-set -e
+set -o errexit
 
-. /opt/kolla/config-nova.sh
+CMD="/usr/bin/nova-consoleauth"
+ARGS=""
 
-cfg=/etc/nova/nova.conf
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
 
-crudini --set $cfg DEFAULT log_file "${NOVA_CONSOLEAUTH_LOG_FILE}"
+# Config-internal script exec out of this function, it does not return here.
+set_configs
 
-echo Starting nova-consoleauth
-exec /usr/bin/nova-consoleauth
+exec $CMD $ARGS
diff --git a/docker/common/nova-controller/nova-novncproxy/config-external.sh b/docker/common/nova-controller/nova-novncproxy/config-external.sh
new file mode 100755
index 0000000000000000000000000000000000000000..fdc33a5bdc46656875ec5f592ce1938e219c22cd
--- /dev/null
+++ b/docker/common/nova-controller/nova-novncproxy/config-external.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+SOURCE="/opt/kolla/nova-novncproxy/nova.conf"
+TARGET="/etc/nova/nova.conf"
+OWNER="nova"
+
+if [[ -f "$SOURCE" ]]; then
+    cp $SOURCE $TARGET
+    chown ${OWNER}: $TARGET
+    chmod 0644 $TARGET
+fi
diff --git a/docker/common/nova-controller/nova-novncproxy/config-internal.sh b/docker/common/nova-controller/nova-novncproxy/config-internal.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9edafbca340fa5fff8aa09d24b9dd87f9e0f7da9
--- /dev/null
+++ b/docker/common/nova-controller/nova-novncproxy/config-internal.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+set -e
+. /opt/kolla/kolla-common.sh
+
+cfg=/etc/nova/nova.conf
+
+check_required_vars PUBLIC_IP NOVA_NOVNC_PROXY_SERVICE_HOST NOVA_NOVNC_PROXY_PORT \
+                    NOVA_NOVNC_BASE_ADDRESS NOVA_VNCSERVER_LISTEN_ADDRESS \
+                    NOVA_VNCSERVER_PROXYCLIENT_ADDRESS
+
+crudini --set $cfg DEFAULT log_file "${NOVA_NOVNCPROXY_LOG_FILE}"
+
+# Listen on all interfaces on port $NOVA_NOVNC_PROXY_PORT for incoming novnc
+# requests.
+# The base_url is given to clients to connect to, like Horizon, so this could
+# very well be fancy DNS name.
+echo Configuring VNC...
+crudini --set $cfg DEFAULT vncserver_listen "${NOVA_VNCSERVER_LISTEN_ADDRESS}"
+crudini --set $cfg DEFAULT vncserver_proxyclient_address "${NOVA_VNCSERVER_PROXYCLIENT_ADDRESS}"
+
+echo Starting nova-novncproxy
+exec /usr/bin/nova-novncproxy
diff --git a/docker/common/nova-controller/nova-novncproxy/start.sh b/docker/common/nova-controller/nova-novncproxy/start.sh
index 9edafbca340fa5fff8aa09d24b9dd87f9e0f7da9..aec5ce7598f3a58fe35267901eb1f69c7742a157 100755
--- a/docker/common/nova-controller/nova-novncproxy/start.sh
+++ b/docker/common/nova-controller/nova-novncproxy/start.sh
@@ -1,22 +1,13 @@
 #!/bin/bash
-set -e
-. /opt/kolla/kolla-common.sh
+set -o errexit
 
-cfg=/etc/nova/nova.conf
+CMD="/usr/bin/nova-novncproxy"
+ARGS=""
 
-check_required_vars PUBLIC_IP NOVA_NOVNC_PROXY_SERVICE_HOST NOVA_NOVNC_PROXY_PORT \
-                    NOVA_NOVNC_BASE_ADDRESS NOVA_VNCSERVER_LISTEN_ADDRESS \
-                    NOVA_VNCSERVER_PROXYCLIENT_ADDRESS
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
 
-crudini --set $cfg DEFAULT log_file "${NOVA_NOVNCPROXY_LOG_FILE}"
+# Config-internal script exec out of this function, it does not return here.
+set_configs
 
-# Listen on all interfaces on port $NOVA_NOVNC_PROXY_PORT for incoming novnc
-# requests.
-# The base_url is given to clients to connect to, like Horizon, so this could
-# very well be fancy DNS name.
-echo Configuring VNC...
-crudini --set $cfg DEFAULT vncserver_listen "${NOVA_VNCSERVER_LISTEN_ADDRESS}"
-crudini --set $cfg DEFAULT vncserver_proxyclient_address "${NOVA_VNCSERVER_PROXYCLIENT_ADDRESS}"
-
-echo Starting nova-novncproxy
-exec /usr/bin/nova-novncproxy
+exec $CMD $ARGS
diff --git a/docker/common/nova-controller/nova-scheduler/config-external.sh b/docker/common/nova-controller/nova-scheduler/config-external.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3df0f9b7bb8647b7a66ac467f03896237153764d
--- /dev/null
+++ b/docker/common/nova-controller/nova-scheduler/config-external.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+SOURCE="/opt/kolla/nova-scheduler/nova.conf"
+TARGET="/etc/nova/nova.conf"
+OWNER="nova"
+
+if [[ -f "$SOURCE" ]]; then
+    cp $SOURCE $TARGET
+    chown ${OWNER}: $TARGET
+    chmod 0644 $TARGET
+fi
diff --git a/docker/common/nova-controller/nova-scheduler/config-internal.sh b/docker/common/nova-controller/nova-scheduler/config-internal.sh
new file mode 100755
index 0000000000000000000000000000000000000000..504c049edc6c4721adf5caa12f495fb6b4d34138
--- /dev/null
+++ b/docker/common/nova-controller/nova-scheduler/config-internal.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+. /opt/kolla/config-nova.sh
+
+check_required_vars NOVA_DB_NAME
+fail_unless_db $NOVA_DB_NAME
+
+cfg=/etc/nova/nova.conf
+
+# configure logging
+crudini --set $cfg DEFAULT log_file "${NOVA_SCHEDULER_LOG_FILE}"
+
+exec /usr/bin/nova-scheduler --config-file /etc/nova/nova.conf
diff --git a/docker/common/nova-controller/nova-scheduler/start.sh b/docker/common/nova-controller/nova-scheduler/start.sh
index 504c049edc6c4721adf5caa12f495fb6b4d34138..a578b95a6c6121181a2007b820f4b21f47699ab7 100755
--- a/docker/common/nova-controller/nova-scheduler/start.sh
+++ b/docker/common/nova-controller/nova-scheduler/start.sh
@@ -1,15 +1,13 @@
 #!/bin/bash
+set -o errexit
 
-set -e
+CMD="/usr/bin/nova-scheduler"
+ARGS=""
 
-. /opt/kolla/config-nova.sh
+# Loading common functions.
+source /opt/kolla/kolla-common.sh
 
-check_required_vars NOVA_DB_NAME
-fail_unless_db $NOVA_DB_NAME
+# Config-internal script exec out of this function, it does not return here.
+set_configs
 
-cfg=/etc/nova/nova.conf
-
-# configure logging
-crudini --set $cfg DEFAULT log_file "${NOVA_SCHEDULER_LOG_FILE}"
-
-exec /usr/bin/nova-scheduler --config-file /etc/nova/nova.conf
+exec $CMD $ARGS