diff --git a/doc/man/man1/sshare.1 b/doc/man/man1/sshare.1
index d6220772eb3ded3647186d442a6dfce12035006b..f4efdf1d0cd7e142c77dd1f2db7aefc9e14f5554 100644
--- a/doc/man/man1/sshare.1
+++ b/doc/man/man1/sshare.1
@@ -74,10 +74,6 @@ Display associations.
 \fB\-\-accounts\fR <\fIAccount\fR> 
 Display accounts.
 
-.TP
-\fB\-\-cluster\fR <\fICluster\fR> 
-Display cluster.
-
 .TP
 \fB\-\-help\fP
 Display a description of sshare options and commands.
@@ -128,14 +124,6 @@ The name of a bank account.
 
 .RE
 
-.SH "CLUSTER "
-
-.TP
-\fICluster\fP
-The name of the cluster.
-
-.RE
-
 .SH " USER "
 
 .TP
diff --git a/src/common/assoc_mgr.c b/src/common/assoc_mgr.c
index 13de1bab413d1373eda5b19787c73a2f6d08f52f..03b2d83361db1627f548765a5c948253c8bebb20 100644
--- a/src/common/assoc_mgr.c
+++ b/src/common/assoc_mgr.c
@@ -1098,7 +1098,8 @@ extern int assoc_mgr_is_user_acct_coord(void *db_conn,
 	return 0;	
 }
 
-extern List assoc_mgr_get_shares(List acct_list, List user_list)
+extern List assoc_mgr_get_shares(void *db_conn,
+				 uid_t uid, List acct_list, List user_list)
 {
 	ListIterator itr = NULL;
 	ListIterator user_itr = NULL;
@@ -1107,22 +1108,42 @@ extern List assoc_mgr_get_shares(List acct_list, List user_list)
 	association_shares_object_t *share = NULL;
 	List ret_list = NULL;
 	char *tmp_char = NULL;
+	acct_user_rec_t user;
+	int is_admin=1;
+	uint16_t private_data = slurm_get_private_data();
 
 	if(!assoc_mgr_association_list
 	   || !list_count(assoc_mgr_association_list))
 		return NULL;
+
+	memset(&user, 0, sizeof(acct_user_rec_t));
+	user.uid = uid;
+	
 	if(user_list && list_count(user_list)) 
 		user_itr = list_iterator_create(user_list);
 
 	if(acct_list && list_count(acct_list)) 
 		acct_itr = list_iterator_create(acct_list);
-	
+
+	if (private_data & PRIVATE_DATA_USAGE) {
+		uint32_t slurm_uid = slurm_get_slurm_user_id();
+		is_admin = 0;
+		/* Check permissions of the requesting user.
+		 */
+		if((uid == slurm_uid || uid == 0)
+		   || assoc_mgr_get_admin_level(db_conn, uid) 
+		   >= ACCT_ADMIN_OPERATOR) 
+			is_admin = 1;	
+		else {
+			assoc_mgr_fill_in_user(db_conn, &user, 1, NULL);
+		}
+	}
+
 	ret_list = list_create(slurm_destroy_association_shares_object);
 
 	slurm_mutex_lock(&assoc_mgr_association_lock);
 	itr = list_iterator_create(assoc_mgr_association_list);
-	while((assoc = list_next(itr))) {
-		
+	while((assoc = list_next(itr))) {		
 		if(user_itr && assoc->user) {
 			while((tmp_char = list_next(user_itr))) {
 				if(!strcasecmp(tmp_char, assoc->user))
@@ -1130,9 +1151,10 @@ extern List assoc_mgr_get_shares(List acct_list, List user_list)
 			}
 			list_iterator_reset(user_itr);
 			/* not correct user */
-			if(!tmp_char)
+			if(!tmp_char) 
 				continue;
 		}
+
 		if(acct_itr) {
 			while((tmp_char = list_next(acct_itr))) {
 				if(!strcasecmp(tmp_char, assoc->acct))
@@ -1140,9 +1162,46 @@ extern List assoc_mgr_get_shares(List acct_list, List user_list)
 			}
 			list_iterator_reset(acct_itr);
 			/* not correct account */
-			if(!tmp_char)
+			if(!tmp_char) 
+				continue;
+		}
+
+		if (private_data & PRIVATE_DATA_USAGE) {
+			if(!is_admin) {
+				ListIterator itr = NULL;
+				acct_coord_rec_t *coord = NULL;
+
+				if(assoc->user && 
+				   !strcmp(assoc->user, user.name)) 
+					goto is_user;
+				
+				if(!user.coord_accts) {
+					debug4("This user isn't a coord.");
+					goto bad_user;
+				}
+
+				if(!assoc->acct) {
+					debug("No account name given "
+					      "in association.");
+					goto bad_user;				
+				}
+				
+				itr = list_iterator_create(user.coord_accts);
+				while((coord = list_next(itr))) {
+					if(!strcasecmp(coord->name, 
+						       assoc->acct))
+						break;
+				}
+				list_iterator_destroy(itr);
+				
+				if(coord) 
+					goto is_user;
+				
+			bad_user:
 				continue;
+			}
 		}
+	is_user:
 
 		share = xmalloc(sizeof(association_shares_object_t));
 		list_append(ret_list, share);
diff --git a/src/common/assoc_mgr.h b/src/common/assoc_mgr.h
index a88483d523fa70022c0fa5304e3d7a0b912d7857..495e4b84e37df23ff56dd2d0cc7dd4aeb4e8e297 100644
--- a/src/common/assoc_mgr.h
+++ b/src/common/assoc_mgr.h
@@ -151,10 +151,12 @@ extern int assoc_mgr_set_cpu_shares(uint32_t procs, uint32_t half_life);
 /*
  * get the share information from the association list in the form of
  * a list containing association_share_object_t's 
+ * IN: uid: uid_t of user issuing the request
  * IN: acct_list: char * list of accounts you want (NULL for all)
  * IN: user_list: char * list of user names you want (NULL for all)
  */
-extern List assoc_mgr_get_shares(List acct_list, List user_list);
+extern List assoc_mgr_get_shares(
+	void *db_conn, uid_t uid, List acct_list, List user_list);
 
 /* 
  * update associations in cache 
diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c
index b03d1463e1e15e04c9e65a8fe22ee0713c271ba3..91c24dd2c8bccb459c5762d4fd21d92c330e9613 100644
--- a/src/slurmctld/proc_req.c
+++ b/src/slurmctld/proc_req.c
@@ -858,7 +858,9 @@ static void  _slurm_rpc_get_shares(slurm_msg_t *msg)
 	debug2("Processing RPC: REQUEST GET SHARES from uid=%u",
 	       (unsigned int)uid);
 	resp_msg.tot_shares = assoc_mgr_root_assoc->cpu_shares;
-	resp_msg.assoc_shares_list = assoc_mgr_get_shares(req_msg->acct_list, 
+	resp_msg.assoc_shares_list = assoc_mgr_get_shares(acct_db_conn,
+							  uid,
+							  req_msg->acct_list, 
 							  req_msg->user_list);
 	slurm_msg_t_init(&response_msg);
 	response_msg.address  = msg->address;
diff --git a/src/sshare/sshare.c b/src/sshare/sshare.c
index 17d9ccc92dea1173af63fdc6133ad96b319ed671..0c85cc9a3a643b7612f5ec57cc24e57fdab6f7c9 100644
--- a/src/sshare/sshare.c
+++ b/src/sshare/sshare.c
@@ -52,8 +52,8 @@ uint32_t my_uid = 0;
 static int      _set_time_format(char *format);
 static int      _get_info(shares_request_msg_t *shares_req, 
 			  shares_response_msg_t **shares_resp);
-static int      _addto_id_char_list(List char_list, char *names, bool gid);
-static char *   _convert_to_id(char *name, bool gid);
+static int      _addto_name_char_list(List char_list, char *names, bool gid);
+static char *   _convert_to_name(int id, bool gid);
 static void     _print_version( void );
 static void	_usage ();
 
@@ -71,7 +71,6 @@ main (int argc, char *argv[])
 	static struct option long_options[] = {
 		{"all", 0,0, 'a'},
 		{"accounts", 1, 0, 'A'},
-		{"cluster", 1, 0, 'C'},
 		{"help",     0, 0, 'h'},
 		{"no_header", 0, 0, 'n'},
 		{"parsable", 0, 0, 'p'},
@@ -85,6 +84,17 @@ main (int argc, char *argv[])
 		{NULL,       0, 0, 0}
 	};
 
+	/* Check to see if we are running a supported accounting plugin */
+	temp = slurm_get_priority_type();
+	if(strcasecmp(temp, "priority/multifactor")) {
+		fprintf (stderr, "You are not running a supported "
+			 "priority plugin\n(%s).\n"
+			 "Only 'priority/multifactor' is supported.\n",
+			temp);
+		xfree(temp);
+		exit(1);
+	}
+	xfree(temp);
 
 	exit_code         = 0;
 	quiet_flag        = 0;
@@ -136,7 +146,7 @@ main (int argc, char *argv[])
 			if(!req_msg.user_list)
 				req_msg.user_list = 
 					list_create(slurm_destroy_char);
-			_addto_id_char_list(req_msg.user_list, optarg, 0);
+			_addto_name_char_list(req_msg.user_list, optarg, 0);
 			break;
 		case 't':
 			_set_time_format(optarg);
@@ -163,17 +173,49 @@ main (int argc, char *argv[])
 		log_alter(opts, 0, NULL);
 	}
 
-	/* Check to see if we are running a supported accounting plugin */
-	temp = slurm_get_priority_type();
-	if(strcasecmp(temp, "priority/multifactor")) {
-		fprintf (stderr, "You are not running a supported "
-			 "priority plugin\n(%s).\n"
-			 "Only 'priority/multifactor' is supported.\n",
-			temp);
-		xfree(temp);
-		exit(1);
+	if(all_users) {
+		if(req_msg.user_list 
+		   && list_count(req_msg.user_list)) {
+			list_destroy(req_msg.user_list);
+			req_msg.user_list = NULL;
+		}
+		if(verbosity)
+			fprintf(stderr, "Users requested:\n\t: all\n");
+	} else if (verbosity && req_msg.user_list 
+	    && list_count(req_msg.user_list)) {
+		fprintf(stderr, "Users requested:\n");
+		ListIterator itr = list_iterator_create(req_msg.user_list);
+		while((temp = list_next(itr))) 
+			fprintf(stderr, "\t: %s\n", temp);
+		list_iterator_destroy(itr);
+	} else if(!req_msg.user_list || !list_count(req_msg.user_list)) {
+		struct passwd *pwd = getpwuid(getuid());
+		if(!req_msg.user_list)
+			req_msg.user_list = list_create(slurm_destroy_char);
+		temp = xstrdup(pwd->pw_name);
+		list_append(req_msg.user_list, temp);
+		if(verbosity) {
+			fprintf(stderr, "Users requested:\n");
+			fprintf(stderr, "\t: %s\n", temp);
+		}
+	}
+
+	if(req_msg.acct_list && list_count(req_msg.acct_list)) {
+		fprintf(stderr, "Accounts requested:\n");
+		ListIterator itr = list_iterator_create(req_msg.acct_list);
+		while((temp = list_next(itr))) 
+			fprintf(stderr, "\t: %s\n", temp);
+		list_iterator_destroy(itr);
+	} else {
+		if(req_msg.acct_list 
+		   && list_count(req_msg.acct_list)) {
+			list_destroy(req_msg.acct_list);
+			req_msg.acct_list = NULL;
+		}
+		if(verbosity)
+			fprintf(stderr, "Accounts requested:\n\t: all\n");
+
 	}
-	xfree(temp);
 
 	error_code = _get_info(&req_msg, &resp_msg);
 
@@ -250,7 +292,7 @@ static int _get_info(shares_request_msg_t *shares_req,
 }
 
 /* returns number of objects added to list */
-static int _addto_id_char_list(List char_list, char *names, bool gid)
+static int _addto_name_char_list(List char_list, char *names, bool gid)
 {
 	int i=0, start=0;
 	char *name = NULL, *tmp_char = NULL;
@@ -283,9 +325,11 @@ static int _addto_id_char_list(List char_list, char *names, bool gid)
 					name = xmalloc((i-start+1));
 					memcpy(name, names+start, (i-start));
 					//info("got %s %d", name, i-start);
-					if (!isdigit((int) *name)) {
-						name = _convert_to_id(
-							name, gid);
+					if (isdigit((int) *name)) {
+						int id = atoi(name);
+						xfree(name);
+						name = _convert_to_name(
+							id, gid);
 					}
 					
 					while((tmp_char = list_next(itr))) {
@@ -315,8 +359,10 @@ static int _addto_id_char_list(List char_list, char *names, bool gid)
 			name = xmalloc((i-start)+1);
 			memcpy(name, names+start, (i-start));
 			
-			if (!isdigit((int) *name)) {
-				name = _convert_to_id(name, gid);
+			if (isdigit((int) *name)) {
+				int id = atoi(name);
+				xfree(name);
+				name = _convert_to_name(id, gid);
 			}
 			
 			while((tmp_char = list_next(itr))) {
@@ -335,24 +381,24 @@ static int _addto_id_char_list(List char_list, char *names, bool gid)
 	return count;
 } 
 
-static char *_convert_to_id(char *name, bool gid)
+static char *_convert_to_name(int id, bool gid)
 {
+	char *name = NULL;
+
 	if(gid) {
 		struct group *grp;
-		if (!(grp=getgrnam(name))) {
+		if (!(grp=getgrgid(id))) {
 			fprintf(stderr, "Invalid group id: %s\n", name);
 			exit(1);
 		}
-		xfree(name);
-		name = xstrdup_printf("%d", grp->gr_gid);
+		name = xstrdup(grp->gr_name);
 	} else {
 		struct passwd *pwd;
-		if (!(pwd=getpwnam(name))) {
+		if (!(pwd=getpwuid(id))) {
 			fprintf(stderr, "Invalid user id: %s\n", name);
 			exit(1);
 		}
-		xfree(name);
-		name = xstrdup_printf("%d", pwd->pw_uid);
+		name = xstrdup(pwd->pw_name);
 	}
 	return name;
 }
@@ -376,7 +422,6 @@ sshare [<OPTION>] [<COMMAND>]                                              \n\
     Valid <OPTION> values are:                                             \n\
      -a or --all: equivalent to \"all\" command                            \n\
      -A or --accounts: equivalent to \"accounts\" command                  \n\
-     -C or --cluster: equivalent to \"cluster\" command                    \n\
      -h or --help or --usage: equivalent to \"help\" command               \n\
      -n or --no_header: no header will be added to the beginning of output \n\
      -p or --parsable: output will be '|' delimited with a '|' at the end  \n\
@@ -390,19 +435,18 @@ sshare [<OPTION>] [<COMMAND>]                                              \n\
                                                                            \n\
                                                                            \n\
     Valid <COMMAND> values are:                                            \n\
-     --all                      list all                                     \n\
-     --accounts <Account>       list accounts                                \n\
-     --cluster <Cluster>        list cluster                                 \n\
-     --help                     print this description of use.               \n\
-     --no_header                output without a header                      \n\
+     --all                      list all                                   \n\
+     --accounts <Account>       list accounts (comma separated list)       \n\
+     --help                     print this description of use.             \n\
+     --no_header                output without a header                    \n\
      --parsable                 output will be | delimited with an ending '|'\n\
      --parsable2                output will be | delimited without an ending '|'\n\
      --quiet                    print no messages other than error messages. \n\
-     --uid                      list help                                    \n\
-     --usage                    show help                                    \n\
-     --user <User>              list user                                    \n\
-     --verbose                  wordy and windy output.                      \n\
-     --version                  display tool version number.                 \n\
+     --uid                      list uid (comma separated list)            \n\
+     --usage                    show help                                  \n\
+     --user <User>              list user (comma separated list)           \n\
+     --verbose                  wordy and windy output.                    \n\
+     --version                  display tool version number.               \n\
                                                                            \n\
                                                                            \n\
                                                                            \n\