diff --git a/contrib/demos/tacker/README.rst b/contrib/demos/tacker/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..22138c0009eb047488c5b093732f3b4d65969957
--- /dev/null
+++ b/contrib/demos/tacker/README.rst
@@ -0,0 +1,20 @@
+A Kolla Demo using Tacker
+=========================
+
+By default, the deploy script will spawn 1 Nova instance on a Neutron
+network created from the tools/init-runonce script.
+
+Then run the deploy script:
+
+::
+
+    $ ./deploy-tacker-demo
+
+After the demo is deployed, a cleanup script can be used to remove
+resources created by deploy script.
+
+To run the cleanup script:
+
+::
+
+    $ ./cleanup-tacker
diff --git a/contrib/demos/tacker/cleanup-tacker b/contrib/demos/tacker/cleanup-tacker
new file mode 100644
index 0000000000000000000000000000000000000000..781b8396f64549b1cba469b5f605e05db9f96a99
--- /dev/null
+++ b/contrib/demos/tacker/cleanup-tacker
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+echo "Deleting sample VNF"
+tacker vnf-delete kolla-sample-vnf
+while tacker vnf-list | grep -q kolla-sample-vnf; do
+    sleep 1
+done
+echo "Deleting sample VNFD"
+tacker vnfd-delete kolla-sample-vnfd
+echo "Deleting sample VIM"
+tacker vim-delete kolla-sample-vim
+echo "Removing sample config"
+rm -rf ./kolla-sample-*.yaml
diff --git a/contrib/demos/tacker/deploy-tacker-demo b/contrib/demos/tacker/deploy-tacker-demo
new file mode 100644
index 0000000000000000000000000000000000000000..eb3f13995737946642d88dbaf6a07cab639d4911
--- /dev/null
+++ b/contrib/demos/tacker/deploy-tacker-demo
@@ -0,0 +1,69 @@
+#!/bin/bash
+
+function gen_config {
+    echo "Generating sample config"
+    DEMO_NET=$(openstack network list | awk '/demo-net/ { print $2 }')
+    IMAGE_ID=$(openstack image list | awk '/cirros/ { print $2 }')
+    cat > ./kolla-sample-vim.yaml <<EOF
+auth_url: ${OS_AUTH_URL}
+username: ${OS_USERNAME}
+password: ${OS_PASSWORD}
+project_name: ${OS_PROJECT_NAME}
+project_domain_name: ${OS_PROJECT_DOMAIN_NAME}
+user_domain_name: ${OS_USER_DOMAIN_NAME}
+EOF
+    cat > ./kolla-sample-vnfd.yaml <<EOF
+tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0
+
+description: Demo example
+
+metadata:
+  template_name: sample-tosca-vnfd
+
+topology_template:
+  node_templates:
+    VDU1:
+      type: tosca.nodes.nfv.VDU.Tacker
+      capabilities:
+        nfv_compute:
+          properties:
+            num_cpus: 1
+            mem_size: 512 MB
+            disk_size: 0 GB
+      properties:
+        image: ${IMAGE_ID}
+        availability_zone: nova
+        mgmt_driver: noop
+
+    CP1:
+      type: tosca.nodes.nfv.CP.Tacker
+      properties:
+        management: true
+        order: 0
+        anti_spoofing_protection: false
+      requirements:
+        - virtualLink:
+            node: VL1
+        - virtualBinding:
+            node: VDU1
+
+    VL1:
+      type: tosca.nodes.nfv.VL
+      properties:
+        network_name: ${DEMO_NET}
+        vendor: Tacker
+EOF
+}
+
+function deploy {
+    echo "Registering sample VIM"
+    tacker vim-register --is-default --config-file ./kolla-sample-vim.yaml --description "kolla sample vim" kolla-sample-vim
+    echo "Creating sample VNFD"
+    tacker vnfd-create --vnfd-file ./kolla-sample-vnfd.yaml kolla-sample-vnfd
+    echo "Creating sample VNF"
+    VNFD_ID=$(tacker vnfd-list | awk '/kolla-sample-vnfd/ { print $2 }')
+    tacker vnf-create --vnfd-id ${VNFD_ID} kolla-sample-vnf
+}
+
+gen_config
+deploy