diff --git a/crm/pengine/graph.c b/crm/pengine/graph.c
index c036dfcabc..c53a17871e 100644
--- a/crm/pengine/graph.c
+++ b/crm/pengine/graph.c
@@ -1,533 +1,533 @@
 /* $Id: graph.c,v 1.104 2006/07/18 06:19:33 andrew Exp $ */
 /* 
  * Copyright (C) 2004 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.1 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #include <portability.h>
 
 #include <sys/param.h>
 #include <crm/crm.h>
 #include <crm/cib.h>
 #include <crm/msg_xml.h>
 #include <crm/common/xml.h>
 #include <crm/common/msg.h>
 
 #include <glib.h>
 
 #include <allocate.h>
 #include <lib/crm/pengine/utils.h>
 #include <utils.h>
 
 gboolean update_action(action_t *action);
 
 gboolean
 update_action_states(GListPtr actions)
 {
 	crm_debug_2("Updating %d actions", g_list_length(actions));
 	slist_iter(
 		action, action_t, actions, lpc,
 
 		update_action(action);
 		);
 
 	return TRUE;
 }
 
 gboolean
 update_action(action_t *action)
 {
 	enum action_tasks task = no_action;
 	
-	crm_debug_3("Processing action %s: %s",
+	crm_debug_2("Processing action %s: %s",
 		    action->uuid, action->optional?"optional":"required");
 
 	slist_iter(
 		other, action_wrapper_t, action->actions_before, lpc,
 		crm_debug_3("\tChecking action %s: %s/%s",
 			    other->action->uuid, ordering_type2text(other->type),
 			    other->action->optional?"optional":"required");
 
 		if(other->type == pe_ordering_restart
 		   && action->rsc->role > RSC_ROLE_STOPPED) {
-			crm_debug_3("Upgrading %s constraint to %s",
+			crm_debug_3("\t  Upgrading %s constraint to %s",
 				    ordering_type2text(other->type),
 				    ordering_type2text(pe_ordering_manditory));
 			other->type = pe_ordering_manditory;
 		}
 		
 		if(other->type != pe_ordering_manditory) {
 			crm_debug_3("\t  Ignoring: %s",
 				    ordering_type2text(other->type));
 			continue;
 			
 		} else if(action->optional || other->action->optional == FALSE){
 			crm_debug_3("\t  Ignoring: %s/%s",
 				    other->action->optional?"-":"they are not optional",
 				    action->optional?"we are optional":"-");
 			continue;
 			
 		} else if(safe_str_eq(other->action->task, CRMD_ACTION_START)) {
 			const char *interval = g_hash_table_lookup(
 				action->meta, XML_LRM_ATTR_INTERVAL);
 			int interval_i = 0;
 			if(interval != NULL) {
 				interval_i = crm_parse_int(interval, NULL);
 				if(interval_i > 0) {
 					crm_debug_3("Ignoring: start + recurring");
 					continue;
 				}
 			}
 		}
 
 		other->action->optional = FALSE;
 		crm_debug_2("* Marking action %s mandatory because of %s",
 			    other->action->uuid, action->uuid);
 		update_action(other->action);
 		);
 
 	slist_iter(
 		other, action_wrapper_t, action->actions_after, lpc,
 		
 		if(action->pseudo == FALSE && action->runnable == FALSE) {
 			if(other->action->runnable == FALSE) {
 				crm_debug_2("Action %s already un-runnable",
 					  other->action->uuid);
 			} else if(action->optional == FALSE) {
 				other->action->runnable = FALSE;
 				crm_debug_2("Marking action %s un-runnable"
 					  " because of %s",
 					  other->action->uuid, action->uuid);
 				update_action(other->action);
 			}
 		}
 
 		crm_debug_3("\t(Recover) Checking action %s: %s/%s",
 			    other->action->uuid, ordering_type2text(other->type),
 			    other->action->optional?"optional":"required");
 
 		if(other->action->rsc == NULL) {
 			continue;
 			
 		} else if(other->type == pe_ordering_recover) {
 			if(other->action->rsc->restart_type != pe_restart_restart) {
 				crm_debug_3("\t  Ignoring: restart type %d",
 					    other->action->rsc->restart_type);
 				continue;
 			}
 			
 		} else if(other->type == pe_ordering_restart) {
 		} else if(other->type == pe_ordering_postnotify) {
 			CRM_CHECK(action->rsc == other->action->rsc, continue);
 
 		} else {
 			crm_debug_3("\t  Ignoring: ordering %s",
 				    ordering_type2text(other->type));
 			continue;
 		}
 		
 		if(other->action->optional == FALSE || action->optional) {
 			crm_debug_3("\t  Ignoring: %s/%s",
 				    action->optional?"we are optional":"-",
 				    other->action->optional?"-":"they are not optional");
 			continue;
 		}
 
 		task = text2task(action->task);
 		switch(task) {
 			case stop_rsc:
 			case stopped_rsc:
 				crm_debug_3("\t  Ignoring: action %s",
 					    action->uuid);
 				break;
 			case start_rsc:
 			case started_rsc:
 				crm_debug_2("* (Recover) Marking action %s"
 					    " mandatory because of %s",
 					    other->action->uuid, action->uuid);
 				other->action->optional = FALSE; 
 				update_action(other->action);
 				break;
 			default:
 				crm_debug_3("\t  Ignoring: action %s",
 					    action->uuid);
 				break;
 		}
 		);
 
 	return FALSE;
 }
 
 
 gboolean
 shutdown_constraints(
 	node_t *node, action_t *shutdown_op, pe_working_set_t *data_set)
 {
 	/* add the stop to the before lists so it counts as a pre-req
 	 * for the shutdown
 	 */
 	slist_iter(
 		rsc, resource_t, node->details->running_rsc, lpc,
 
 		if(rsc->is_managed == FALSE) {
 			continue;
 		}
 		
 		custom_action_order(
 			rsc, stop_key(rsc), NULL,
 			NULL, crm_strdup(CRM_OP_SHUTDOWN), shutdown_op,
 			pe_ordering_manditory, data_set);
 
 		);	
 
 	return TRUE;	
 }
 
 gboolean
 stonith_constraints(
 	node_t *node, action_t *stonith_op, pe_working_set_t *data_set)
 {
 	CRM_CHECK(stonith_op != NULL, return FALSE);
 	
 	/*
 	 * Make sure the stonith OP occurs before we start any shared resources
 	 */
 	if(stonith_op != NULL) {
 		slist_iter(
 			rsc, resource_t, data_set->resources, lpc,
 			rsc->cmds->stonith_ordering(rsc, stonith_op, data_set);
 			);
 	}
 	
 	/* add the stonith OP as a stop pre-req and the mark the stop
 	 * as a pseudo op - since its now redundant
 	 */
 	
 	return TRUE;
 }
 
 static void dup_attr(gpointer key, gpointer value, gpointer user_data)
 {
 	g_hash_table_replace(user_data, crm_strdup(key), crm_strdup(value));
 }
 
 crm_data_t *
 action2xml(action_t *action, gboolean as_input)
 {
 	gboolean needs_node_info = TRUE;
 	crm_data_t * action_xml = NULL;
 	crm_data_t * args_xml = NULL;
 	char *action_id_s = NULL;
 	
 	if(action == NULL) {
 		return NULL;
 	}
 
 	crm_debug_4("Dumping action %d as XML", action->id);
 	if(safe_str_eq(action->task, CRM_OP_FENCE)) {
 		action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT);
 /* 		needs_node_info = FALSE; */
 		
 	} else if(safe_str_eq(action->task, CRM_OP_SHUTDOWN)) {
 		action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT);
 
 	} else if(safe_str_eq(action->task, CRM_OP_LRM_REFRESH)) {
 		action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT);
 
 /* 	} else if(safe_str_eq(action->task, CRMD_ACTION_PROBED)) { */
 /* 		action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); */
 
 	} else if(action->pseudo) {
 		action_xml = create_xml_node(NULL, XML_GRAPH_TAG_PSEUDO_EVENT);
 		needs_node_info = FALSE;
 
 	} else {
 		action_xml = create_xml_node(NULL, XML_GRAPH_TAG_RSC_OP);
 	}
 
 	action_id_s = crm_itoa(action->id);
 	crm_xml_add(action_xml, XML_ATTR_ID, action_id_s);
 	crm_free(action_id_s);
 	
 	crm_xml_add(action_xml, XML_LRM_ATTR_TASK, action->task);
 	if(action->rsc != NULL && action->rsc->clone_name != NULL) {
 		char *clone_key = NULL;
 		const char *interval_s = g_hash_table_lookup(action->meta, "interval");
 		int interval = crm_parse_int(interval_s, "0");
 
 		if(safe_str_eq(action->task, CRMD_ACTION_NOTIFY)) {			
 			const char *n_type = g_hash_table_lookup(
 				action->extra, crm_meta_name("notify_type"));
 			const char *n_task = g_hash_table_lookup(
 				action->extra, crm_meta_name("notify_operation"));
 			CRM_CHECK(n_type != NULL, ;);
 			CRM_CHECK(n_task != NULL, ;);
 			clone_key = generate_notify_key(action->rsc->clone_name, n_type, n_task);
 			
 		} else {
 			clone_key = generate_op_key(action->rsc->clone_name, action->task, interval);
 		}
 		
 		crm_xml_add(action_xml, XML_LRM_ATTR_TASK_KEY, clone_key);
 		crm_xml_add(action_xml, "internal_"XML_LRM_ATTR_TASK_KEY, action->uuid);
 		crm_free(clone_key);
 		
 	} else {
 		crm_xml_add(action_xml, XML_LRM_ATTR_TASK_KEY, action->uuid);
 	}
 	
 	if(needs_node_info && action->node != NULL) {
 		crm_xml_add(action_xml, XML_LRM_ATTR_TARGET,
 			    action->node->details->uname);
 
 		crm_xml_add(action_xml, XML_LRM_ATTR_TARGET_UUID,
 			    action->node->details->id);		
 	}
 
 	if(action->failure_is_fatal == FALSE) {
 		add_hash_param(action->meta,
 			       XML_ATTR_TE_ALLOWFAIL, XML_BOOLEAN_TRUE);
 	}
 	
 	if(as_input) {
 		return action_xml;
 	}
 
 	if(action->notify_keys != NULL) {
 		g_hash_table_foreach(
 			action->notify_keys, dup_attr, action->meta);
 	}
 	if(action->rsc != NULL && action->pseudo == FALSE) {
 		int lpc = 0;
 		
 		crm_data_t *rsc_xml = create_xml_node(
 			action_xml, crm_element_name(action->rsc->xml));
 
 		const char *attr_list[] = {
 			XML_AGENT_ATTR_CLASS,
 			XML_AGENT_ATTR_PROVIDER,
 			XML_ATTR_TYPE
 		};
 
 		if(action->rsc->clone_name != NULL) {
 			crm_debug("Using clone name %s for %s", action->rsc->clone_name, action->rsc->id);
 			crm_xml_add(rsc_xml, XML_ATTR_ID, action->rsc->clone_name);
 			crm_xml_add(rsc_xml, XML_ATTR_ID_LONG, action->rsc->id);
 
 		} else {
 			crm_xml_add(rsc_xml, XML_ATTR_ID, action->rsc->id);
 			crm_xml_add(rsc_xml, XML_ATTR_ID_LONG, action->rsc->long_name);
 		}
 		
 		for(lpc = 0; lpc < DIMOF(attr_list); lpc++) {
 			crm_xml_add(rsc_xml, attr_list[lpc],
 				    g_hash_table_lookup(action->rsc->meta, attr_list[lpc]));
 		}
 	}
 
 	args_xml = create_xml_node(action_xml, XML_TAG_ATTRS);
 	crm_xml_add(args_xml, XML_ATTR_CRM_VERSION, CRM_FEATURE_SET);
 
 	g_hash_table_foreach(action->extra, hash2field, args_xml);
 	if(action->rsc != NULL && safe_str_neq(action->task, CRMD_ACTION_STOP)) {
 		g_hash_table_foreach(action->rsc->parameters, hash2field, args_xml);
 	}
 
 	g_hash_table_foreach(action->meta, hash2metafield, args_xml);
 	if(action->rsc != NULL) {
 		int lpc = 0;
 		const char *key = NULL;
 		const char *value = NULL;
 		const char *meta_list[] = {
 			XML_RSC_ATTR_UNIQUE,
 			XML_RSC_ATTR_INCARNATION,
 			XML_RSC_ATTR_INCARNATION_MAX,
 			XML_RSC_ATTR_INCARNATION_NODEMAX,
 			XML_RSC_ATTR_MASTER_MAX,
 			XML_RSC_ATTR_MASTER_NODEMAX,
 		};
 		
 		for(lpc = 0; lpc < DIMOF(meta_list); lpc++) {
 			key = meta_list[lpc];
 			value = g_hash_table_lookup(action->rsc->meta, key);
 			if(value != NULL) {
 				char *crm_name = crm_concat(CRM_META, key, '_');
 				crm_xml_add(args_xml, crm_name, value);
 				crm_free(crm_name);
 			}
 		}
 	}
 	
 	crm_log_xml_debug_4(action_xml, "dumped action");
 	
 	return action_xml;
 }
 
 static gboolean
 should_dump_action(action_t *action) 
 {
 	const char * interval = NULL;
 
 	CRM_CHECK(action != NULL, return FALSE);
 
 	interval = g_hash_table_lookup(action->meta, XML_LRM_ATTR_INTERVAL);
 	if(action->optional) {
 		crm_debug_5("action %d was optional", action->id);
 		return FALSE;
 
 	} else if(action->pseudo == FALSE && action->runnable == FALSE) {
 		crm_debug_5("action %d was not runnable", action->id);
 		return FALSE;
 
 	} else if(action->dumped) {
 		crm_debug_5("action %d was already dumped", action->id);
 		return FALSE;
 
 	} else if(action->rsc != NULL
 		  && action->rsc->is_managed == FALSE) {
 
 		/* make sure probes go through */
 		if(safe_str_neq(action->task, CRMD_ACTION_STATUS)) {
 			pe_warn("action %d (%s) was for an unmanaged resource (%s)",
 				action->id, action->uuid, action->rsc->id);
 			return FALSE;
 		}
 		
 		if(interval != NULL && safe_str_neq(interval, "0")) {
 			pe_warn("action %d (%s) was for an unmanaged resource (%s)",
 				action->id, action->uuid, action->rsc->id);
 			return FALSE;
 		}
 	}
 	
 	if(action->pseudo
 	   || safe_str_eq(action->task,  CRM_OP_FENCE)
 	   || safe_str_eq(action->task,  CRM_OP_SHUTDOWN)) {
 		/* skip the next checks */
 		return TRUE;
 	}
 
 	if(action->node == NULL) {
 		pe_err("action %d (%s) was not allocated",
 		       action->id, action->uuid);
 		log_action(LOG_DEBUG, "Unallocated action", action, FALSE);
 		return FALSE;
 		
 	} else if(action->node->details->online == FALSE) {
 		pe_err("action %d was (%s) scheduled for offline node",
 		       action->id, action->uuid);
 		log_action(LOG_DEBUG, "Action for offline node", action, FALSE);
 		return FALSE;
 #if 0
 		/* but this would also affect resources that can be safely
 		 *  migrated before a fencing op
 		 */
 	} else if(action->node->details->unclean == FALSE) {
 		pe_err("action %d was (%s) scheduled for unclean node",
 		       action->id, action->uuid);
 		log_action(LOG_DEBUG, "Action for unclean node", action, FALSE);
 		return FALSE;
 #endif
 	}
 	return TRUE;
 }
 
 /* lowest to highest */
 static gint sort_action_id(gconstpointer a, gconstpointer b)
 {
 	const action_wrapper_t *action_wrapper2 = (const action_wrapper_t*)a;
 	const action_wrapper_t *action_wrapper1 = (const action_wrapper_t*)b;
 
 	if(a == NULL) { return 1; }
 	if(b == NULL) { return -1; }
   
 	if(action_wrapper1->action->id > action_wrapper2->action->id) {
 		return -1;
 	}
 	
 	if(action_wrapper1->action->id < action_wrapper2->action->id) {
 		return 1;
 	}
 	return 0;
 }
 
 void
 graph_element_from_action(action_t *action, pe_working_set_t *data_set)
 {
 	int last_action = -1;
 	int synapse_priority = 0;
 	crm_data_t * syn = NULL;
 	crm_data_t * set = NULL;
 	crm_data_t * in  = NULL;
 	crm_data_t * input = NULL;
 	crm_data_t * xml_action = NULL;
 
 	if(should_dump_action(action) == FALSE) {
 		return;
 	}
 	
 	action->dumped = TRUE;
 	
 	syn = create_xml_node(data_set->graph, "synapse");
 	set = create_xml_node(syn, "action_set");
 	in  = create_xml_node(syn, "inputs");
 
 	crm_xml_add_int(syn, XML_ATTR_ID, data_set->num_synapse);
 	data_set->num_synapse++;
 
 	if(action->rsc != NULL) {
 		synapse_priority = action->rsc->priority;
 	}
 	if(action->priority > synapse_priority) {
 		synapse_priority = action->priority;
 	}
 	if(synapse_priority > 0) {
 		crm_xml_add_int(syn, XML_CIB_ATTR_PRIORITY, synapse_priority);
 	}
 	
 	xml_action = action2xml(action, FALSE);
 	add_node_copy(set, xml_action);
 	free_xml(xml_action);
 
 	action->actions_before = g_list_sort(
 		action->actions_before, sort_action_id);
 	
 	slist_iter(wrapper,action_wrapper_t,action->actions_before,lpc,
 
 		   if(last_action == wrapper->action->id) {
 			   crm_debug_2("Input (%d) %s duplicated",
 				       wrapper->action->id,
 				       wrapper->action->uuid);
 			   continue;
 			   
 		   } else if(wrapper->action->optional == TRUE) {
 			   crm_debug_2("Input (%d) %s optional",
 				       wrapper->action->id,
 				       wrapper->action->uuid);
 			   continue;
 		   }
 
 		   CRM_CHECK(last_action < wrapper->action->id, ;);
 		   last_action = wrapper->action->id;
 		   input = create_xml_node(in, "trigger");
 		   
 		   xml_action = action2xml(wrapper->action, TRUE);
 		   add_node_copy(input, xml_action);
 		   free_xml(xml_action);
 		   
 		);
 }
 
diff --git a/crm/pengine/group.c b/crm/pengine/group.c
index e46fdc545f..fb487df92c 100644
--- a/crm/pengine/group.c
+++ b/crm/pengine/group.c
@@ -1,460 +1,470 @@
 /* $Id: group.c,v 1.69 2006/08/14 09:06:31 andrew Exp $ */
 /* 
  * Copyright (C) 2004 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.1 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #include <portability.h>
 
 #include <pengine.h>
 #include <lib/crm/pengine/utils.h>
 #include <crm/msg_xml.h>
 #include <clplumbing/cl_misc.h>
 #include <allocate.h>
 #include <utils.h>
 
 #define VARIANT_GROUP 1
 #include <lib/crm/pengine/variant.h>
 
 void group_set_cmds(resource_t *rsc)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 	group_data->self->cmds = &resource_class_alloc_functions[group_data->self->variant];
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		child_rsc->cmds = &resource_class_alloc_functions[child_rsc->variant];
 		child_rsc->cmds->set_cmds(child_rsc);
 		);
 }
 
 int group_num_allowed_nodes(resource_t *rsc)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 	if(group_data->colocated == FALSE) {
 		crm_config_err("Cannot clone non-colocated group: %s", rsc->id);
 		return 0;
 	}
  	return group_data->self->cmds->num_allowed_nodes(group_data->self);
 }
 
 node_t *
 group_color(resource_t *rsc, pe_working_set_t *data_set)
 {
 	resource_t *child = NULL;
 	node_t *group_node = NULL;
 	GListPtr child_iter = NULL;
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	if(rsc->provisional == FALSE) {
 		return rsc->allocated_to;
 	}
 	/* combine the child weights */
 	crm_debug("Processing %s", rsc->id);
 	if(rsc->is_allocating) {
 		crm_debug("Dependancy loop detected involving %s", rsc->id);
 		return NULL;
 	}
 	rsc->is_allocating = TRUE;
+	group_data->self->role = group_data->first_child->role;
 	
 	group_data->first_child->rsc_cons = g_list_concat(
 		group_data->first_child->rsc_cons, rsc->rsc_cons);
 	rsc->rsc_cons = NULL;
 
 	/* process in reverse so that all scores are merged before allocation */
 	child_iter = g_list_last(group_data->child_list);
 	for(; child_iter != NULL; ) {
 		child = child_iter->data;
 		child_iter = g_list_previous(child_iter);
 		group_node = child->cmds->color(child, data_set);
 	}
-	
-	rsc->provisional = FALSE;
+
+	group_data->self->next_role = group_data->first_child->next_role;	
 	rsc->is_allocating = FALSE;
+	rsc->provisional = FALSE;
 
 	if(group_data->colocated) {
 		return group_node;
 	} 
 	return NULL;
 }
 
 void group_update_pseudo_status(resource_t *parent, resource_t *child);
 
 void group_create_actions(resource_t *rsc, pe_working_set_t *data_set)
 {
 	action_t *op = NULL;
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	crm_debug_2("Creating actions for %s", rsc->id);
 	
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		child_rsc->cmds->create_actions(child_rsc, data_set);
 		group_update_pseudo_status(rsc, child_rsc);
 		);
 
 	op = start_action(group_data->self, NULL, !group_data->child_starting);
 	op->pseudo   = TRUE;
 
 	op = custom_action(group_data->self, started_key(group_data->self),
 			   CRMD_ACTION_STARTED, NULL,
 			   !group_data->child_starting, TRUE, data_set);
 	op->pseudo   = TRUE;
 
 	op = stop_action(group_data->self, NULL, !group_data->child_stopping);
 	op->pseudo   = TRUE;
 	
 	op = custom_action(group_data->self, stopped_key(group_data->self),
 			   CRMD_ACTION_STOPPED, NULL,
 			   !group_data->child_stopping, TRUE, data_set);
 	op->pseudo   = TRUE;
 
 	rsc->actions = group_data->self->actions;
 }
 
 void
 group_update_pseudo_status(resource_t *parent, resource_t *child) 
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, parent);
 
 	if(group_data->child_stopping && group_data->child_starting) {
 		return;
 	}
 	slist_iter(
 		action, action_t, child->actions, lpc,
 
 		if(action->optional) {
 			continue;
 		}
 		if(safe_str_eq(CRMD_ACTION_STOP, action->task) && action->runnable) {
 			group_data->child_stopping = TRUE;
 			crm_debug_3("Based on %s the group is stopping", action->uuid);
 
 		} else if(safe_str_eq(CRMD_ACTION_START, action->task) && action->runnable) {
 			group_data->child_starting = TRUE;
 			crm_debug_3("Based on %s the group is starting", action->uuid);
 		}
 		
 		);
 }
 
 void group_internal_constraints(resource_t *rsc, pe_working_set_t *data_set)
 {
 	resource_t *last_rsc = NULL;
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	group_data->self->cmds->internal_constraints(group_data->self, data_set);
 	
 	custom_action_order(
 		group_data->self, stopped_key(group_data->self), NULL,
 		group_data->self, start_key(group_data->self), NULL,
 		pe_ordering_optional, data_set);
 
 	custom_action_order(
 		group_data->self, stop_key(group_data->self), NULL,
 		group_data->self, stopped_key(group_data->self), NULL,
 		pe_ordering_optional, data_set);
 
 	custom_action_order(
 		group_data->self, start_key(group_data->self), NULL,
 		group_data->self, started_key(group_data->self), NULL,
 		pe_ordering_optional, data_set);
 	
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 
 		child_rsc->cmds->internal_constraints(child_rsc, data_set);
 
 		if(group_data->colocated && last_rsc != NULL) {
 			rsc_colocation_new(
 				"group:internal_colocation", NULL, INFINITY,
 				child_rsc, last_rsc, NULL, NULL);
 		}
 	
 		if(group_data->ordered == FALSE) {
 			order_start_start(
 				group_data->self, child_rsc, pe_ordering_optional);
 
 			custom_action_order(
 				child_rsc, start_key(child_rsc), NULL,
 				group_data->self, started_key(group_data->self), NULL,
 				pe_ordering_optional, data_set);
 
 			order_stop_stop(
 				group_data->self, child_rsc, pe_ordering_optional);
 
 			custom_action_order(
 				child_rsc, stop_key(child_rsc), NULL,
 				group_data->self, stopped_key(group_data->self), NULL,
 				pe_ordering_optional, data_set);
 
 			continue;
 		}
 		
 		if(last_rsc != NULL) {
 			order_start_start(
 				last_rsc, child_rsc, pe_ordering_optional);
 			order_stop_stop(
 				child_rsc, last_rsc, pe_ordering_optional);
 
 			/* recovery */
 			child_rsc->restart_type = pe_restart_restart;
 			order_start_start(
 				last_rsc, child_rsc, pe_ordering_recover);
 			order_stop_stop(
 				child_rsc, last_rsc, pe_ordering_recover);
 
 		} else {
 			custom_action_order(
 				child_rsc, stop_key(child_rsc), NULL,
 				group_data->self, stopped_key(group_data->self), NULL,
 				pe_ordering_optional, data_set);
 
 			order_start_start(group_data->self, child_rsc,
 					  pe_ordering_optional);
+
+			/* recovery */
+			custom_action_order(
+				child_rsc, stop_key(child_rsc), NULL,
+				group_data->self, stopped_key(group_data->self), NULL,
+				pe_ordering_recover, data_set);
+			order_start_start(group_data->self, child_rsc,
+					  pe_ordering_recover);
 		}
 		
 		last_rsc = child_rsc;
 		);
 
 	if(group_data->ordered && last_rsc != NULL) {
 		custom_action_order(
 			last_rsc, start_key(last_rsc), NULL,
 			group_data->self, started_key(group_data->self), NULL,
 			pe_ordering_optional, data_set);
 
 		order_stop_stop(
 			group_data->self, last_rsc, pe_ordering_optional);
 	}
 		
 }
 
 
 void group_rsc_colocation_lh(
 	resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint)
 {
 	group_variant_data_t *group_data = NULL;
 	
 	if(rsc_lh == NULL) {
 		pe_err("rsc_lh was NULL for %s", constraint->id);
 		return;
 
 	} else if(rsc_rh == NULL) {
 		pe_err("rsc_rh was NULL for %s", constraint->id);
 		return;
 	}
 		
 	crm_debug_4("Processing constraints from %s", rsc_lh->id);
 
 	get_group_variant_data(group_data, rsc_lh);
 
 	if(group_data->colocated) {
 		group_data->first_child->cmds->rsc_colocation_lh(
 			group_data->first_child, rsc_rh, constraint); 
 		return;
 
 	} else if(constraint->score >= INFINITY) {
 		crm_config_err("%s: Cannot perform manditory colocation"
 			       " between non-colocated group and %s",
 			       rsc_lh->id, rsc_rh->id);
 		return;
 	} 
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		child_rsc->cmds->rsc_colocation_lh(
 			child_rsc, rsc_rh, constraint); 
 		);
 }
 
 void group_rsc_colocation_rh(
 	resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc_rh);
 	CRM_CHECK(rsc_lh->variant == pe_native, return);
 
 	crm_debug_3("Processing RH of constraint %s", constraint->id);
 	print_resource(LOG_DEBUG_3, "LHS", rsc_lh, TRUE);
 
 	if(rsc_rh->provisional) {
 		return;
 	
 	} else if(group_data->colocated) {
 		group_data->first_child->cmds->rsc_colocation_rh(
 			rsc_lh, group_data->first_child, constraint); 
 		return;
 
 	} else if(constraint->score >= INFINITY) {
 		crm_config_err("%s: Cannot perform manditory colocation with"
 			       " non-colocated group: %s", rsc_lh->id, rsc_rh->id);
 		return;
 	} 
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		child_rsc->cmds->rsc_colocation_rh(
 			rsc_lh, child_rsc, constraint); 
 		);
 }
 
 void group_rsc_order_lh(resource_t *rsc, order_constraint_t *order)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	crm_debug("%s->%s", order->lh_action_task, order->rh_action_task);
 
 	if(group_data->self == NULL) {
 		return;
 	}
 
 	convert_non_atomic_task(rsc, order);
 	group_data->self->cmds->rsc_order_lh(group_data->self, order);
 }
 
 void group_rsc_order_rh(
 	action_t *lh_action, resource_t *rsc, order_constraint_t *order)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	crm_debug_2("%s->%s", lh_action->uuid, order->rh_action_task);
 
 	if(group_data->self == NULL) {
 		return;
 	}
 
 	group_data->self->cmds->rsc_order_rh(lh_action, group_data->self, order);
 }
 
 void group_rsc_location(resource_t *rsc, rsc_to_node_t *constraint)
 {
 	gboolean reset_scores = TRUE;
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	crm_debug("Processing rsc_location %s for %s",
 		  constraint->id, group_data->self->id);
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		child_rsc->cmds->rsc_location(child_rsc, constraint);
 		if(group_data->colocated && reset_scores) {
 			reset_scores = FALSE;
 			slist_iter(node, node_t, constraint->node_list_rh, lpc2,
 				   node->weight = 0;
 				);
 		}
 		);
 }
 
 
 void group_expand(resource_t *rsc, pe_working_set_t *data_set)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	crm_debug_3("Processing actions from %s", rsc->id);
 
 	CRM_CHECK(group_data->self != NULL, return);
 	group_data->self->cmds->expand(group_data->self, data_set);
 	
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 
 		child_rsc->cmds->expand(child_rsc, data_set);
 		);
 
 }
 
 void
 group_agent_constraints(resource_t *rsc)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		
 		child_rsc->cmds->agent_constraints(child_rsc);
 		);
 }
 
 void
 group_create_notify_element(resource_t *rsc, action_t *op,
 			    notify_data_t *n_data, pe_working_set_t *data_set)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		
 		child_rsc->cmds->create_notify_element(
 			child_rsc, op, n_data, data_set);
 		);
 }
 
 gboolean
 group_create_probe(resource_t *rsc, node_t *node, action_t *complete,
 		    gboolean force, pe_working_set_t *data_set) 
 {
 	gboolean any_created = FALSE;
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		
 		any_created = child_rsc->cmds->create_probe(
 			child_rsc, node, complete, force, data_set) || any_created;
 		);
 	return any_created;
 }
 
 void
 group_stonith_ordering(
 	resource_t *rsc,  action_t *stonith_op, pe_working_set_t *data_set)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		
 		child_rsc->cmds->stonith_ordering(
 			child_rsc, stonith_op, data_set);
 		);
 }
 
 void
 group_migrate_reload(resource_t *rsc, pe_working_set_t *data_set)
 {
 	group_variant_data_t *group_data = NULL;
 	get_group_variant_data(group_data, rsc);
 
 	slist_iter(
 		child_rsc, resource_t, group_data->child_list, lpc,
 		
 		child_rsc->cmds->migrate_reload(child_rsc, data_set);
 		);
 }
diff --git a/crm/pengine/regression.sh b/crm/pengine/regression.sh
index f6504781b7..e569e9d42f 100755
--- a/crm/pengine/regression.sh
+++ b/crm/pengine/regression.sh
@@ -1,232 +1,234 @@
 #!/bin/bash
 
  # Copyright (C) 2004 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.1 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  #
 
 . regression.core.sh
 create_mode="true"
 echo Generating test outputs for these tests...
 echo ""
+do_test rec-rsc-9 "Resource Recover - group/group"
 
 echo Done.
 echo ""
 echo Performing the following tests...
 create_mode="false"
 
 echo ""
 do_test simple1 "Offline     "
 do_test simple2 "Start       "
 do_test simple3 "Start 2     "
 do_test simple4 "Start Failed"
 do_test simple6 "Stop Start  "
 do_test simple7 "Shutdown    "
 #do_test simple8 "Stonith	"
 #do_test simple9 "Lower version"
 #do_test simple10 "Higher version"
 do_test simple11 "Priority (ne)"
 do_test simple12 "Priority (eq)"
 do_test simple8 "Stickiness"
 
 echo ""
 do_test params-0 "Params: No change"
 do_test params-1 "Params: Changed"
 do_test params-2 "Params: Resource definition"
 do_test params-4 "Params: Reload"
 
 echo ""
 do_test orphan-0 "Orphan ignore"
 do_test orphan-1 "Orphan stop"
 
 echo ""
 do_test target-0 "Target Role : baseline"
 do_test target-1 "Target Role : test"
 
 echo ""
 do_test date-1 "Dates" -d "2005-020"
 do_test date-2 "Date Spec - Pass" -d "2005-020T12:30"
 do_test date-3 "Date Spec - Fail" -d "2005-020T11:30"
 do_test probe-0 "Probe (anon clone)"
 do_test probe-1 "Pending Probe"
 do_test standby "Standby"
 do_test comments "Comments"
 
 echo ""
 do_test rsc_dep1 "Must not     "
 do_test rsc_dep3 "Must         "
 do_test rsc_dep5 "Must not 3   "
 do_test rsc_dep7 "Must 3       "
 do_test rsc_dep10 "Must (but cant)"
 do_test rsc_dep2  "Must (running) "
 do_test rsc_dep8  "Must (running : alt) "
 do_test rsc_dep4  "Must (running + move)"
 
 echo ""
 do_test order1 "Order start 1     "
 do_test order2 "Order start 2     "
 do_test order3 "Order stop	  "
 do_test order4 "Order (multiple)  "
 do_test order5 "Order (move)  "
 do_test order6 "Order (move w/ restart)  "
 do_test order7 "Order (manditory)  "
 
 #echo ""
 #do_test agent1 "version: lt (empty)"
 #do_test agent2 "version: eq	"
 #do_test agent3 "version: gt	"
 
 echo ""
 do_test attrs1 "string: eq (and)     "
 do_test attrs2 "string: lt / gt (and)"
 do_test attrs3 "string: ne (or)      "
 do_test attrs4 "string: exists       "
 do_test attrs5 "string: not_exists   "
 do_test attrs6 "is_dc: true          "
 do_test attrs7 "is_dc: false         "
 do_test attrs8 "score_attribute      "
 
 echo ""
 do_test mon-rsc-1 "Schedule Monitor - start"
 do_test mon-rsc-2 "Schedule Monitor - move "
 do_test mon-rsc-3 "Schedule Monitor - pending start     "
 do_test mon-rsc-4 "Schedule Monitor - move/pending start"
 
 echo ""
 do_test rec-rsc-0 "Resource Recover - no start     "
 do_test rec-rsc-1 "Resource Recover - start        "
 do_test rec-rsc-2 "Resource Recover - monitor      "
 do_test rec-rsc-3 "Resource Recover - stop - ignore"
 do_test rec-rsc-4 "Resource Recover - stop - block "
 do_test rec-rsc-5 "Resource Recover - stop - fence "
 do_test rec-rsc-6 "Resource Recover - multiple - restart"
 do_test rec-rsc-7 "Resource Recover - multiple - stop   "
 do_test rec-rsc-8 "Resource Recover - multiple - block  "
+do_test rec-rsc-9 "Resource Recover - group/group"
 
 echo ""
 do_test quorum-1 "No quorum - ignore"
 do_test quorum-2 "No quorum - freeze"
 do_test quorum-3 "No quorum - stop  "
 do_test quorum-4 "No quorum - start anyway"
 do_test quorum-5 "No quorum - start anyway (group)"
 do_test quorum-6 "No quorum - start anyway (clone)"
 
 echo ""
 do_test rec-node-1 "Node Recover - Startup   - no fence"
 do_test rec-node-2 "Node Recover - Startup   - fence   "
 do_test rec-node-3 "Node Recover - HA down   - no fence"
 do_test rec-node-4 "Node Recover - HA down   - fence   "
 do_test rec-node-5 "Node Recover - CRM down  - no fence"
 do_test rec-node-6 "Node Recover - CRM down  - fence   "
 do_test rec-node-7 "Node Recover - no quorum - ignore  "
 do_test rec-node-8 "Node Recover - no quorum - freeze  "
 do_test rec-node-9 "Node Recover - no quorum - stop    "
 do_test rec-node-10 "Node Recover - no quorum - stop w/fence"
 do_test rec-node-11 "Node Recover - CRM down w/ group - fence   "
 do_test rec-node-12 "Node Recover - nothing active - fence   "
 do_test rec-node-13 "Node Recover - failed resource + shutdown - fence   "
 do_test rec-node-14 "Serialize all stonith's"
 
 echo ""
 do_test multi1 "Multiple Active (stop/start)"
 
 echo ""
 do_test migrate-1 "Migrate (migrate)"
 do_test migrate-2 "Migrate (stable)"
 do_test migrate-3 "Migrate (failed migrate_to)"
 do_test migrate-4 "Migrate (failed migrate_from)"
 
 #echo ""
 #do_test complex1 "Complex	"
 
 echo ""
 do_test group1 "Group		"
 do_test group2 "Group + Native	"
 do_test group3 "Group + Group	"
 do_test group4 "Group + Native (nothing)"
 do_test group5 "Group + Native (move)   "
 do_test group6 "Group + Group (move)    "
 do_test group7 "Group colocation"
 do_test group13 "Group colocation (cant run)"
 do_test group8 "Group anti-colocation"
 do_test group9 "Group recovery"
 do_test group10 "Group partial recovery"
 do_test group11 "Group target_role"
 
 echo ""
 do_test inc0 "Incarnation start" 
 do_test inc1 "Incarnation start order" 
 do_test inc2 "Incarnation silent restart, stop, move"
 do_test inc3 "Inter-incarnation ordering, silent restart, stop, move"
 do_test inc4 "Inter-incarnation ordering, silent restart, stop, move (ordered)"
 do_test inc5 "Inter-incarnation ordering, silent restart, stop, move (restart 1)"
 do_test inc6 "Inter-incarnation ordering, silent restart, stop, move (restart 2)"
 do_test inc7 "Clone colocation"
 do_test inc8 "Clone anti-colocation"
 do_test inc9 "Non-unique clone"
 do_test inc10 "Non-unique clone (stop)"
 do_test inc11 "Primitive colocation with clones" 
 do_test inc12 "Clone shutdown" 
 
 echo ""
 do_test master-0 "Stopped -> Slave"
 do_test master-1 "Stopped -> Promote"
 do_test master-2 "Stopped -> Promote : notify"
 do_test master-3 "Stopped -> Promote : master location"
 do_test master-4 "Started -> Promote : master location"
 do_test master-5 "Promoted -> Promoted"
 do_test master-6 "Promoted -> Promoted (2)"
 do_test master-7 "Promoted -> Fenced"
 do_test master-8 "Promoted -> Fenced -> Moved"
 do_test master-9 "Stopped + Promotable + No quorum"
 do_test master-10 "Stopped -> Promotable : notify with monitor"
 do_test master-11 "Stopped -> Promote : colocation"
 
 
 echo ""
 do_test managed-0 "Managed (reference)"
 do_test managed-1 "Not managed - down "
 do_test managed-2 "Not managed - up   "
 
 echo ""
 do_test interleave-0 "Interleave (reference)"
 do_test interleave-1 "coloc - not interleaved"
 do_test interleave-2 "coloc - interleaved   "
 do_test interleave-3 "coloc - interleaved (2)"
 
 echo ""
 do_test notify-0 "Notify reference"
 do_test notify-1 "Notify simple"
 do_test notify-2 "Notify simple, confirm"
 do_test notify-3 "Notify move, confirm"
 #do_test notify-2 "Notify - 764"
 
 echo ""
 do_test 594 "OSDL #594"
 do_test 662 "OSDL #662"
 do_test 696 "OSDL #696"
 do_test 726 "OSDL #726"
 do_test 735 "OSDL #735"
 do_test 764 "OSDL #764"
 do_test 797 "OSDL #797"
 do_test 829 "OSDL #829"
 do_test 994 "OSDL #994"
 do_test 1360 "OSDL #1360 - Clone stickiness"
 do_test unrunnable-1 "Unrunnable"
 do_test stonith-0 "Stonith loop"
 
 echo ""
 
 test_results
diff --git a/crm/pengine/testcases/rec-node-11.dot b/crm/pengine/testcases/rec-node-11.dot
index f2567d50e6..73b2d54f83 100644
--- a/crm/pengine/testcases/rec-node-11.dot
+++ b/crm/pengine/testcases/rec-node-11.dot
@@ -1,30 +1,33 @@
  digraph "g" {
 "group1_running_0" [ style=bold color="green" fontcolor="orange" ]
 "group1_start_0" -> "group1_running_0" [ style = bold]
 "group1_start_0" -> "rsc1_start_0 node2" [ style = bold]
 "group1_start_0" [ style=bold color="green" fontcolor="orange" ]
+"group1_stop_0" -> "group1_start_0" [ style = bold]
+"group1_stop_0" -> "rsc2_stop_0 node1" [ style = bold]
+"group1_stop_0" [ style=bold color="green" fontcolor="orange" ]
 "probe_complete node2" -> "probe_complete" [ style = bold]
 "probe_complete node2" [ style=bold color="green" fontcolor="black" ]
 "probe_complete" -> "group1_start_0" [ style = bold]
 "probe_complete" [ style=bold color="green" fontcolor="orange" ]
 "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold]
 "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ]
 "rsc1_start_0 node2" -> "rsc2_start_0 node2" [ style = bold]
 "rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ]
 "rsc1_stop_0 node1" -> "rsc1_start_0 node2" [ style = bold]
 "rsc1_stop_0 node1" [ style=bold color="green" fontcolor="orange" ]
 "rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold]
 "rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ]
 "rsc2_start_0 node2" -> "group1_running_0" [ style = bold]
 "rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ]
 "rsc2_stop_0 node1" -> "rsc1_stop_0 node1" [ style = bold]
 "rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold]
 "rsc2_stop_0 node1" [ style=bold color="green" fontcolor="orange" ]
 "rsc3_start_0 node2" -> "group1_start_0" [ style = bold]
 "rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ]
 "rsc3_stop_0 node2" -> "rsc3_start_0 node2" [ style = bold]
 "rsc3_stop_0 node2" [ style=bold color="green" fontcolor="black" ]
 "stonith node1" -> "rsc1_start_0 node2" [ style = bold]
 "stonith node1" -> "rsc2_start_0 node2" [ style = bold]
 "stonith node1" [ style=bold color="green" fontcolor="black" ]
 }
diff --git a/crm/pengine/testcases/rec-node-11.exp b/crm/pengine/testcases/rec-node-11.exp
index e5f29f20b3..2bc5f81a02 100644
--- a/crm/pengine/testcases/rec-node-11.exp
+++ b/crm/pengine/testcases/rec-node-11.exp
@@ -1,166 +1,181 @@
  <transition_graph cluster-delay="60s" transition_id="0">
    <synapse id="0">
      <action_set>
        <pseudo_event id="9" operation="start" operation_key="group1_start_0">
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
        </pseudo_event>
      </action_set>
      <inputs>
        <trigger>
          <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete"/>
        </trigger>
+       <trigger>
+         <pseudo_event id="11" operation="stop" operation_key="group1_stop_0"/>
+       </trigger>
        <trigger>
          <rsc_op id="14" operation="start" operation_key="rsc3_start_0" on_node="node2" on_node_uuid="uuid2"/>
        </trigger>
      </inputs>
    </synapse>
    <synapse id="1">
      <action_set>
        <pseudo_event id="10" operation="running" operation_key="group1_running_0">
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
        </pseudo_event>
      </action_set>
      <inputs>
        <trigger>
          <rsc_op id="8" operation="start" operation_key="rsc2_start_0" on_node="node2" on_node_uuid="uuid2"/>
        </trigger>
        <trigger>
          <pseudo_event id="9" operation="start" operation_key="group1_start_0"/>
        </trigger>
      </inputs>
    </synapse>
    <synapse id="2">
+     <action_set>
+       <pseudo_event id="11" operation="stop" operation_key="group1_stop_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs/>
+   </synapse>
+   <synapse id="3">
      <action_set>
        <pseudo_event id="1" operation="stop" operation_key="rsc1_stop_0">
          <attributes crm_feature_set="1.0.8" CRM_meta_id="stop-1" CRM_meta_on_fail="block" CRM_meta_timeout="20000" CRM_meta_name="stop"/>
        </pseudo_event>
      </action_set>
      <inputs>
        <trigger>
          <pseudo_event id="7" operation="stop" operation_key="rsc2_stop_0"/>
        </trigger>
      </inputs>
    </synapse>
-   <synapse id="3" priority="1000000">
+   <synapse id="4" priority="1000000">
      <action_set>
        <rsc_op id="4" operation="monitor" operation_key="rsc1_monitor_0" on_node="node2" on_node_uuid="uuid2">
          <primitive id="rsc1" long-id="group1:rsc1" class="heartbeat" type="apache"/>
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000" CRM_meta_op_target_rc="7"/>
        </rsc_op>
      </action_set>
      <inputs/>
    </synapse>
-   <synapse id="4">
+   <synapse id="5">
      <action_set>
        <rsc_op id="6" operation="start" operation_key="rsc1_start_0" on_node="node2" on_node_uuid="uuid2">
          <primitive id="rsc1" long-id="group1:rsc1" class="heartbeat" type="apache"/>
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
        </rsc_op>
      </action_set>
      <inputs>
        <trigger>
          <pseudo_event id="1" operation="stop" operation_key="rsc1_stop_0"/>
        </trigger>
        <trigger>
          <pseudo_event id="9" operation="start" operation_key="group1_start_0"/>
        </trigger>
        <trigger>
          <crm_event id="15" operation="stonith" operation_key="stonith" on_node="node1" on_node_uuid="uuid1"/>
        </trigger>
      </inputs>
    </synapse>
-   <synapse id="5" priority="1000000">
+   <synapse id="6" priority="1000000">
      <action_set>
        <rsc_op id="5" operation="monitor" operation_key="rsc2_monitor_0" on_node="node2" on_node_uuid="uuid2">
          <primitive id="rsc2" long-id="group1:rsc2" class="heartbeat" type="apache"/>
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000" CRM_meta_op_target_rc="7"/>
        </rsc_op>
      </action_set>
      <inputs/>
    </synapse>
-   <synapse id="6">
+   <synapse id="7">
      <action_set>
        <pseudo_event id="7" operation="stop" operation_key="rsc2_stop_0">
          <attributes crm_feature_set="1.0.8" CRM_meta_id="stop-2" CRM_meta_on_fail="block" CRM_meta_timeout="20000" CRM_meta_name="stop"/>
        </pseudo_event>
      </action_set>
-     <inputs/>
+     <inputs>
+       <trigger>
+         <pseudo_event id="11" operation="stop" operation_key="group1_stop_0"/>
+       </trigger>
+     </inputs>
    </synapse>
-   <synapse id="7">
+   <synapse id="8">
      <action_set>
        <rsc_op id="8" operation="start" operation_key="rsc2_start_0" on_node="node2" on_node_uuid="uuid2">
          <primitive id="rsc2" long-id="group1:rsc2" class="heartbeat" type="apache"/>
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
        </rsc_op>
      </action_set>
      <inputs>
        <trigger>
          <rsc_op id="6" operation="start" operation_key="rsc1_start_0" on_node="node2" on_node_uuid="uuid2"/>
        </trigger>
        <trigger>
          <pseudo_event id="7" operation="stop" operation_key="rsc2_stop_0"/>
        </trigger>
        <trigger>
          <crm_event id="15" operation="stonith" operation_key="stonith" on_node="node1" on_node_uuid="uuid1"/>
        </trigger>
      </inputs>
    </synapse>
-   <synapse id="8">
+   <synapse id="9">
      <action_set>
        <rsc_op id="13" operation="stop" operation_key="rsc3_stop_0" on_node="node2" on_node_uuid="uuid2">
          <primitive id="rsc3" long-id="rsc3" class="heartbeat" type="apache"/>
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
        </rsc_op>
      </action_set>
      <inputs/>
    </synapse>
-   <synapse id="9">
+   <synapse id="10">
      <action_set>
        <rsc_op id="14" operation="start" operation_key="rsc3_start_0" on_node="node2" on_node_uuid="uuid2">
          <primitive id="rsc3" long-id="rsc3" class="heartbeat" type="apache"/>
          <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
        </rsc_op>
      </action_set>
      <inputs>
        <trigger>
          <rsc_op id="13" operation="stop" operation_key="rsc3_stop_0" on_node="node2" on_node_uuid="uuid2"/>
        </trigger>
      </inputs>
    </synapse>
-   <synapse id="10">
+   <synapse id="11">
      <action_set>
        <pseudo_event id="2" operation="probe_complete" operation_key="probe_complete">
          <attributes crm_feature_set="1.0.8"/>
        </pseudo_event>
      </action_set>
      <inputs>
        <trigger>
          <rsc_op id="3" operation="probe_complete" operation_key="probe_complete" on_node="node2" on_node_uuid="uuid2"/>
        </trigger>
      </inputs>
    </synapse>
-   <synapse id="11" priority="1000000">
+   <synapse id="12" priority="1000000">
      <action_set>
        <rsc_op id="3" operation="probe_complete" operation_key="probe_complete" on_node="node2" on_node_uuid="uuid2">
          <attributes crm_feature_set="1.0.8" CRM_meta_op_no_wait="true"/>
        </rsc_op>
      </action_set>
      <inputs>
        <trigger>
          <rsc_op id="4" operation="monitor" operation_key="rsc1_monitor_0" on_node="node2" on_node_uuid="uuid2"/>
        </trigger>
        <trigger>
          <rsc_op id="5" operation="monitor" operation_key="rsc2_monitor_0" on_node="node2" on_node_uuid="uuid2"/>
        </trigger>
      </inputs>
    </synapse>
-   <synapse id="12">
+   <synapse id="13">
      <action_set>
        <crm_event id="15" operation="stonith" operation_key="stonith" on_node="node1" on_node_uuid="uuid1">
          <attributes crm_feature_set="1.0.8" CRM_meta_on_node="node1" CRM_meta_stonith_action="reboot" CRM_meta_on_node_uuid="uuid1"/>
        </crm_event>
      </action_set>
      <inputs/>
    </synapse>
  </transition_graph>
 
diff --git a/crm/pengine/testcases/rec-rsc-9.dot b/crm/pengine/testcases/rec-rsc-9.dot
new file mode 100644
index 0000000000..2338201c5e
--- /dev/null
+++ b/crm/pengine/testcases/rec-rsc-9.dot
@@ -0,0 +1,37 @@
+ digraph "g" {
+"bar_running_0" -> "foo_start_0" [ style = bold]
+"bar_running_0" -> "rsc1_start_0 node1" [ style = bold]
+"bar_running_0" [ style=bold color="green" fontcolor="orange" ]
+"bar_start_0" -> "bar_running_0" [ style = bold]
+"bar_start_0" -> "rsc3_start_0 node1" [ style = bold]
+"bar_start_0" [ style=bold color="green" fontcolor="orange" ]
+"bar_stop_0" -> "bar_start_0" [ style = bold]
+"bar_stop_0" -> "bar_stopped_0" [ style = bold]
+"bar_stop_0" -> "rsc3_stop_0 node1" [ style = bold]
+"bar_stop_0" [ style=bold color="green" fontcolor="orange" ]
+"bar_stopped_0" -> "bar_start_0" [ style = bold]
+"bar_stopped_0" [ style=bold color="green" fontcolor="orange" ]
+"foo_start_0" -> "rsc2_start_0 node1" [ style = bold]
+"foo_start_0" [ style=bold color="green" fontcolor="orange" ]
+"foo_stop_0" -> "foo_start_0" [ style = bold]
+"foo_stop_0" -> "foo_stopped_0" [ style = bold]
+"foo_stop_0" -> "rsc2_stop_0 node1" [ style = bold]
+"foo_stop_0" [ style=bold color="green" fontcolor="orange" ]
+"foo_stopped_0" -> "bar_stop_0" [ style = bold]
+"foo_stopped_0" -> "foo_start_0" [ style = bold]
+"foo_stopped_0" [ style=bold color="green" fontcolor="orange" ]
+"probe_complete node1" [ style=bold color="green" fontcolor="black" ]
+"rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ]
+"rsc1_stop_0 node1" -> "bar_stop_0" [ style = bold]
+"rsc1_stop_0 node1" -> "rsc1_start_0 node1" [ style = bold]
+"rsc1_stop_0 node1" [ style=bold color="green" fontcolor="black" ]
+"rsc2_start_0 node1" [ style=bold color="green" fontcolor="black" ]
+"rsc2_stop_0 node1" -> "foo_stopped_0" [ style = bold]
+"rsc2_stop_0 node1" -> "rsc2_start_0 node1" [ style = bold]
+"rsc2_stop_0 node1" [ style=bold color="green" fontcolor="black" ]
+"rsc3_start_0 node1" -> "bar_running_0" [ style = bold]
+"rsc3_start_0 node1" [ style=bold color="green" fontcolor="black" ]
+"rsc3_stop_0 node1" -> "bar_stopped_0" [ style = bold]
+"rsc3_stop_0 node1" -> "rsc3_start_0 node1" [ style = bold]
+"rsc3_stop_0 node1" [ style=bold color="green" fontcolor="black" ]
+}
diff --git a/crm/pengine/testcases/rec-rsc-9.exp b/crm/pengine/testcases/rec-rsc-9.exp
new file mode 100644
index 0000000000..ab00d60e68
--- /dev/null
+++ b/crm/pengine/testcases/rec-rsc-9.exp
@@ -0,0 +1,195 @@
+ <transition_graph cluster-delay="60s" transition_id="0">
+   <synapse id="0">
+     <action_set>
+       <rsc_op id="4" operation="stop" operation_key="rsc1_stop_0" on_node="node1" on_node_uuid="node1">
+         <primitive id="rsc1" long-id="rsc1" class="heartbeat" type="apache"/>
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </rsc_op>
+     </action_set>
+     <inputs/>
+   </synapse>
+   <synapse id="1">
+     <action_set>
+       <rsc_op id="5" operation="start" operation_key="rsc1_start_0" on_node="node1" on_node_uuid="node1">
+         <primitive id="rsc1" long-id="rsc1" class="heartbeat" type="apache"/>
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </rsc_op>
+     </action_set>
+     <inputs>
+       <trigger>
+         <rsc_op id="4" operation="stop" operation_key="rsc1_stop_0" on_node="node1" on_node_uuid="node1"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="14" operation="running" operation_key="bar_running_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="2">
+     <action_set>
+       <pseudo_event id="8" operation="start" operation_key="foo_start_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs>
+       <trigger>
+         <pseudo_event id="10" operation="stop" operation_key="foo_stop_0"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="11" operation="stopped" operation_key="foo_stopped_0"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="14" operation="running" operation_key="bar_running_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="3">
+     <action_set>
+       <pseudo_event id="10" operation="stop" operation_key="foo_stop_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs/>
+   </synapse>
+   <synapse id="4">
+     <action_set>
+       <pseudo_event id="11" operation="stopped" operation_key="foo_stopped_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs>
+       <trigger>
+         <rsc_op id="6" operation="stop" operation_key="rsc2_stop_0" on_node="node1" on_node_uuid="node1"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="10" operation="stop" operation_key="foo_stop_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="5">
+     <action_set>
+       <rsc_op id="6" operation="stop" operation_key="rsc2_stop_0" on_node="node1" on_node_uuid="node1">
+         <primitive id="rsc2" long-id="foo:rsc2" class="heartbeat" type="apache"/>
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </rsc_op>
+     </action_set>
+     <inputs>
+       <trigger>
+         <pseudo_event id="10" operation="stop" operation_key="foo_stop_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="6">
+     <action_set>
+       <rsc_op id="7" operation="start" operation_key="rsc2_start_0" on_node="node1" on_node_uuid="node1">
+         <primitive id="rsc2" long-id="foo:rsc2" class="heartbeat" type="apache"/>
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </rsc_op>
+     </action_set>
+     <inputs>
+       <trigger>
+         <rsc_op id="6" operation="stop" operation_key="rsc2_stop_0" on_node="node1" on_node_uuid="node1"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="8" operation="start" operation_key="foo_start_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="7">
+     <action_set>
+       <pseudo_event id="13" operation="start" operation_key="bar_start_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs>
+       <trigger>
+         <pseudo_event id="15" operation="stop" operation_key="bar_stop_0"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="16" operation="stopped" operation_key="bar_stopped_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="8">
+     <action_set>
+       <pseudo_event id="14" operation="running" operation_key="bar_running_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs>
+       <trigger>
+         <rsc_op id="12" operation="start" operation_key="rsc3_start_0" on_node="node1" on_node_uuid="node1"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="13" operation="start" operation_key="bar_start_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="9">
+     <action_set>
+       <pseudo_event id="15" operation="stop" operation_key="bar_stop_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs>
+       <trigger>
+         <rsc_op id="4" operation="stop" operation_key="rsc1_stop_0" on_node="node1" on_node_uuid="node1"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="11" operation="stopped" operation_key="foo_stopped_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="10">
+     <action_set>
+       <pseudo_event id="16" operation="stopped" operation_key="bar_stopped_0">
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </pseudo_event>
+     </action_set>
+     <inputs>
+       <trigger>
+         <rsc_op id="1" operation="stop" operation_key="rsc3_stop_0" on_node="node1" on_node_uuid="node1"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="15" operation="stop" operation_key="bar_stop_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="11">
+     <action_set>
+       <rsc_op id="1" operation="stop" operation_key="rsc3_stop_0" on_node="node1" on_node_uuid="node1">
+         <primitive id="rsc3" long-id="bar:rsc3" class="heartbeat" type="apache"/>
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </rsc_op>
+     </action_set>
+     <inputs>
+       <trigger>
+         <pseudo_event id="15" operation="stop" operation_key="bar_stop_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="12">
+     <action_set>
+       <rsc_op id="12" operation="start" operation_key="rsc3_start_0" on_node="node1" on_node_uuid="node1">
+         <primitive id="rsc3" long-id="bar:rsc3" class="heartbeat" type="apache"/>
+         <attributes crm_feature_set="1.0.8" CRM_meta_timeout="20000"/>
+       </rsc_op>
+     </action_set>
+     <inputs>
+       <trigger>
+         <rsc_op id="1" operation="stop" operation_key="rsc3_stop_0" on_node="node1" on_node_uuid="node1"/>
+       </trigger>
+       <trigger>
+         <pseudo_event id="13" operation="start" operation_key="bar_start_0"/>
+       </trigger>
+     </inputs>
+   </synapse>
+   <synapse id="13" priority="1000000">
+     <action_set>
+       <rsc_op id="3" operation="probe_complete" operation_key="probe_complete" on_node="node1" on_node_uuid="node1">
+         <attributes crm_feature_set="1.0.8" CRM_meta_op_no_wait="true"/>
+       </rsc_op>
+     </action_set>
+     <inputs/>
+   </synapse>
+ </transition_graph>
+
diff --git a/crm/pengine/testcases/rec-rsc-9.xml b/crm/pengine/testcases/rec-rsc-9.xml
new file mode 100644
index 0000000000..6979b98213
--- /dev/null
+++ b/crm/pengine/testcases/rec-rsc-9.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!DOCTYPE cib SYSTEM "crm-1.0.dtd">
+<!-- shutdown -->
+<cib num_updates="1" epoch="1" admin_epoch="0">
+  <configuration>
+    <crm_config><cluster_property_set id="cib-bootstrap-options"><attributes>
+      <nvpair id="no_quorum_policy" name="no_quorum_policy" value="ignore"/>
+      <nvpair id="symmetric_cluster" name="symmetric_cluster" value="true"/>
+      <nvpair id="default_resource_stickiness" name="default_resource_stickiness" value="100"/>
+    </attributes></cluster_property_set></crm_config>
+    <nodes>
+      <node id="node1" uname="node1" type="member"/>
+    </nodes>
+    <resources>
+      <primitive id="rsc1" class="heartbeat" type="apache" restart_type="restart"/>
+      <group id="foo" restart_type="restart">
+	<primitive id="rsc2" class="heartbeat" type="apache"/>
+      </group>
+      <group id="bar">
+	<primitive id="rsc3" class="heartbeat" type="apache" />
+      </group>
+    </resources>
+    <constraints>
+      <rsc_order id="order_recover" from="rsc1" type="after" to="bar"/>
+      <rsc_order id="order_recover" from="foo" type="after" to="bar" score="1"/>
+    </constraints>
+  </configuration>
+  <status>
+    <node_state id="node1" ha="active" uname="node1" crmd="online" join="member" expected="member" in_ccm="true">
+      <lrm>
+        <lrm_resources>
+          <lrm_resource id="rsc1" class="heartbeat" type="apache">
+            <lrm_rsc_op id="rsc1_start_0" operation="start" interval="0" op_status="0" rc_code="0" call_id="1" op_digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" crm_feature_set="1.0.6" transition_magic=""/>
+          </lrm_resource>
+          <lrm_resource id="rsc3" class="heartbeat" type="apache">
+            <lrm_rsc_op id="rsc3_start_0" operation="start" interval="0" op_status="0" rc_code="0" call_id="1" op_digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" crm_feature_set="1.0.6" transition_magic=""/>
+            <lrm_rsc_op id="rsc3_fail_0" operation="fail" interval="0" op_status="4" rc_code="60" call_id="2" op_digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" crm_feature_set="1.0.6" transition_magic=""/>
+          </lrm_resource>
+          <lrm_resource id="rsc2" class="heartbeat" type="apache">
+            <lrm_rsc_op id="rsc2_start_0" operation="start" interval="0" op_status="0" rc_code="0" call_id="1" op_digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" crm_feature_set="1.0.6" transition_magic=""/>
+          </lrm_resource>
+        </lrm_resources>
+      </lrm>
+    </node_state>
+  </status>
+</cib>