diff --git a/tools/cib_shadow.c b/tools/cib_shadow.c
index 99c2afa088..fd2cfdc96a 100644
--- a/tools/cib_shadow.c
+++ b/tools/cib_shadow.c
@@ -1,458 +1,458 @@
 
 /*
  * 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 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 <sys/param.h>
 #include <crm/crm.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
 #include <stdlib.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <crm/msg_xml.h>
 #include <crm/common/xml.h>
 
 #include <crm/common/ipc.h>
 
 #include <crm/cib.h>
 
 static int command_options = cib_sync_call;
 static cib_t *real_cib = NULL;
 static int force_flag = 0;
 static int batch_flag = 0;
 
 static char *
 get_shadow_prompt(const char *name)
 {
     return crm_strdup_printf("shadow[%.40s] # ", name);
 }
 
 static void
 shadow_setup(char *name, gboolean do_switch)
 {
     const char *prompt = getenv("PS1");
     const char *shell = getenv("SHELL");
     char *new_prompt = get_shadow_prompt(name);
 
     printf("Setting up shadow instance\n");
 
     if (safe_str_eq(new_prompt, prompt)) {
         /* nothing to do */
         goto done;
 
     } else if (batch_flag == FALSE && shell != NULL) {
         setenv("PS1", new_prompt, 1);
         setenv("CIB_shadow", name, 1);
         printf("Type Ctrl-D to exit the crm_shadow shell\n");
 
         if (strstr(shell, "bash")) {
             execl(shell, shell, "--norc", "--noprofile", NULL);
         } else {
             execl(shell, shell, NULL);
         }
 
     } else if (do_switch) {
         printf("To switch to the named shadow instance, paste the following into your shell:\n");
 
     } else {
         printf
             ("A new shadow instance was created.  To begin using it paste the following into your shell:\n");
     }
     printf("  CIB_shadow=%s ; export CIB_shadow\n", name);
 
   done:
     free(new_prompt);
 }
 
 static void
 shadow_teardown(char *name)
 {
     const char *prompt = getenv("PS1");
     char *our_prompt = get_shadow_prompt(name);
 
     if (prompt != NULL && strstr(prompt, our_prompt)) {
         printf("Now type Ctrl-D to exit the crm_shadow shell\n");
 
     } else {
         printf
             ("Please remember to unset the CIB_shadow variable by pasting the following into your shell:\n");
         printf("  unset CIB_shadow\n");
     }
     free(our_prompt);
 }
 
 /* *INDENT-OFF* */
 static struct crm_option long_options[] = {
     /* Top-level Options */
     {"help",    0, 0, '?', "\t\tThis text"},
     {"version", 0, 0, '$', "\t\tVersion information"  },
     {"verbose", 0, 0, 'V', "\t\tIncrease debug output"},
 
     {"-spacer-",	1, 0, '-', "\nQueries:"},
     {"which",   no_argument,       NULL, 'w', "\t\tIndicate the active shadow copy"},
     {"display", no_argument,       NULL, 'p', "\t\tDisplay the contents of the active shadow copy"},
     {"edit",    no_argument,       NULL, 'E', "\t\tEdit the contents of the active shadow copy with your favorite $EDITOR"},
     {"diff",    no_argument,       NULL, 'd', "\t\tDisplay the changes in the active shadow copy\n"},
     {"file",    no_argument,       NULL, 'F', "\t\tDisplay the location of the active shadow copy file\n"},
 
     {"-spacer-",	1, 0, '-', "\nCommands:"},
     {"create",		required_argument, NULL, 'c', "\tCreate the named shadow copy of the active cluster configuration"},
     {"create-empty",	required_argument, NULL, 'e', "Create the named shadow copy with an empty cluster configuration. Optional: --validate-with"},
     {"commit",  required_argument, NULL, 'C', "\tUpload the contents of the named shadow copy to the cluster"},
     {"delete",  required_argument, NULL, 'D', "\tDelete the contents of the named shadow copy"},
     {"reset",   required_argument, NULL, 'r', "\tRecreate the named shadow copy from the active cluster configuration"},
     {"switch",  required_argument, NULL, 's', "\t(Advanced) Switch to the named shadow copy"},
 
     {"-spacer-",	1, 0, '-', "\nAdditional Options:"},
     {"force",	no_argument, NULL, 'f', "\t\t(Advanced) Force the action to be performed"},
     {"batch",   no_argument, NULL, 'b', "\t\t(Advanced) Don't spawn a new shell" },
     {"all",     no_argument, NULL, 'a', "\t\t(Advanced) Upload the entire CIB, including status, with --commit" },
     {"validate-with",     required_argument, NULL, 'v', "(Advanced) Create an older configuration version" },
 
     {"-spacer-",	1, 0, '-', "\nExamples:", pcmk_option_paragraph},
     {"-spacer-",	1, 0, '-', "Create a blank shadow configuration:", pcmk_option_paragraph},
     {"-spacer-",	1, 0, '-', " crm_shadow --create-empty myShadow", pcmk_option_example},
     {"-spacer-",	1, 0, '-', "Create a shadow configuration from the running cluster:", pcmk_option_paragraph},
     {"-spacer-",	1, 0, '-', " crm_shadow --create myShadow", pcmk_option_example},
     {"-spacer-",	1, 0, '-', "Display the current shadow configuration:", pcmk_option_paragraph},
     {"-spacer-",	1, 0, '-', " crm_shadow --display", pcmk_option_example},
     {"-spacer-",	1, 0, '-', "Discard the current shadow configuration (named myShadow):", pcmk_option_paragraph},
-    {"-spacer-",	1, 0, '-', " crm_shadow --delete myShadow", pcmk_option_example},
+    {"-spacer-",	1, 0, '-', " crm_shadow --delete myShadow --force", pcmk_option_example},
     {"-spacer-",	1, 0, '-', "Upload the current shadow configuration (named myShadow) to the running cluster:", pcmk_option_paragraph},
     {"-spacer-",	1, 0, '-', " crm_shadow --commit myShadow", pcmk_option_example},
 
     {0, 0, 0, 0}
 };
 /* *INDENT-ON* */
 
 int
 main(int argc, char **argv)
 {
     int rc = pcmk_ok;
     int flag;
     int argerr = 0;
     crm_exit_t exit_code = CRM_EX_OK;
     static int command = '?';
     const char *validation = NULL;
     char *shadow = NULL;
     char *shadow_file = NULL;
     gboolean full_upload = FALSE;
     gboolean dangerous_cmd = FALSE;
     struct stat buf;
     int option_index = 0;
 
     crm_log_cli_init("crm_shadow");
     crm_set_options(NULL, "(query|command) [modifiers]", long_options,
                     "Perform configuration changes in a sandbox before updating the live cluster."
                     "\n\nSets up an environment in which configuration tools (cibadmin, crm_resource, etc) work"
                     " offline instead of against a live cluster, allowing changes to be previewed and tested"
                     " for side-effects.\n");
 
     if (argc < 2) {
         crm_help('?', CRM_EX_USAGE);
     }
 
     while (1) {
         flag = crm_get_option(argc, argv, &option_index);
         if (flag == -1 || flag == 0)
             break;
 
         switch (flag) {
             case 'a':
                 full_upload = TRUE;
                 break;
             case 'd':
             case 'E':
             case 'p':
             case 'w':
             case 'F':
                 command = flag;
                 free(shadow);
                 shadow = NULL;
                 {
                     const char *env = getenv("CIB_shadow");
                     if(env) {
                         shadow = strdup(env);
                     } else {
                         fprintf(stderr, "No active shadow configuration defined\n");
                         crm_exit(CRM_EX_NOSUCH);
                     }
                 }
                 break;
             case 'v':
                 validation = optarg;
                 break;
             case 'e':
             case 'c':
             case 's':
             case 'r':
                 command = flag;
                 free(shadow);
                 shadow = strdup(optarg);
                 break;
             case 'C':
             case 'D':
                 command = flag;
                 dangerous_cmd = TRUE;
                 free(shadow);
                 shadow = strdup(optarg);
                 break;
             case 'V':
                 command_options = command_options | cib_verbose;
                 crm_bump_log_level(argc, argv);
                 break;
             case '$':
             case '?':
                 crm_help(flag, CRM_EX_OK);
                 break;
             case 'f':
                 command_options |= cib_quorum_override;
                 force_flag = 1;
                 break;
             case 'b':
                 batch_flag = 1;
                 break;
             default:
                 printf("Argument code 0%o (%c)" " is not (?yet?) supported\n", flag, flag);
                 ++argerr;
                 break;
         }
     }
 
     if (optind < argc) {
         printf("non-option ARGV-elements: ");
         while (optind < argc)
             printf("%s ", argv[optind++]);
         printf("\n");
         crm_help('?', CRM_EX_USAGE);
     }
 
     if (optind > argc) {
         ++argerr;
     }
 
     if (argerr) {
         crm_help('?', CRM_EX_USAGE);
     }
 
     if (command == 'w') {
         /* which shadow instance is active? */
         const char *local = getenv("CIB_shadow");
 
         if (local == NULL) {
             fprintf(stderr, "No shadow instance provided\n");
             exit_code = CRM_EX_NOSUCH;
         } else {
             fprintf(stdout, "%s\n", local);
         }
         goto done;
     }
 
     if (shadow == NULL) {
         fprintf(stderr, "No shadow instance provided\n");
         fflush(stderr);
         exit_code = CRM_EX_NOSUCH;
         goto done;
 
     } else if (command != 's' && command != 'c') {
         const char *local = getenv("CIB_shadow");
 
         if (local != NULL && safe_str_neq(local, shadow) && force_flag == FALSE) {
             fprintf(stderr,
                     "The supplied shadow instance (%s) is not the same as the active one (%s).\n"
                     "  To prevent accidental destruction of the cluster,"
                     " the --force flag is required in order to proceed.\n", shadow, local);
             fflush(stderr);
             exit_code = CRM_EX_USAGE;
             goto done;
         }
     }
 
     if (dangerous_cmd && force_flag == FALSE) {
         fprintf(stderr, "The supplied command is considered dangerous."
                 "  To prevent accidental destruction of the cluster,"
                 " the --force flag is required in order to proceed.\n");
         fflush(stderr);
         exit_code = CRM_EX_USAGE;
         goto done;
     }
 
     shadow_file = get_shadow_file(shadow);
     if (command == 'D') {
         /* delete the file */
         if ((unlink(shadow_file) < 0) && (errno != ENOENT)) {
             exit_code = crm_errno2exit(errno);
             fprintf(stderr, "Could not remove shadow instance '%s': %s\n",
                     shadow, strerror(errno));
         }
         shadow_teardown(shadow);
         goto done;
 
     } else if (command == 'F') {
         printf("%s\n", shadow_file);
         goto done;
     }
 
     if (command == 'd' || command == 'r' || command == 'c' || command == 'C') {
         real_cib = cib_new_no_shadow();
         rc = real_cib->cmds->signon(real_cib, crm_system_name, cib_command);
         if (rc != pcmk_ok) {
             fprintf(stderr, "Signon to CIB failed: %s\n", pcmk_strerror(rc));
             exit_code = crm_errno2exit(rc);
             goto done;
         }
     }
 
     // File existence check
     rc = stat(shadow_file, &buf);
     if (command == 'e' || command == 'c') {
         if (rc == 0 && force_flag == FALSE) {
             fprintf(stderr, "A shadow instance '%s' already exists.\n"
                     "  To prevent accidental destruction of the cluster,"
                     " the --force flag is required in order to proceed.\n", shadow);
             exit_code = CRM_EX_CANTCREAT;
             goto done;
         }
     } else if (rc < 0) {
         fprintf(stderr, "Could not access shadow instance '%s': %s\n", shadow, strerror(errno));
         exit_code = CRM_EX_NOSUCH;
         goto done;
     }
 
     if (command == 'c' || command == 'e' || command == 'r') {
         xmlNode *output = NULL;
 
         /* create a shadow instance based on the current cluster config */
         if (command == 'c' || command == 'r') {
             rc = real_cib->cmds->query(real_cib, NULL, &output, command_options);
             if (rc != pcmk_ok) {
                 fprintf(stderr, "Could not connect to the CIB: %s\n", pcmk_strerror(rc));
                 exit_code = crm_errno2exit(rc);
                 goto done;
             }
 
         } else {
             output = createEmptyCib(0);
             if(validation) {
                 crm_xml_add(output, XML_ATTR_VALIDATION, validation);
             }
             printf("Created new %s configuration\n",
                    crm_element_value(output, XML_ATTR_VALIDATION));
         }
 
         rc = write_xml_file(output, shadow_file, FALSE);
         free_xml(output);
 
         if (rc < 0) {
             fprintf(stderr, "Could not %s the shadow instance '%s': %s\n",
                     command == 'r' ? "reset" : "create",
                     shadow, pcmk_strerror(rc));
             exit_code = crm_errno2exit(rc);
             goto done;
         }
         shadow_setup(shadow, FALSE);
 
     } else if (command == 'E') {
         char *editor = getenv("EDITOR");
 
         if (editor == NULL) {
             fprintf(stderr, "No value for EDITOR defined\n");
             exit_code = CRM_EX_NOT_CONFIGURED;
             goto done;
         }
 
         execlp(editor, "--", shadow_file, NULL);
         fprintf(stderr, "Could not invoke EDITOR (%s %s): %s\n",
                 editor, shadow_file, strerror(errno));
         exit_code = CRM_EX_OSFILE;
         goto done;
 
     } else if (command == 's') {
         shadow_setup(shadow, TRUE);
         goto done;
 
     } else if (command == 'p') {
         /* display the current contents */
         char *output_s = NULL;
         xmlNode *output = filename2xml(shadow_file);
 
         output_s = dump_xml_formatted(output);
         printf("%s", output_s);
 
         free(output_s);
         free_xml(output);
 
     } else if (command == 'd') {
         /* diff against cluster */
         xmlNode *diff = NULL;
         xmlNode *old_config = NULL;
         xmlNode *new_config = filename2xml(shadow_file);
 
         rc = real_cib->cmds->query(real_cib, NULL, &old_config, command_options);
 
         if (rc != pcmk_ok) {
             fprintf(stderr, "Could not query the CIB: %s\n", pcmk_strerror(rc));
             exit_code = crm_errno2exit(rc);
             goto done;
         }
 
         xml_track_changes(new_config, NULL, new_config, FALSE);
         xml_calculate_changes(old_config, new_config);
 
         diff = xml_create_patchset(0, old_config, new_config, NULL, FALSE);
 
         xml_log_changes(LOG_INFO, __FUNCTION__, new_config);
         xml_accept_changes(new_config);
 
         if (diff != NULL) {
             xml_log_patchset(0, "  ", diff);
             exit_code = CRM_EX_ERROR;
         }
         goto done;
 
     } else if (command == 'C') {
         /* commit to the cluster */
         xmlNode *input = filename2xml(shadow_file);
         xmlNode *section_xml = input;
         const char *section = NULL;
 
         if (!full_upload) {
             section = XML_CIB_TAG_CONFIGURATION;
             section_xml = first_named_child(input, section);
         }
         rc = real_cib->cmds->replace(real_cib, section, section_xml,
                                      command_options);
         if (rc != pcmk_ok) {
             fprintf(stderr, "Could not commit shadow instance '%s' to the CIB: %s\n",
                     shadow, pcmk_strerror(rc));
             exit_code = crm_errno2exit(rc);
         }
         shadow_teardown(shadow);
         free_xml(input);
     }
   done:
     free(shadow_file);
     free(shadow);
     return crm_exit(exit_code);
 }
diff --git a/tools/crm_failcount b/tools/crm_failcount
index 5cf7e01935..d20bf09a59 100755
--- a/tools/crm_failcount
+++ b/tools/crm_failcount
@@ -1,269 +1,269 @@
 #!/bin/bash
 
 USAGE_TEXT="Usage: crm_failcount <command> [<options>]
 Common options:
  --help                 Display this text, then exit
  --version              Display version information, then exit
  -V, --verbose          Specify multiple times to increase debug output
  -q, --quiet            Print only the value (if querying)
 
 Commands:
  -G, --query            Query the current value of the resource's fail count
  -D, --delete           Delete resource's recorded failures
 
 Additional Options:
  -r, --resource=value   Name of the resource to use (required)
  -n, --operation=value  Name of operation to use (instead of all operations)
- -I, --interval=value   If operation is specified, its interval (MUST be in milliseconds)
+ -I, --interval=value   If operation is specified, its interval
  -N, --node=value       Use failcount on named node (instead of local node)"
 
 
 HELP_TEXT="crm_failcount - Query or delete resource fail counts
 
 $USAGE_TEXT"
 
 
 exit_usage() {
 	if [ $# -gt 0 ]; then
 		echo "error: $@" >&2
 	fi
 	echo
 	echo "$USAGE_TEXT"
 	exit 1
 }
 
 warn() {
 	echo "warning: $@" >&2
 }
 
 interval_re() {
 	echo "^[[:blank:]]*([0-9]+)[[:blank:]]*(${1})[[:blank:]]*$"
 }
 
 # This function should follow crm_get_interval() as closely as possible
 parse_interval() {
 	INT_S="$1"
 
 	INT_8601RE="^P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)S)?$"
 	
 	if [[ $INT_S =~ $(interval_re "s|sec|") ]]; then
 		echo $(( ${BASH_REMATCH[1]} * 1000 ))
 
 	elif [[ $INT_S =~ $(interval_re "ms|msec") ]]; then
 		echo "${BASH_REMATCH[1]}"
 
 	elif [[ $INT_S =~ $(interval_re "m|min") ]]; then
 		echo $(( ${BASH_REMATCH[1]} * 60000 ))
 
 	elif [[ $INT_S =~ $(interval_re "h|hr") ]]; then
 		echo $(( ${BASH_REMATCH[1]} * 3600000 ))
 
 	elif [[ $INT_S =~ $(interval_re "us|usec") ]]; then
 		echo $(( ${BASH_REMATCH[1]} / 1000 ))
 
 	elif [[ $INT_S =~ ^P([0-9]+)W$ ]]; then
 		echo $(( ${BASH_REMATCH[1]} * 604800000 ))
 
 	elif [[ $INT_S =~ $INT_8601RE ]]; then
 		echo $(( ( ${BASH_REMATCH[2]:-0} * 31536000000 ) \
 			+ ( ${BASH_REMATCH[4]:-0} * 2592000000 ) \
 			+ ( ${BASH_REMATCH[6]:-0} * 86400000 ) \
 			+ ( ${BASH_REMATCH[8]:-0} * 3600000 ) \
 			+ ( ${BASH_REMATCH[10]:-0} * 60000 ) \
 			+ ( ${BASH_REMATCH[12]:-0} * 1000 ) ))
 
 	else
 		warn "Unrecognized interval, using 0"
 		echo "0"
 	fi
 }
 
 query_single_attr() {
 	QSR_TARGET="$1"
 	QSR_ATTR="$2"
 
 	crm_attribute $VERBOSE --quiet --query -t status -d 0 \
 		-N "$QSR_TARGET" -n "$QSR_ATTR"
 }
 
 query_attr_sum() {
 	QAS_TARGET="$1"
 	QAS_PREFIX="$2"
 
 	# Build xpath to match all transient node attributes with prefix
 	QAS_XPATH="/cib/status/node_state[@uname='${QAS_TARGET}']"
 	QAS_XPATH="${QAS_XPATH}/transient_attributes/instance_attributes"
 	QAS_XPATH="${QAS_XPATH}/nvpair[starts-with(@name,'$QAS_PREFIX')]"
 
 	# Query attributes that match xpath
 	# @TODO We ignore stderr because we don't want "no results" to look
 	# like an error, but that also makes $VERBOSE pointless.
 	QAS_ALL=$(cibadmin --query --sync-call --local \
 		--xpath="$QAS_XPATH" 2>/dev/null)
 
 	# @TODO There is currently no reliable way to distinguish "no results"
 	# from actual CIB errors. For now, treat any error as "no results".
 	#
 	#if [ $? -ne 0 ]; then
 	#	echo error >&2
 	#	return
 	#fi
 
 	# Extract the attribute values (one per line) from the output
 	QAS_VALUE=$(echo "$QAS_ALL" | sed -n -e \
 		's/.*<nvpair.*value="\([0-9][0-9]*\)".*>.*/\1/p')
 
 	# Sum the values
 	QAS_SUM=0
 	for i in 0 $QAS_VALUE; do
 		QAS_SUM=$(($QAS_SUM + $i))
 	done
 	echo $QAS_SUM
 }
 
 query_failcount() {
 	QF_TARGET="$1"
 	QF_RESOURCE="$2"
 	QF_OPERATION="$3"
 	QF_INTERVAL="$4"
 
 	QF_ATTR_RSC="fail-count-${QF_RESOURCE}"
 
 	if [ -n "$QF_OPERATION" ]; then
 		QF_ATTR_DISPLAY="${QF_ATTR_RSC}#${QF_OPERATION}_${QF_INTERVAL}"
 		QF_COUNT=$(query_single_attr "$QF_TARGET" "$QF_ATTR_DISPLAY")
 	else
 		QF_ATTR_DISPLAY="$QF_ATTR_RSC"
 		QF_COUNT=$(query_attr_sum "$QF_TARGET" "${QF_ATTR_RSC}#")
 	fi
 
 	# @COMPAT attributes set < 1.1.17:
 	# If we didn't find any per-operation failcount,
 	# check whether there is a legacy per-resource failcount.
 	if [ "$QF_COUNT" = "0" ]; then
 		QF_COUNT=$(query_single_attr "$QF_TARGET" "$QF_ATTR_RSC")
 		if [ "$QF_COUNT" != "0" ]; then
 			QF_ATTR_DISPLAY="$QF_ATTR_RSC"
 		fi
 	fi
 
 	# Echo result (comparable to crm_attribute, for backward compatibility)
 	if [ -n "$QUIET" ]; then
 		echo $QF_COUNT
 	else
 		echo "scope=status  name=$QF_ATTR_DISPLAY value=$QF_COUNT"
 	fi
 }
 
 clear_failcount() {
 	CF_TARGET="$1"
 	CF_RESOURCE="$2"
 	CF_OPERATION="$3"
 	CF_INTERVAL="$4"
 
 	if [ -n "$CF_OPERATION" ]; then
 		CF_OPERATION="-n $CF_OPERATION -I ${CF_INTERVAL}ms"
 	fi
 	crm_resource $QUIET $VERBOSE --cleanup \
 		-N "$CF_TARGET" -r "$CF_RESOURCE" $CF_OPERATION
 }
 
 QUIET=""
 VERBOSE=""
 
 command=""
 resource=""
 operation=""
 interval="0"
 target=$(crm_node -n 2>/dev/null)
 
 SHORTOPTS="qDGQVN:U:v:i:l:r:n:I:"
 
 LONGOPTS_COMMON="help,version,verbose,quiet"
 LONGOPTS_COMMANDS="query,delete"
 LONGOPTS_OTHER="resource:,node:,operation:,interval:"
 LONGOPTS_COMPAT="delete-attr,get-value,resource-id:,uname:,lifetime:,attr-value:,attr-id:"
 
 LONGOPTS="$LONGOPTS_COMMON,$LONGOPTS_COMMANDS,$LONGOPTS_OTHER,$LONGOPTS_COMPAT"
 
 TEMP=$(getopt -o $SHORTOPTS --long $LONGOPTS -n crm_failcount -- "$@")
 if [ $? -ne 0 ]; then
 	exit_usage
 fi
 eval set -- "$TEMP" # Quotes around $TEMP are essential
 
 while true ; do
 	case "$1" in
 		--help)
 			echo "$HELP_TEXT"
 			exit 0
 			;;
 		--version)
 			crm_attribute --version
 			exit $?
 			;;
 		-q|-Q|--quiet)
 			QUIET="--quiet"
 			shift
 			;;
 		-V|--verbose)
 			VERBOSE="$VERBOSE $1"
 			shift
 			;;
 		-G|--query|--get-value)
 			command="--query"
 			shift
 			;;
 		-D|--delete|--delete-attr)
 			command="--delete"
 			shift
 			;;
 		-r|--resource|--resource-id)
 			resource="$2"
 			shift 2
 			;;
 		-n|--operation)
 			operation="$2"
 			shift 2
 			;;
 		-I|--interval)
 			interval="$2"
 			shift 2
 			;;
 		-N|--node|-U|--uname)
 			target="$2"
 			shift 2
 			;;
 		-v|--attr-value)
 			if [ "$2" = "0" ]; then
 				command="--delete"
 			else
 				warn "ignoring deprecated option '$1' with nonzero value"
 			fi
 			shift 2
 			;;
 		-i|--attr-id|-l|--lifetime)
 			warn "ignoring deprecated option '$1'"
 			shift 2
 			;;
 		--)
 			shift
 			break
 			;;
 		*)
 			exit_usage "unknown option '$1'"
 			;;
 	esac
 done
 
 [ -n "$command" ]  || exit_usage "must specify a command"
 [ -n "$resource" ] || exit_usage "resource name required"
 [ -n "$target" ]   || exit_usage "node name required"
 
 interval=$(parse_interval $interval)
 
 if [ "$command" = "--query" ]; then
 	query_failcount "$target" "$resource" "$operation" "$interval"
 else
 	clear_failcount "$target" "$resource" "$operation" "$interval"
 fi
diff --git a/tools/crm_verify.c b/tools/crm_verify.c
index f90f605147..9eea07019e 100644
--- a/tools/crm_verify.c
+++ b/tools/crm_verify.c
@@ -1,274 +1,276 @@
 
 /* 
  * 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 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 <crm/crm.h>
 
 #include <stdio.h>
 #include <sys/types.h>
 #include <unistd.h>
 
 #include <stdlib.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <libgen.h>
 #include <glib.h>
 
 #include <crm/common/xml.h>
 #include <crm/common/util.h>
 #include <crm/msg_xml.h>
 #include <crm/cib.h>
 #include <crm/pengine/status.h>
 
 gboolean USE_LIVE_CIB = FALSE;
 char *cib_save = NULL;
 extern gboolean stage0(pe_working_set_t * data_set);
 extern void cleanup_alloc_calculations(pe_working_set_t * data_set);
 extern xmlNode *do_calculations(pe_working_set_t * data_set, xmlNode * xml_input, crm_time_t * now);
 
 /* *INDENT-OFF* */
 static struct crm_option long_options[] = {
     /* Top-level Options */
     {"help",           0, 0, '?', "\tThis text"},
     {"version",        0, 0, '$', "\tVersion information"  },
     {"verbose",        0, 0, 'V', "\tIncrease debug output\n"},
     
     {"-spacer-",	1, 0, '-', "\nData sources:"},
     {"live-check",  0, 0, 'L', "Check the configuration used by the running cluster\n"},
     {"xml-file",    1, 0, 'x', "Check the configuration in the named file"},
     {"xml-text",    1, 0, 'X', "Check the configuration in the supplied string"},
     {"xml-pipe",    0, 0, 'p', "Check the configuration piped in via stdin"},
 
     {"-spacer-",    1, 0, '-', "\nAdditional Options:"},
     {"save-xml",    1, 0, 'S', "Save the verified XML to the named file.  Most useful with -L"},
 
     {"-spacer-",    1, 0, '-', "\nExamples:", pcmk_option_paragraph},
     {"-spacer-",    1, 0, '-', "Check the consistency of the configuration in the running cluster:", pcmk_option_paragraph},
     {"-spacer-",    1, 0, '-', " crm_verify --live-check", pcmk_option_example},
     {"-spacer-",    1, 0, '-', "Check the consistency of the configuration in a given file and produce verbose output:", pcmk_option_paragraph},
     {"-spacer-",    1, 0, '-', " crm_verify --xml-file file.xml --verbose", pcmk_option_example},
   
     {0, 0, 0, 0}
 };
 /* *INDENT-ON* */
 
 int
 main(int argc, char **argv)
 {
     xmlNode *cib_object = NULL;
     xmlNode *status = NULL;
     int argerr = 0;
     int flag;
     int option_index = 0;
 
     pe_working_set_t data_set;
     cib_t *cib_conn = NULL;
     int rc = pcmk_ok;
 
     bool verbose = FALSE;
     gboolean xml_stdin = FALSE;
     const char *xml_tag = NULL;
     const char *xml_file = NULL;
     const char *xml_string = NULL;
 
     crm_log_cli_init("crm_verify");
     crm_set_options(NULL, "[modifiers] data_source", long_options,
-                    "\n\nChecks the well-formedness of an XML configuration, its conformance to the configured schema and for the presence of common misconfigurations."
-                    "\n\nIt reports two classes of problems, errors and warnings."
-                    " Errors must be fixed before the cluster will work properly."
-                    " However, it is left up to the administrator to decide if the warnings should also be fixed.");
+                    "check a Pacemaker configuration for errors"
+                    "\n\nCheck the well-formedness of a complete Pacemaker XML configuration,"
+                    "\n\nits conformance to the configured schema, and the presence of common"
+                    "\n\nmisconfigurations. Problems reported as errors must be fixed before the"
+                    "\n\ncluster will work properly. It is left to the administrator to decide"
+                    "\n\nwhether to fix problems reported as warnings.");
 
     while (1) {
         flag = crm_get_option(argc, argv, &option_index);
         if (flag == -1)
             break;
 
         switch (flag) {
             case 'X':
                 crm_trace("Option %c => %s", flag, optarg);
                 xml_string = optarg;
                 break;
             case 'x':
                 crm_trace("Option %c => %s", flag, optarg);
                 xml_file = optarg;
                 break;
             case 'p':
                 xml_stdin = TRUE;
                 break;
             case 'S':
                 cib_save = optarg;
                 break;
             case 'V':
                 verbose = TRUE;
                 crm_bump_log_level(argc, argv);
                 break;
             case 'L':
                 USE_LIVE_CIB = TRUE;
                 break;
             case '$':
             case '?':
                 crm_help(flag, CRM_EX_OK);
                 break;
             default:
                 fprintf(stderr, "Option -%c is not yet supported\n", flag);
                 ++argerr;
                 break;
         }
     }
 
     if (optind < argc) {
         printf("non-option ARGV-elements: ");
         while (optind < argc) {
             printf("%s ", argv[optind++]);
         }
         printf("\n");
     }
 
     if (optind > argc) {
         ++argerr;
     }
 
     if (argerr) {
         crm_err("%d errors in option parsing", argerr);
         crm_help(flag, CRM_EX_USAGE);
     }
 
     crm_info("=#=#=#=#= Getting XML =#=#=#=#=");
 
     if (USE_LIVE_CIB) {
         cib_conn = cib_new();
         rc = cib_conn->cmds->signon(cib_conn, crm_system_name, cib_command);
     }
 
     if (USE_LIVE_CIB) {
         if (rc == pcmk_ok) {
             int options = cib_scope_local | cib_sync_call;
 
             crm_info("Reading XML from: live cluster");
             rc = cib_conn->cmds->query(cib_conn, NULL, &cib_object, options);
         }
 
         if (rc != pcmk_ok) {
             fprintf(stderr, "Live CIB query failed: %s\n", pcmk_strerror(rc));
             goto done;
         }
         if (cib_object == NULL) {
             fprintf(stderr, "Live CIB query failed: empty result\n");
             rc = -ENOMSG;
             goto done;
         }
 
     } else if (xml_file != NULL) {
         cib_object = filename2xml(xml_file);
         if (cib_object == NULL) {
             fprintf(stderr, "Couldn't parse input file: %s\n", xml_file);
             rc = -ENODATA;
             goto done;
         }
 
     } else if (xml_string != NULL) {
         cib_object = string2xml(xml_string);
         if (cib_object == NULL) {
             fprintf(stderr, "Couldn't parse input string: %s\n", xml_string);
             rc = -ENODATA;
             goto done;
         }
     } else if (xml_stdin) {
         cib_object = stdin2xml();
         if (cib_object == NULL) {
             fprintf(stderr, "Couldn't parse input from STDIN.\n");
             rc = -ENODATA;
             goto done;
         }
 
     } else {
         fprintf(stderr, "No configuration source specified."
                 "  Use --help for usage information.\n");
         rc = -ENODATA;
         goto done;
     }
 
     xml_tag = crm_element_name(cib_object);
     if (safe_str_neq(xml_tag, XML_TAG_CIB)) {
         fprintf(stderr,
                 "This tool can only check complete configurations (i.e. those starting with <cib>).\n");
         rc = -EBADMSG;
         goto done;
     }
 
     if (cib_save != NULL) {
         write_xml_file(cib_object, cib_save, FALSE);
     }
 
     status = get_object_root(XML_CIB_TAG_STATUS, cib_object);
     if (status == NULL) {
         create_xml_node(cib_object, XML_CIB_TAG_STATUS);
     }
 
     if (validate_xml(cib_object, NULL, FALSE) == FALSE) {
         crm_config_err("CIB did not pass schema validation");
         free_xml(cib_object);
         cib_object = NULL;
 
     } else if (cli_config_update(&cib_object, NULL, FALSE) == FALSE) {
         crm_config_error = TRUE;
         free_xml(cib_object);
         cib_object = NULL;
         fprintf(stderr, "The cluster will NOT be able to use this configuration.\n");
         fprintf(stderr, "Please manually update the configuration to conform to the %s syntax.\n",
                 xml_latest_schema());
     }
 
     set_working_set_defaults(&data_set);
     if (cib_object == NULL) {
     } else if (status != NULL || USE_LIVE_CIB) {
         /* live queries will always have a status section and can do a full simulation */
         do_calculations(&data_set, cib_object, NULL);
         cleanup_alloc_calculations(&data_set);
 
     } else {
         data_set.now = crm_time_new(NULL);
         data_set.input = cib_object;
         stage0(&data_set);
         cleanup_alloc_calculations(&data_set);
     }
 
     if (crm_config_error) {
         fprintf(stderr, "Errors found during check: config not valid\n");
         if (verbose == FALSE) {
             fprintf(stderr, "  -V may provide more details\n");
         }
         rc = -pcmk_err_generic;
 
     } else if (crm_config_warning) {
         fprintf(stderr, "Warnings found during check: config may not be valid\n");
         if (verbose == FALSE) {
             fprintf(stderr, "  Use -V for more details\n");
         }
         rc = -pcmk_err_generic;
     }
 
     if (USE_LIVE_CIB && cib_conn) {
         cib_conn->cmds->signoff(cib_conn);
         cib_delete(cib_conn);
     }
 
   done:
     return rc;
 }