Blob Blame History Raw
diff --git a/cts/patterns.py b/cts/patterns.py
index e734f40..13307e5 100644
--- a/cts/patterns.py
+++ b/cts/patterns.py
@@ -180,6 +180,9 @@ class crm_cs_v0(BasePatterns):
             r"error: log_operation:.*Operation 'reboot' .* with device 'FencingFail' returned:",
             r"Child process .* terminated with signal 9",
             r"getinfo response error: 1$",
+            "sbd.* error: inquisitor_child: DEBUG MODE IS ACTIVE",
+            "sbd.* pcmk:    error: crm_ipc_read: Connection to cib_ro failed",
+            "sbd.* pcmk:    error: mainloop_gio_callback: Connection to cib_ro.* closed .I/O condition=17",
         ]
 
         self.BadNews = [
diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c
index 7423af1..baf6cb9 100644
--- a/lib/pengine/utils.c
+++ b/lib/pengine/utils.c
@@ -74,6 +74,7 @@ node_copy(node_t * this_node)
 
     crm_trace("Copying %p (%s) to %p", this_node, this_node->details->uname, new_node);
 
+    new_node->rsc_discover_mode = this_node->rsc_discover_mode;
     new_node->weight = this_node->weight;
     new_node->fixed = this_node->fixed;
     new_node->details = this_node->details;
diff --git a/lib/services/systemd.c b/lib/services/systemd.c
index 51ade44..a8bf1b4 100644
--- a/lib/services/systemd.c
+++ b/lib/services/systemd.c
@@ -461,10 +461,10 @@ systemd_async_dispatch(DBusPendingCall *pending, void *user_data)
 
     if(op) {
         crm_trace("Got result: %p for %p for %s, %s", reply, pending, op->rsc, op->action);
+        op->opaque->pending = NULL;
     } else {
         crm_trace("Got result: %p for %p", reply, pending);
     }
-    op->opaque->pending = NULL;
     systemd_exec_result(reply, op);
 
     if(pending) {
diff --git a/pengine/allocate.c b/pengine/allocate.c
index e708e26..45e2212 100644
--- a/pengine/allocate.c
+++ b/pengine/allocate.c
@@ -948,6 +948,28 @@ probe_resources(pe_working_set_t * data_set)
     return TRUE;
 }
 
+static void
+rsc_discover_filter(resource_t *rsc, node_t *node)
+{
+    GListPtr gIter = rsc->children;
+    resource_t *top = uber_parent(rsc);
+    node_t *match;
+
+    if (rsc->exclusive_discover == FALSE && top->exclusive_discover == FALSE) {
+        return;
+    }
+
+    for (; gIter != NULL; gIter = gIter->next) {
+        resource_t *child_rsc = (resource_t *) gIter->data;
+        rsc_discover_filter(child_rsc, node);
+    }
+
+    match = g_hash_table_lookup(rsc->allowed_nodes, node->details->id);
+    if (match && match->rsc_discover_mode != discover_exclusive) {
+        match->weight = -INFINITY;
+    }
+}
+
 /*
  * Count how many valid nodes we have (so we know the maximum number of
  *  colors we can resolve).
@@ -986,6 +1008,7 @@ stage2(pe_working_set_t * data_set)
             resource_t *rsc = (resource_t *) gIter2->data;
 
             common_apply_stickiness(rsc, node, data_set);
+            rsc_discover_filter(rsc, node);
         }
     }
 
diff --git a/pengine/native.c b/pengine/native.c
index 3dca702..6d62010 100644
--- a/pengine/native.c
+++ b/pengine/native.c
@@ -2103,6 +2103,9 @@ native_rsc_location(resource_t * rsc, rsc_to_node_t * constraint)
         }
 
         if (other_node->rsc_discover_mode < constraint->discover_mode) {
+            if (constraint->discover_mode == discover_exclusive) {
+                rsc->exclusive_discover = TRUE;
+            }
             /* exclusive > never > always... always is default */
             other_node->rsc_discover_mode = constraint->discover_mode;
         }
diff --git a/pengine/test10/resource-discovery.dot b/pengine/test10/resource-discovery.dot
index efb2434..5b1aab9 100644
--- a/pengine/test10/resource-discovery.dot
+++ b/pengine/test10/resource-discovery.dot
@@ -1,41 +1,26 @@
  digraph "g" {
-"FAKE1_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
-"FAKE1_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
-"FAKE1_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
-"FAKE1_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
-"FAKE1_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
-"FAKE1_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
-"FAKE1_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
-"FAKE1_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
 "FAKE1_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
 "FAKE1_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
-"FAKE1_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
-"FAKE1_start_0 18node2" -> "FAKE1_monitor_60000 18node2" [ style = bold]
-"FAKE1_start_0 18node2" [ style=bold color="green" fontcolor="black"]
-"FAKE2_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
-"FAKE2_start_0 18node3" -> "FAKE2_monitor_60000 18node3" [ style = bold]
-"FAKE2_start_0 18node3" [ style=bold color="green" fontcolor="black"]
-"FAKE2_stop_0 18node2" -> "FAKE2_start_0 18node3" [ style = bold]
-"FAKE2_stop_0 18node2" -> "all_stopped" [ style = bold]
-"FAKE2_stop_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE1_start_0 18node4" -> "FAKE1_monitor_60000 18node4" [ style = bold]
+"FAKE1_start_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE2_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKE2_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE2_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKE2_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE2_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE2_start_0 18node2" -> "FAKE2_monitor_60000 18node2" [ style = bold]
+"FAKE2_start_0 18node2" [ style=bold color="green" fontcolor="black"]
 "FAKE3_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
 "FAKE3_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
 "FAKE3_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
 "FAKE3_start_0 18node3" -> "FAKE3_monitor_60000 18node3" [ style = bold]
 "FAKE3_start_0 18node3" [ style=bold color="green" fontcolor="black"]
-"FAKE3_stop_0 18builder" -> "FAKE3_start_0 18node3" [ style = bold]
-"FAKE3_stop_0 18builder" -> "all_stopped" [ style = bold]
-"FAKE3_stop_0 18builder" [ style=bold color="green" fontcolor="black"]
 "FAKE4_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
 "FAKE4_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
 "FAKE4_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
 "FAKE4_start_0 18node4" -> "FAKE4_monitor_60000 18node4" [ style = bold]
 "FAKE4_start_0 18node4" [ style=bold color="green" fontcolor="black"]
-"FAKE4_stop_0 18node1" -> "FAKE4_start_0 18node4" [ style = bold]
-"FAKE4_stop_0 18node1" -> "all_stopped" [ style = bold]
-"FAKE4_stop_0 18node1" [ style=bold color="green" fontcolor="black"]
-"FAKE5_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
-"FAKE5_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
 "FAKE5_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
 "FAKE5_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
 "FAKE5_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
@@ -49,56 +34,54 @@
 "FAKE5_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
 "FAKE5_start_0 remote1" -> "FAKE5_monitor_60000 remote1" [ style = bold]
 "FAKE5_start_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKE6_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKE6_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE6_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKE6_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE6_monitor_10000 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE6_start_0 18node1" -> "FAKE6_monitor_10000 18node1" [ style = bold]
+"FAKE6_start_0 18node1" -> "FAKE7_start_0 18node1" [ style = bold]
+"FAKE6_start_0 18node1" -> "FAKEGROUP_running_0" [ style = bold]
+"FAKE6_start_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE7_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKE7_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE7_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKE7_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE7_monitor_10000 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE7_start_0 18node1" -> "FAKE7_monitor_10000 18node1" [ style = bold]
+"FAKE7_start_0 18node1" -> "FAKEGROUP_running_0" [ style = bold]
+"FAKE7_start_0 18node1" [ style=bold color="green" fontcolor="black"]
 "FAKECLONE1-clone_running_0" [ style=bold color="green" fontcolor="orange"]
 "FAKECLONE1-clone_start_0" -> "FAKECLONE1-clone_running_0" [ style = bold]
-"FAKECLONE1-clone_start_0" -> "FAKECLONE1:0_start_0 18builder" [ style = bold]
-"FAKECLONE1-clone_start_0" -> "FAKECLONE1:1_start_0 18node1" [ style = bold]
-"FAKECLONE1-clone_start_0" -> "FAKECLONE1:2_start_0 18node2" [ style = bold]
-"FAKECLONE1-clone_start_0" -> "FAKECLONE1:3_start_0 18node4" [ style = bold]
-"FAKECLONE1-clone_start_0" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
-"FAKECLONE1-clone_start_0" -> "FAKECLONE1:5_start_0 18node3" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:0_start_0 18node1" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:1_start_0 remote1" [ style = bold]
 "FAKECLONE1-clone_start_0" [ style=bold color="green" fontcolor="orange"]
-"FAKECLONE1:0_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:0_start_0 18builder" -> "FAKECLONE1-clone_running_0" [ style = bold]
-"FAKECLONE1:0_start_0 18builder" -> "FAKECLONE1:0_monitor_60000 18builder" [ style = bold]
-"FAKECLONE1:0_start_0 18builder" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:1_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:1_start_0 18node1" -> "FAKECLONE1-clone_running_0" [ style = bold]
-"FAKECLONE1:1_start_0 18node1" -> "FAKECLONE1:1_monitor_60000 18node1" [ style = bold]
-"FAKECLONE1:1_start_0 18node1" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:2_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:2_start_0 18node2" -> "FAKECLONE1-clone_running_0" [ style = bold]
-"FAKECLONE1:2_start_0 18node2" -> "FAKECLONE1:2_monitor_60000 18node2" [ style = bold]
-"FAKECLONE1:2_start_0 18node2" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:3_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:3_start_0 18node4" -> "FAKECLONE1-clone_running_0" [ style = bold]
-"FAKECLONE1:3_start_0 18node4" -> "FAKECLONE1:3_monitor_60000 18node4" [ style = bold]
-"FAKECLONE1:3_start_0 18node4" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:4_monitor_0 remote1" -> "probe_complete remote1" [ style = bold]
-"FAKECLONE1:4_monitor_0 remote1" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:4_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:4_start_0 remote1" -> "FAKECLONE1-clone_running_0" [ style = bold]
-"FAKECLONE1:4_start_0 remote1" -> "FAKECLONE1:4_monitor_60000 remote1" [ style = bold]
-"FAKECLONE1:4_start_0 remote1" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:5_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE1:5_start_0 18node3" -> "FAKECLONE1-clone_running_0" [ style = bold]
-"FAKECLONE1:5_start_0 18node3" -> "FAKECLONE1:5_monitor_60000 18node3" [ style = bold]
-"FAKECLONE1:5_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:0_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKECLONE1:0_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:0_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:0_start_0 18node1" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:0_start_0 18node1" -> "FAKECLONE1:0_monitor_60000 18node1" [ style = bold]
+"FAKECLONE1:0_start_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_monitor_0 remote1" -> "probe_complete remote1" [ style = bold]
+"FAKECLONE1:1_monitor_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_start_0 remote1" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:1_start_0 remote1" -> "FAKECLONE1:1_monitor_60000 remote1" [ style = bold]
+"FAKECLONE1:1_start_0 remote1" [ style=bold color="green" fontcolor="black"]
 "FAKECLONE2-clone_running_0" [ style=bold color="green" fontcolor="orange"]
 "FAKECLONE2-clone_start_0" -> "FAKECLONE2-clone_running_0" [ style = bold]
-"FAKECLONE2-clone_start_0" -> "FAKECLONE2:0_start_0 18builder" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:0_start_0 18node3" [ style = bold]
 "FAKECLONE2-clone_start_0" -> "FAKECLONE2:1_start_0 18node1" [ style = bold]
 "FAKECLONE2-clone_start_0" -> "FAKECLONE2:2_start_0 18node2" [ style = bold]
 "FAKECLONE2-clone_start_0" -> "FAKECLONE2:3_start_0 18node4" [ style = bold]
 "FAKECLONE2-clone_start_0" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
-"FAKECLONE2-clone_start_0" -> "FAKECLONE2:5_start_0 18node3" [ style = bold]
 "FAKECLONE2-clone_start_0" [ style=bold color="green" fontcolor="orange"]
-"FAKECLONE2:0_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
-"FAKECLONE2:0_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE2:0_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE2:0_start_0 18builder" -> "FAKECLONE2-clone_running_0" [ style = bold]
-"FAKECLONE2:0_start_0 18builder" -> "FAKECLONE2:0_monitor_60000 18builder" [ style = bold]
-"FAKECLONE2:0_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:0_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKECLONE2:0_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:0_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:0_start_0 18node3" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:0_start_0 18node3" -> "FAKECLONE2:0_monitor_60000 18node3" [ style = bold]
+"FAKECLONE2:0_start_0 18node3" [ style=bold color="green" fontcolor="black"]
 "FAKECLONE2:1_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
 "FAKECLONE2:1_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
 "FAKECLONE2:1_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
@@ -121,15 +104,11 @@
 "FAKECLONE2:4_start_0 remote1" -> "FAKECLONE2-clone_running_0" [ style = bold]
 "FAKECLONE2:4_start_0 remote1" -> "FAKECLONE2:4_monitor_60000 remote1" [ style = bold]
 "FAKECLONE2:4_start_0 remote1" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE2:5_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
-"FAKECLONE2:5_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE2:5_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
-"FAKECLONE2:5_start_0 18node3" -> "FAKECLONE2-clone_running_0" [ style = bold]
-"FAKECLONE2:5_start_0 18node3" -> "FAKECLONE2:5_monitor_60000 18node3" [ style = bold]
-"FAKECLONE2:5_start_0 18node3" [ style=bold color="green" fontcolor="black"]
-"all_stopped" [ style=bold color="green" fontcolor="orange"]
-"probe_complete 18builder" -> "probe_nodes_complete" [ style = bold]
-"probe_complete 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKEGROUP_running_0" [ style=bold color="green" fontcolor="orange"]
+"FAKEGROUP_start_0" -> "FAKE6_start_0 18node1" [ style = bold]
+"FAKEGROUP_start_0" -> "FAKE7_start_0 18node1" [ style = bold]
+"FAKEGROUP_start_0" -> "FAKEGROUP_running_0" [ style = bold]
+"FAKEGROUP_start_0" [ style=bold color="green" fontcolor="orange"]
 "probe_complete 18node1" -> "probe_nodes_complete" [ style = bold]
 "probe_complete 18node1" [ style=bold color="green" fontcolor="black"]
 "probe_complete 18node2" -> "probe_nodes_complete" [ style = bold]
@@ -140,46 +119,53 @@
 "probe_complete 18node4" [ style=bold color="green" fontcolor="black"]
 "probe_complete remote1" -> "probe_complete" [ style = bold]
 "probe_complete remote1" [ style=bold color="green" fontcolor="black"]
-"probe_complete" -> "FAKE1_start_0 18node2" [ style = bold]
-"probe_complete" -> "FAKE2_stop_0 18node2" [ style = bold]
+"probe_complete" -> "FAKE1_start_0 18node4" [ style = bold]
+"probe_complete" -> "FAKE2_start_0 18node2" [ style = bold]
 "probe_complete" -> "FAKE3_start_0 18node3" [ style = bold]
-"probe_complete" -> "FAKE3_stop_0 18builder" [ style = bold]
 "probe_complete" -> "FAKE4_start_0 18node4" [ style = bold]
-"probe_complete" -> "FAKE4_stop_0 18node1" [ style = bold]
 "probe_complete" -> "FAKE5_start_0 remote1" [ style = bold]
-"probe_complete" -> "FAKECLONE1:0_start_0 18builder" [ style = bold]
-"probe_complete" -> "FAKECLONE1:1_start_0 18node1" [ style = bold]
-"probe_complete" -> "FAKECLONE1:2_start_0 18node2" [ style = bold]
-"probe_complete" -> "FAKECLONE1:3_start_0 18node4" [ style = bold]
-"probe_complete" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
-"probe_complete" -> "FAKECLONE1:5_start_0 18node3" [ style = bold]
-"probe_complete" -> "FAKECLONE2:0_start_0 18builder" [ style = bold]
+"probe_complete" -> "FAKE6_start_0 18node1" [ style = bold]
+"probe_complete" -> "FAKE7_start_0 18node1" [ style = bold]
+"probe_complete" -> "FAKECLONE1:0_start_0 18node1" [ style = bold]
+"probe_complete" -> "FAKECLONE1:1_start_0 remote1" [ style = bold]
+"probe_complete" -> "FAKECLONE2:0_start_0 18node3" [ style = bold]
 "probe_complete" -> "FAKECLONE2:1_start_0 18node1" [ style = bold]
 "probe_complete" -> "FAKECLONE2:2_start_0 18node2" [ style = bold]
 "probe_complete" -> "FAKECLONE2:3_start_0 18node4" [ style = bold]
 "probe_complete" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
-"probe_complete" -> "FAKECLONE2:5_start_0 18node3" [ style = bold]
+"probe_complete" -> "shooter_start_0 18node2" [ style = bold]
 "probe_complete" [ style=bold color="green" fontcolor="orange"]
-"probe_nodes_complete" -> "remote1_start_0 18builder" [ style = bold]
+"probe_nodes_complete" -> "remote1_start_0 18node1" [ style = bold]
 "probe_nodes_complete" [ style=bold color="green" fontcolor="orange"]
+"remote1_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"remote1_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"remote1_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"remote1_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
 "remote1_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
 "remote1_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
 "remote1_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
 "remote1_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
-"remote1_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
-"remote1_start_0 18builder" -> "FAKE5_monitor_0 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKE5_monitor_60000 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKE5_start_0 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKECLONE1:4_monitor_0 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKECLONE1:4_monitor_60000 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKECLONE2:4_monitor_0 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKECLONE2:4_monitor_60000 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
-"remote1_start_0 18builder" -> "remote1_monitor_60000 18builder" [ style = bold]
-"remote1_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"remote1_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
+"remote1_start_0 18node1" -> "FAKE5_monitor_0 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKE5_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKE5_start_0 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKECLONE1:1_monitor_0 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKECLONE1:1_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKECLONE1:1_start_0 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKECLONE2:4_monitor_0 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKECLONE2:4_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
+"remote1_start_0 18node1" -> "remote1_monitor_60000 18node1" [ style = bold]
+"remote1_start_0 18node1" [ style=bold color="green" fontcolor="black"]
+"shooter_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"shooter_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"shooter_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"shooter_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
 "shooter_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
 "shooter_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
 "shooter_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
 "shooter_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"shooter_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"shooter_start_0 18node2" -> "shooter_monitor_60000 18node2" [ style = bold]
+"shooter_start_0 18node2" [ style=bold color="green" fontcolor="black"]
 }
diff --git a/pengine/test10/resource-discovery.exp b/pengine/test10/resource-discovery.exp
index 2770f4e..5459bd7 100644
--- a/pengine/test10/resource-discovery.exp
+++ b/pengine/test10/resource-discovery.exp
@@ -1,52 +1,52 @@
 <transition_graph cluster-delay="60s" stonith-timeout="60s" failed-stop-offset="INFINITY" failed-start-offset="INFINITY"  transition_id="0">
   <synapse id="0">
     <action_set>
-      <rsc_op id="27" operation="monitor" operation_key="shooter_monitor_0" on_node="18node4" on_node_uuid="4">
+      <rsc_op id="38" operation="monitor" operation_key="shooter_monitor_60000" on_node="18node2" on_node_uuid="2">
         <primitive id="shooter" class="stonith" type="fence_xvm"/>
-        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+        <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs/>
+    <inputs>
+      <trigger>
+        <rsc_op id="37" operation="start" operation_key="shooter_start_0" on_node="18node2" on_node_uuid="2"/>
+      </trigger>
+    </inputs>
   </synapse>
   <synapse id="1">
     <action_set>
-      <rsc_op id="20" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3">
+      <rsc_op id="37" operation="start" operation_key="shooter_start_0" on_node="18node2" on_node_uuid="2">
         <primitive id="shooter" class="stonith" type="fence_xvm"/>
-        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+        <attributes CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs/>
+    <inputs>
+      <trigger>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
+      </trigger>
+    </inputs>
   </synapse>
   <synapse id="2">
     <action_set>
-      <rsc_op id="40" operation="monitor" operation_key="remote1_monitor_60000" on_node="18builder" on_node_uuid="5">
-        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
-        <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+      <rsc_op id="27" operation="monitor" operation_key="shooter_monitor_0" on_node="18node4" on_node_uuid="4">
+        <primitive id="shooter" class="stonith" type="fence_xvm"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs>
-      <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-    </inputs>
+    <inputs/>
   </synapse>
   <synapse id="3">
     <action_set>
-      <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5">
-        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
-        <attributes CRM_meta_timeout="20000" />
+      <rsc_op id="21" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3">
+        <primitive id="shooter" class="stonith" type="fence_xvm"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs>
-      <trigger>
-        <pseudo_event id="7" operation="probe_nodes_complete" operation_key="probe_nodes_complete"/>
-      </trigger>
-    </inputs>
+    <inputs/>
   </synapse>
   <synapse id="4">
     <action_set>
-      <rsc_op id="28" operation="monitor" operation_key="remote1_monitor_0" on_node="18node4" on_node_uuid="4">
-        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+      <rsc_op id="14" operation="monitor" operation_key="shooter_monitor_0" on_node="18node2" on_node_uuid="2">
+        <primitive id="shooter" class="stonith" type="fence_xvm"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
@@ -54,8 +54,8 @@
   </synapse>
   <synapse id="5">
     <action_set>
-      <rsc_op id="21" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3">
-        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+      <rsc_op id="5" operation="monitor" operation_key="shooter_monitor_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="shooter" class="stonith" type="fence_xvm"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
@@ -63,34 +63,34 @@
   </synapse>
   <synapse id="6">
     <action_set>
-      <rsc_op id="42" operation="monitor" operation_key="FAKE1_monitor_60000" on_node="18node2" on_node_uuid="2">
-        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+      <rsc_op id="40" operation="monitor" operation_key="remote1_monitor_60000" on_node="18node1" on_node_uuid="1">
+        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
         <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="41" operation="start" operation_key="FAKE1_start_0" on_node="18node2" on_node_uuid="2"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="7">
     <action_set>
-      <rsc_op id="41" operation="start" operation_key="FAKE1_start_0" on_node="18node2" on_node_uuid="2">
-        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+      <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
         <attributes CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="3" operation="probe_nodes_complete" operation_key="probe_nodes_complete"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="8">
     <action_set>
-      <rsc_op id="29" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+      <rsc_op id="28" operation="monitor" operation_key="remote1_monitor_0" on_node="18node4" on_node_uuid="4">
+        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
@@ -98,8 +98,8 @@
   </synapse>
   <synapse id="9">
     <action_set>
-      <rsc_op id="22" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+      <rsc_op id="22" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3">
+        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
@@ -107,8 +107,8 @@
   </synapse>
   <synapse id="10">
     <action_set>
-      <rsc_op id="17" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node2" on_node_uuid="2">
-        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+      <rsc_op id="15" operation="monitor" operation_key="remote1_monitor_0" on_node="18node2" on_node_uuid="2">
+        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
@@ -116,8 +116,8 @@
   </synapse>
   <synapse id="11">
     <action_set>
-      <rsc_op id="13" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node1" on_node_uuid="1">
-        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+      <rsc_op id="6" operation="monitor" operation_key="remote1_monitor_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
@@ -125,95 +125,110 @@
   </synapse>
   <synapse id="12">
     <action_set>
-      <rsc_op id="9" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18builder" on_node_uuid="5">
+      <rsc_op id="42" operation="monitor" operation_key="FAKE1_monitor_60000" on_node="18node4" on_node_uuid="4">
         <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
-      </rsc_op>
-    </action_set>
-    <inputs/>
-  </synapse>
-  <synapse id="13">
-    <action_set>
-      <rsc_op id="45" operation="monitor" operation_key="FAKE2_monitor_60000" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="44" operation="start" operation_key="FAKE2_start_0" on_node="18node3" on_node_uuid="3"/>
+        <rsc_op id="41" operation="start" operation_key="FAKE1_start_0" on_node="18node4" on_node_uuid="4"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="14">
+  <synapse id="13">
     <action_set>
-      <rsc_op id="44" operation="start" operation_key="FAKE2_start_0" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+      <rsc_op id="41" operation="start" operation_key="FAKE1_start_0" on_node="18node4" on_node_uuid="4">
+        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="43" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
     </inputs>
   </synapse>
+  <synapse id="14">
+    <action_set>
+      <rsc_op id="29" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node4" on_node_uuid="4">
+        <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      </rsc_op>
+    </action_set>
+    <inputs/>
+  </synapse>
   <synapse id="15">
     <action_set>
-      <rsc_op id="43" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2">
+      <rsc_op id="44" operation="monitor" operation_key="FAKE2_monitor_60000" on_node="18node2" on_node_uuid="2">
         <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_timeout="20000" />
+        <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <rsc_op id="43" operation="start" operation_key="FAKE2_start_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="16">
     <action_set>
-      <rsc_op id="48" operation="monitor" operation_key="FAKE3_monitor_60000" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+      <rsc_op id="43" operation="start" operation_key="FAKE2_start_0" on_node="18node2" on_node_uuid="2">
+        <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="47" operation="start" operation_key="FAKE3_start_0" on_node="18node3" on_node_uuid="3"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="17">
     <action_set>
-      <rsc_op id="47" operation="start" operation_key="FAKE3_start_0" on_node="18node3" on_node_uuid="3">
+      <rsc_op id="16" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node2" on_node_uuid="2">
+        <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      </rsc_op>
+    </action_set>
+    <inputs/>
+  </synapse>
+  <synapse id="18">
+    <action_set>
+      <rsc_op id="7" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      </rsc_op>
+    </action_set>
+    <inputs/>
+  </synapse>
+  <synapse id="19">
+    <action_set>
+      <rsc_op id="46" operation="monitor" operation_key="FAKE3_monitor_60000" on_node="18node3" on_node_uuid="3">
         <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_timeout="20000" />
+        <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="46" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="45" operation="start" operation_key="FAKE3_start_0" on_node="18node3" on_node_uuid="3"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="18">
+  <synapse id="20">
     <action_set>
-      <rsc_op id="46" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5">
+      <rsc_op id="45" operation="start" operation_key="FAKE3_start_0" on_node="18node3" on_node_uuid="3">
         <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="19">
+  <synapse id="21">
     <action_set>
       <rsc_op id="23" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node3" on_node_uuid="3">
         <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
@@ -222,49 +237,33 @@
     </action_set>
     <inputs/>
   </synapse>
-  <synapse id="20">
+  <synapse id="22">
     <action_set>
-      <rsc_op id="51" operation="monitor" operation_key="FAKE4_monitor_60000" on_node="18node4" on_node_uuid="4">
+      <rsc_op id="48" operation="monitor" operation_key="FAKE4_monitor_60000" on_node="18node4" on_node_uuid="4">
         <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="50" operation="start" operation_key="FAKE4_start_0" on_node="18node4" on_node_uuid="4"/>
+        <rsc_op id="47" operation="start" operation_key="FAKE4_start_0" on_node="18node4" on_node_uuid="4"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="21">
-    <action_set>
-      <rsc_op id="50" operation="start" operation_key="FAKE4_start_0" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_timeout="20000" />
-      </rsc_op>
-    </action_set>
-    <inputs>
-      <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="49" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1"/>
-      </trigger>
-    </inputs>
-  </synapse>
-  <synapse id="22">
+  <synapse id="23">
     <action_set>
-      <rsc_op id="49" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1">
+      <rsc_op id="47" operation="start" operation_key="FAKE4_start_0" on_node="18node4" on_node_uuid="4">
         <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="23">
+  <synapse id="24">
     <action_set>
       <rsc_op id="30" operation="monitor" operation_key="FAKE4_monitor_0" on_node="18node4" on_node_uuid="4">
         <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
@@ -273,63 +272,54 @@
     </action_set>
     <inputs/>
   </synapse>
-  <synapse id="24">
+  <synapse id="25">
     <action_set>
-      <rsc_op id="53" operation="monitor" operation_key="FAKE5_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+      <rsc_op id="50" operation="monitor" operation_key="FAKE5_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
         <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="52" operation="start" operation_key="FAKE5_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="49" operation="start" operation_key="FAKE5_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="25">
+  <synapse id="26">
     <action_set>
-      <rsc_op id="52" operation="start" operation_key="FAKE5_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+      <rsc_op id="49" operation="start" operation_key="FAKE5_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
         <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="26">
+  <synapse id="27">
     <action_set>
-      <rsc_op id="34" operation="monitor" operation_key="FAKE5_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+      <rsc_op id="34" operation="monitor" operation_key="FAKE5_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
         <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="27">
-    <action_set>
-      <rsc_op id="31" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
-      </rsc_op>
-    </action_set>
-    <inputs/>
-  </synapse>
   <synapse id="28">
     <action_set>
-      <rsc_op id="24" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node3" on_node_uuid="3">
+      <rsc_op id="31" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node4" on_node_uuid="4">
         <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
@@ -338,7 +328,7 @@
   </synapse>
   <synapse id="29">
     <action_set>
-      <rsc_op id="18" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2">
+      <rsc_op id="24" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node3" on_node_uuid="3">
         <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
@@ -347,7 +337,7 @@
   </synapse>
   <synapse id="30">
     <action_set>
-      <rsc_op id="14" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1">
+      <rsc_op id="17" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2">
         <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
@@ -356,7 +346,7 @@
   </synapse>
   <synapse id="31">
     <action_set>
-      <rsc_op id="10" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18builder" on_node_uuid="5">
+      <rsc_op id="8" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1">
         <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
         <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
@@ -365,517 +355,480 @@
   </synapse>
   <synapse id="32">
     <action_set>
-      <rsc_op id="55" operation="monitor" operation_key="FAKECLONE1:0_monitor_60000" on_node="18builder" on_node_uuid="5">
+      <rsc_op id="52" operation="monitor" operation_key="FAKECLONE1:0_monitor_60000" on_node="18node1" on_node_uuid="1">
         <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+        <attributes CRM_meta_clone="0" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="54" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="51" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="33">
     <action_set>
-      <rsc_op id="54" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18builder" on_node_uuid="5">
+      <rsc_op id="51" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18node1" on_node_uuid="1">
         <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+        <attributes CRM_meta_clone="0" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+        <pseudo_event id="55" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="34">
     <action_set>
-      <rsc_op id="57" operation="monitor" operation_key="FAKECLONE1:1_monitor_60000" on_node="18node1" on_node_uuid="1">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="9" operation="monitor" operation_key="FAKECLONE1:0_monitor_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="0" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs>
-      <trigger>
-        <rsc_op id="56" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node1" on_node_uuid="1"/>
-      </trigger>
-    </inputs>
+    <inputs/>
   </synapse>
   <synapse id="35">
     <action_set>
-      <rsc_op id="56" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node1" on_node_uuid="1">
+      <rsc_op id="54" operation="monitor" operation_key="FAKECLONE1:1_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
         <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+        <attributes CRM_meta_clone="1" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+        <rsc_op id="53" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="36">
     <action_set>
-      <rsc_op id="59" operation="monitor" operation_key="FAKECLONE1:2_monitor_60000" on_node="18node2" on_node_uuid="2">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:2" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="53" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
+        <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="1" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="58" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node2" on_node_uuid="2"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
-    </inputs>
-  </synapse>
-  <synapse id="37">
-    <action_set>
-      <rsc_op id="58" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node2" on_node_uuid="2">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:2" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </rsc_op>
-    </action_set>
-    <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+        <pseudo_event id="55" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="38">
+  <synapse id="37">
     <action_set>
-      <rsc_op id="61" operation="monitor" operation_key="FAKECLONE1:3_monitor_60000" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:3" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="35" operation="monitor" operation_key="FAKECLONE1:1_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
+        <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="1" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="60" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="39">
+  <synapse id="38" priority="1000000">
     <action_set>
-      <rsc_op id="60" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:3" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </rsc_op>
+      <pseudo_event id="56" operation="running" operation_key="FAKECLONE1-clone_running_0">
+        <attributes CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      </pseudo_event>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <rsc_op id="51" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+        <rsc_op id="53" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
+      </trigger>
+      <trigger>
+        <pseudo_event id="55" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
+  <synapse id="39">
+    <action_set>
+      <pseudo_event id="55" operation="start" operation_key="FAKECLONE1-clone_start_0">
+        <attributes CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      </pseudo_event>
+    </action_set>
+    <inputs/>
+  </synapse>
   <synapse id="40">
     <action_set>
-      <rsc_op id="63" operation="monitor" operation_key="FAKECLONE1:4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="60" operation="monitor" operation_key="FAKECLONE2:0_monitor_60000" on_node="18node3" on_node_uuid="3">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="0" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="62" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="59" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18node3" on_node_uuid="3"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="41">
     <action_set>
-      <rsc_op id="62" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="59" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18node3" on_node_uuid="3">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="0" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-      <trigger>
-        <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+        <pseudo_event id="69" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="42">
     <action_set>
-      <rsc_op id="35" operation="monitor" operation_key="FAKECLONE1:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      <rsc_op id="25" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18node3" on_node_uuid="3">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="0" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs>
-      <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-    </inputs>
+    <inputs/>
   </synapse>
   <synapse id="43">
     <action_set>
-      <rsc_op id="65" operation="monitor" operation_key="FAKECLONE1:5_monitor_60000" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:5" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="62" operation="monitor" operation_key="FAKECLONE2:1_monitor_60000" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="1" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="64" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18node3" on_node_uuid="3"/>
+        <rsc_op id="61" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="44">
     <action_set>
-      <rsc_op id="64" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKECLONE1" long-id="FAKECLONE1:5" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="61" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="1" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+        <pseudo_event id="69" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="45" priority="1000000">
+  <synapse id="45">
     <action_set>
-      <pseudo_event id="67" operation="running" operation_key="FAKECLONE1-clone_running_0">
-        <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </pseudo_event>
+      <rsc_op id="10" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="1" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      </rsc_op>
+    </action_set>
+    <inputs/>
+  </synapse>
+  <synapse id="46">
+    <action_set>
+      <rsc_op id="64" operation="monitor" operation_key="FAKECLONE2:2_monitor_60000" on_node="18node2" on_node_uuid="2">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="2" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="54" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="56" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node1" on_node_uuid="1"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="58" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node2" on_node_uuid="2"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="60" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="62" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="63" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
+    </inputs>
+  </synapse>
+  <synapse id="47">
+    <action_set>
+      <rsc_op id="63" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="2" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      </rsc_op>
+    </action_set>
+    <inputs>
       <trigger>
-        <rsc_op id="64" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18node3" on_node_uuid="3"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+        <pseudo_event id="69" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="46">
-    <action_set>
-      <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0">
-        <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </pseudo_event>
-    </action_set>
-    <inputs/>
-  </synapse>
-  <synapse id="47">
+  <synapse id="48">
     <action_set>
-      <rsc_op id="71" operation="monitor" operation_key="FAKECLONE2:0_monitor_60000" on_node="18builder" on_node_uuid="5">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="66" operation="monitor" operation_key="FAKECLONE2:3_monitor_60000" on_node="18node4" on_node_uuid="4">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="3" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="70" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="65" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="48">
+  <synapse id="49">
     <action_set>
-      <rsc_op id="70" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18builder" on_node_uuid="5">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="65" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="3" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+        <pseudo_event id="69" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="49">
+  <synapse id="50">
     <action_set>
-      <rsc_op id="11" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18builder" on_node_uuid="5">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      <rsc_op id="32" operation="monitor" operation_key="FAKECLONE2:3_monitor_0" on_node="18node4" on_node_uuid="4">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="3" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs/>
   </synapse>
-  <synapse id="50">
+  <synapse id="51">
     <action_set>
-      <rsc_op id="73" operation="monitor" operation_key="FAKECLONE2:1_monitor_60000" on_node="18node1" on_node_uuid="1">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="68" operation="monitor" operation_key="FAKECLONE2:4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="4" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="72" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="67" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="51">
+  <synapse id="52">
     <action_set>
-      <rsc_op id="72" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="67" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="4" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+        <pseudo_event id="69" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="52">
-    <action_set>
-      <rsc_op id="15" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node1" on_node_uuid="1">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
-      </rsc_op>
-    </action_set>
-    <inputs/>
-  </synapse>
   <synapse id="53">
     <action_set>
-      <rsc_op id="75" operation="monitor" operation_key="FAKECLONE2:2_monitor_60000" on_node="18node2" on_node_uuid="2">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="36" operation="monitor" operation_key="FAKECLONE2:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
+        <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_clone="4" CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="74" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2"/>
+        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="54">
+  <synapse id="54" priority="1000000">
     <action_set>
-      <rsc_op id="74" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </rsc_op>
+      <pseudo_event id="70" operation="running" operation_key="FAKECLONE2-clone_running_0">
+        <attributes CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      </pseudo_event>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <rsc_op id="59" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18node3" on_node_uuid="3"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="61" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="63" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
       <trigger>
-        <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+        <rsc_op id="65" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="67" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
+      </trigger>
+      <trigger>
+        <pseudo_event id="69" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="55">
     <action_set>
-      <rsc_op id="77" operation="monitor" operation_key="FAKECLONE2:3_monitor_60000" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </rsc_op>
+      <pseudo_event id="69" operation="start" operation_key="FAKECLONE2-clone_start_0">
+        <attributes CRM_meta_clone_max="5" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      </pseudo_event>
     </action_set>
-    <inputs>
-      <trigger>
-        <rsc_op id="76" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
-      </trigger>
-    </inputs>
+    <inputs/>
   </synapse>
   <synapse id="56">
     <action_set>
-      <rsc_op id="76" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </rsc_op>
+      <pseudo_event id="78" operation="running" operation_key="FAKEGROUP_running_0">
+        <attributes CRM_meta_timeout="20000" />
+      </pseudo_event>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+        <rsc_op id="73" operation="start" operation_key="FAKE6_start_0" on_node="18node1" on_node_uuid="1"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="75" operation="start" operation_key="FAKE7_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+        <pseudo_event id="77" operation="start" operation_key="FAKEGROUP_start_0"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="57">
     <action_set>
-      <rsc_op id="32" operation="monitor" operation_key="FAKECLONE2:3_monitor_0" on_node="18node4" on_node_uuid="4">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
-      </rsc_op>
+      <pseudo_event id="77" operation="start" operation_key="FAKEGROUP_start_0">
+        <attributes CRM_meta_timeout="20000" />
+      </pseudo_event>
     </action_set>
     <inputs/>
   </synapse>
   <synapse id="58">
     <action_set>
-      <rsc_op id="79" operation="monitor" operation_key="FAKECLONE2:4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="74" operation="monitor" operation_key="FAKE6_monitor_10000" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKE6" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="78" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="73" operation="start" operation_key="FAKE6_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="59">
     <action_set>
-      <rsc_op id="78" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="73" operation="start" operation_key="FAKE6_start_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKE6" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_name="start" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+        <pseudo_event id="77" operation="start" operation_key="FAKEGROUP_start_0"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="60">
     <action_set>
-      <rsc_op id="36" operation="monitor" operation_key="FAKECLONE2:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      <rsc_op id="18" operation="monitor" operation_key="FAKE6_monitor_0" on_node="18node2" on_node_uuid="2">
+        <primitive id="FAKE6" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs>
-      <trigger>
-        <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-    </inputs>
+    <inputs/>
   </synapse>
   <synapse id="61">
     <action_set>
-      <rsc_op id="81" operation="monitor" operation_key="FAKECLONE2:5_monitor_60000" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="11" operation="monitor" operation_key="FAKE6_monitor_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKE6" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs>
-      <trigger>
-        <rsc_op id="80" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18node3" on_node_uuid="3"/>
-      </trigger>
-    </inputs>
+    <inputs/>
   </synapse>
   <synapse id="62">
     <action_set>
-      <rsc_op id="80" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+      <rsc_op id="76" operation="monitor" operation_key="FAKE7_monitor_10000" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKE7" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
-      </trigger>
-      <trigger>
-        <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+        <rsc_op id="75" operation="start" operation_key="FAKE7_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="63">
     <action_set>
-      <rsc_op id="25" operation="monitor" operation_key="FAKECLONE2:5_monitor_0" on_node="18node3" on_node_uuid="3">
-        <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
-        <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      <rsc_op id="75" operation="start" operation_key="FAKE7_start_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKE7" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_name="start" CRM_meta_timeout="20000" />
       </rsc_op>
     </action_set>
-    <inputs/>
-  </synapse>
-  <synapse id="64" priority="1000000">
-    <action_set>
-      <pseudo_event id="83" operation="running" operation_key="FAKECLONE2-clone_running_0">
-        <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </pseudo_event>
-    </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="70" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="72" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1"/>
+        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
       </trigger>
       <trigger>
-        <rsc_op id="74" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2"/>
+        <rsc_op id="73" operation="start" operation_key="FAKE6_start_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="76" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="78" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="80" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18node3" on_node_uuid="3"/>
-      </trigger>
-      <trigger>
-        <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+        <pseudo_event id="77" operation="start" operation_key="FAKEGROUP_start_0"/>
       </trigger>
     </inputs>
   </synapse>
+  <synapse id="64">
+    <action_set>
+      <rsc_op id="19" operation="monitor" operation_key="FAKE7_monitor_0" on_node="18node2" on_node_uuid="2">
+        <primitive id="FAKE7" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      </rsc_op>
+    </action_set>
+    <inputs/>
+  </synapse>
   <synapse id="65">
     <action_set>
-      <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0">
-        <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
-      </pseudo_event>
+      <rsc_op id="12" operation="monitor" operation_key="FAKE7_monitor_0" on_node="18node1" on_node_uuid="1">
+        <primitive id="FAKE7" class="ocf" provider="heartbeat" type="Dummy"/>
+        <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+      </rsc_op>
     </action_set>
     <inputs/>
   </synapse>
   <synapse id="66" priority="1000000">
     <action_set>
-      <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-remote1" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+      <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-remote1" on_node="remote1" on_node_uuid="remote1" router_node="18node1">
         <attributes CRM_meta_op_no_wait="true" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="34" operation="monitor" operation_key="FAKE5_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="34" operation="monitor" operation_key="FAKE5_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
       </trigger>
       <trigger>
-        <rsc_op id="35" operation="monitor" operation_key="FAKECLONE1:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="35" operation="monitor" operation_key="FAKECLONE1:1_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
       </trigger>
       <trigger>
-        <rsc_op id="36" operation="monitor" operation_key="FAKECLONE2:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="36" operation="monitor" operation_key="FAKECLONE2:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
       </trigger>
     </inputs>
   </synapse>
@@ -908,19 +861,16 @@
   </synapse>
   <synapse id="68" priority="1000000">
     <action_set>
-      <rsc_op id="19" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3">
+      <rsc_op id="20" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3">
         <attributes CRM_meta_op_no_wait="true" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="20" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="21" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3"/>
+        <rsc_op id="21" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3"/>
       </trigger>
       <trigger>
-        <rsc_op id="22" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node3" on_node_uuid="3"/>
+        <rsc_op id="22" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3"/>
       </trigger>
       <trigger>
         <rsc_op id="23" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node3" on_node_uuid="3"/>
@@ -929,112 +879,100 @@
         <rsc_op id="24" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node3" on_node_uuid="3"/>
       </trigger>
       <trigger>
-        <rsc_op id="25" operation="monitor" operation_key="FAKECLONE2:5_monitor_0" on_node="18node3" on_node_uuid="3"/>
+        <rsc_op id="25" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18node3" on_node_uuid="3"/>
       </trigger>
     </inputs>
   </synapse>
   <synapse id="69" priority="1000000">
     <action_set>
-      <rsc_op id="16" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2">
+      <rsc_op id="13" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2">
         <attributes CRM_meta_op_no_wait="true" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="17" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node2" on_node_uuid="2"/>
+        <rsc_op id="14" operation="monitor" operation_key="shooter_monitor_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
       <trigger>
-        <rsc_op id="18" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2"/>
+        <rsc_op id="15" operation="monitor" operation_key="remote1_monitor_0" on_node="18node2" on_node_uuid="2"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="16" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
-    </inputs>
-  </synapse>
-  <synapse id="70" priority="1000000">
-    <action_set>
-      <rsc_op id="12" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1">
-        <attributes CRM_meta_op_no_wait="true" />
-      </rsc_op>
-    </action_set>
-    <inputs>
       <trigger>
-        <rsc_op id="13" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node1" on_node_uuid="1"/>
+        <rsc_op id="17" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
       <trigger>
-        <rsc_op id="14" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1"/>
+        <rsc_op id="18" operation="monitor" operation_key="FAKE6_monitor_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
       <trigger>
-        <rsc_op id="15" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node1" on_node_uuid="1"/>
+        <rsc_op id="19" operation="monitor" operation_key="FAKE7_monitor_0" on_node="18node2" on_node_uuid="2"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="71" priority="1000000">
+  <synapse id="70" priority="1000000">
     <action_set>
-      <rsc_op id="8" operation="probe_complete" operation_key="probe_complete-18builder" on_node="18builder" on_node_uuid="5">
+      <rsc_op id="4" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1">
         <attributes CRM_meta_op_no_wait="true" />
       </rsc_op>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="9" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="5" operation="monitor" operation_key="shooter_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="10" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="6" operation="monitor" operation_key="remote1_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="11" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="7" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
-    </inputs>
-  </synapse>
-  <synapse id="72">
-    <action_set>
-      <pseudo_event id="7" operation="probe_nodes_complete" operation_key="probe_nodes_complete">
-        <attributes />
-      </pseudo_event>
-    </action_set>
-    <inputs>
       <trigger>
-        <rsc_op id="8" operation="probe_complete" operation_key="probe_complete-18builder" on_node="18builder" on_node_uuid="5"/>
+        <rsc_op id="8" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="12" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1"/>
+        <rsc_op id="9" operation="monitor" operation_key="FAKECLONE1:0_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="16" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2"/>
+        <rsc_op id="10" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="19" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3"/>
+        <rsc_op id="11" operation="monitor" operation_key="FAKE6_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
       <trigger>
-        <rsc_op id="26" operation="probe_complete" operation_key="probe_complete-18node4" on_node="18node4" on_node_uuid="4"/>
+        <rsc_op id="12" operation="monitor" operation_key="FAKE7_monitor_0" on_node="18node1" on_node_uuid="1"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="73">
+  <synapse id="71">
     <action_set>
-      <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete">
+      <pseudo_event id="3" operation="probe_nodes_complete" operation_key="probe_nodes_complete">
         <attributes />
       </pseudo_event>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-remote1" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+        <rsc_op id="4" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="13" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="20" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3"/>
+      </trigger>
+      <trigger>
+        <rsc_op id="26" operation="probe_complete" operation_key="probe_complete-18node4" on_node="18node4" on_node_uuid="4"/>
       </trigger>
     </inputs>
   </synapse>
-  <synapse id="74">
+  <synapse id="72">
     <action_set>
-      <pseudo_event id="5" operation="all_stopped" operation_key="all_stopped">
+      <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete">
         <attributes />
       </pseudo_event>
     </action_set>
     <inputs>
       <trigger>
-        <rsc_op id="43" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="46" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5"/>
-      </trigger>
-      <trigger>
-        <rsc_op id="49" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1"/>
+        <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-remote1" on_node="remote1" on_node_uuid="remote1" router_node="18node1"/>
       </trigger>
     </inputs>
   </synapse>
diff --git a/pengine/test10/resource-discovery.scores b/pengine/test10/resource-discovery.scores
index e1fa78e..9b56b96 100644
--- a/pengine/test10/resource-discovery.scores
+++ b/pengine/test10/resource-discovery.scores
@@ -1,197 +1,169 @@
 Allocation scores:
-clone_color: FAKECLONE1-clone allocation score on 18builder: 0
 clone_color: FAKECLONE1-clone allocation score on 18node1: 0
-clone_color: FAKECLONE1-clone allocation score on 18node2: 0
-clone_color: FAKECLONE1-clone allocation score on 18node3: 0
-clone_color: FAKECLONE1-clone allocation score on 18node4: 0
+clone_color: FAKECLONE1-clone allocation score on 18node2: -INFINITY
+clone_color: FAKECLONE1-clone allocation score on 18node3: -INFINITY
+clone_color: FAKECLONE1-clone allocation score on 18node4: -INFINITY
 clone_color: FAKECLONE1-clone allocation score on remote1: 0
-clone_color: FAKECLONE1:0 allocation score on 18builder: 0
 clone_color: FAKECLONE1:0 allocation score on 18node1: 0
-clone_color: FAKECLONE1:0 allocation score on 18node2: 0
-clone_color: FAKECLONE1:0 allocation score on 18node3: 0
-clone_color: FAKECLONE1:0 allocation score on 18node4: 0
+clone_color: FAKECLONE1:0 allocation score on 18node2: -INFINITY
+clone_color: FAKECLONE1:0 allocation score on 18node3: -INFINITY
+clone_color: FAKECLONE1:0 allocation score on 18node4: -INFINITY
 clone_color: FAKECLONE1:0 allocation score on remote1: 0
-clone_color: FAKECLONE1:1 allocation score on 18builder: 0
 clone_color: FAKECLONE1:1 allocation score on 18node1: 0
-clone_color: FAKECLONE1:1 allocation score on 18node2: 0
-clone_color: FAKECLONE1:1 allocation score on 18node3: 0
-clone_color: FAKECLONE1:1 allocation score on 18node4: 0
+clone_color: FAKECLONE1:1 allocation score on 18node2: -INFINITY
+clone_color: FAKECLONE1:1 allocation score on 18node3: -INFINITY
+clone_color: FAKECLONE1:1 allocation score on 18node4: -INFINITY
 clone_color: FAKECLONE1:1 allocation score on remote1: 0
-clone_color: FAKECLONE1:2 allocation score on 18builder: 0
 clone_color: FAKECLONE1:2 allocation score on 18node1: 0
-clone_color: FAKECLONE1:2 allocation score on 18node2: 0
-clone_color: FAKECLONE1:2 allocation score on 18node3: 0
-clone_color: FAKECLONE1:2 allocation score on 18node4: 0
+clone_color: FAKECLONE1:2 allocation score on 18node2: -INFINITY
+clone_color: FAKECLONE1:2 allocation score on 18node3: -INFINITY
+clone_color: FAKECLONE1:2 allocation score on 18node4: -INFINITY
 clone_color: FAKECLONE1:2 allocation score on remote1: 0
-clone_color: FAKECLONE1:3 allocation score on 18builder: 0
 clone_color: FAKECLONE1:3 allocation score on 18node1: 0
-clone_color: FAKECLONE1:3 allocation score on 18node2: 0
-clone_color: FAKECLONE1:3 allocation score on 18node3: 0
-clone_color: FAKECLONE1:3 allocation score on 18node4: 0
+clone_color: FAKECLONE1:3 allocation score on 18node2: -INFINITY
+clone_color: FAKECLONE1:3 allocation score on 18node3: -INFINITY
+clone_color: FAKECLONE1:3 allocation score on 18node4: -INFINITY
 clone_color: FAKECLONE1:3 allocation score on remote1: 0
-clone_color: FAKECLONE1:4 allocation score on 18builder: 0
 clone_color: FAKECLONE1:4 allocation score on 18node1: 0
-clone_color: FAKECLONE1:4 allocation score on 18node2: 0
-clone_color: FAKECLONE1:4 allocation score on 18node3: 0
-clone_color: FAKECLONE1:4 allocation score on 18node4: 0
+clone_color: FAKECLONE1:4 allocation score on 18node2: -INFINITY
+clone_color: FAKECLONE1:4 allocation score on 18node3: -INFINITY
+clone_color: FAKECLONE1:4 allocation score on 18node4: -INFINITY
 clone_color: FAKECLONE1:4 allocation score on remote1: 0
-clone_color: FAKECLONE1:5 allocation score on 18builder: 0
-clone_color: FAKECLONE1:5 allocation score on 18node1: 0
-clone_color: FAKECLONE1:5 allocation score on 18node2: 0
-clone_color: FAKECLONE1:5 allocation score on 18node3: 0
-clone_color: FAKECLONE1:5 allocation score on 18node4: 0
-clone_color: FAKECLONE1:5 allocation score on remote1: 0
-clone_color: FAKECLONE2-clone allocation score on 18builder: 0
 clone_color: FAKECLONE2-clone allocation score on 18node1: 0
 clone_color: FAKECLONE2-clone allocation score on 18node2: 0
 clone_color: FAKECLONE2-clone allocation score on 18node3: 0
 clone_color: FAKECLONE2-clone allocation score on 18node4: 0
 clone_color: FAKECLONE2-clone allocation score on remote1: 0
-clone_color: FAKECLONE2:0 allocation score on 18builder: 0
 clone_color: FAKECLONE2:0 allocation score on 18node1: 0
 clone_color: FAKECLONE2:0 allocation score on 18node2: 0
 clone_color: FAKECLONE2:0 allocation score on 18node3: 0
 clone_color: FAKECLONE2:0 allocation score on 18node4: 0
 clone_color: FAKECLONE2:0 allocation score on remote1: 0
-clone_color: FAKECLONE2:1 allocation score on 18builder: 0
 clone_color: FAKECLONE2:1 allocation score on 18node1: 0
 clone_color: FAKECLONE2:1 allocation score on 18node2: 0
 clone_color: FAKECLONE2:1 allocation score on 18node3: 0
 clone_color: FAKECLONE2:1 allocation score on 18node4: 0
 clone_color: FAKECLONE2:1 allocation score on remote1: 0
-clone_color: FAKECLONE2:2 allocation score on 18builder: 0
 clone_color: FAKECLONE2:2 allocation score on 18node1: 0
 clone_color: FAKECLONE2:2 allocation score on 18node2: 0
 clone_color: FAKECLONE2:2 allocation score on 18node3: 0
 clone_color: FAKECLONE2:2 allocation score on 18node4: 0
 clone_color: FAKECLONE2:2 allocation score on remote1: 0
-clone_color: FAKECLONE2:3 allocation score on 18builder: 0
 clone_color: FAKECLONE2:3 allocation score on 18node1: 0
 clone_color: FAKECLONE2:3 allocation score on 18node2: 0
 clone_color: FAKECLONE2:3 allocation score on 18node3: 0
 clone_color: FAKECLONE2:3 allocation score on 18node4: 0
 clone_color: FAKECLONE2:3 allocation score on remote1: 0
-clone_color: FAKECLONE2:4 allocation score on 18builder: 0
 clone_color: FAKECLONE2:4 allocation score on 18node1: 0
 clone_color: FAKECLONE2:4 allocation score on 18node2: 0
 clone_color: FAKECLONE2:4 allocation score on 18node3: 0
 clone_color: FAKECLONE2:4 allocation score on 18node4: 0
 clone_color: FAKECLONE2:4 allocation score on remote1: 0
-clone_color: FAKECLONE2:5 allocation score on 18builder: 0
-clone_color: FAKECLONE2:5 allocation score on 18node1: 0
-clone_color: FAKECLONE2:5 allocation score on 18node2: 0
-clone_color: FAKECLONE2:5 allocation score on 18node3: 0
-clone_color: FAKECLONE2:5 allocation score on 18node4: 0
-clone_color: FAKECLONE2:5 allocation score on remote1: 0
-native_color: FAKE1 allocation score on 18builder: 0
-native_color: FAKE1 allocation score on 18node1: 0
-native_color: FAKE1 allocation score on 18node2: 0
-native_color: FAKE1 allocation score on 18node3: 0
+group_color: FAKE6 allocation score on 18node1: 0
+group_color: FAKE6 allocation score on 18node2: 0
+group_color: FAKE6 allocation score on 18node3: -INFINITY
+group_color: FAKE6 allocation score on 18node4: -INFINITY
+group_color: FAKE6 allocation score on remote1: -INFINITY
+group_color: FAKE7 allocation score on 18node1: 0
+group_color: FAKE7 allocation score on 18node2: 0
+group_color: FAKE7 allocation score on 18node3: -INFINITY
+group_color: FAKE7 allocation score on 18node4: -INFINITY
+group_color: FAKE7 allocation score on remote1: -INFINITY
+group_color: FAKEGROUP allocation score on 18node1: 0
+group_color: FAKEGROUP allocation score on 18node2: 0
+group_color: FAKEGROUP allocation score on 18node3: -INFINITY
+group_color: FAKEGROUP allocation score on 18node4: -INFINITY
+group_color: FAKEGROUP allocation score on remote1: -INFINITY
+native_color: FAKE1 allocation score on 18node1: -INFINITY
+native_color: FAKE1 allocation score on 18node2: -INFINITY
+native_color: FAKE1 allocation score on 18node3: -INFINITY
 native_color: FAKE1 allocation score on 18node4: 0
 native_color: FAKE1 allocation score on remote1: -INFINITY
-native_color: FAKE2 allocation score on 18builder: 0
-native_color: FAKE2 allocation score on 18node1: 0
-native_color: FAKE2 allocation score on 18node2: -INFINITY
-native_color: FAKE2 allocation score on 18node3: 0
-native_color: FAKE2 allocation score on 18node4: 0
-native_color: FAKE2 allocation score on remote1: 0
-native_color: FAKE3 allocation score on 18builder: 0
-native_color: FAKE3 allocation score on 18node1: 0
-native_color: FAKE3 allocation score on 18node2: 0
+native_color: FAKE2 allocation score on 18node1: 10
+native_color: FAKE2 allocation score on 18node2: 100
+native_color: FAKE2 allocation score on 18node3: -INFINITY
+native_color: FAKE2 allocation score on 18node4: -INFINITY
+native_color: FAKE2 allocation score on remote1: -INFINITY
+native_color: FAKE3 allocation score on 18node1: -INFINITY
+native_color: FAKE3 allocation score on 18node2: -INFINITY
 native_color: FAKE3 allocation score on 18node3: INFINITY
-native_color: FAKE3 allocation score on 18node4: 0
-native_color: FAKE3 allocation score on remote1: 0
-native_color: FAKE4 allocation score on 18builder: 0
-native_color: FAKE4 allocation score on 18node1: 0
-native_color: FAKE4 allocation score on 18node2: 0
-native_color: FAKE4 allocation score on 18node3: 0
+native_color: FAKE3 allocation score on 18node4: -INFINITY
+native_color: FAKE3 allocation score on remote1: -INFINITY
+native_color: FAKE4 allocation score on 18node1: -INFINITY
+native_color: FAKE4 allocation score on 18node2: -INFINITY
+native_color: FAKE4 allocation score on 18node3: -INFINITY
 native_color: FAKE4 allocation score on 18node4: 0
-native_color: FAKE4 allocation score on remote1: 0
-native_color: FAKE5 allocation score on 18builder: 0
+native_color: FAKE4 allocation score on remote1: -INFINITY
 native_color: FAKE5 allocation score on 18node1: 0
 native_color: FAKE5 allocation score on 18node2: 0
 native_color: FAKE5 allocation score on 18node3: 0
 native_color: FAKE5 allocation score on 18node4: 0
 native_color: FAKE5 allocation score on remote1: 0
-native_color: FAKECLONE1:0 allocation score on 18builder: 0
+native_color: FAKE6 allocation score on 18node1: 0
+native_color: FAKE6 allocation score on 18node2: 0
+native_color: FAKE6 allocation score on 18node3: -INFINITY
+native_color: FAKE6 allocation score on 18node4: -INFINITY
+native_color: FAKE6 allocation score on remote1: -INFINITY
+native_color: FAKE7 allocation score on 18node1: 0
+native_color: FAKE7 allocation score on 18node2: -INFINITY
+native_color: FAKE7 allocation score on 18node3: -INFINITY
+native_color: FAKE7 allocation score on 18node4: -INFINITY
+native_color: FAKE7 allocation score on remote1: -INFINITY
 native_color: FAKECLONE1:0 allocation score on 18node1: 0
-native_color: FAKECLONE1:0 allocation score on 18node2: 0
-native_color: FAKECLONE1:0 allocation score on 18node3: 0
-native_color: FAKECLONE1:0 allocation score on 18node4: 0
+native_color: FAKECLONE1:0 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:0 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE1:0 allocation score on 18node4: -INFINITY
 native_color: FAKECLONE1:0 allocation score on remote1: 0
-native_color: FAKECLONE1:1 allocation score on 18builder: -INFINITY
-native_color: FAKECLONE1:1 allocation score on 18node1: 0
-native_color: FAKECLONE1:1 allocation score on 18node2: 0
-native_color: FAKECLONE1:1 allocation score on 18node3: 0
-native_color: FAKECLONE1:1 allocation score on 18node4: 0
+native_color: FAKECLONE1:1 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:1 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:1 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE1:1 allocation score on 18node4: -INFINITY
 native_color: FAKECLONE1:1 allocation score on remote1: 0
-native_color: FAKECLONE1:2 allocation score on 18builder: -INFINITY
 native_color: FAKECLONE1:2 allocation score on 18node1: -INFINITY
-native_color: FAKECLONE1:2 allocation score on 18node2: 0
-native_color: FAKECLONE1:2 allocation score on 18node3: 0
-native_color: FAKECLONE1:2 allocation score on 18node4: 0
-native_color: FAKECLONE1:2 allocation score on remote1: 0
-native_color: FAKECLONE1:3 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE1:2 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:2 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE1:2 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE1:2 allocation score on remote1: -INFINITY
 native_color: FAKECLONE1:3 allocation score on 18node1: -INFINITY
 native_color: FAKECLONE1:3 allocation score on 18node2: -INFINITY
-native_color: FAKECLONE1:3 allocation score on 18node3: 0
-native_color: FAKECLONE1:3 allocation score on 18node4: 0
-native_color: FAKECLONE1:3 allocation score on remote1: 0
-native_color: FAKECLONE1:4 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE1:3 allocation score on remote1: -INFINITY
 native_color: FAKECLONE1:4 allocation score on 18node1: -INFINITY
 native_color: FAKECLONE1:4 allocation score on 18node2: -INFINITY
-native_color: FAKECLONE1:4 allocation score on 18node3: 0
+native_color: FAKECLONE1:4 allocation score on 18node3: -INFINITY
 native_color: FAKECLONE1:4 allocation score on 18node4: -INFINITY
-native_color: FAKECLONE1:4 allocation score on remote1: 0
-native_color: FAKECLONE1:5 allocation score on 18builder: -INFINITY
-native_color: FAKECLONE1:5 allocation score on 18node1: -INFINITY
-native_color: FAKECLONE1:5 allocation score on 18node2: -INFINITY
-native_color: FAKECLONE1:5 allocation score on 18node3: 0
-native_color: FAKECLONE1:5 allocation score on 18node4: -INFINITY
-native_color: FAKECLONE1:5 allocation score on remote1: -INFINITY
-native_color: FAKECLONE2:0 allocation score on 18builder: 0
+native_color: FAKECLONE1:4 allocation score on remote1: -INFINITY
 native_color: FAKECLONE2:0 allocation score on 18node1: 0
 native_color: FAKECLONE2:0 allocation score on 18node2: 0
 native_color: FAKECLONE2:0 allocation score on 18node3: 0
 native_color: FAKECLONE2:0 allocation score on 18node4: 0
 native_color: FAKECLONE2:0 allocation score on remote1: 0
-native_color: FAKECLONE2:1 allocation score on 18builder: -INFINITY
 native_color: FAKECLONE2:1 allocation score on 18node1: 0
 native_color: FAKECLONE2:1 allocation score on 18node2: 0
-native_color: FAKECLONE2:1 allocation score on 18node3: 0
+native_color: FAKECLONE2:1 allocation score on 18node3: -INFINITY
 native_color: FAKECLONE2:1 allocation score on 18node4: 0
 native_color: FAKECLONE2:1 allocation score on remote1: 0
-native_color: FAKECLONE2:2 allocation score on 18builder: -INFINITY
 native_color: FAKECLONE2:2 allocation score on 18node1: -INFINITY
 native_color: FAKECLONE2:2 allocation score on 18node2: 0
-native_color: FAKECLONE2:2 allocation score on 18node3: 0
+native_color: FAKECLONE2:2 allocation score on 18node3: -INFINITY
 native_color: FAKECLONE2:2 allocation score on 18node4: 0
 native_color: FAKECLONE2:2 allocation score on remote1: 0
-native_color: FAKECLONE2:3 allocation score on 18builder: -INFINITY
 native_color: FAKECLONE2:3 allocation score on 18node1: -INFINITY
 native_color: FAKECLONE2:3 allocation score on 18node2: -INFINITY
-native_color: FAKECLONE2:3 allocation score on 18node3: 0
+native_color: FAKECLONE2:3 allocation score on 18node3: -INFINITY
 native_color: FAKECLONE2:3 allocation score on 18node4: 0
 native_color: FAKECLONE2:3 allocation score on remote1: 0
-native_color: FAKECLONE2:4 allocation score on 18builder: -INFINITY
 native_color: FAKECLONE2:4 allocation score on 18node1: -INFINITY
 native_color: FAKECLONE2:4 allocation score on 18node2: -INFINITY
-native_color: FAKECLONE2:4 allocation score on 18node3: 0
+native_color: FAKECLONE2:4 allocation score on 18node3: -INFINITY
 native_color: FAKECLONE2:4 allocation score on 18node4: -INFINITY
 native_color: FAKECLONE2:4 allocation score on remote1: 0
-native_color: FAKECLONE2:5 allocation score on 18builder: -INFINITY
-native_color: FAKECLONE2:5 allocation score on 18node1: -INFINITY
-native_color: FAKECLONE2:5 allocation score on 18node2: -INFINITY
-native_color: FAKECLONE2:5 allocation score on 18node3: 0
-native_color: FAKECLONE2:5 allocation score on 18node4: -INFINITY
-native_color: FAKECLONE2:5 allocation score on remote1: -INFINITY
-native_color: remote1 allocation score on 18builder: 0
 native_color: remote1 allocation score on 18node1: 0
 native_color: remote1 allocation score on 18node2: 0
 native_color: remote1 allocation score on 18node3: 0
 native_color: remote1 allocation score on 18node4: 0
 native_color: remote1 allocation score on remote1: -INFINITY
-native_color: shooter allocation score on 18builder: 0
 native_color: shooter allocation score on 18node1: 0
 native_color: shooter allocation score on 18node2: 0
 native_color: shooter allocation score on 18node3: 0
diff --git a/pengine/test10/resource-discovery.summary b/pengine/test10/resource-discovery.summary
index af0e5b3..e3d23a5 100644
--- a/pengine/test10/resource-discovery.summary
+++ b/pengine/test10/resource-discovery.summary
@@ -1,124 +1,128 @@
 
 Current cluster status:
-Online: [ 18builder 18node1 18node2 18node3 18node4 ]
+Online: [ 18node1 18node2 18node3 18node4 ]
 RemoteOFFLINE: [ remote1 ]
 
- shooter	(stonith:fence_xvm):	Started 18node1 
+ shooter	(stonith:fence_xvm):	Stopped 
  remote1	(ocf::pacemaker:remote):	Stopped 
  FAKE1	(ocf::heartbeat:Dummy):	Stopped 
- FAKE2	(ocf::heartbeat:Dummy):	Started 18node2 
- FAKE3	(ocf::heartbeat:Dummy):	Started 18builder 
- FAKE4	(ocf::heartbeat:Dummy):	Started 18node1 
+ FAKE2	(ocf::heartbeat:Dummy):	Stopped 
+ FAKE3	(ocf::heartbeat:Dummy):	Stopped 
+ FAKE4	(ocf::heartbeat:Dummy):	Stopped 
  FAKE5	(ocf::heartbeat:Dummy):	Stopped 
  Clone Set: FAKECLONE1-clone [FAKECLONE1]
-     Stopped: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+     Stopped: [ 18node1 18node2 18node3 18node4 remote1 ]
  Clone Set: FAKECLONE2-clone [FAKECLONE2]
-     Stopped: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+     Stopped: [ 18node1 18node2 18node3 18node4 remote1 ]
+ Resource Group: FAKEGROUP
+     FAKE6	(ocf::heartbeat:Dummy):	Stopped 
+     FAKE7	(ocf::heartbeat:Dummy):	Stopped 
 
 Transition Summary:
- * Start   remote1	(18builder)
- * Start   FAKE1	(18node2)
- * Move    FAKE2	(Started 18node2 -> 18node3)
- * Move    FAKE3	(Started 18builder -> 18node3)
- * Move    FAKE4	(Started 18node1 -> 18node4)
+ * Start   shooter	(18node2)
+ * Start   remote1	(18node1)
+ * Start   FAKE1	(18node4)
+ * Start   FAKE2	(18node2)
+ * Start   FAKE3	(18node3)
+ * Start   FAKE4	(18node4)
  * Start   FAKE5	(remote1)
- * Start   FAKECLONE1:0	(18builder)
- * Start   FAKECLONE1:1	(18node1)
- * Start   FAKECLONE1:2	(18node2)
- * Start   FAKECLONE1:3	(18node4)
- * Start   FAKECLONE1:4	(remote1)
- * Start   FAKECLONE1:5	(18node3)
- * Start   FAKECLONE2:0	(18builder)
+ * Start   FAKECLONE1:0	(18node1)
+ * Start   FAKECLONE1:1	(remote1)
+ * Start   FAKECLONE2:0	(18node3)
  * Start   FAKECLONE2:1	(18node1)
  * Start   FAKECLONE2:2	(18node2)
  * Start   FAKECLONE2:3	(18node4)
  * Start   FAKECLONE2:4	(remote1)
- * Start   FAKECLONE2:5	(18node3)
+ * Start   FAKE6	(18node1)
+ * Start   FAKE7	(18node1)
 
 Executing cluster transition:
  * Resource action: shooter         monitor on 18node4
  * Resource action: shooter         monitor on 18node3
+ * Resource action: shooter         monitor on 18node2
+ * Resource action: shooter         monitor on 18node1
  * Resource action: remote1         monitor on 18node4
  * Resource action: remote1         monitor on 18node3
+ * Resource action: remote1         monitor on 18node2
+ * Resource action: remote1         monitor on 18node1
  * Resource action: FAKE1           monitor on 18node4
- * Resource action: FAKE1           monitor on 18node3
- * Resource action: FAKE1           monitor on 18node2
- * Resource action: FAKE1           monitor on 18node1
- * Resource action: FAKE1           monitor on 18builder
+ * Resource action: FAKE2           monitor on 18node2
+ * Resource action: FAKE2           monitor on 18node1
  * Resource action: FAKE3           monitor on 18node3
  * Resource action: FAKE4           monitor on 18node4
  * Resource action: FAKE5           monitor on 18node4
  * Resource action: FAKE5           monitor on 18node3
  * Resource action: FAKE5           monitor on 18node2
  * Resource action: FAKE5           monitor on 18node1
- * Resource action: FAKE5           monitor on 18builder
+ * Resource action: FAKECLONE1:0    monitor on 18node1
  * Pseudo action:   FAKECLONE1-clone_start_0
- * Resource action: FAKECLONE2:0    monitor on 18builder
+ * Resource action: FAKECLONE2:0    monitor on 18node3
  * Resource action: FAKECLONE2:1    monitor on 18node1
  * Resource action: FAKECLONE2:3    monitor on 18node4
- * Resource action: FAKECLONE2:5    monitor on 18node3
  * Pseudo action:   FAKECLONE2-clone_start_0
+ * Pseudo action:   FAKEGROUP_start_0
+ * Resource action: FAKE6           monitor on 18node2
+ * Resource action: FAKE6           monitor on 18node1
+ * Resource action: FAKE7           monitor on 18node2
+ * Resource action: FAKE7           monitor on 18node1
  * Pseudo action:   probe_nodes_complete
- * Resource action: remote1         start on 18builder
+ * Resource action: remote1         start on 18node1
  * Resource action: FAKE5           monitor on remote1
- * Resource action: FAKECLONE1:4    monitor on remote1
+ * Resource action: FAKECLONE1:1    monitor on remote1
  * Resource action: FAKECLONE2:4    monitor on remote1
  * Pseudo action:   probe_complete
- * Resource action: remote1         monitor=60000 on 18builder
- * Resource action: FAKE1           start on 18node2
- * Resource action: FAKE2           stop on 18node2
- * Resource action: FAKE3           stop on 18builder
- * Resource action: FAKE4           stop on 18node1
+ * Resource action: shooter         start on 18node2
+ * Resource action: remote1         monitor=60000 on 18node1
+ * Resource action: FAKE1           start on 18node4
+ * Resource action: FAKE2           start on 18node2
+ * Resource action: FAKE3           start on 18node3
+ * Resource action: FAKE4           start on 18node4
  * Resource action: FAKE5           start on remote1
- * Resource action: FAKECLONE1:0    start on 18builder
- * Resource action: FAKECLONE1:1    start on 18node1
- * Resource action: FAKECLONE1:2    start on 18node2
- * Resource action: FAKECLONE1:3    start on 18node4
- * Resource action: FAKECLONE1:4    start on remote1
- * Resource action: FAKECLONE1:5    start on 18node3
+ * Resource action: FAKECLONE1:0    start on 18node1
+ * Resource action: FAKECLONE1:1    start on remote1
  * Pseudo action:   FAKECLONE1-clone_running_0
- * Resource action: FAKECLONE2:0    start on 18builder
+ * Resource action: FAKECLONE2:0    start on 18node3
  * Resource action: FAKECLONE2:1    start on 18node1
  * Resource action: FAKECLONE2:2    start on 18node2
  * Resource action: FAKECLONE2:3    start on 18node4
  * Resource action: FAKECLONE2:4    start on remote1
- * Resource action: FAKECLONE2:5    start on 18node3
  * Pseudo action:   FAKECLONE2-clone_running_0
- * Pseudo action:   all_stopped
- * Resource action: FAKE1           monitor=60000 on 18node2
- * Resource action: FAKE2           start on 18node3
- * Resource action: FAKE3           start on 18node3
- * Resource action: FAKE4           start on 18node4
+ * Resource action: FAKE6           start on 18node1
+ * Resource action: FAKE7           start on 18node1
+ * Resource action: shooter         monitor=60000 on 18node2
+ * Resource action: FAKE1           monitor=60000 on 18node4
+ * Resource action: FAKE2           monitor=60000 on 18node2
+ * Resource action: FAKE3           monitor=60000 on 18node3
+ * Resource action: FAKE4           monitor=60000 on 18node4
  * Resource action: FAKE5           monitor=60000 on remote1
- * Resource action: FAKECLONE1:0    monitor=60000 on 18builder
- * Resource action: FAKECLONE1:1    monitor=60000 on 18node1
- * Resource action: FAKECLONE1:2    monitor=60000 on 18node2
- * Resource action: FAKECLONE1:3    monitor=60000 on 18node4
- * Resource action: FAKECLONE1:4    monitor=60000 on remote1
- * Resource action: FAKECLONE1:5    monitor=60000 on 18node3
- * Resource action: FAKECLONE2:0    monitor=60000 on 18builder
+ * Resource action: FAKECLONE1:0    monitor=60000 on 18node1
+ * Resource action: FAKECLONE1:1    monitor=60000 on remote1
+ * Resource action: FAKECLONE2:0    monitor=60000 on 18node3
  * Resource action: FAKECLONE2:1    monitor=60000 on 18node1
  * Resource action: FAKECLONE2:2    monitor=60000 on 18node2
  * Resource action: FAKECLONE2:3    monitor=60000 on 18node4
  * Resource action: FAKECLONE2:4    monitor=60000 on remote1
- * Resource action: FAKECLONE2:5    monitor=60000 on 18node3
- * Resource action: FAKE2           monitor=60000 on 18node3
- * Resource action: FAKE3           monitor=60000 on 18node3
- * Resource action: FAKE4           monitor=60000 on 18node4
+ * Pseudo action:   FAKEGROUP_running_0
+ * Resource action: FAKE6           monitor=10000 on 18node1
+ * Resource action: FAKE7           monitor=10000 on 18node1
 
 Revised cluster status:
-Online: [ 18builder 18node1 18node2 18node3 18node4 ]
+Online: [ 18node1 18node2 18node3 18node4 ]
 RemoteOnline: [ remote1 ]
 
- shooter	(stonith:fence_xvm):	Started 18node1 
- remote1	(ocf::pacemaker:remote):	Started 18builder 
- FAKE1	(ocf::heartbeat:Dummy):	Started 18node2 
- FAKE2	(ocf::heartbeat:Dummy):	Started 18node3 
+ shooter	(stonith:fence_xvm):	Started 18node2 
+ remote1	(ocf::pacemaker:remote):	Started 18node1 
+ FAKE1	(ocf::heartbeat:Dummy):	Started 18node4 
+ FAKE2	(ocf::heartbeat:Dummy):	Started 18node2 
  FAKE3	(ocf::heartbeat:Dummy):	Started 18node3 
  FAKE4	(ocf::heartbeat:Dummy):	Started 18node4 
  FAKE5	(ocf::heartbeat:Dummy):	Started remote1 
  Clone Set: FAKECLONE1-clone [FAKECLONE1]
-     Started: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+     Started: [ 18node1 remote1 ]
+     Stopped: [ 18node2 18node3 18node4 ]
  Clone Set: FAKECLONE2-clone [FAKECLONE2]
-     Started: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+     Started: [ 18node1 18node2 18node3 18node4 remote1 ]
+ Resource Group: FAKEGROUP
+     FAKE6	(ocf::heartbeat:Dummy):	Started 18node1 
+     FAKE7	(ocf::heartbeat:Dummy):	Started 18node1 
 
diff --git a/pengine/test10/resource-discovery.xml b/pengine/test10/resource-discovery.xml
index 5836804..8b517df 100644
--- a/pengine/test10/resource-discovery.xml
+++ b/pengine/test10/resource-discovery.xml
@@ -1,4 +1,4 @@
-<cib epoch="11" num_updates="1" admin_epoch="0" validate-with="pacemaker-next" cib-last-written="Tue Sep  3 17:59:24 2013" update-origin="18builder" update-client="crm_resource" crm_feature_set="3.0.7" have-quorum="1" dc-uuid="5">
+<cib admin_epoch="0" cib-last-written="Tue Sep  3 17:59:24 2013" crm_feature_set="3.0.7" dc-uuid="5" epoch="13" have-quorum="1" num_updates="0" update-client="crm_resource" update-origin="18builder" validate-with="pacemaker-next">
   <configuration>
     <crm_config>
       <cluster_property_set id="cib-bootstrap-options">
@@ -11,7 +11,6 @@
       <node id="2" uname="18node2"/>
       <node id="3" uname="18node3"/>
       <node id="4" uname="18node4"/>
-      <node id="5" uname="18builder"/>
     </nodes>
     <resources>
       <primitive class="stonith" id="shooter" type="fence_xvm">
@@ -29,16 +28,14 @@
       </primitive>
       <primitive class="ocf" id="FAKE1" provider="heartbeat" type="Dummy">
         <instance_attributes id="FAKE1-instance_attributes"/>
-        <meta_attributes id="FAKE1-meta_attributes">
-        </meta_attributes>
+        <meta_attributes id="FAKE1-meta_attributes"/>
         <operations>
           <op id="FAKE1-monitor-interval-60s" interval="60s" name="monitor"/>
         </operations>
       </primitive>
       <primitive class="ocf" id="FAKE2" provider="heartbeat" type="Dummy">
         <instance_attributes id="FAKE2-instance_attributes"/>
-        <meta_attributes id="FAKE2-meta_attributes">
-        </meta_attributes>
+        <meta_attributes id="FAKE2-meta_attributes"/>
         <operations>
           <op id="FAKE2-monitor-interval-60s" interval="60s" name="monitor"/>
         </operations>
@@ -77,109 +74,70 @@
           </operations>
         </primitive>
       </clone>
+      <group id="FAKEGROUP">
+        <primitive class="ocf" id="FAKE6" provider="heartbeat" type="Dummy">
+          <instance_attributes id="FAKE6-instance_attributes"/>
+          <operations>
+            <op id="FAKE6-start-timeout-20" interval="0s" name="start" timeout="20"/>
+            <op id="FAKE6-stop-timeout-20" interval="0s" name="stop" timeout="20"/>
+            <op id="FAKE6-monitor-interval-10" interval="10" name="monitor" timeout="20"/>
+          </operations>
+        </primitive>
+        <primitive class="ocf" id="FAKE7" provider="heartbeat" type="Dummy">
+          <instance_attributes id="FAKE7-instance_attributes"/>
+          <operations>
+            <op id="FAKE7-start-timeout-20" interval="0s" name="start" timeout="20"/>
+            <op id="FAKE7-stop-timeout-20" interval="0s" name="stop" timeout="20"/>
+            <op id="FAKE7-monitor-interval-10" interval="10" name="monitor" timeout="20"/>
+          </operations>
+        </primitive>
+      </group>
     </resources>
     <constraints>
-      <rsc_location id="location-FAKE1-remote1--INFINITY" node="remote1" rsc="FAKE1" score="-INFINITY" resource-discovery="never" />
-      <rsc_location id="location-FAKE2-18node2--INFINITY" node="18node2" rsc="FAKE2" score="-INFINITY" resource-discovery="exclusive" />
-      <rsc_location id="location-FAKE3-18node3--INFINITY" node="18node3" rsc="FAKE3" score="INFINITY" resource-discovery="exclusive" />
-      <rsc_location id="location-FAKE4-1-18node3--INFINITY" node="18node4" rsc="FAKE4" score="0" resource-discovery="always" />
-      <rsc_location id="location-FAKE4-2-18node3--INFINITY" node="18node4" rsc="FAKE4" score="0" resource-discovery="never" />
-      <rsc_location id="location-FAKE4-3-18node3--INFINITY" node="18node4" rsc="FAKE4" score="0" resource-discovery="exclusive" />
-      <rsc_location id="location-FAKE5-18node3--INFINITY" node="18node4" rsc="FAKE5" score="0" resource-discovery="always" />
-      <rsc_location id="location-FAKECLONE1-remote--INFINITY" node="remote1" rsc="FAKECLONE1-clone" score="0" resource-discovery="exclusive" />
-      <rsc_location id="location-FAKECLONE2-18node2--INFINITY" node="18node2" rsc="FAKECLONE2-clone" score="0" resource-discovery="never" />
+      <rsc_location id="location-FAKE1-remote1" node="remote1" resource-discovery="never" rsc="FAKE1" score="-INFINITY"/>
+      <rsc_location id="location-FAKE1-18node1" node="18node1" resource-discovery="never" rsc="FAKE1" score="-INFINITY"/>
+      <rsc_location id="location-FAKE1-18node2" node="18node2" resource-discovery="never" rsc="FAKE1" score="-INFINITY"/>
+      <rsc_location id="location-FAKE1-18node3" node="18node3" resource-discovery="never" rsc="FAKE1" score="-INFINITY"/>
+      <rsc_location id="location-FAKE2-18node1" node="18node1" resource-discovery="exclusive" rsc="FAKE2" score="10"/>
+      <rsc_location id="location-FAKE2-18node2" node="18node2" resource-discovery="exclusive" rsc="FAKE2" score="100"/>
+      <rsc_location id="location-FAKE3-18node3--INFINITY" node="18node3" resource-discovery="exclusive" rsc="FAKE3" score="INFINITY"/>
+      <rsc_location id="location-FAKE4-1-18node3--INFINITY" node="18node4" resource-discovery="always" rsc="FAKE4" score="0"/>
+      <rsc_location id="location-FAKE4-2-18node3--INFINITY" node="18node4" resource-discovery="never" rsc="FAKE4" score="0"/>
+      <rsc_location id="location-FAKE4-3-18node3--INFINITY" node="18node4" resource-discovery="exclusive" rsc="FAKE4" score="0"/>
+      <rsc_location id="location-FAKE5-18node3--INFINITY" node="18node4" resource-discovery="always" rsc="FAKE5" score="0"/>
+      <rsc_location id="location-FAKECLONE1-remote--INFINITY" node="remote1" resource-discovery="exclusive" rsc="FAKECLONE1-clone" score="0"/>
+      <rsc_location id="location-FAKECLONE1-18node1-INFINITY" node="18node1" resource-discovery="exclusive" rsc="FAKECLONE1-clone" score="0"/>
+      <rsc_location id="location-FAKECLONE2-18node2--INFINITY" node="18node2" resource-discovery="never" rsc="FAKECLONE2-clone" score="0"/>
+
+
+      <rsc_location id="location-FAKEGROUP-18node1" node="18node1" resource-discovery="exclusive" rsc="FAKEGROUP" score="0"/>
+      <rsc_location id="location-FAKEGROUP-18node2" node="18node2" resource-discovery="exclusive" rsc="FAKEGROUP" score="0"/>
     </constraints>
   </configuration>
   <status>
-    <node_state id="5" uname="18builder" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
-      <transient_attributes id="5">
-        <instance_attributes id="status-5">
-        </instance_attributes>
-      </transient_attributes>
-      <lrm id="5">
-        <lrm_resources>
-          <lrm_resource id="shooter" type="fence_xvm" class="stonith">
-            <lrm_rsc_op id="shooter_last_0" operation_key="shooter_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="11:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;11:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="16" rc-code="0" op-status="0" interval="0" last-run="1378248545" last-rc-change="1378248545" exec-time="1" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-            <lrm_rsc_op id="shooter_monitor_60000" operation_key="shooter_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:3:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;10:3:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="11" rc-code="0" op-status="0" interval="60000" last-rc-change="1378248534" exec-time="8" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
-          </lrm_resource>
-          <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
-            <lrm_rsc_op id="remote1_last_0" operation_key="remote1_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:6:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;12:6:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="13" rc-code="0" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-            <lrm_rsc_op id="remote1_monitor_60000" operation_key="remote1_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:5:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;13:5:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="3" rc-code="0" op-status="0" interval="60000" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="7:9:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;7:9:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="39" rc-code="7" op-status="0" interval="0" last-run="1378249145" last-rc-change="1378249145" exec-time="61" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="18:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;18:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="53" rc-code="0" op-status="0" interval="0" last-run="1378249147" last-rc-change="1378249147" exec-time="11" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-            <lrm_rsc_op id="FAKE3_monitor_60000" operation_key="FAKE3_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="19:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;19:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="56" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249147" exec-time="10" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="9:12:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;9:12:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="61" rc-code="7" op-status="0" interval="0" last-run="1378249149" last-rc-change="1378249149" exec-time="65" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-        </lrm_resources>
+    <node_state crm-debug-origin="remote_init_cib_status" id="remote1" remote_node="true" uname="remote1">
+      <lrm id="remote1">
+        <lrm_resources/>
       </lrm>
     </node_state>
-    <node_state id="1" uname="18node1" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member">
+    <node_state crm-debug-origin="do_update_resource" crmd="online" expected="member" id="1" in_ccm="true" join="member" uname="18node1">
       <lrm id="1">
-        <lrm_resources>
-          <lrm_resource id="shooter" type="fence_xvm" class="stonith">
-            <lrm_rsc_op id="shooter_last_0" operation_key="shooter_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;12:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="9" rc-code="0" op-status="0" interval="0" last-run="1378248547" last-rc-change="1378248547" exec-time="19" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-            <lrm_rsc_op id="shooter_monitor_60000" operation_key="shooter_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;13:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="12" rc-code="0" op-status="0" interval="60000" last-rc-change="1378248548" exec-time="8" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
-          </lrm_resource>
-          <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
-            <lrm_rsc_op id="remote1_last_0" operation_key="remote1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="8:4:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;8:4:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="1" rc-code="7" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="9:9:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;9:9:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="25" rc-code="7" op-status="0" interval="0" last-run="1378249144" last-rc-change="1378249144" exec-time="28" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE3_last_failure_0" operation_key="FAKE3_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:10:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;10:10:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="30" rc-code="0" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="32" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-            <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="17:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;17:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="33" rc-code="0" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="15" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="22:12:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;22:12:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="40" rc-code="0" op-status="0" interval="0" last-run="1378249148" last-rc-change="1378249148" exec-time="36" queue-time="38" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-            <lrm_rsc_op id="FAKE4_monitor_60000" operation_key="FAKE4_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="23:12:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;23:12:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="44" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249148" exec-time="14" queue-time="1" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
-          </lrm_resource>
-        </lrm_resources>
+        <lrm_resources/>
       </lrm>
-      <transient_attributes id="1">
-        <instance_attributes id="status-1">
-        </instance_attributes>
-      </transient_attributes>
     </node_state>
-    <node_state id="2" uname="18node2" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member">
+    <node_state crm-debug-origin="do_update_resource" crmd="online" expected="member" id="2" in_ccm="true" join="member" uname="18node2">
       <lrm id="2">
-        <lrm_resources>
-          <lrm_resource id="shooter" type="fence_xvm" class="stonith">
-            <lrm_rsc_op id="shooter_last_0" operation_key="shooter_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="8:3:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;8:3:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="5" rc-code="7" op-status="0" interval="0" last-run="1378248530" last-rc-change="1378248530" exec-time="980" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-          <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
-            <lrm_rsc_op id="remote1_last_0" operation_key="remote1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:4:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;10:4:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="1" rc-code="7" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="16:9:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;16:9:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="18" rc-code="0" op-status="0" interval="0" last-run="1378249144" last-rc-change="1378249144" exec-time="18" queue-time="9" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-            <lrm_rsc_op id="FAKE2_monitor_60000" operation_key="FAKE2_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="17:9:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;17:9:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="22" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249144" exec-time="20" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:10:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;12:10:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="27" rc-code="7" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="35" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-          <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
-            <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:12:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;13:12:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="32" rc-code="7" op-status="0" interval="0" last-run="1378249148" last-rc-change="1378249148" exec-time="33" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
-          </lrm_resource>
-        </lrm_resources>
+        <lrm_resources/>
       </lrm>
-      <transient_attributes id="2">
-        <instance_attributes id="status-2">
-        </instance_attributes>
-      </transient_attributes>
     </node_state>
-    <node_state id="3" uname="18node3" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member"/>
-    <node_state id="4" uname="18node4" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member"/>
-    <node_state remote_node="true" id="remote1" uname="remote1" crm-debug-origin="remote_init_cib_status">
-      <transient_attributes id="remote1">
-        <instance_attributes id="status-remote1">
-        </instance_attributes>
-      </transient_attributes>
+    <node_state crm-debug-origin="do_update_resource" crmd="online" expected="member" id="3" in_ccm="true" join="member" uname="18node3">
+      <lrm id="3">
+        <lrm_resources/>
+      </lrm>
     </node_state>
+    <node_state crm-debug-origin="do_update_resource" crmd="online" expected="member" id="4" in_ccm="true" join="member" uname="18node4"/>
+    <lrm id="4">
+      <lrm_resources/>
+    </lrm>
   </status>
 </cib>
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 5142b29..74b69e3 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -77,7 +77,7 @@ crm_node_SOURCES	= crm_node.c
 crm_node_LDADD		= $(top_builddir)/lib/cluster/libcrmcluster.la \
 			  $(COMMONLIBS) $(CLUSTERLIBS)
 
-crm_simulate_SOURCES	= crm_simulate.c
+crm_simulate_SOURCES	= crm_simulate.c fake_transition.c
 crm_simulate_CFLAGS	= -I$(top_srcdir)/pengine
 
 crm_simulate_LDADD	= $(top_builddir)/lib/pengine/libpe_status.la		\
@@ -105,12 +105,14 @@ crm_verify_LDADD	= $(top_builddir)/lib/pengine/libpe_status.la 	\
 crm_attribute_SOURCES	= crm_attribute.c
 crm_attribute_LDADD	= $(top_builddir)/lib/cluster/libcrmcluster.la $(COMMONLIBS)
 
-crm_resource_SOURCES	= crm_resource.c
-crm_resource_LDADD	= $(top_builddir)/lib/pengine/libpe_rules.la  \
-			$(top_builddir)/lib/lrmd/liblrmd.la \
-			$(top_builddir)/lib/services/libcrmservice.la \
-			$(top_builddir)/lib/pengine/libpe_status.la \
-			$(top_builddir)/pengine/libpengine.la \
+crm_resource_SOURCES	= crm_resource.c fake_transition.c
+crm_resource_CFLAGS	= -I$(top_srcdir)/pengine
+crm_resource_LDADD	= $(top_builddir)/lib/pengine/libpe_rules.la  		\
+			$(top_builddir)/lib/lrmd/liblrmd.la 			\
+			$(top_builddir)/lib/services/libcrmservice.la 		\
+			$(top_builddir)/lib/pengine/libpe_status.la 		\
+			$(top_builddir)/pengine/libpengine.la 			\
+			$(top_builddir)/lib/transition/libtransitioner.la	\
 			$(COMMONLIBS)
 
 iso8601_SOURCES		= test.iso8601.c
diff --git a/tools/crm_failcount b/tools/crm_failcount
index 94a8400..ed697e9 100755
--- a/tools/crm_failcount
+++ b/tools/crm_failcount
@@ -1,5 +1,6 @@
 #!/bin/bash
 
+resource=""
 options=""
 target=`crm_node -n`
 
@@ -11,15 +12,7 @@ if [ $? != 0 ] ; then echo "crm_failcount - A convenience wrapper for crm_attrib
 # Note the quotes around `$TEMP': they are essential!
 eval set -- "$TEMP"
 
-while true ; do
-    case "$1" in
-	-N|--node) target="$2"; shift; shift;;
-	-U|--uname) target="$2"; shift; shift;;
-	-v|--attr-value|-i|--attr-id) options="$options $1 $2"; shift; shift;;
-	-Q|--quiet|-D|--delete-attr|-G|--get-value|-V) options="$options $1"; shift;;
-	-r|--resource-id) options="$options -n fail-count-$2"; shift; shift;;
-	--version) crm_attribute --version; exit 0;;
-	--help)
+function show_help() {
 	    echo "crm_failcount - A convenience wrapper for crm_attribute";
 	    echo "";
 	    echo "Set, update or remove the failcount for the specified resource on the named node";
@@ -43,10 +36,27 @@ while true ; do
 	    echo " -l, --lifetime=value	Until when should the setting take affect."
 	    echo "	       		Valid values: reboot, forever"
 	    echo " -i, --id=value		(Advanced) The ID used to identify the attribute"
+}
+
+while true ; do
+    case "$1" in
+	-N|--node) target="$2"; shift; shift;;
+	-U|--uname) target="$2"; shift; shift;;
+	-v|--attr-value|-i|--attr-id) options="$options $1 $2"; shift; shift;;
+	-Q|--quiet|-D|--delete-attr|-G|--get-value|-V) options="$options $1"; shift;;
+	-r|--resource-id) options="$options -n fail-count-$2"; resource="$2"; shift; shift;;
+	--version) crm_attribute --version; exit 0;;
+	--help)
+	    show_help
 	    exit 0;;
 	--) shift ; break ;;
 	*) echo "Unknown option: $1. See --help for details." exit 1;;
     esac
 done
 
+if [ "x$resource" = x ]; then
+    echo "You must supply a resource name to check. See 'crm_failcount --help' for details"
+    exit 1
+fi
+
 crm_attribute -N $target $options -t status -d 0
diff --git a/tools/crm_resource.c b/tools/crm_resource.c
index ff5effd..6e510e1 100644
--- a/tools/crm_resource.c
+++ b/tools/crm_resource.c
@@ -43,6 +43,9 @@
 #include <crm/pengine/status.h>
 #include <crm/pengine/internal.h>
 
+#include "fake_transition.h"
+extern xmlNode *do_calculations(pe_working_set_t * data_set, xmlNode * xml_input, crm_time_t * now);
+
 bool scope_master = FALSE;
 gboolean do_force = FALSE;
 gboolean BE_QUIET = FALSE;
@@ -1300,6 +1303,373 @@ generate_resource_params(resource_t * rsc, pe_working_set_t * data_set)
     return combined;
 }
 
+static bool resource_is_running_on(resource_t *rsc, const char *host) 
+{
+    bool found = TRUE;
+    GListPtr hIter = NULL;
+    GListPtr hosts = NULL;
+
+    if(rsc == NULL) {
+        return FALSE;
+    }
+
+    rsc->fns->location(rsc, &hosts, TRUE);
+    for (hIter = hosts; host != NULL && hIter != NULL; hIter = hIter->next) {
+        pe_node_t *node = (pe_node_t *) hIter->data;
+
+        if(strcmp(host, node->details->uname) == 0) {
+            crm_trace("Resource %s is running on %s\n", rsc->id, host);
+            goto done;
+        } else if(strcmp(host, node->details->id) == 0) {
+            crm_trace("Resource %s is running on %s\n", rsc->id, host);
+            goto done;
+        }
+    }
+
+    if(host != NULL) {
+        crm_trace("Resource %s is not running on: %s\n", rsc->id, host);
+        found = FALSE;
+
+    } else if(host == NULL && hosts == NULL) {
+        crm_trace("Resource %s is not running\n", rsc->id);
+        found = FALSE;
+    }
+
+  done:
+
+    g_list_free(hosts);
+    return found;
+}
+
+static GList *get_active_resources(const char *host, pe_working_set_t *data_set) 
+{
+    GList *rIter = NULL;
+    GList *active = NULL;
+
+    for (rIter = data_set->resources; rIter != NULL; rIter = rIter->next) {
+        resource_t *rsc = (resource_t *) rIter->data;
+
+        if(resource_is_running_on(rsc, host)) {
+            active = g_list_append(active, strdup(rsc->id));
+        }
+    }
+
+    return active;
+}
+
+static GList *subtract_lists(GList *from, GList *items) 
+{
+    GList *item = NULL;
+    GList *result = g_list_copy(from);
+
+    for (item = items; item != NULL; item = item->next) {
+        GList *candidate = NULL;
+        for (candidate = from; candidate != NULL; candidate = candidate->next) {
+            crm_info("Comparing %s with %s", candidate->data, item->data);
+            if(strcmp(candidate->data, item->data) == 0) {
+                result = g_list_remove(result, candidate->data);
+                break;
+            }
+        }
+    }
+
+    return result;
+}
+
+static void dump_list(GList *items, const char *tag) 
+{
+    int lpc = 0;
+    GList *item = NULL;
+
+    for (item = items; item != NULL; item = item->next) {
+        crm_trace("%s[%d]: %s", tag, lpc, item->data);
+        lpc++;
+    }
+}
+
+static void display_list(GList *items, const char *tag) 
+{
+    GList *item = NULL;
+
+    for (item = items; item != NULL; item = item->next) {
+        fprintf(stdout, "%s%s\n", tag, (const char *)item->data);
+    }
+}
+
+static int
+update_dataset(cib_t *cib, pe_working_set_t * data_set, bool simulate)
+{
+    xmlNode *cib_xml_copy = NULL;
+    int rc = cib->cmds->query(cib, NULL, &cib_xml_copy, cib_scope_local | cib_sync_call);
+
+    if(rc != pcmk_ok) {
+        fprintf(stdout, "Could not obtain the current CIB: %s (%d)\n", pcmk_strerror(rc), rc);
+        return crm_exit(rc);
+
+    } else if (cli_config_update(&cib_xml_copy, NULL, FALSE) == FALSE) {
+        fprintf(stderr, "Could not upgrade the current CIB\n");
+        return -ENOKEY;
+    }
+
+    set_working_set_defaults(data_set);
+    data_set->input = cib_xml_copy;
+    data_set->now = crm_time_new(NULL);
+
+    if(simulate) {
+        char *pid = crm_itoa(getpid());
+        cib_t *shadow_cib = cib_shadow_new(pid);
+        char *shadow_file = get_shadow_file(pid);
+
+        if (shadow_cib == NULL) {
+            fprintf(stderr, "Could not create shadow cib: '%s'\n", pid);
+            crm_exit(-ENXIO);
+        }
+
+        rc = write_xml_file(cib_xml_copy, shadow_file, FALSE);
+
+        if (rc < 0) {
+            fprintf(stderr, "Could not populate shadow cib: %s (%d)\n", pcmk_strerror(rc), rc);
+            free_xml(cib_xml_copy);
+            return rc;
+        }
+
+        rc = shadow_cib->cmds->signon(shadow_cib, crm_system_name, cib_command);
+        if(rc != pcmk_ok) {
+            fprintf(stderr, "Could not connect to shadow cib: %s (%d)\n", pcmk_strerror(rc), rc);
+            free_xml(cib_xml_copy);
+            return rc;
+        }
+
+        do_calculations(data_set, cib_xml_copy, NULL);
+        run_simulation(data_set, shadow_cib, NULL, TRUE);
+        rc = update_dataset(shadow_cib, data_set, FALSE);
+
+        cib_delete(shadow_cib);
+        /* unlink(shadow_file); */
+        free(shadow_file);
+
+    } else {
+        cluster_status(data_set);
+    }
+
+    return rc;
+}
+
+static int
+max_delay_in(pe_working_set_t * data_set, GList *resources) 
+{
+    int max_delay = 0;
+    GList *item = NULL;
+
+    for (item = resources; item != NULL; item = item->next) {
+        resource_t *rsc = pe_find_resource(data_set->resources, (const char *)item->data);
+
+        if(rsc) {
+            char *key = g_strdup_printf("%s_%s_0", rsc->id, RSC_STOP);
+            action_t *stop = custom_action(rsc, key, RSC_STOP, NULL, TRUE, FALSE, data_set);
+            const char *value = g_hash_table_lookup(stop->meta, XML_ATTR_TIMEOUT);
+            int delay = crm_int_helper(value, NULL);
+
+            if(delay > max_delay) {
+                crm_trace("Calculated new delay of %s ms due to %s", value, rsc->id);
+                max_delay = delay;
+            }
+
+            pe_free_action(stop);
+        }
+    }
+
+
+    return 5 + (max_delay / 1000);
+}
+
+static int
+resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib)
+{
+    int rc = 0;
+    int lpc = 0;
+    int before = 0;
+    int step_timeout_s = 0;
+    int sleep_interval = 2;
+    int timeout = timeout_ms / 1000;
+
+    bool is_clone = FALSE;
+    char *rsc_id = NULL;
+
+    GList *list_delta = NULL;
+    GList *target_active = NULL;
+    GList *current_active = NULL;
+    GList *restart_target_active = NULL;
+
+    pe_working_set_t data_set;
+
+    if(resource_is_running_on(rsc, host) == FALSE) {
+        return -ENXIO;
+    }
+
+
+    rsc_id = strdup(rsc->id);
+    if(rsc->variant > pe_group) {
+        is_clone = TRUE;
+    }
+
+    /*
+      grab full cib
+      determine resource state of list
+      disable or ban
+      poll and and watch for resources to get stopped
+      without --wait, calculate the stop timeout for each step and wait for that
+      if we hit --wait or the service timeout, re-enable or un-ban, report failure and indicate which resources we couldn't take down
+      if everything stopped, re-enable or un-ban
+      poll and and watch for resources to get stopped
+      without --wait, calculate the start timeout for each step and wait for that
+      if we hit --wait or the service timeout, report (different) failure and indicate which resources we couldn't bring back up
+      report success
+
+      Optimizations:
+      - use constraints to determine ordered list of affected resources
+      - Allow a --no-deps option (aka. --force-restart)
+    */
+
+
+    set_working_set_defaults(&data_set);
+    rc = update_dataset(cib, &data_set, FALSE);
+    if(rc != pcmk_ok) {
+        fprintf(stdout, "Could not get new resource list: %s (%d)\n", pcmk_strerror(rc), rc);
+        return rc;
+    }
+
+    restart_target_active = get_active_resources(host, &data_set);
+    current_active = get_active_resources(host, &data_set);
+
+    dump_list(current_active, "Origin");
+
+    if(is_clone && host) {
+        BE_QUIET = TRUE;
+        rc = ban_resource(rsc_id, host, NULL, cib);
+
+    } else {
+        rc = set_resource_attr(rsc_id, NULL, NULL, XML_RSC_ATTR_TARGET_ROLE, RSC_STOPPED, FALSE, cib, &data_set);
+    }
+    if(rc != pcmk_ok) {
+        fprintf(stderr, "Could not set target-role for %s: %s (%d)\n", rsc_id, pcmk_strerror(rc), rc);
+        return crm_exit(rc);
+    }
+
+    rc = update_dataset(cib, &data_set, TRUE);
+    if(rc != pcmk_ok) {
+        fprintf(stderr, "Could not determine which resources would be stopped\n");
+        goto failure;
+    }
+
+    target_active = get_active_resources(host, &data_set);
+    dump_list(target_active, "Target");
+
+    list_delta = subtract_lists(current_active, target_active);
+    fprintf(stdout, "Waiting for %d resources to stop:\n", g_list_length(list_delta));
+    display_list(list_delta, " * ");
+
+    step_timeout_s = timeout / sleep_interval;
+    while(g_list_length(list_delta) > 0) {
+        before = g_list_length(list_delta);
+        if(timeout_ms == 0) {
+            step_timeout_s = max_delay_in(&data_set, list_delta) / sleep_interval;
+        }
+
+        /* We probably don't need the entire step timeout */
+        for(lpc = 0; lpc < step_timeout_s && g_list_length(list_delta) > 0; lpc++) {
+            sleep(sleep_interval);
+            if(timeout) {
+                timeout -= sleep_interval;
+                crm_trace("%ds remaining", timeout);
+            }
+            rc = update_dataset(cib, &data_set, FALSE);
+            if(rc != pcmk_ok) {
+                fprintf(stderr, "Could not determine which resources were stopped\n");
+                goto failure;
+            }
+
+            current_active = get_active_resources(host, &data_set);
+            list_delta = subtract_lists(current_active, target_active);
+            dump_list(current_active, "Current");
+            dump_list(list_delta, "Delta");
+        }
+
+        crm_trace("%d (was %d) resources remaining", before, g_list_length(list_delta));
+        if(before == g_list_length(list_delta)) {
+            /* aborted during stop phase, print the contents of list_delta */
+            fprintf(stderr, "Could not complete shutdown of %s, %d resources remaining\n", rsc_id, g_list_length(list_delta));
+            display_list(list_delta, " * ");
+            rc = -ETIME;
+            goto failure;
+        }
+
+    }
+
+    if(is_clone && host) {
+        rc = clear_resource(rsc_id, host, NULL, cib);
+
+    } else {
+        rc = delete_resource_attr(rsc_id, NULL, NULL, XML_RSC_ATTR_TARGET_ROLE, cib, &data_set);
+    }
+
+    if(rc != pcmk_ok) {
+        fprintf(stderr, "Could not unset target-role for %s: %s (%d)\n", rsc_id, pcmk_strerror(rc), rc);
+        return crm_exit(rc);
+    }
+
+    target_active = restart_target_active;
+    list_delta = subtract_lists(target_active, current_active);
+    fprintf(stdout, "Waiting for %d resources to start again:\n", g_list_length(list_delta));
+    display_list(list_delta, " * ");
+
+    step_timeout_s = timeout / sleep_interval;
+    while(g_list_length(list_delta) > 0) {
+        if(timeout_ms == 0) {
+            step_timeout_s = max_delay_in(&data_set, list_delta) / sleep_interval;
+        }
+
+        /* We probably don't need the entire step timeout */
+        for(lpc = 0; lpc < step_timeout_s && g_list_length(list_delta) > 0; lpc++) {
+            sleep(sleep_interval);
+            if(timeout) {
+                timeout -= sleep_interval;
+                crm_trace("%ds remaining", timeout);
+            }
+
+            rc = update_dataset(cib, &data_set, FALSE);
+            if(rc != pcmk_ok) {
+                fprintf(stderr, "Could not determine which resources were started\n");
+                goto failure;
+            }
+
+            current_active = get_active_resources(host, &data_set);
+            list_delta = subtract_lists(target_active, current_active);
+            dump_list(current_active, "Current");
+            dump_list(list_delta, "Delta");
+        }
+
+        if(before == g_list_length(list_delta)) {
+            /* aborted during start phase, print the contents of list_delta */
+            fprintf(stdout, "Could not complete restart of %s, %d resources remaining\n", rsc_id, g_list_length(list_delta));
+            display_list(list_delta, " * ");
+            rc = -ETIME;
+            goto failure;
+        }
+
+    } while(g_list_length(list_delta) > 0);
+
+    return pcmk_ok;
+
+  failure:
+    if(is_clone && host) {
+        clear_resource(rsc_id, host, NULL, cib);
+
+    } else {
+        delete_resource_attr(rsc_id, NULL, NULL, XML_RSC_ATTR_TARGET_ROLE, cib, &data_set);
+    }
+    return rc;
+}
 
 /* *INDENT-OFF* */
 static struct crm_option long_options[] = {
@@ -1371,6 +1741,7 @@ static struct crm_option long_options[] = {
     {"-spacer-",   1, 0, '-', "\nAdvanced Commands:"},
     {"delete",     0, 0, 'D', "\t\t(Advanced) Delete a resource from the CIB"},
     {"fail",       0, 0, 'F', "\t\t(Advanced) Tell the cluster this resource has failed"},
+    {"restart",    0, 0,  0,  NULL, 1},
     {"force-stop", 0, 0,  0,  "\t(Advanced) Bypass the cluster and stop a resource on the local node. Additional detail with -V"},
     {"force-start",0, 0,  0,  "\t(Advanced) Bypass the cluster and start a resource on the local node. Additional detail with -V"},
     {"force-check",0, 0,  0,  "\t(Advanced) Bypass the cluster and check the state of a resource on the local node. Additional detail with -V\n"},
@@ -1384,6 +1755,7 @@ static struct crm_option long_options[] = {
     {"utilization",	0, 0, 'z', "\tModify a resource's utilization attribute. For use with -p, -g, -d"},
     {"set-name",        1, 0, 's', "\t(Advanced) ID of the instance_attributes object to change"},
     {"nvpair",          1, 0, 'i', "\t(Advanced) ID of the nvpair object to change/delete"},
+    {"timeout",         1, 0, 'T',  "\t(Advanced) How long to wait for --restart to take effect", 1},
     {"force",		0, 0, 'f', "\n" /* Is this actually true anymore?
 					   "\t\tForce the resource to move by creating a rule for the current location and a score of -INFINITY"
 					   "\n\t\tThis should be used if the resource's stickiness and constraint scores total more than INFINITY (Currently 100,000)"
@@ -1444,6 +1816,7 @@ main(int argc, char **argv)
 
     int rc = pcmk_ok;
     int option_index = 0;
+    int timeout_ms = 0;
     int argerr = 0;
     int flag;
 
@@ -1469,6 +1842,7 @@ main(int argc, char **argv)
                     recursive = TRUE;
 
                 } else if (safe_str_eq("force-stop", longname)
+                    || safe_str_eq("restart", longname)
                     || safe_str_eq("force-start", longname)
                     || safe_str_eq("force-check", longname)) {
                     rsc_cmd = flag;
@@ -1618,6 +1992,9 @@ main(int argc, char **argv)
             case 't':
                 rsc_type = optarg;
                 break;
+            case 'T':
+                timeout_ms = crm_get_msec(optarg);
+                break;
             case 'C':
             case 'R':
             case 'P':
@@ -1769,6 +2146,11 @@ main(int argc, char **argv)
             goto bail;
         }
 
+    } else if (rsc_cmd == 0 && rsc_long_cmd && safe_str_eq(rsc_long_cmd, "restart")) {
+        resource_t *rsc = pe_find_resource(data_set.resources, rsc_id);
+
+        rc = resource_restart(rsc, host_uname, timeout_ms, cib_conn);
+
     } else if (rsc_cmd == 0 && rsc_long_cmd) {
         svc_action_t *op = NULL;
         const char *rtype = NULL;
@@ -1801,6 +2183,16 @@ main(int argc, char **argv)
             action = "monitor";
         }
 
+        if(rsc->variant == pe_clone || rsc->variant == pe_master) {
+            /* Grab the first child resource in the hope its not a group */
+            rsc = rsc->children->data;
+        }
+
+        if(rsc->variant == pe_group) {
+            CMD_ERR("Sorry, --%s doesn't support group resources\n", rsc_long_cmd);
+            crm_exit(EOPNOTSUPP);
+        }
+
         rclass = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS);
         rprov = crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER);
         rtype = crm_element_value(rsc->xml, XML_ATTR_TYPE);
diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c
index 7c0dcc7..d4e2238 100644
--- a/tools/crm_simulate.c
+++ b/tools/crm_simulate.c
@@ -34,19 +34,14 @@
 #include <crm/common/iso8601.h>
 #include <crm/pengine/status.h>
 #include <allocate.h>
+#include "fake_transition.h"
 
 cib_t *global_cib = NULL;
 GListPtr op_fail = NULL;
 gboolean quiet = FALSE;
-gboolean bringing_nodes_online = FALSE;
 gboolean print_pending = FALSE;
 char *temp_shadow = NULL;
-
-#define new_node_template "//"XML_CIB_TAG_NODE"[@uname='%s']"
-#define node_template "//"XML_CIB_TAG_STATE"[@uname='%s']"
-#define rsc_template "//"XML_CIB_TAG_STATE"[@uname='%s']//"XML_LRM_TAG_RESOURCE"[@id='%s']"
-#define op_template  "//"XML_CIB_TAG_STATE"[@uname='%s']//"XML_LRM_TAG_RESOURCE"[@id='%s']/"XML_LRM_TAG_RSC_OP"[@id='%s']"
-/* #define op_template  "//"XML_CIB_TAG_STATE"[@uname='%s']//"XML_LRM_TAG_RESOURCE"[@id='%s']/"XML_LRM_TAG_RSC_OP"[@id='%s' and @"XML_LRM_ATTR_CALLID"='%d']" */
+extern gboolean bringing_nodes_online;
 
 #define quiet_log(fmt, args...) do {		\
 	if(quiet == FALSE) {			\
@@ -68,472 +63,6 @@ get_date(void)
     return NULL;
 }
 
-static xmlNode *
-find_resource(xmlNode * cib_node, const char *resource)
-{
-    char *xpath = NULL;
-    xmlNode *match = NULL;
-    const char *node = crm_element_value(cib_node, XML_ATTR_UNAME);
-    int max = strlen(rsc_template) + strlen(resource) + strlen(node) + 1;
-
-    xpath = calloc(1, max);
-
-    snprintf(xpath, max, rsc_template, node, resource);
-    match = get_xpath_object(xpath, cib_node, LOG_DEBUG_2);
-
-    free(xpath);
-    return match;
-}
-
-static void
-create_node_entry(cib_t * cib_conn, const char *node)
-{
-    int rc = pcmk_ok;
-    int max = strlen(new_node_template) + strlen(node) + 1;
-    char *xpath = NULL;
-
-    xpath = calloc(1, max);
-
-    snprintf(xpath, max, new_node_template, node);
-    rc = cib_conn->cmds->query(cib_conn, xpath, NULL, cib_xpath | cib_sync_call | cib_scope_local);
-
-    if (rc == -ENXIO) {
-        xmlNode *cib_object = create_xml_node(NULL, XML_CIB_TAG_NODE);
-
-        /* Using node uname as uuid ala corosync/openais */
-        crm_xml_add(cib_object, XML_ATTR_ID, node);
-        crm_xml_add(cib_object, XML_ATTR_UNAME, node);
-        cib_conn->cmds->create(cib_conn, XML_CIB_TAG_NODES, cib_object,
-                               cib_sync_call | cib_scope_local);
-        /* Not bothering with subsequent query to see if it exists,
-           we'll bomb out later in the call to query_node_uuid()... */
-
-        free_xml(cib_object);
-    }
-
-    free(xpath);
-}
-
-static xmlNode *
-inject_node_state(cib_t * cib_conn, const char *node, const char *uuid)
-{
-    int rc = pcmk_ok;
-    int max = strlen(rsc_template) + strlen(node) + 1;
-    char *xpath = NULL;
-    xmlNode *cib_object = NULL;
-
-    xpath = calloc(1, max);
-
-    if (bringing_nodes_online) {
-        create_node_entry(cib_conn, node);
-    }
-
-    snprintf(xpath, max, node_template, node);
-    rc = cib_conn->cmds->query(cib_conn, xpath, &cib_object,
-                               cib_xpath | cib_sync_call | cib_scope_local);
-
-    if (cib_object && ID(cib_object) == NULL) {
-        crm_err("Detected multiple node_state entries for xpath=%s, bailing", xpath);
-        crm_log_xml_warn(cib_object, "Duplicates");
-        crm_exit(ENOTUNIQ);
-    }
-
-    if (rc == -ENXIO) {
-        char *found_uuid = NULL;
-
-        if (uuid == NULL) {
-            query_node_uuid(cib_conn, node, &found_uuid, NULL);
-        } else {
-            found_uuid = strdup(uuid);
-        }
-
-        cib_object = create_xml_node(NULL, XML_CIB_TAG_STATE);
-        crm_xml_add(cib_object, XML_ATTR_UUID, found_uuid);
-        crm_xml_add(cib_object, XML_ATTR_UNAME, node);
-        cib_conn->cmds->create(cib_conn, XML_CIB_TAG_STATUS, cib_object,
-                               cib_sync_call | cib_scope_local);
-        free_xml(cib_object);
-        free(found_uuid);
-
-        rc = cib_conn->cmds->query(cib_conn, xpath, &cib_object,
-                                   cib_xpath | cib_sync_call | cib_scope_local);
-        crm_trace("injecting node state for %s. rc is %d", node, rc);
-    }
-
-    free(xpath);
-    CRM_ASSERT(rc == pcmk_ok);
-    return cib_object;
-}
-
-static xmlNode *
-modify_node(cib_t * cib_conn, char *node, gboolean up)
-{
-    xmlNode *cib_node = inject_node_state(cib_conn, node, NULL);
-
-    if (up) {
-        crm_xml_add(cib_node, XML_NODE_IN_CLUSTER, XML_BOOLEAN_YES);
-        crm_xml_add(cib_node, XML_NODE_IS_PEER, ONLINESTATUS);
-        crm_xml_add(cib_node, XML_NODE_JOIN_STATE, CRMD_JOINSTATE_MEMBER);
-        crm_xml_add(cib_node, XML_NODE_EXPECTED, CRMD_JOINSTATE_MEMBER);
-
-    } else {
-        crm_xml_add(cib_node, XML_NODE_IN_CLUSTER, XML_BOOLEAN_NO);
-        crm_xml_add(cib_node, XML_NODE_IS_PEER, OFFLINESTATUS);
-        crm_xml_add(cib_node, XML_NODE_JOIN_STATE, CRMD_JOINSTATE_DOWN);
-        crm_xml_add(cib_node, XML_NODE_EXPECTED, CRMD_JOINSTATE_DOWN);
-    }
-
-    crm_xml_add(cib_node, XML_ATTR_ORIGIN, crm_system_name);
-    return cib_node;
-}
-
-static void
-inject_transient_attr(xmlNode * cib_node, const char *name, const char *value)
-{
-    xmlNode *attrs = NULL;
-    xmlNode *container = NULL;
-    xmlNode *nvp = NULL;
-    const char *node_uuid = ID(cib_node);
-    char *nvp_id = crm_concat(name, node_uuid, '-');
-
-    crm_info("Injecting attribute %s=%s into %s '%s'", name, value, xmlGetNodePath(cib_node),
-             ID(cib_node));
-
-    attrs = first_named_child(cib_node, XML_TAG_TRANSIENT_NODEATTRS);
-    if (attrs == NULL) {
-        attrs = create_xml_node(cib_node, XML_TAG_TRANSIENT_NODEATTRS);
-        crm_xml_add(attrs, XML_ATTR_ID, node_uuid);
-    }
-
-    container = first_named_child(attrs, XML_TAG_ATTR_SETS);
-    if (container == NULL) {
-        container = create_xml_node(attrs, XML_TAG_ATTR_SETS);
-        crm_xml_add(container, XML_ATTR_ID, node_uuid);
-    }
-
-    nvp = create_xml_node(container, XML_CIB_TAG_NVPAIR);
-    crm_xml_add(nvp, XML_ATTR_ID, nvp_id);
-    crm_xml_add(nvp, XML_NVPAIR_ATTR_NAME, name);
-    crm_xml_add(nvp, XML_NVPAIR_ATTR_VALUE, value);
-
-    free(nvp_id);
-}
-
-static xmlNode *
-inject_resource(xmlNode * cib_node, const char *resource, const char *rclass, const char *rtype,
-                const char *rprovider)
-{
-    xmlNode *lrm = NULL;
-    xmlNode *container = NULL;
-    xmlNode *cib_resource = NULL;
-    char *xpath = NULL;
-
-    cib_resource = find_resource(cib_node, resource);
-    if (cib_resource != NULL) {
-        return cib_resource;
-    }
-
-    /* One day, add query for class, provider, type */
-
-    if (rclass == NULL || rtype == NULL) {
-        fprintf(stderr, "Resource %s not found in the status section of %s."
-                "  Please supply the class and type to continue\n", resource, ID(cib_node));
-        return NULL;
-
-    } else if (safe_str_neq(rclass, "ocf")
-               && safe_str_neq(rclass, "stonith")
-               && safe_str_neq(rclass, "heartbeat")
-               && safe_str_neq(rclass, "service")
-               && safe_str_neq(rclass, "upstart")
-               && safe_str_neq(rclass, "systemd")
-               && safe_str_neq(rclass, "lsb")) {
-        fprintf(stderr, "Invalid class for %s: %s\n", resource, rclass);
-        return NULL;
-
-    } else if (safe_str_eq(rclass, "ocf") && rprovider == NULL) {
-        fprintf(stderr, "Please specify the provider for resource %s\n", resource);
-        return NULL;
-    }
-
-    xpath = (char *)xmlGetNodePath(cib_node);
-    crm_info("Injecting new resource %s into %s '%s'", resource, xpath, ID(cib_node));
-    free(xpath);
-
-    lrm = first_named_child(cib_node, XML_CIB_TAG_LRM);
-    if (lrm == NULL) {
-        const char *node_uuid = ID(cib_node);
-
-        lrm = create_xml_node(cib_node, XML_CIB_TAG_LRM);
-        crm_xml_add(lrm, XML_ATTR_ID, node_uuid);
-    }
-
-    container = first_named_child(lrm, XML_LRM_TAG_RESOURCES);
-    if (container == NULL) {
-        container = create_xml_node(lrm, XML_LRM_TAG_RESOURCES);
-    }
-
-    cib_resource = create_xml_node(container, XML_LRM_TAG_RESOURCE);
-    crm_xml_add(cib_resource, XML_ATTR_ID, resource);
-
-    crm_xml_add(cib_resource, XML_AGENT_ATTR_CLASS, rclass);
-    crm_xml_add(cib_resource, XML_AGENT_ATTR_PROVIDER, rprovider);
-    crm_xml_add(cib_resource, XML_ATTR_TYPE, rtype);
-
-    return cib_resource;
-}
-
-static lrmd_event_data_t *
-create_op(xmlNode * cib_resource, const char *task, int interval, int outcome)
-{
-    lrmd_event_data_t *op = NULL;
-    xmlNode *xop = NULL;
-
-    op = calloc(1, sizeof(lrmd_event_data_t));
-
-    op->rsc_id = strdup(ID(cib_resource));
-    op->interval = interval;
-    op->op_type = strdup(task);
-
-    op->rc = outcome;
-    op->op_status = 0;
-    op->params = NULL;          /* TODO: Fill me in */
-    op->t_run = time(NULL);
-    op->t_rcchange = op->t_run;
-
-    op->call_id = 0;
-    for (xop = __xml_first_child(cib_resource); xop != NULL; xop = __xml_next(xop)) {
-        int tmp = 0;
-
-        crm_element_value_int(xop, XML_LRM_ATTR_CALLID, &tmp);
-        if (tmp > op->call_id) {
-            op->call_id = tmp;
-        }
-    }
-    op->call_id++;
-
-    return op;
-}
-
-static xmlNode *
-inject_op(xmlNode * cib_resource, lrmd_event_data_t * op, int target_rc)
-{
-    return create_operation_update(cib_resource, op, CRM_FEATURE_SET, target_rc, crm_system_name,
-                                   LOG_DEBUG_2);
-}
-
-static void
-update_failcounts(xmlNode * cib_node, const char *resource, int interval, int rc)
-{
-    if (rc == 0) {
-        return;
-
-    } else if (rc == 7 && interval == 0) {
-        return;
-
-    } else {
-        char *name = NULL;
-        char *now = crm_itoa(time(NULL));
-
-        name = crm_concat("fail-count", resource, '-');
-        inject_transient_attr(cib_node, name, "value++");
-
-        name = crm_concat("last-failure", resource, '-');
-        inject_transient_attr(cib_node, name, now);
-
-        free(name);
-        free(now);
-    }
-}
-
-static gboolean
-exec_pseudo_action(crm_graph_t * graph, crm_action_t * action)
-{
-    const char *node = crm_element_value(action->xml, XML_LRM_ATTR_TARGET);
-    const char *task = crm_element_value(action->xml, XML_LRM_ATTR_TASK_KEY);
-
-    action->confirmed = TRUE;
-
-    quiet_log(" * Pseudo action:   %s%s%s\n", task, node ? " on " : "", node ? node : "");
-    update_graph(graph, action);
-    return TRUE;
-}
-
-GListPtr resource_list = NULL;
-
-static gboolean
-exec_rsc_action(crm_graph_t * graph, crm_action_t * action)
-{
-    int rc = 0;
-    GListPtr gIter = NULL;
-    lrmd_event_data_t *op = NULL;
-    int target_outcome = 0;
-    gboolean uname_is_uuid = FALSE;
-
-    const char *rtype = NULL;
-    const char *rclass = NULL;
-    const char *resource = NULL;
-    const char *rprovider = NULL;
-    const char *operation = crm_element_value(action->xml, "operation");
-    const char *target_rc_s = crm_meta_value(action->params, XML_ATTR_TE_TARGET_RC);
-
-    xmlNode *cib_node = NULL;
-    xmlNode *cib_resource = NULL;
-    xmlNode *action_rsc = first_named_child(action->xml, XML_CIB_TAG_RESOURCE);
-
-    char *node = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET);
-    char *uuid = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET_UUID);
-    const char *router_node = crm_element_value(action->xml, XML_LRM_ATTR_ROUTER_NODE);
-
-    if (safe_str_eq(operation, CRM_OP_PROBED)
-        || safe_str_eq(operation, CRM_OP_REPROBE)) {
-        crm_info("Skipping %s op for %s\n", operation, node);
-        goto done;
-    }
-
-    if (action_rsc == NULL) {
-        crm_log_xml_err(action->xml, "Bad");
-        free(node); free(uuid);
-        return FALSE;
-    }
-
-    /* Look for the preferred name
-     * If not found, try the expected 'local' name
-     * If not found use the preferred name anyway
-     */
-    resource = crm_element_value(action_rsc, XML_ATTR_ID);
-    if (pe_find_resource(resource_list, resource) == NULL) {
-        const char *longname = crm_element_value(action_rsc, XML_ATTR_ID_LONG);
-
-        if (pe_find_resource(resource_list, longname)) {
-            resource = longname;
-        }
-    }
-
-    if (safe_str_eq(operation, "delete")) {
-        quiet_log(" * Resource action: %-15s delete on %s\n", resource, node);
-        goto done;
-    }
-
-    rclass = crm_element_value(action_rsc, XML_AGENT_ATTR_CLASS);
-    rtype = crm_element_value(action_rsc, XML_ATTR_TYPE);
-    rprovider = crm_element_value(action_rsc, XML_AGENT_ATTR_PROVIDER);
-
-    if (target_rc_s != NULL) {
-        target_outcome = crm_parse_int(target_rc_s, "0");
-    }
-
-    CRM_ASSERT(global_cib->cmds->query(global_cib, NULL, NULL, cib_sync_call | cib_scope_local) ==
-               pcmk_ok);
-
-    if (router_node) {
-        uname_is_uuid = TRUE;
-    }
-
-    cib_node = inject_node_state(global_cib, node, uname_is_uuid ? node : uuid);
-    CRM_ASSERT(cib_node != NULL);
-
-    cib_resource = inject_resource(cib_node, resource, rclass, rtype, rprovider);
-    CRM_ASSERT(cib_resource != NULL);
-
-    op = convert_graph_action(cib_resource, action, 0, target_outcome);
-    if (op->interval) {
-        quiet_log(" * Resource action: %-15s %s=%d on %s\n", resource, op->op_type, op->interval,
-                  node);
-    } else {
-        quiet_log(" * Resource action: %-15s %s on %s\n", resource, op->op_type, node);
-    }
-
-    for (gIter = op_fail; gIter != NULL; gIter = gIter->next) {
-        char *spec = (char *)gIter->data;
-        char *key = NULL;
-
-        key = calloc(1, 1 + strlen(spec));
-        snprintf(key, strlen(spec), "%s_%s_%d@%s=", resource, op->op_type, op->interval, node);
-
-        if (strncasecmp(key, spec, strlen(key)) == 0) {
-            sscanf(spec, "%*[^=]=%d", (int *)&op->rc);
-
-            action->failed = TRUE;
-            graph->abort_priority = INFINITY;
-            printf("\tPretending action %d failed with rc=%d\n", action->id, op->rc);
-            update_failcounts(cib_node, resource, op->interval, op->rc);
-            free(key);
-            break;
-        }
-        free(key);
-    }
-
-    inject_op(cib_resource, op, target_outcome);
-    lrmd_free_event(op);
-
-    rc = global_cib->cmds->modify(global_cib, XML_CIB_TAG_STATUS, cib_node,
-                                  cib_sync_call | cib_scope_local);
-    CRM_ASSERT(rc == pcmk_ok);
-
-  done:
-    free(node); free(uuid);
-    free_xml(cib_node);
-    action->confirmed = TRUE;
-    update_graph(graph, action);
-    return TRUE;
-}
-
-static gboolean
-exec_crmd_action(crm_graph_t * graph, crm_action_t * action)
-{
-    const char *node = crm_element_value(action->xml, XML_LRM_ATTR_TARGET);
-    const char *task = crm_element_value(action->xml, XML_LRM_ATTR_TASK);
-    xmlNode *rsc = first_named_child(action->xml, XML_CIB_TAG_RESOURCE);
-
-    action->confirmed = TRUE;
-
-    if(rsc) {
-        quiet_log(" * Cluster action:  %s for %s on %s\n", task, ID(rsc), node);
-    } else {
-        quiet_log(" * Cluster action:  %s on %s\n", task, node);
-    }
-    update_graph(graph, action);
-    return TRUE;
-}
-
-#define STATUS_PATH_MAX 512
-static gboolean
-exec_stonith_action(crm_graph_t * graph, crm_action_t * action)
-{
-    const char *op = crm_meta_value(action->params, "stonith_action");
-    char *target = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET);
-
-    quiet_log(" * Fencing %s (%s)\n", target, op);
-    if(safe_str_neq(op, "on")) {
-        int rc = 0;
-        char xpath[STATUS_PATH_MAX];
-        xmlNode *cib_node = modify_node(global_cib, target, FALSE);
-
-        crm_xml_add(cib_node, XML_ATTR_ORIGIN, __FUNCTION__);
-        CRM_ASSERT(cib_node != NULL);
-
-        rc = global_cib->cmds->replace(global_cib, XML_CIB_TAG_STATUS, cib_node,
-                                   cib_sync_call | cib_scope_local);
-        CRM_ASSERT(rc == pcmk_ok);
-
-        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target, XML_CIB_TAG_LRM);
-        global_cib->cmds->delete(global_cib, xpath, NULL,
-                                      cib_xpath | cib_sync_call | cib_scope_local);
-
-        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target,
-                 XML_TAG_TRANSIENT_NODEATTRS);
-        global_cib->cmds->delete(global_cib, xpath, NULL,
-                                      cib_xpath | cib_sync_call | cib_scope_local);
-
-        free_xml(cib_node);
-    }
-
-    action->confirmed = TRUE;
-    update_graph(graph, action);
-    free(target);
-    return TRUE;
-}
-
 static void
 print_cluster_status(pe_working_set_t * data_set, long options)
 {
@@ -657,62 +186,6 @@ print_cluster_status(pe_working_set_t * data_set, long options)
     fprintf(stdout, "\n");
 }
 
-static int
-run_simulation(pe_working_set_t * data_set)
-{
-    crm_graph_t *transition = NULL;
-    enum transition_status graph_rc = -1;
-
-    crm_graph_functions_t exec_fns = {
-        exec_pseudo_action,
-        exec_rsc_action,
-        exec_crmd_action,
-        exec_stonith_action,
-    };
-
-    set_graph_functions(&exec_fns);
-
-    quiet_log("\nExecuting cluster transition:\n");
-    transition = unpack_graph(data_set->graph, crm_system_name);
-    print_graph(LOG_DEBUG, transition);
-
-    resource_list = data_set->resources;
-    do {
-        graph_rc = run_graph(transition);
-
-    } while (graph_rc == transition_active);
-    resource_list = NULL;
-
-    if (graph_rc != transition_complete) {
-        fprintf(stdout, "Transition failed: %s\n", transition_status(graph_rc));
-        print_graph(LOG_ERR, transition);
-    }
-    destroy_graph(transition);
-    if (graph_rc != transition_complete) {
-        fprintf(stdout, "An invalid transition was produced\n");
-    }
-
-    if (quiet == FALSE) {
-        xmlNode *cib_object = NULL;
-        int rc =
-            global_cib->cmds->query(global_cib, NULL, &cib_object, cib_sync_call | cib_scope_local);
-
-        CRM_ASSERT(rc == pcmk_ok);
-        quiet_log("\nRevised cluster status:\n");
-        cleanup_alloc_calculations(data_set);
-        data_set->input = cib_object;
-        data_set->now = get_date();
-
-        cluster_status(data_set);
-        print_cluster_status(data_set, 0);
-    }
-
-    if (graph_rc != transition_complete) {
-        return graph_rc;
-    }
-    return 0;
-}
-
 static char *
 create_action_name(action_t * action)
 {
@@ -883,274 +356,6 @@ create_dotfile(pe_working_set_t * data_set, const char *dot_file, gboolean all_a
     }
 }
 
-static int
-find_ticket_state(cib_t * the_cib, const char *ticket_id, xmlNode ** ticket_state_xml)
-{
-    int offset = 0;
-    static int xpath_max = 1024;
-    int rc = pcmk_ok;
-    xmlNode *xml_search = NULL;
-
-    char *xpath_string = NULL;
-
-    CRM_ASSERT(ticket_state_xml != NULL);
-    *ticket_state_xml = NULL;
-
-    xpath_string = calloc(1, xpath_max);
-    offset += snprintf(xpath_string + offset, xpath_max - offset, "%s", "/cib/status/tickets");
-
-    if (ticket_id) {
-        offset += snprintf(xpath_string + offset, xpath_max - offset, "/%s[@id=\"%s\"]",
-                           XML_CIB_TAG_TICKET_STATE, ticket_id);
-    }
-    CRM_LOG_ASSERT(offset > 0);
-    rc = the_cib->cmds->query(the_cib, xpath_string, &xml_search,
-                              cib_sync_call | cib_scope_local | cib_xpath);
-
-    if (rc != pcmk_ok) {
-        goto bail;
-    }
-
-    crm_log_xml_debug(xml_search, "Match");
-    if (xml_has_children(xml_search)) {
-        if (ticket_id) {
-            fprintf(stdout, "Multiple ticket_states match ticket_id=%s\n", ticket_id);
-        }
-        *ticket_state_xml = xml_search;
-    } else {
-        *ticket_state_xml = xml_search;
-    }
-
-  bail:
-    free(xpath_string);
-    return rc;
-}
-
-static int
-set_ticket_state_attr(const char *ticket_id, const char *attr_name,
-                      const char *attr_value, cib_t * cib, int cib_options)
-{
-    int rc = pcmk_ok;
-    xmlNode *xml_top = NULL;
-    xmlNode *ticket_state_xml = NULL;
-
-    rc = find_ticket_state(cib, ticket_id, &ticket_state_xml);
-    if (rc == pcmk_ok) {
-        crm_debug("Found a match state for ticket: id=%s", ticket_id);
-        xml_top = ticket_state_xml;
-
-    } else if (rc != -ENXIO) {
-        return rc;
-
-    } else {
-        xmlNode *xml_obj = NULL;
-
-        xml_top = create_xml_node(NULL, XML_CIB_TAG_STATUS);
-        xml_obj = create_xml_node(xml_top, XML_CIB_TAG_TICKETS);
-        ticket_state_xml = create_xml_node(xml_obj, XML_CIB_TAG_TICKET_STATE);
-        crm_xml_add(ticket_state_xml, XML_ATTR_ID, ticket_id);
-    }
-
-    crm_xml_add(ticket_state_xml, attr_name, attr_value);
-
-    crm_log_xml_debug(xml_top, "Update");
-
-    rc = cib->cmds->modify(cib, XML_CIB_TAG_STATUS, xml_top, cib_options);
-
-    free_xml(xml_top);
-
-    return rc;
-}
-
-static void
-modify_configuration(pe_working_set_t * data_set,
-                     const char *quorum, const char *watchdog, GListPtr node_up, GListPtr node_down, GListPtr node_fail,
-                     GListPtr op_inject, GListPtr ticket_grant, GListPtr ticket_revoke,
-                     GListPtr ticket_standby, GListPtr ticket_activate)
-{
-    int rc = pcmk_ok;
-    GListPtr gIter = NULL;
-
-    xmlNode *cib_op = NULL;
-    xmlNode *cib_node = NULL;
-    xmlNode *cib_resource = NULL;
-
-    lrmd_event_data_t *op = NULL;
-
-    if (quorum) {
-        xmlNode *top = create_xml_node(NULL, XML_TAG_CIB);
-
-        quiet_log(" + Setting quorum: %s\n", quorum);
-        /* crm_xml_add(top, XML_ATTR_DC_UUID, dc_uuid);      */
-        crm_xml_add(top, XML_ATTR_HAVE_QUORUM, quorum);
-
-        rc = global_cib->cmds->modify(global_cib, NULL, top, cib_sync_call | cib_scope_local);
-        CRM_ASSERT(rc == pcmk_ok);
-    }
-
-    if (watchdog) {
-        quiet_log(" + Setting watchdog: %s\n", watchdog);
-
-        rc = update_attr_delegate(global_cib, cib_sync_call | cib_scope_local,
-                             XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL, NULL,
-                             XML_ATTR_HAVE_WATCHDOG, watchdog, FALSE, NULL, NULL);
-
-        CRM_ASSERT(rc == pcmk_ok);
-    }
-
-    for (gIter = node_up; gIter != NULL; gIter = gIter->next) {
-        char *node = (char *)gIter->data;
-
-        quiet_log(" + Bringing node %s online\n", node);
-        cib_node = modify_node(global_cib, node, TRUE);
-        CRM_ASSERT(cib_node != NULL);
-
-        rc = global_cib->cmds->modify(global_cib, XML_CIB_TAG_STATUS, cib_node,
-                                      cib_sync_call | cib_scope_local);
-        CRM_ASSERT(rc == pcmk_ok);
-        free_xml(cib_node);
-    }
-
-    for (gIter = node_down; gIter != NULL; gIter = gIter->next) {
-        char xpath[STATUS_PATH_MAX];
-        char *node = (char *)gIter->data;
-
-        quiet_log(" + Taking node %s offline\n", node);
-        cib_node = modify_node(global_cib, node, FALSE);
-        CRM_ASSERT(cib_node != NULL);
-
-        rc = global_cib->cmds->modify(global_cib, XML_CIB_TAG_STATUS, cib_node,
-                                      cib_sync_call | cib_scope_local);
-        CRM_ASSERT(rc == pcmk_ok);
-        free_xml(cib_node);
-
-        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", node, XML_CIB_TAG_LRM);
-        global_cib->cmds->delete(global_cib, xpath, NULL,
-                                      cib_xpath | cib_sync_call | cib_scope_local);
-
-        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", node,
-                 XML_TAG_TRANSIENT_NODEATTRS);
-        global_cib->cmds->delete(global_cib, xpath, NULL,
-                                      cib_xpath | cib_sync_call | cib_scope_local);
-
-    }
-
-    for (gIter = node_fail; gIter != NULL; gIter = gIter->next) {
-        char *node = (char *)gIter->data;
-
-        quiet_log(" + Failing node %s\n", node);
-        cib_node = modify_node(global_cib, node, TRUE);
-        crm_xml_add(cib_node, XML_NODE_IN_CLUSTER, XML_BOOLEAN_NO);
-        CRM_ASSERT(cib_node != NULL);
-
-        rc = global_cib->cmds->modify(global_cib, XML_CIB_TAG_STATUS, cib_node,
-                                      cib_sync_call | cib_scope_local);
-        CRM_ASSERT(rc == pcmk_ok);
-        free_xml(cib_node);
-    }
-
-    for (gIter = ticket_grant; gIter != NULL; gIter = gIter->next) {
-        char *ticket_id = (char *)gIter->data;
-
-        quiet_log(" + Granting ticket %s\n", ticket_id);
-        rc = set_ticket_state_attr(ticket_id, "granted", "true",
-                                   global_cib, cib_sync_call | cib_scope_local);
-
-        CRM_ASSERT(rc == pcmk_ok);
-    }
-
-    for (gIter = ticket_revoke; gIter != NULL; gIter = gIter->next) {
-        char *ticket_id = (char *)gIter->data;
-
-        quiet_log(" + Revoking ticket %s\n", ticket_id);
-        rc = set_ticket_state_attr(ticket_id, "granted", "false",
-                                   global_cib, cib_sync_call | cib_scope_local);
-
-        CRM_ASSERT(rc == pcmk_ok);
-    }
-
-    for (gIter = ticket_standby; gIter != NULL; gIter = gIter->next) {
-        char *ticket_id = (char *)gIter->data;
-
-        quiet_log(" + Making ticket %s standby\n", ticket_id);
-        rc = set_ticket_state_attr(ticket_id, "standby", "true",
-                                   global_cib, cib_sync_call | cib_scope_local);
-
-        CRM_ASSERT(rc == pcmk_ok);
-    }
-
-    for (gIter = ticket_activate; gIter != NULL; gIter = gIter->next) {
-        char *ticket_id = (char *)gIter->data;
-
-        quiet_log(" + Activating ticket %s\n", ticket_id);
-        rc = set_ticket_state_attr(ticket_id, "standby", "false",
-                                   global_cib, cib_sync_call | cib_scope_local);
-
-        CRM_ASSERT(rc == pcmk_ok);
-    }
-
-    for (gIter = op_inject; gIter != NULL; gIter = gIter->next) {
-        char *spec = (char *)gIter->data;
-
-        int rc = 0;
-        int outcome = 0;
-        int interval = 0;
-
-        char *key = NULL;
-        char *node = NULL;
-        char *task = NULL;
-        char *resource = NULL;
-
-        const char *rtype = NULL;
-        const char *rclass = NULL;
-        const char *rprovider = NULL;
-
-        resource_t *rsc = NULL;
-
-        quiet_log(" + Injecting %s into the configuration\n", spec);
-
-        key = calloc(1, strlen(spec) + 1);
-        node = calloc(1, strlen(spec) + 1);
-        rc = sscanf(spec, "%[^@]@%[^=]=%d", key, node, &outcome);
-        CRM_CHECK(rc == 3,
-                  fprintf(stderr, "Invalid operation spec: %s.  Only found %d fields\n", spec, rc);
-                  continue);
-
-        parse_op_key(key, &resource, &task, &interval);
-
-        rsc = pe_find_resource(data_set->resources, resource);
-        if (rsc == NULL) {
-            fprintf(stderr, " - Invalid resource name: %s\n", resource);
-        } else {
-            rclass = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS);
-            rtype = crm_element_value(rsc->xml, XML_ATTR_TYPE);
-            rprovider = crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER);
-
-            cib_node = inject_node_state(global_cib, node, NULL);
-            CRM_ASSERT(cib_node != NULL);
-
-            update_failcounts(cib_node, resource, interval, outcome);
-
-            cib_resource = inject_resource(cib_node, resource, rclass, rtype, rprovider);
-            CRM_ASSERT(cib_resource != NULL);
-
-            op = create_op(cib_resource, task, interval, outcome);
-            CRM_ASSERT(op != NULL);
-
-            cib_op = inject_op(cib_resource, op, 0);
-            CRM_ASSERT(cib_op != NULL);
-            lrmd_free_event(op);
-
-            rc = global_cib->cmds->modify(global_cib, XML_CIB_TAG_STATUS, cib_node,
-                                          cib_sync_call | cib_scope_local);
-            CRM_ASSERT(rc == pcmk_ok);
-        }
-        free(task);
-        free(node);
-        free(key);
-    }
-}
-
 static void
 setup_input(const char *input, const char *output)
 {
@@ -1571,7 +776,7 @@ main(int argc, char **argv)
 
     if (modified) {
         quiet_log("Performing requested modifications\n");
-        modify_configuration(&data_set, quorum, watchdog, node_up, node_down, node_fail, op_inject,
+        modify_configuration(&data_set, global_cib, quorum, watchdog, node_up, node_down, node_fail, op_inject,
                              ticket_grant, ticket_revoke, ticket_standby, ticket_activate);
 
         rc = global_cib->cmds->query(global_cib, NULL, &input, cib_sync_call);
@@ -1632,7 +837,14 @@ main(int argc, char **argv)
     }
 
     if (simulate) {
-        rc = run_simulation(&data_set);
+        rc = run_simulation(&data_set, global_cib, op_fail, quiet);
+        if(quiet == FALSE) {
+            data_set.now = get_date();
+
+            quiet_log("\nRevised cluster status:\n");
+            cluster_status(&data_set);
+            print_cluster_status(&data_set, 0);
+        }
     }
 
   done:
diff --git a/tools/fake_transition.c b/tools/fake_transition.c
new file mode 100644
index 0000000..d6d71eb
--- /dev/null
+++ b/tools/fake_transition.c
@@ -0,0 +1,846 @@
+/*
+ * Copyright (C) 2009 Andrew Beekhof <andrew@beekhof.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <crm_internal.h>
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include <crm/crm.h>
+#include <crm/cib.h>
+#include <crm/common/util.h>
+#include <crm/transition.h>
+#include <crm/common/iso8601.h>
+#include <crm/pengine/status.h>
+#include <allocate.h>
+#include "fake_transition.h"
+
+static bool fake_quiet = FALSE;
+static cib_t *fake_cib = NULL;
+static GListPtr fake_resource_list = NULL;
+static GListPtr fake_op_fail_list = NULL;
+gboolean bringing_nodes_online = FALSE;
+
+#define STATUS_PATH_MAX 512
+
+#define quiet_log(fmt, args...) do {              \
+              if(fake_quiet) {                         \
+                  crm_trace(fmt, ##args);         \
+              } else {                            \
+                  printf(fmt , ##args);           \
+              }                                   \
+    } while(0)
+
+#define new_node_template "//"XML_CIB_TAG_NODE"[@uname='%s']"
+#define node_template "//"XML_CIB_TAG_STATE"[@uname='%s']"
+#define rsc_template "//"XML_CIB_TAG_STATE"[@uname='%s']//"XML_LRM_TAG_RESOURCE"[@id='%s']"
+#define op_template  "//"XML_CIB_TAG_STATE"[@uname='%s']//"XML_LRM_TAG_RESOURCE"[@id='%s']/"XML_LRM_TAG_RSC_OP"[@id='%s']"
+/* #define op_template  "//"XML_CIB_TAG_STATE"[@uname='%s']//"XML_LRM_TAG_RESOURCE"[@id='%s']/"XML_LRM_TAG_RSC_OP"[@id='%s' and @"XML_LRM_ATTR_CALLID"='%d']" */
+
+
+static void
+inject_transient_attr(xmlNode * cib_node, const char *name, const char *value)
+{
+    xmlNode *attrs = NULL;
+    xmlNode *container = NULL;
+    xmlNode *nvp = NULL;
+    const char *node_uuid = ID(cib_node);
+    char *nvp_id = crm_concat(name, node_uuid, '-');
+
+    quiet_log("Injecting attribute %s=%s into %s '%s'", name, value, xmlGetNodePath(cib_node),
+             ID(cib_node));
+
+    attrs = first_named_child(cib_node, XML_TAG_TRANSIENT_NODEATTRS);
+    if (attrs == NULL) {
+        attrs = create_xml_node(cib_node, XML_TAG_TRANSIENT_NODEATTRS);
+        crm_xml_add(attrs, XML_ATTR_ID, node_uuid);
+    }
+
+    container = first_named_child(attrs, XML_TAG_ATTR_SETS);
+    if (container == NULL) {
+        container = create_xml_node(attrs, XML_TAG_ATTR_SETS);
+        crm_xml_add(container, XML_ATTR_ID, node_uuid);
+    }
+
+    nvp = create_xml_node(container, XML_CIB_TAG_NVPAIR);
+    crm_xml_add(nvp, XML_ATTR_ID, nvp_id);
+    crm_xml_add(nvp, XML_NVPAIR_ATTR_NAME, name);
+    crm_xml_add(nvp, XML_NVPAIR_ATTR_VALUE, value);
+
+    free(nvp_id);
+}
+
+static void
+update_failcounts(xmlNode * cib_node, const char *resource, int interval, int rc)
+{
+    if (rc == 0) {
+        return;
+
+    } else if (rc == 7 && interval == 0) {
+        return;
+
+    } else {
+        char *name = NULL;
+        char *now = crm_itoa(time(NULL));
+
+        name = crm_concat("fail-count", resource, '-');
+        inject_transient_attr(cib_node, name, "value++");
+
+        name = crm_concat("last-failure", resource, '-');
+        inject_transient_attr(cib_node, name, now);
+
+        free(name);
+        free(now);
+    }
+}
+
+static void
+create_node_entry(cib_t * cib_conn, const char *node)
+{
+    int rc = pcmk_ok;
+    int max = strlen(new_node_template) + strlen(node) + 1;
+    char *xpath = NULL;
+
+    xpath = calloc(1, max);
+
+    snprintf(xpath, max, new_node_template, node);
+    rc = cib_conn->cmds->query(cib_conn, xpath, NULL, cib_xpath | cib_sync_call | cib_scope_local);
+
+    if (rc == -ENXIO) {
+        xmlNode *cib_object = create_xml_node(NULL, XML_CIB_TAG_NODE);
+
+        /* Using node uname as uuid ala corosync/openais */
+        crm_xml_add(cib_object, XML_ATTR_ID, node);
+        crm_xml_add(cib_object, XML_ATTR_UNAME, node);
+        cib_conn->cmds->create(cib_conn, XML_CIB_TAG_NODES, cib_object,
+                               cib_sync_call | cib_scope_local);
+        /* Not bothering with subsequent query to see if it exists,
+           we'll bomb out later in the call to query_node_uuid()... */
+
+        free_xml(cib_object);
+    }
+
+    free(xpath);
+}
+
+static lrmd_event_data_t *
+create_op(xmlNode * cib_resource, const char *task, int interval, int outcome)
+{
+    lrmd_event_data_t *op = NULL;
+    xmlNode *xop = NULL;
+
+    op = calloc(1, sizeof(lrmd_event_data_t));
+
+    op->rsc_id = strdup(ID(cib_resource));
+    op->interval = interval;
+    op->op_type = strdup(task);
+
+    op->rc = outcome;
+    op->op_status = 0;
+    op->params = NULL;          /* TODO: Fill me in */
+    op->t_run = time(NULL);
+    op->t_rcchange = op->t_run;
+
+    op->call_id = 0;
+    for (xop = __xml_first_child(cib_resource); xop != NULL; xop = __xml_next(xop)) {
+        int tmp = 0;
+
+        crm_element_value_int(xop, XML_LRM_ATTR_CALLID, &tmp);
+        if (tmp > op->call_id) {
+            op->call_id = tmp;
+        }
+    }
+    op->call_id++;
+
+    return op;
+}
+
+static xmlNode *
+inject_op(xmlNode * cib_resource, lrmd_event_data_t * op, int target_rc)
+{
+    return create_operation_update(cib_resource, op, CRM_FEATURE_SET, target_rc, crm_system_name,
+                                   LOG_DEBUG_2);
+}
+
+static xmlNode *
+inject_node_state(cib_t * cib_conn, const char *node, const char *uuid)
+{
+    int rc = pcmk_ok;
+    int max = strlen(rsc_template) + strlen(node) + 1;
+    char *xpath = NULL;
+    xmlNode *cib_object = NULL;
+
+    xpath = calloc(1, max);
+
+    if (bringing_nodes_online) {
+        create_node_entry(cib_conn, node);
+    }
+
+    snprintf(xpath, max, node_template, node);
+    rc = cib_conn->cmds->query(cib_conn, xpath, &cib_object,
+                               cib_xpath | cib_sync_call | cib_scope_local);
+
+    if (cib_object && ID(cib_object) == NULL) {
+        crm_err("Detected multiple node_state entries for xpath=%s, bailing", xpath);
+        crm_log_xml_warn(cib_object, "Duplicates");
+        crm_exit(ENOTUNIQ);
+    }
+
+    if (rc == -ENXIO) {
+        char *found_uuid = NULL;
+
+        if (uuid == NULL) {
+            query_node_uuid(cib_conn, node, &found_uuid, NULL);
+        } else {
+            found_uuid = strdup(uuid);
+        }
+
+        cib_object = create_xml_node(NULL, XML_CIB_TAG_STATE);
+        crm_xml_add(cib_object, XML_ATTR_UUID, found_uuid);
+        crm_xml_add(cib_object, XML_ATTR_UNAME, node);
+        cib_conn->cmds->create(cib_conn, XML_CIB_TAG_STATUS, cib_object,
+                               cib_sync_call | cib_scope_local);
+        free_xml(cib_object);
+        free(found_uuid);
+
+        rc = cib_conn->cmds->query(cib_conn, xpath, &cib_object,
+                                   cib_xpath | cib_sync_call | cib_scope_local);
+        crm_trace("injecting node state for %s. rc is %d", node, rc);
+    }
+
+    free(xpath);
+    CRM_ASSERT(rc == pcmk_ok);
+    return cib_object;
+}
+
+static xmlNode *
+modify_node(cib_t * cib_conn, char *node, gboolean up)
+{
+    xmlNode *cib_node = inject_node_state(cib_conn, node, NULL);
+
+    if (up) {
+        crm_xml_add(cib_node, XML_NODE_IN_CLUSTER, XML_BOOLEAN_YES);
+        crm_xml_add(cib_node, XML_NODE_IS_PEER, ONLINESTATUS);
+        crm_xml_add(cib_node, XML_NODE_JOIN_STATE, CRMD_JOINSTATE_MEMBER);
+        crm_xml_add(cib_node, XML_NODE_EXPECTED, CRMD_JOINSTATE_MEMBER);
+
+    } else {
+        crm_xml_add(cib_node, XML_NODE_IN_CLUSTER, XML_BOOLEAN_NO);
+        crm_xml_add(cib_node, XML_NODE_IS_PEER, OFFLINESTATUS);
+        crm_xml_add(cib_node, XML_NODE_JOIN_STATE, CRMD_JOINSTATE_DOWN);
+        crm_xml_add(cib_node, XML_NODE_EXPECTED, CRMD_JOINSTATE_DOWN);
+    }
+
+    crm_xml_add(cib_node, XML_ATTR_ORIGIN, crm_system_name);
+    return cib_node;
+}
+
+static xmlNode *
+find_resource_xml(xmlNode * cib_node, const char *resource)
+{
+    char *xpath = NULL;
+    xmlNode *match = NULL;
+    const char *node = crm_element_value(cib_node, XML_ATTR_UNAME);
+    int max = strlen(rsc_template) + strlen(resource) + strlen(node) + 1;
+
+    xpath = calloc(1, max);
+
+    snprintf(xpath, max, rsc_template, node, resource);
+    match = get_xpath_object(xpath, cib_node, LOG_DEBUG_2);
+
+    free(xpath);
+    return match;
+}
+
+
+static xmlNode *
+inject_resource(xmlNode * cib_node, const char *resource, const char *rclass, const char *rtype,
+                const char *rprovider)
+{
+    xmlNode *lrm = NULL;
+    xmlNode *container = NULL;
+    xmlNode *cib_resource = NULL;
+    char *xpath = NULL;
+
+    cib_resource = find_resource_xml(cib_node, resource);
+    if (cib_resource != NULL) {
+        return cib_resource;
+    }
+
+    /* One day, add query for class, provider, type */
+
+    if (rclass == NULL || rtype == NULL) {
+        fprintf(stderr, "Resource %s not found in the status section of %s."
+                "  Please supply the class and type to continue\n", resource, ID(cib_node));
+        return NULL;
+
+    } else if (safe_str_neq(rclass, "ocf")
+               && safe_str_neq(rclass, "stonith")
+               && safe_str_neq(rclass, "heartbeat")
+               && safe_str_neq(rclass, "service")
+               && safe_str_neq(rclass, "upstart")
+               && safe_str_neq(rclass, "systemd")
+               && safe_str_neq(rclass, "lsb")) {
+        fprintf(stderr, "Invalid class for %s: %s\n", resource, rclass);
+        return NULL;
+
+    } else if (safe_str_eq(rclass, "ocf") && rprovider == NULL) {
+        fprintf(stderr, "Please specify the provider for resource %s\n", resource);
+        return NULL;
+    }
+
+    xpath = (char *)xmlGetNodePath(cib_node);
+    crm_info("Injecting new resource %s into %s '%s'", resource, xpath, ID(cib_node));
+    free(xpath);
+
+    lrm = first_named_child(cib_node, XML_CIB_TAG_LRM);
+    if (lrm == NULL) {
+        const char *node_uuid = ID(cib_node);
+
+        lrm = create_xml_node(cib_node, XML_CIB_TAG_LRM);
+        crm_xml_add(lrm, XML_ATTR_ID, node_uuid);
+    }
+
+    container = first_named_child(lrm, XML_LRM_TAG_RESOURCES);
+    if (container == NULL) {
+        container = create_xml_node(lrm, XML_LRM_TAG_RESOURCES);
+    }
+
+    cib_resource = create_xml_node(container, XML_LRM_TAG_RESOURCE);
+    crm_xml_add(cib_resource, XML_ATTR_ID, resource);
+
+    crm_xml_add(cib_resource, XML_AGENT_ATTR_CLASS, rclass);
+    crm_xml_add(cib_resource, XML_AGENT_ATTR_PROVIDER, rprovider);
+    crm_xml_add(cib_resource, XML_ATTR_TYPE, rtype);
+
+    return cib_resource;
+}
+
+static int
+find_ticket_state(cib_t * the_cib, const char *ticket_id, xmlNode ** ticket_state_xml)
+{
+    int offset = 0;
+    static int xpath_max = 1024;
+    int rc = pcmk_ok;
+    xmlNode *xml_search = NULL;
+
+    char *xpath_string = NULL;
+
+    CRM_ASSERT(ticket_state_xml != NULL);
+    *ticket_state_xml = NULL;
+
+    xpath_string = calloc(1, xpath_max);
+    offset += snprintf(xpath_string + offset, xpath_max - offset, "%s", "/cib/status/tickets");
+
+    if (ticket_id) {
+        offset += snprintf(xpath_string + offset, xpath_max - offset, "/%s[@id=\"%s\"]",
+                           XML_CIB_TAG_TICKET_STATE, ticket_id);
+    }
+    CRM_LOG_ASSERT(offset > 0);
+    rc = the_cib->cmds->query(the_cib, xpath_string, &xml_search,
+                              cib_sync_call | cib_scope_local | cib_xpath);
+
+    if (rc != pcmk_ok) {
+        goto bail;
+    }
+
+    crm_log_xml_debug(xml_search, "Match");
+    if (xml_has_children(xml_search)) {
+        if (ticket_id) {
+            fprintf(stdout, "Multiple ticket_states match ticket_id=%s\n", ticket_id);
+        }
+        *ticket_state_xml = xml_search;
+    } else {
+        *ticket_state_xml = xml_search;
+    }
+
+  bail:
+    free(xpath_string);
+    return rc;
+}
+
+static int
+set_ticket_state_attr(const char *ticket_id, const char *attr_name,
+                      const char *attr_value, cib_t * cib, int cib_options)
+{
+    int rc = pcmk_ok;
+    xmlNode *xml_top = NULL;
+    xmlNode *ticket_state_xml = NULL;
+
+    rc = find_ticket_state(cib, ticket_id, &ticket_state_xml);
+    if (rc == pcmk_ok) {
+        crm_debug("Found a match state for ticket: id=%s", ticket_id);
+        xml_top = ticket_state_xml;
+
+    } else if (rc != -ENXIO) {
+        return rc;
+
+    } else {
+        xmlNode *xml_obj = NULL;
+
+        xml_top = create_xml_node(NULL, XML_CIB_TAG_STATUS);
+        xml_obj = create_xml_node(xml_top, XML_CIB_TAG_TICKETS);
+        ticket_state_xml = create_xml_node(xml_obj, XML_CIB_TAG_TICKET_STATE);
+        crm_xml_add(ticket_state_xml, XML_ATTR_ID, ticket_id);
+    }
+
+    crm_xml_add(ticket_state_xml, attr_name, attr_value);
+
+    crm_log_xml_debug(xml_top, "Update");
+
+    rc = cib->cmds->modify(cib, XML_CIB_TAG_STATUS, xml_top, cib_options);
+
+    free_xml(xml_top);
+
+    return rc;
+}
+
+void
+modify_configuration(pe_working_set_t * data_set, cib_t *cib,
+                     const char *quorum, const char *watchdog, GListPtr node_up, GListPtr node_down, GListPtr node_fail,
+                     GListPtr op_inject, GListPtr ticket_grant, GListPtr ticket_revoke,
+                     GListPtr ticket_standby, GListPtr ticket_activate)
+{
+    int rc = pcmk_ok;
+    GListPtr gIter = NULL;
+
+    xmlNode *cib_op = NULL;
+    xmlNode *cib_node = NULL;
+    xmlNode *cib_resource = NULL;
+
+    lrmd_event_data_t *op = NULL;
+
+    if (quorum) {
+        xmlNode *top = create_xml_node(NULL, XML_TAG_CIB);
+
+        quiet_log(" + Setting quorum: %s\n", quorum);
+        /* crm_xml_add(top, XML_ATTR_DC_UUID, dc_uuid);      */
+        crm_xml_add(top, XML_ATTR_HAVE_QUORUM, quorum);
+
+        rc = cib->cmds->modify(cib, NULL, top, cib_sync_call | cib_scope_local);
+        CRM_ASSERT(rc == pcmk_ok);
+    }
+
+    if (watchdog) {
+        quiet_log(" + Setting watchdog: %s\n", watchdog);
+
+        rc = update_attr_delegate(cib, cib_sync_call | cib_scope_local,
+                             XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL, NULL,
+                             XML_ATTR_HAVE_WATCHDOG, watchdog, FALSE, NULL, NULL);
+
+        CRM_ASSERT(rc == pcmk_ok);
+    }
+
+    for (gIter = node_up; gIter != NULL; gIter = gIter->next) {
+        char *node = (char *)gIter->data;
+
+        quiet_log(" + Bringing node %s online\n", node);
+        cib_node = modify_node(cib, node, TRUE);
+        CRM_ASSERT(cib_node != NULL);
+
+        rc = cib->cmds->modify(cib, XML_CIB_TAG_STATUS, cib_node,
+                                      cib_sync_call | cib_scope_local);
+        CRM_ASSERT(rc == pcmk_ok);
+        free_xml(cib_node);
+    }
+
+    for (gIter = node_down; gIter != NULL; gIter = gIter->next) {
+        char xpath[STATUS_PATH_MAX];
+        char *node = (char *)gIter->data;
+
+        quiet_log(" + Taking node %s offline\n", node);
+        cib_node = modify_node(cib, node, FALSE);
+        CRM_ASSERT(cib_node != NULL);
+
+        rc = cib->cmds->modify(cib, XML_CIB_TAG_STATUS, cib_node,
+                                      cib_sync_call | cib_scope_local);
+        CRM_ASSERT(rc == pcmk_ok);
+        free_xml(cib_node);
+
+        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", node, XML_CIB_TAG_LRM);
+        cib->cmds->delete(cib, xpath, NULL,
+                                      cib_xpath | cib_sync_call | cib_scope_local);
+
+        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", node,
+                 XML_TAG_TRANSIENT_NODEATTRS);
+        cib->cmds->delete(cib, xpath, NULL,
+                                      cib_xpath | cib_sync_call | cib_scope_local);
+
+    }
+
+    for (gIter = node_fail; gIter != NULL; gIter = gIter->next) {
+        char *node = (char *)gIter->data;
+
+        quiet_log(" + Failing node %s\n", node);
+        cib_node = modify_node(cib, node, TRUE);
+        crm_xml_add(cib_node, XML_NODE_IN_CLUSTER, XML_BOOLEAN_NO);
+        CRM_ASSERT(cib_node != NULL);
+
+        rc = cib->cmds->modify(cib, XML_CIB_TAG_STATUS, cib_node,
+                                      cib_sync_call | cib_scope_local);
+        CRM_ASSERT(rc == pcmk_ok);
+        free_xml(cib_node);
+    }
+
+    for (gIter = ticket_grant; gIter != NULL; gIter = gIter->next) {
+        char *ticket_id = (char *)gIter->data;
+
+        quiet_log(" + Granting ticket %s\n", ticket_id);
+        rc = set_ticket_state_attr(ticket_id, "granted", "true",
+                                   cib, cib_sync_call | cib_scope_local);
+
+        CRM_ASSERT(rc == pcmk_ok);
+    }
+
+    for (gIter = ticket_revoke; gIter != NULL; gIter = gIter->next) {
+        char *ticket_id = (char *)gIter->data;
+
+        quiet_log(" + Revoking ticket %s\n", ticket_id);
+        rc = set_ticket_state_attr(ticket_id, "granted", "false",
+                                   cib, cib_sync_call | cib_scope_local);
+
+        CRM_ASSERT(rc == pcmk_ok);
+    }
+
+    for (gIter = ticket_standby; gIter != NULL; gIter = gIter->next) {
+        char *ticket_id = (char *)gIter->data;
+
+        quiet_log(" + Making ticket %s standby\n", ticket_id);
+        rc = set_ticket_state_attr(ticket_id, "standby", "true",
+                                   cib, cib_sync_call | cib_scope_local);
+
+        CRM_ASSERT(rc == pcmk_ok);
+    }
+
+    for (gIter = ticket_activate; gIter != NULL; gIter = gIter->next) {
+        char *ticket_id = (char *)gIter->data;
+
+        quiet_log(" + Activating ticket %s\n", ticket_id);
+        rc = set_ticket_state_attr(ticket_id, "standby", "false",
+                                   cib, cib_sync_call | cib_scope_local);
+
+        CRM_ASSERT(rc == pcmk_ok);
+    }
+
+    for (gIter = op_inject; gIter != NULL; gIter = gIter->next) {
+        char *spec = (char *)gIter->data;
+
+        int rc = 0;
+        int outcome = 0;
+        int interval = 0;
+
+        char *key = NULL;
+        char *node = NULL;
+        char *task = NULL;
+        char *resource = NULL;
+
+        const char *rtype = NULL;
+        const char *rclass = NULL;
+        const char *rprovider = NULL;
+
+        resource_t *rsc = NULL;
+
+        quiet_log(" + Injecting %s into the configuration\n", spec);
+
+        key = calloc(1, strlen(spec) + 1);
+        node = calloc(1, strlen(spec) + 1);
+        rc = sscanf(spec, "%[^@]@%[^=]=%d", key, node, &outcome);
+        CRM_CHECK(rc == 3,
+                  fprintf(stderr, "Invalid operation spec: %s.  Only found %d fields\n", spec, rc);
+                  continue);
+
+        parse_op_key(key, &resource, &task, &interval);
+
+        rsc = pe_find_resource(data_set->resources, resource);
+        if (rsc == NULL) {
+            fprintf(stderr, " - Invalid resource name: %s\n", resource);
+        } else {
+            rclass = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS);
+            rtype = crm_element_value(rsc->xml, XML_ATTR_TYPE);
+            rprovider = crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER);
+
+            cib_node = inject_node_state(cib, node, NULL);
+            CRM_ASSERT(cib_node != NULL);
+
+            update_failcounts(cib_node, resource, interval, outcome);
+
+            cib_resource = inject_resource(cib_node, resource, rclass, rtype, rprovider);
+            CRM_ASSERT(cib_resource != NULL);
+
+            op = create_op(cib_resource, task, interval, outcome);
+            CRM_ASSERT(op != NULL);
+
+            cib_op = inject_op(cib_resource, op, 0);
+            CRM_ASSERT(cib_op != NULL);
+            lrmd_free_event(op);
+
+            rc = cib->cmds->modify(cib, XML_CIB_TAG_STATUS, cib_node,
+                                          cib_sync_call | cib_scope_local);
+            CRM_ASSERT(rc == pcmk_ok);
+        }
+        free(task);
+        free(node);
+        free(key);
+    }
+}
+
+static gboolean
+exec_pseudo_action(crm_graph_t * graph, crm_action_t * action)
+{
+    const char *node = crm_element_value(action->xml, XML_LRM_ATTR_TARGET);
+    const char *task = crm_element_value(action->xml, XML_LRM_ATTR_TASK_KEY);
+
+    action->confirmed = TRUE;
+
+    quiet_log(" * Pseudo action:   %s%s%s\n", task, node ? " on " : "", node ? node : "");
+    update_graph(graph, action);
+    return TRUE;
+}
+
+static gboolean
+exec_rsc_action(crm_graph_t * graph, crm_action_t * action)
+{
+    int rc = 0;
+    GListPtr gIter = NULL;
+    lrmd_event_data_t *op = NULL;
+    int target_outcome = 0;
+    gboolean uname_is_uuid = FALSE;
+
+    const char *rtype = NULL;
+    const char *rclass = NULL;
+    const char *resource = NULL;
+    const char *rprovider = NULL;
+    const char *operation = crm_element_value(action->xml, "operation");
+    const char *target_rc_s = crm_meta_value(action->params, XML_ATTR_TE_TARGET_RC);
+
+    xmlNode *cib_node = NULL;
+    xmlNode *cib_resource = NULL;
+    xmlNode *action_rsc = first_named_child(action->xml, XML_CIB_TAG_RESOURCE);
+
+    char *node = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET);
+    char *uuid = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET_UUID);
+    const char *router_node = crm_element_value(action->xml, XML_LRM_ATTR_ROUTER_NODE);
+
+    if (safe_str_eq(operation, CRM_OP_PROBED)
+        || safe_str_eq(operation, CRM_OP_REPROBE)) {
+        crm_info("Skipping %s op for %s\n", operation, node);
+        goto done;
+    }
+
+    if (action_rsc == NULL) {
+        crm_log_xml_err(action->xml, "Bad");
+        free(node); free(uuid);
+        return FALSE;
+    }
+
+    /* Look for the preferred name
+     * If not found, try the expected 'local' name
+     * If not found use the preferred name anyway
+     */
+    resource = crm_element_value(action_rsc, XML_ATTR_ID);
+    if (pe_find_resource(fake_resource_list, resource) == NULL) {
+        const char *longname = crm_element_value(action_rsc, XML_ATTR_ID_LONG);
+
+        if (pe_find_resource(fake_resource_list, longname)) {
+            resource = longname;
+        }
+    }
+
+    if (safe_str_eq(operation, "delete")) {
+        quiet_log(" * Resource action: %-15s delete on %s\n", resource, node);
+        goto done;
+    }
+
+    rclass = crm_element_value(action_rsc, XML_AGENT_ATTR_CLASS);
+    rtype = crm_element_value(action_rsc, XML_ATTR_TYPE);
+    rprovider = crm_element_value(action_rsc, XML_AGENT_ATTR_PROVIDER);
+
+    if (target_rc_s != NULL) {
+        target_outcome = crm_parse_int(target_rc_s, "0");
+    }
+
+    CRM_ASSERT(fake_cib->cmds->query(fake_cib, NULL, NULL, cib_sync_call | cib_scope_local) ==
+               pcmk_ok);
+
+    if (router_node) {
+        uname_is_uuid = TRUE;
+    }
+
+    cib_node = inject_node_state(fake_cib, node, uname_is_uuid ? node : uuid);
+    CRM_ASSERT(cib_node != NULL);
+
+    cib_resource = inject_resource(cib_node, resource, rclass, rtype, rprovider);
+    CRM_ASSERT(cib_resource != NULL);
+
+    op = convert_graph_action(cib_resource, action, 0, target_outcome);
+    if (op->interval) {
+        quiet_log(" * Resource action: %-15s %s=%d on %s\n", resource, op->op_type, op->interval,
+                  node);
+    } else {
+        quiet_log(" * Resource action: %-15s %s on %s\n", resource, op->op_type, node);
+    }
+
+    for (gIter = fake_op_fail_list; gIter != NULL; gIter = gIter->next) {
+        char *spec = (char *)gIter->data;
+        char *key = NULL;
+
+        key = calloc(1, 1 + strlen(spec));
+        snprintf(key, strlen(spec), "%s_%s_%d@%s=", resource, op->op_type, op->interval, node);
+
+        if (strncasecmp(key, spec, strlen(key)) == 0) {
+            sscanf(spec, "%*[^=]=%d", (int *)&op->rc);
+
+            action->failed = TRUE;
+            graph->abort_priority = INFINITY;
+            printf("\tPretending action %d failed with rc=%d\n", action->id, op->rc);
+            update_failcounts(cib_node, resource, op->interval, op->rc);
+            free(key);
+            break;
+        }
+        free(key);
+    }
+
+    inject_op(cib_resource, op, target_outcome);
+    lrmd_free_event(op);
+
+    rc = fake_cib->cmds->modify(fake_cib, XML_CIB_TAG_STATUS, cib_node,
+                                  cib_sync_call | cib_scope_local);
+    CRM_ASSERT(rc == pcmk_ok);
+
+  done:
+    free(node); free(uuid);
+    free_xml(cib_node);
+    action->confirmed = TRUE;
+    update_graph(graph, action);
+    return TRUE;
+}
+
+static gboolean
+exec_crmd_action(crm_graph_t * graph, crm_action_t * action)
+{
+    const char *node = crm_element_value(action->xml, XML_LRM_ATTR_TARGET);
+    const char *task = crm_element_value(action->xml, XML_LRM_ATTR_TASK);
+    xmlNode *rsc = first_named_child(action->xml, XML_CIB_TAG_RESOURCE);
+
+    action->confirmed = TRUE;
+
+    if(rsc) {
+        quiet_log(" * Cluster action:  %s for %s on %s\n", task, ID(rsc), node);
+    } else {
+        quiet_log(" * Cluster action:  %s on %s\n", task, node);
+    }
+    update_graph(graph, action);
+    return TRUE;
+}
+
+static gboolean
+exec_stonith_action(crm_graph_t * graph, crm_action_t * action)
+{
+    const char *op = crm_meta_value(action->params, "stonith_action");
+    char *target = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET);
+
+    quiet_log(" * Fencing %s (%s)\n", target, op);
+    if(safe_str_neq(op, "on")) {
+        int rc = 0;
+        char xpath[STATUS_PATH_MAX];
+        xmlNode *cib_node = modify_node(fake_cib, target, FALSE);
+
+        crm_xml_add(cib_node, XML_ATTR_ORIGIN, __FUNCTION__);
+        CRM_ASSERT(cib_node != NULL);
+
+        rc = fake_cib->cmds->replace(fake_cib, XML_CIB_TAG_STATUS, cib_node,
+                                   cib_sync_call | cib_scope_local);
+        CRM_ASSERT(rc == pcmk_ok);
+
+        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target, XML_CIB_TAG_LRM);
+        fake_cib->cmds->delete(fake_cib, xpath, NULL,
+                                      cib_xpath | cib_sync_call | cib_scope_local);
+
+        snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target,
+                 XML_TAG_TRANSIENT_NODEATTRS);
+        fake_cib->cmds->delete(fake_cib, xpath, NULL,
+                                      cib_xpath | cib_sync_call | cib_scope_local);
+
+        free_xml(cib_node);
+    }
+
+    action->confirmed = TRUE;
+    update_graph(graph, action);
+    free(target);
+    return TRUE;
+}
+
+int
+run_simulation(pe_working_set_t * data_set, cib_t *cib, GListPtr op_fail_list, bool quiet)
+{
+    crm_graph_t *transition = NULL;
+    enum transition_status graph_rc = -1;
+
+    crm_graph_functions_t exec_fns = {
+        exec_pseudo_action,
+        exec_rsc_action,
+        exec_crmd_action,
+        exec_stonith_action,
+    };
+
+    fake_cib = cib;
+    fake_quiet = quiet;
+    fake_op_fail_list = op_fail_list;
+
+    quiet_log("\nExecuting cluster transition:\n");
+
+    set_graph_functions(&exec_fns);
+    transition = unpack_graph(data_set->graph, crm_system_name);
+    print_graph(LOG_DEBUG, transition);
+
+    fake_resource_list = data_set->resources;
+    do {
+        graph_rc = run_graph(transition);
+
+    } while (graph_rc == transition_active);
+    fake_resource_list = NULL;
+
+    if (graph_rc != transition_complete) {
+        fprintf(stdout, "Transition failed: %s\n", transition_status(graph_rc));
+        print_graph(LOG_ERR, transition);
+    }
+    destroy_graph(transition);
+    if (graph_rc != transition_complete) {
+        fprintf(stdout, "An invalid transition was produced\n");
+    }
+
+    if (quiet == FALSE) {
+        xmlNode *cib_object = NULL;
+        int rc = fake_cib->cmds->query(fake_cib, NULL, &cib_object, cib_sync_call | cib_scope_local);
+
+        CRM_ASSERT(rc == pcmk_ok);
+        cleanup_alloc_calculations(data_set);
+        data_set->input = cib_object;
+    }
+
+    if (graph_rc != transition_complete) {
+        return graph_rc;
+    }
+    return 0;
+}
diff --git a/tools/fake_transition.h b/tools/fake_transition.h
new file mode 100644
index 0000000..2ee7af9
--- /dev/null
+++ b/tools/fake_transition.h
@@ -0,0 +1,8 @@
+void modify_configuration(
+    pe_working_set_t * data_set, cib_t *cib,
+    const char *quorum, const char *watchdog, GListPtr node_up, GListPtr node_down, GListPtr node_fail,
+    GListPtr op_inject, GListPtr ticket_grant, GListPtr ticket_revoke,
+    GListPtr ticket_standby, GListPtr ticket_activate);
+
+int run_simulation(pe_working_set_t * data_set, cib_t *cib, GListPtr op_fail_list, bool quiet);
+