diff --git a/src/sinfo/opts.c b/src/sinfo/opts.c
index 4f906eb9a4749258dab2397e0414c4c8b22a65e2..d36e0870c9faef625dc3a31043849fb909bf8fe4 100644
--- a/src/sinfo/opts.c
+++ b/src/sinfo/opts.c
@@ -43,6 +43,7 @@
 #define OPT_FORMAT    	0x05
 #define OPT_VERBOSE   	0x06
 #define OPT_ITERATE   	0x07
+#define OPT_EXACT   	0x08
 
 static int _parse_state(char *str, enum node_states *states);
 
@@ -63,6 +64,8 @@ int parse_command_line(int argc, char *argv[])
 
 	/* Declare the Options */
 	static const struct poptOption options[] = {
+		{"exact", 'e', POPT_ARG_NONE, &params.exact_match, OPT_EXACT,
+		 "group node only on exact match of configuration",NULL},
 		{"iterate", 'i', POPT_ARG_INT, &params.iterate,
 		 OPT_ITERATE, "specify an interation period", "seconds"},
 		{"state", 't', POPT_ARG_STRING, &temp_state,
@@ -83,14 +86,15 @@ int parse_command_line(int argc, char *argv[])
 		 NULL},
 		{"verbose", 'v', POPT_ARG_NONE, &params.verbose,
 		 OPT_VERBOSE, "verbosity level", "level"},
-		POPT_AUTOHELP {NULL, '\0', 0, NULL, 0, NULL, NULL} /* end */
+		POPT_AUTOHELP 
+		{NULL, '\0', 0, NULL, 0, NULL, NULL} /* end */
 	};
 
 	/* Initial the popt contexts */
 	context = poptGetContext("sinfo", argc, (const char **) argv,
 				 options, POPT_CONTEXT_POSIXMEHARDER);
 
-	poptSetOtherOptionHelp(context, "[-lns]");
+	poptSetOtherOptionHelp(context, "[-elns]");
 
 	next_opt = poptGetNextOpt(context);
 
@@ -112,15 +116,13 @@ int parse_command_line(int argc, char *argv[])
 			}
 			break;
 		case OPT_NODE_STATE:
-			{
-				params.state_flag = true;
-				if (_parse_state(temp_state, &params.state)
-				    == SLURM_ERROR) {
-					fprintf(stderr,
-						"%s: %s is an invalid node state\n",
-						argv[0], temp_state);
-					exit(1);
-				}
+			params.state_flag = true;
+			if (_parse_state(temp_state, &params.state)
+			    == SLURM_ERROR) {
+				fprintf(stderr,
+					"%s: %s is invalid node state\n",
+					argv[0], temp_state);
+				exit(1);
 			}
 			break;
 
@@ -180,19 +182,20 @@ static int _parse_state(char *str, enum node_states *states)
 }
 
 /* print the parameters specified */
-void print_options()
+void print_options( void )
 {
 	printf("-----------------------------\n");
 	printf("partition(%s) = %s\n",
 	       (params.partition_flag ? "true" : "false"),
 	       params.partition);
-	printf("node(%s) = %s\n", (params.node_flag ? "true" : "false"),
+	printf("node(%s)  = %s\n", (params.node_flag ? "true" : "false"),
 	       params.node);
 	printf("state(%s) = %s\n", (params.state_flag ? "true" : "false"),
 	       node_state_string(params.state));
 	printf("summarize = %s\n", params.summarize ? "true" : "false");
-	printf("verbose = %d\n", params.verbose);
+	printf("exact     = %d\n", params.exact_match);
+	printf("verbose   = %d\n", params.verbose);
 	printf("long output = %s\n",
 	       params.long_output ? "true" : "false");
 	printf("-----------------------------\n\n");
-};
+}
diff --git a/src/sinfo/sinfo.c b/src/sinfo/sinfo.c
index 550e266680162a923832623d12b786a573aa000a..1255f07c80a62fdce07f9e211006e24a5a601160 100644
--- a/src/sinfo/sinfo.c
+++ b/src/sinfo/sinfo.c
@@ -36,7 +36,7 @@ static char *command_name;
 struct sinfo_parameters params =
     {	partition_flag:false, partition:NULL, state_flag:false,
 	node_flag:false, node:NULL, summarize:false, long_output:false,
-	line_wrap:false, verbose:false, iterate:0
+	line_wrap:false, verbose:false, iterate:0, exact_match:false
 };
 
 /************
@@ -76,7 +76,7 @@ static int _print_str(char *number, int width, bool right);
 /* Display partition functions */
 static struct partition_summary *_find_partition_summary(List l, char *name);
 static struct node_state_summary *_find_node_state_summary(
-		List l, enum node_states state);
+		List l, node_info_t *ninfo);
 static List _setup_partition_summary(
 		partition_info_msg_t * part_ptr, node_info_msg_t * node_ptr);
 static void _print_partition_header(bool no_name);
@@ -397,13 +397,19 @@ static struct partition_summary *_find_partition_summary(List l, char *name)
 }
 
 static struct node_state_summary *
-_find_node_state_summary(List l, enum node_states state)
+_find_node_state_summary(List l, node_info_t *ninfo)
 {
 	ListIterator i = list_iterator_create(l);
 	struct node_state_summary *current;
 
 	while ((current = list_next(i)) != NULL) {
-		if (state == current->state)
+		if (ninfo->node_state != current->state)
+			continue;
+		if (params.exact_match == 0)
+			break;
+		if ((ninfo->cpus        == current->cpu_min) &&
+		    (ninfo->real_memory == current->ram_min) &&
+		    (ninfo->tmp_disk    == current->disk_min))
 			break;
 	}
 
@@ -443,10 +449,8 @@ _setup_partition_summary(partition_info_msg_t * part_ptr,
 			continue;
 		}
 
-		if ((node_sum =
-		     _find_node_state_summary(part_sum->states,
-					     (enum node_states) ninfo->
-					     node_state)) != NULL) {
+		if ((node_sum = 
+		     _find_node_state_summary(part_sum->states, ninfo))) {
 			node_sum->state =
 			    (enum node_states) ninfo->node_state;
 			node_sum->cpu_max =
@@ -497,11 +501,11 @@ _display_all_partition_summary(partition_info_msg_t * part_ptr,
 
 /* Formating for partiton display headers... */
 int part_sz_part = 10;
-int part_sz_num = 6;
-int part_sz_state = 10;
+int part_sz_num = 5;
+int part_sz_state = 9;
 int part_sz_cpus = 4;
-int part_sz_ram = 8;
-int part_sz_disk = 8;
+int part_sz_ram = 9;
+int part_sz_disk = 11;
 int part_sz_nodes = 0;
 
 static void _print_partition_header(bool no_name)
@@ -513,15 +517,16 @@ static void _print_partition_header(bool no_name)
 		printf(" ");
 	}
 	_print_str("NODES", part_sz_num, true);
-	printf("  ");
+	printf(" ");
 	_print_str("STATE", part_sz_state, false);
 	printf(" ");
 	_print_str("CPUS", part_sz_cpus, true);
 	printf(" ");
-	_print_str("MEM", part_sz_ram, true);
+	_print_str("MEMORY", part_sz_ram, true);
 	printf(" ");
-	_print_str("DISK", part_sz_disk, true);
-	_print_str("  NODES", part_sz_nodes, false);
+	_print_str("TMP_DISK", part_sz_disk, true);
+	printf(" ");
+	_print_str("NODES", part_sz_nodes, false);
 	printf("\n");
 	if (no_name == true)
 		printf
@@ -578,7 +583,7 @@ _display_partition_node_info(struct partition_summary *partition,
 			printf("\t");
 
 		_print_int(state_sum->node_count, part_sz_num, true);
-		printf("  ");
+		printf(" ");
 		_print_str(node_state_string(state_sum->state),
 			   part_sz_state, false);
 		printf(" ");
@@ -587,7 +592,7 @@ _display_partition_node_info(struct partition_summary *partition,
 		_print_str(ram_buf, part_sz_ram, true);
 		printf(" ");
 		_print_str(disk_buf, part_sz_disk, true);
-		printf("  ");
+		printf(" ");
 		_print_str(name_buf, part_sz_nodes, false);
 		printf("\n");
 		part_name = no_name;
diff --git a/src/sinfo/sinfo.h b/src/sinfo/sinfo.h
index 43fb05b45e5e61bf16d195a4197afc95eca597b2..dba6fb15a0dc01eb2a8d0161ac4c0d1e45f33bb6 100644
--- a/src/sinfo/sinfo.h
+++ b/src/sinfo/sinfo.h
@@ -27,7 +27,7 @@
 #ifndef __SINFO_H__
 
 #if HAVE_CONFIG_H
-#  include <config.h>
+#  include "config.h"
 #endif
 
 #include <ctype.h>
@@ -46,13 +46,12 @@
 #include <time.h>
 #include <unistd.h>
 
-#include <src/api/slurm.h>
-#include <src/common/hostlist.h>
-#include <src/common/log.h>
-#include <src/common/slurm_protocol_api.h>
-#include <src/common/xmalloc.h>
-#include <src/common/list.h>
-#include <src/common/hostlist.h>
+#include "src/api/slurm.h"
+#include "src/common/hostlist.h"
+#include "src/common/list.h"
+#include "src/common/log.h"
+#include "src/common/slurm_protocol_api.h"
+#include "src/common/xmalloc.h"
 
 
 #define MIN(x,y) (((x)<(y))?(x):(y))
@@ -69,6 +68,7 @@ struct sinfo_parameters {
 	bool line_wrap;
 	int verbose;
 	int iterate;
+	bool exact_match;
 };
 
 struct node_state_summary {
@@ -90,6 +90,6 @@ struct partition_summary {
 
 int parse_state( char* str, enum job_states* states );
 int parse_command_line( int argc, char* argv[] );
-void print_options();
+void print_options( void );
 
 #endif