Index: utils/xuserset.c
===================================================================
--- utils/xuserset.c	(revision 758)
+++ utils/xuserset.c	(working copy)
@@ -98,7 +98,7 @@
 {
 	int c, ecode, port = STAT_PORT;
 	u32 userid;
-	char cmd[9], ukeypath[256], userkey[4096];
+	char cmd[9], ukeypath[256], userkey[4096], *ukey;
 	char *nodeset, *ename, *username, *groupname;
         char *adminkey = NULL, *end;
 	Xpnodeset *nds, *nds2;
@@ -143,7 +143,7 @@
 
 	snprintf(cmd, 9 * sizeof(char), "%s", argv[optind++]);
 	if (!strcmp("add", cmd) && !passwdfile) {
-		if (argc < 7)
+		if (argc < 6)
 			usage(argv[0]);
 	} else if (!strcmp("delete", cmd) && !passwdfile) {
 		if (argc < 4)
@@ -230,17 +230,21 @@
 					    gr->gr_name, userkey);
 			}
 		} else {
-			if ((argc - optind) < 4)
+			if ((argc - optind) < 3)
 				usage(argv[0]);
 			username = argv[optind++];
 			userid = strtol(argv[optind++], NULL, 10);
 			groupname = argv[optind++];
-			
-			if (get_user_key(argv[optind], userkey, sizeof(userkey)) < 0) {
-				sp_suerror("get_user_key", errno);
-				goto error;
+
+			ukey = NULL;
+			if (optind < argc) {
+				if (get_user_key(argv[optind], userkey, sizeof(userkey)) < 0) {
+					sp_suerror("get_user_key", errno);
+					goto error;
+				}
+				ukey = userkey;
 			}
-			
+
 			if (xp_user_add(nds, adminkey, username, userid,
 					groupname, userkey) < 0)
 				return -1;
Index: libxcpu/user.c
===================================================================
--- libxcpu/user.c	(revision 758)
+++ libxcpu/user.c	(working copy)
@@ -88,10 +88,16 @@
 	cmd = sp_malloc(sizeof(*cmd));
 	cmd->len = 4096;
 	cmd->str = sp_malloc(cmd->len);
-	qkey = quotestrdup(ukey);
-	snprintf(cmd->str, cmd->len, "user-add %s %d %s %s\n", uname, uid,
-		 gname, qkey);
-	free(qkey);
+	if (ukey) {
+		qkey = quotestrdup(ukey);
+		snprintf(cmd->str, cmd->len, "user-add %s %d %s %s\n", uname, uid,
+			 gname, qkey);
+		free(qkey);
+	} else {
+		snprintf(cmd->str, cmd->len, "user-add %s %d %s\n", uname, uid,
+			 gname);
+	}
+
 	addcmd = xcmd_init(cmd, adminkey);
 	if (!addcmd)
 		goto error;
Index: xcpufs/xcpufs.c
===================================================================
--- xcpufs/xcpufs.c	(revision 758)
+++ xcpufs/xcpufs.c	(working copy)
@@ -1143,8 +1143,8 @@
 static int
 execute_command(Spuserpool *up, char *s)
 {
-        int n, ret, nargs, pid, euid;
-	char **args, *cmd, **toks, *p;
+        int n, ret, nargs, pid, euid, keylen;
+	char **args, *cmd, **toks, *p, *ukey;
 
 	nargs = tokenize(s, &toks);
 	if (nargs < 0) {
@@ -1157,7 +1157,13 @@
 
 	ret = -1;
 	if (strcmp("user-add", cmd) == 0) {
-		if (nargs != 5) {
+		if (nargs==4) {
+			ukey = NULL;
+			keylen = 0;
+		} else if (nargs==5) {
+			ukey = args[3];
+			keylen = strlen(args[3]);
+		} else {
 			sp_werror("Usage: user-add uname uid groupname key", EIO);
 			goto done;
 		}
@@ -1168,7 +1174,7 @@
 			goto done;
 		}
 
-		if (!ukey_add(up, args[0], n, args[2], args[3], strlen(args[3])))
+		if (!ukey_add(up, args[0], n, args[2], ukey, keylen))
 			ret = 1;
 	} else if (strcmp("user-del", cmd) == 0) {
 		if (!ukey_del(up, args[0]))
Index: xcpufs/xauth.c
===================================================================
--- xcpufs/xauth.c	(revision 758)
+++ xcpufs/xauth.c	(working copy)
@@ -278,8 +278,13 @@
 	Xkey *ukey;
 	Passkey *p, *pp;
 
-	if(!afid)
+	if (!afid) {
+		ukey = fid->user->aux;
+		if (!ukey)
+			return 1;
+
 		goto error;
+	}
 
 	auth = afid->aux;
 	if (!auth)
