diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2
index c708f30e43..ae67807d6e 100755
--- a/dockers/docker-orchagent/Dockerfile.j2
+++ b/dockers/docker-orchagent/Dockerfile.j2
@@ -26,7 +26,7 @@ debs/{{ deb }}{{' '}}
 RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
 RUN rm -rf /debs
 
-COPY ["start.sh", "orchagent.sh", "/usr/bin/"]
+COPY ["start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"]
 COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
 COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"]
 COPY ["mirror.json.j2", "/usr/share/sonic/templates/"]
diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh
index 8afd8fab31..cdf9ea1662 100755
--- a/dockers/docker-orchagent/orchagent.sh
+++ b/dockers/docker-orchagent/orchagent.sh
@@ -1,80 +1,26 @@
 #!/usr/bin/env bash
 
-# Exit immediately upon error
-set -e
-
-function start_app {
-    orchagent $ORCHAGENT_ARGS &
-    portsyncd $PORTSYNCD_ARGS &
-    intfsyncd &
-    neighsyncd &
-    for file in $SWSSCONFIG_ARGS
-    do
-      swssconfig /etc/swss/config.d/$file
-      sleep 1
-    done
-}
-
-function config_acl {
-    if [ -f "/etc/sonic/acl.json" ]; then
-        mkdir -p /etc/swss/config.d/acl
-        rm -rf /etc/swss/config.d/acl/*
-        translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json
-        for filename in /etc/swss/config.d/acl/*.json; do
-            [ -e "$filename" ] || break
-            swssconfig $filename
-        done
-    fi
-}
-
-function clean_up {
-    pkill -9 orchagent
-    pkill -9 portsyncd
-    pkill -9 intfsyncd
-    pkill -9 neighsyncd
-    exit
-}
-
-trap clean_up SIGTERM SIGKILL
-
 HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku`
 
 MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'`
 
 ORCHAGENT_ARGS=""
 
-PORTSYNCD_ARGS="-p /usr/share/sonic/hwsku/port_config.ini"
-
-SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json "
-
 if [ "$HWSKU" == "Force10-S6000" ]; then
     ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
-    SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json "
 elif [ "$HWSKU" == "Force10-S6100" ]; then
     ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
 elif [ "$HWSKU" == "Force10-Z9100" ]; then
     ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
 elif [ "$HWSKU" == "Arista-7050-QX32" ]; then
     ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
-    SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json "
 elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then
     ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
 elif [ "$HWSKU" == "AS7512" ]; then
     ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
 elif [ "$HWSKU" == "INGRASYS-S9100-C32" ]; then
     ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
-elif [ "$HWSKU" == "ACS-MSN2700" ]; then
-    SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json "
 fi
 
-while true; do
-    # Check if syncd starts
-    result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p`
-    if [ "$result" != "0" ]; then
-        start_app
-        config_acl
-        read
-    fi
-    sleep 1
-done
+exec /usr/bin/orchagent ${ORCHAGENT_ARGS}
 
diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh
index b86a9aa1dc..823e6ce4c5 100755
--- a/dockers/docker-orchagent/start.sh
+++ b/dockers/docker-orchagent/start.sh
@@ -11,5 +11,24 @@ rm -f /var/run/rsyslogd.pid
 
 supervisorctl start rsyslogd
 
+# Wait for syncd to start
+while true; do
+    RESULT=$(echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p)
+
+    if [ "$RESULT" != "0" ]; then
+        break
+    fi
+
+    sleep 1
+done
+
 supervisorctl start orchagent
 
+supervisorctl start portsyncd
+
+supervisorctl start intfsyncd
+
+supervisorctl start neighsyncd
+
+supervisorctl start swssconfig
+
diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf
index 943233d2d4..02c07188c6 100644
--- a/dockers/docker-orchagent/supervisord.conf
+++ b/dockers/docker-orchagent/supervisord.conf
@@ -27,3 +27,35 @@ autorestart=false
 stdout_logfile=syslog
 stderr_logfile=syslog
 
+[program:portsyncd]
+command=/usr/bin/portsyncd -p /usr/share/sonic/hwsku/port_config.ini
+priority=4
+autostart=false
+autorestart=false
+stdout_logfile=syslog
+stderr_logfile=syslog
+
+[program:intfsyncd]
+command=/usr/bin/intfsyncd
+priority=5
+autostart=false
+autorestart=false
+stdout_logfile=syslog
+stderr_logfile=syslog
+
+[program:neighsyncd]
+command=/usr/bin/neighsyncd
+priority=6
+autostart=false
+autorestart=false
+stdout_logfile=syslog
+stderr_logfile=syslog
+
+[program:swssconfig]
+command=/usr/bin/swssconfig.sh
+priority=7
+autostart=false
+autorestart=false
+stdout_logfile=syslog
+stderr_logfile=syslog
+
diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh
new file mode 100755
index 0000000000..f0f1e100f3
--- /dev/null
+++ b/dockers/docker-orchagent/swssconfig.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+
+function config_acl {
+    if [ -f "/etc/sonic/acl.json" ]; then
+        mkdir -p /etc/swss/config.d/acl
+        rm -rf /etc/swss/config.d/acl/*
+        translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json
+        for filename in /etc/swss/config.d/acl/*.json; do
+            [ -e "$filename" ] || break
+            swssconfig $filename
+        done
+    fi
+}
+
+HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku`
+
+SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json "
+
+if [ "$HWSKU" == "Force10-S6000" ]; then
+    SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json "
+elif [ "$HWSKU" == "Arista-7050-QX32" ]; then
+    SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json "
+elif [ "$HWSKU" == "ACS-MSN2700" ]; then
+    SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json "
+fi
+
+for file in $SWSSCONFIG_ARGS; do
+    swssconfig /etc/swss/config.d/$file
+    sleep 1
+done
+
+config_acl
+