diff --git a/ansible/roles/stop/tasks/copy_tools.yml b/ansible/roles/stop/tasks/copy_tools.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e6a1ec62d884759384744e3e3a45387c3c907417
--- /dev/null
+++ b/ansible/roles/stop/tasks/copy_tools.yml
@@ -0,0 +1,17 @@
+---
+- name: Creating /kolla-stop/tools directory on node
+  file:
+    state: directory
+    path: /tmp/kolla-stop/tools
+
+- name: Copying validate-docker-execute.sh file
+  copy:
+    src: ../tools/validate-docker-execute.sh
+    dest: /tmp/kolla-stop/tools
+    mode: 0755
+
+- name: Copying stop-containers file
+  copy:
+    src: ../tools/stop-containers
+    dest: /tmp/kolla-stop/tools
+    mode: 0755
diff --git a/ansible/roles/stop/tasks/main.yml b/ansible/roles/stop/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ab994d374e8280de200d3127636d1feed25fd2da
--- /dev/null
+++ b/ansible/roles/stop/tasks/main.yml
@@ -0,0 +1,4 @@
+---
+- include: copy_tools.yml
+
+- include: stop_containers.yml
diff --git a/ansible/roles/stop/tasks/stop_containers.yml b/ansible/roles/stop/tasks/stop_containers.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7b679f8c43495aeebab752054c3a7281c171fd50
--- /dev/null
+++ b/ansible/roles/stop/tasks/stop_containers.yml
@@ -0,0 +1,4 @@
+---
+- name: Stopping Kolla containers
+  command: /tmp/kolla-stop/tools/stop-containers
+
diff --git a/ansible/stop.yml b/ansible/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0ff7bf494f893d6bce6e63b9f2f6fe81731b9de1
--- /dev/null
+++ b/ansible/stop.yml
@@ -0,0 +1,4 @@
+---
+- hosts: all
+  roles:
+    - stop
diff --git a/setup.cfg b/setup.cfg
index bacc903c6819924bcb8b7d7d1c3b3e4d2195670e..610126ac0b84696a565cf0d67c6e0aab5e9efad1 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -30,6 +30,7 @@ data_files =
     share/kolla/tools = tools/cleanup-containers
     share/kolla/tools = tools/cleanup-host
     share/kolla/tools = tools/cleanup-images
+    share/kolla/tools = tools/stop-containers
     share/kolla/doc = doc/*
     share/kolla/etc_examples = etc/*
     share/kolla = tools/init-runonce
diff --git a/tools/kolla-ansible b/tools/kolla-ansible
index 16891734b28423663fc94515399e7edaad6bbb7f..fefd195218f98479d6f06285e3edfd623b98d4e0 100755
--- a/tools/kolla-ansible
+++ b/tools/kolla-ansible
@@ -50,6 +50,7 @@ Commands:
     post-deploy         Do post deploy on deploy node
     pull                Pull all images for containers (only pulls, no running container changes)
     reconfigure         Reconfigure OpenStack service
+    stop                Stop Kolla containers
     certificates        Generate self-signed certificate for TLS *For Development Only*
     upgrade             Upgrades existing OpenStack Environment
     genconfig           Generate configuration files for enabled OpenStack services
@@ -206,6 +207,10 @@ EOF
         ACTION="Reconfigure OpenStack service"
         EXTRA_OPTS="$EXTRA_OPTS -e action=reconfigure -e serial=30%"
         ;;
+(stop)
+        ACTION="Stop Kolla containers"
+        PLAYBOOK="${BASEDIR}/ansible/stop.yml"
+        ;;
 (certificates)
         ACTION="Generate TLS Certificates"
         PLAYBOOK="${BASEDIR}/ansible/certificates.yml"
diff --git a/tools/stop-containers b/tools/stop-containers
new file mode 100755
index 0000000000000000000000000000000000000000..f12c50f44ac391258830f9431f852b523b7eed5d
--- /dev/null
+++ b/tools/stop-containers
@@ -0,0 +1,18 @@
+#!/bin/bash
+if [[ $(pgrep qemu) ]]; then
+    echo "Some qemu processes were detected."
+    echo "Docker will not be able to stop the nova_libvirt container with those running."
+    echo "Please clean them up before rerunning this script."
+    exit 1
+fi
+
+if [ -n "$1" ]; then
+    containers_to_stop=($(docker ps | grep -E "$1" | awk '{print $1}'))
+else
+    containers_to_stop=$(docker ps --filter "label=kolla_version" --format "{{.Names}}" -a)
+fi
+
+echo "Stopping containers..."
+(docker stop -t 30 ${containers_to_stop} 2>&1) > /dev/null
+
+echo "All containers stopped!"