diff --git a/clearwater.yaml b/clearwater.yaml
index a155c60..1de2e0f 100644
--- a/clearwater.yaml
+++ b/clearwater.yaml
@@ -185,6 +185,7 @@ resources:
 
   ellis:
     type: ./ellis.yaml
+    depends_on: dns
     properties:
       public_mgmt_net_id: { get_param: public_mgmt_net_id }
       private_mgmt_net_id: { get_attr: [ mgmt_network, private_net ] }
@@ -202,6 +203,7 @@ resources:
 
   bono:
     type: OS::Heat::ResourceGroup
+    depends_on: ellis
     properties:
       count: { get_param: bono_cluster_size }
       index_var: "__index__"
@@ -229,6 +231,7 @@ resources:
 
   sprout:
     type: OS::Heat::ResourceGroup
+    depends_on: ellis
     properties:
       count: { get_param: sprout_cluster_size }
       index_var: __index__
@@ -257,6 +260,7 @@ resources:
 
   homer:
     type: OS::Heat::ResourceGroup
+    depends_on: ellis
     properties:
       count: { get_param: homer_cluster_size }
       index_var: __index__
@@ -285,6 +289,7 @@ resources:
 
   dime:
     type: OS::Heat::ResourceGroup
+    depends_on: ellis
     properties:
       count: { get_param: dime_cluster_size }
       index_var: __index__
@@ -313,6 +318,7 @@ resources:
 
   vellum:
     type: OS::Heat::ResourceGroup
+    depends_on: ellis
     properties:
       count: { get_param: vellum_cluster_size }
       index_var: __index__
diff --git a/dns.yaml b/dns.yaml
index 825ede1..3e6c938 100644
--- a/dns.yaml
+++ b/dns.yaml
@@ -91,6 +91,16 @@ resources:
       security_groups:
         - { get_param: dns_security_group }
 
+  wait_condition:
+    type: OS::Heat::WaitCondition
+    properties:
+      handle: {get_resource: wait_handle}
+      count: 1
+      timeout: 600
+
+  wait_handle:
+    type: OS::Heat::WaitConditionHandle
+
   server:
     type: OS::Nova::Server
     properties:
@@ -110,6 +120,7 @@ resources:
             __public_ip__: { get_attr: [ mgmt_floating_ip, floating_ip_address ] }
             __private_sig_ip__: { get_attr: [ sig_port, fixed_ips, 0, ip_address ] }
             __private_sig_cidr__: { get_param: private_sig_net_cidr }
+            wc_notify: { get_attr: [wait_handle, curl_cli] }
           template: |
             #!/bin/bash
 
@@ -162,6 +173,7 @@ resources:
 
             # Now that BIND configuration is correct, kick it to reload.
             service bind9 reload
+            wc_notify --data-binary '{"status": "SUCCESS"}'
 
 outputs:
   public_mgmt_ip:
diff --git a/ellis.yaml b/ellis.yaml
index 963352d..d39c235 100644
--- a/ellis.yaml
+++ b/ellis.yaml
@@ -103,6 +103,16 @@ resources:
       floating_network_id: { get_param: public_mgmt_net_id }
       port_id: { get_resource: mgmt_port }
 
+  wait_condition:
+    type: OS::Heat::WaitCondition
+    properties:
+      handle: {get_resource: wait_handle}
+      count: 1
+      timeout: 600
+
+  wait_handle:
+    type: OS::Heat::WaitConditionHandle
+
   server:
     type: OS::Nova::Server
     properties:
@@ -126,6 +136,7 @@ resources:
             __dnssec_key__: { get_param: dnssec_key }
             __etcd_ip__ : { get_param: etcd_ip }
             __index__ : { get_param: index }
+            wc_notify: { get_attr: [wait_handle, curl_cli] }
           template: |
             #!/bin/bash
 
@@ -227,6 +238,7 @@ resources:
             echo 'nameserver __dns_mgmt_ip__' > /etc/dnsmasq.resolv.conf
             echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
             service dnsmasq force-reload
+            wc_notify --data-binary '{"status": "SUCCESS"}'
 
 outputs:
   public_mgmt_ip: