diff --git a/NEWS b/NEWS
index c087a88d85dca8e7e63684b2ccba76418f666401..8f4c16a061aa05742e134d921d2b20d07a39a72a 100644
--- a/NEWS
+++ b/NEWS
@@ -91,8 +91,13 @@ documents those changes that are of interest to users and admins.
     user's current group, but all groups the user has access to.
  -- BLUEGENE - Add salloc options to specify images to be loaded (--blrts-image, 
     --linux-image, --mloader-image, and --ramdisk-image).
+ -- BLUEGENE - In bluegene.conf, permit Groups to be comma separated in addition 
+    to colon separators previously supported.
  -- sbatch will accept batch script containing "#SLURM" options and advise
     changed to "#SBATCH".
+ -- If srun --output or --error specification contains a task number rather 
+    than a file name, send stdout/err from specified task to srun's stdout/err
+    rather than to a file by the same name as the task's number.
 
 * Changes in SLURM 1.2.18
 =========================
diff --git a/doc/html/bluegene.shtml b/doc/html/bluegene.shtml
index 1ec641242c2e334476452a189286442f5053d34b..a0e92e54145d5342c2fb9791ce5d3e39806eab9f 100644
--- a/doc/html/bluegene.shtml
+++ b/doc/html/bluegene.shtml
@@ -464,10 +464,10 @@ AltRamDiskImage=/bgl/BlueLight/ppcfloor/bglsys/bin/ramdisk3.elf
 
 # Another option for images would be a "You can use anything you like image" *
 # This allows the user to use any image entered with no security checking
-AltBlrtsImage=* Groups=da:adamb
-AltLinuxImage=* Groups=da:adamb
-AltMloaderImage=* Groups=da:adamb
-AltRamDiskImage=*  Groups=da:adamb
+AltBlrtsImage=* Groups=da,adamb
+AltLinuxImage=* Groups=da,adamb
+AltMloaderImage=* Groups=da,adamb
+AltRamDiskImage=*  Groups=da,adamb
 
 LayoutMode=STATIC
 BasePartitionNodeCnt=512
diff --git a/doc/man/man5/bluegene.conf.5 b/doc/man/man5/bluegene.conf.5
index 04355532e69b81574779e45a97be17188b0f61d4..5e0c1df34af0d5544ef346a19988bbeb578a1f64 100644
--- a/doc/man/man5/bluegene.conf.5
+++ b/doc/man/man5/bluegene.conf.5
@@ -65,7 +65,7 @@ There is no default value and this must be specified.
 \fBAltBlrtsImage\fR
 Alternative BlrtsImage.  This is an optional field only used for 
 mulitple images on a system and should be followed by a Groups= with
-the user groups allowed to use this image (i.e. Groups=da:jette) if 
+the user groups allowed to use this image (i.e. Groups=da,jette) if 
 Groups= is not stated then this image will be able to be used by all
 groups. You can but as many alternative images as you want in the conf file.
 
@@ -73,7 +73,7 @@ groups. You can but as many alternative images as you want in the conf file.
 \fBAltLinuxImage\fR
 Alternative LinuxImage.  This is an optional field only used for 
 mulitple images on a system and should be followed by a Groups= with
-the user groups allowed to use this image (i.e. Groups=da:jette) if 
+the user groups allowed to use this image (i.e. Groups=da,jette) if 
 Groups= is not stated then this image will be able to be used by all
 groups. You can but as many alternative images as you want in the conf file.
 
@@ -81,7 +81,7 @@ groups. You can but as many alternative images as you want in the conf file.
 \fBAltMloaderImage\fR
 Alternative MloaderImage.  This is an optional field only used for 
 mulitple images on a system and should be followed by a Groups= with
-the user groups allowed to use this image (i.e. Groups=da:jette) if 
+the user groups allowed to use this image (i.e. Groups=da,jette) if 
 Groups= is not stated then this image will be able to be used by all
 groups. You can but as many alternative images as you want in the conf file.
 
@@ -89,7 +89,7 @@ groups. You can but as many alternative images as you want in the conf file.
 \fBAltRamDiskImage\fR
 Alternative RamDiskImage.  This is an optional field only used for 
 mulitple images on a system and should be followed by a Groups= with
-the user groups allowed to use this image (i.e. Groups=da:jette) if 
+the user groups allowed to use this image (i.e. Groups=da,jette) if 
 Groups= is not stated then this image will be able to be used by all
 groups. You can but as many alternative images as you want in the conf file.
 
diff --git a/etc/bluegene.conf.example b/etc/bluegene.conf.example
index cc56c650e1055796c35589e71d4a964d644f03fc..a1dfa9fa14eb25f89596356d6a3d4fa3537515aa 100644
--- a/etc/bluegene.conf.example
+++ b/etc/bluegene.conf.example
@@ -59,10 +59,10 @@ AltRamDiskImage=/bgl/BlueLight/ppcfloor/bglsys/bin/ramdisk3.elf
 
 # Another option for images would be a "You can use anything you like image" *
 # This allows the user to use any image entered with no security checking
-AltBlrtsImage=* Groups=da:adamb
-AltLinuxImage=* Groups=da:adamb
-AltMloaderImage=* Groups=da:adamb
-AltRamDiskImage=*  Groups=da:adamb
+AltBlrtsImage=* Groups=da,adamb
+AltLinuxImage=* Groups=da,adamb
+AltMloaderImage=* Groups=da,adamb
+AltRamDiskImage=*  Groups=da,adamb
 
 LayoutMode=STATIC
 BasePartitionNodeCnt=512
diff --git a/src/plugins/select/bluegene/block_allocator/block_allocator.c b/src/plugins/select/bluegene/block_allocator/block_allocator.c
index 8b89ba29bf4013734464ecbd4daadf11def1808f..1d62d9e7e4d15dfac7170830d18fb2b231a82783 100644
--- a/src/plugins/select/bluegene/block_allocator/block_allocator.c
+++ b/src/plugins/select/bluegene/block_allocator/block_allocator.c
@@ -305,7 +305,7 @@ extern int parse_image(void **dest, slurm_parser_enum_t type,
 	s_p_get_string(&tmp, "Groups", tbl);
 	if(tmp) {
 		for(i=0; i<strlen(tmp); i++) {
-			if(tmp[i] == ':') {
+			if((tmp[i] == ':') || (tmp[i] == ',')) {
 				image_group = xmalloc(sizeof(image_group_t));
 				image_group->name = xmalloc(i-j+2);
 				snprintf(image_group->name,
@@ -325,7 +325,7 @@ extern int parse_image(void **dest, slurm_parser_enum_t type,
 			snprintf(image_group->name, (i-j)+1, "%s", tmp+j);
 			image_group->gid = gid_from_string(image_group->name);
 			if (image_group->gid == (gid_t) -1) {
-				error("Invalid bluegene.conf parameter Groups=%s", 
+				fatal("Invalid bluegene.conf parameter Groups=%s", 
 				      image_group->name);
 			} else {
 				debug3("adding group %s %d", image_group->name,
diff --git a/src/srun/srun.c b/src/srun/srun.c
index 819bc75c89f3a5831b0845035444d820c67479de..471ff42d3d04fd3b687bd79515daaa881759aa26 100644
--- a/src/srun/srun.c
+++ b/src/srun/srun.c
@@ -757,7 +757,7 @@ _set_stdio_fds(srun_job_t *job, slurm_step_io_fds_t *cio_fds)
 	 * create stdin file descriptor
 	 */
 	if (_is_local_file(job->ifname)) {
-		if (job->ifname->name == NULL || job->ifname->taskid != -1) {
+		if ((job->ifname->name == NULL) || (job->ifname->taskid != -1)) {
 			cio_fds->in.fd = STDIN_FILENO;
 		} else {
 			cio_fds->in.fd = open(job->ifname->name, O_RDONLY);
@@ -780,7 +780,7 @@ _set_stdio_fds(srun_job_t *job, slurm_step_io_fds_t *cio_fds)
 	 * create stdout file descriptor
 	 */
 	if (_is_local_file(job->ofname)) {
-		if (job->ofname->name == NULL) {
+		if ((job->ofname->name == NULL) || (job->ofname->taskid != -1)) {
 			cio_fds->out.fd = STDOUT_FILENO;
 		} else {
 			cio_fds->out.fd = open(job->ofname->name,
@@ -804,7 +804,7 @@ _set_stdio_fds(srun_job_t *job, slurm_step_io_fds_t *cio_fds)
 		cio_fds->err.fd = cio_fds->out.fd;
 		cio_fds->err.taskid = cio_fds->out.taskid;
 	} else if (_is_local_file(job->efname)) {
-		if (job->efname->name == NULL) {
+		if ((job->efname->name == NULL) || (job->efname->taskid != -1)) {
 			cio_fds->err.fd = STDERR_FILENO;
 		} else {
 			cio_fds->err.fd = open(job->efname->name,
diff --git a/testsuite/expect/README b/testsuite/expect/README
index de718e7e2068a1a479e6933d89bd2181f77fe5b4..a06b7ddfe2c9d4f517454db425166544b9f07c4e 100644
--- a/testsuite/expect/README
+++ b/testsuite/expect/README
@@ -105,8 +105,8 @@ test1.19   Test srun stdout/err file name formatting (--output and --error
            options with %j, %J, %n, %s and %t specifications).
 test1.20   Test srun stdout/err disabling (--output and --error options with 
            argument of "none").
-test1.21   Test srun stdin routing to specific task (--input option with 
-           numeric argument).
+test1.21   Test srun stdin/out routing with specific task number (--input 
+           and --output options with numeric argument).
 test1.22   Confirm that a job executes with various launch thread fanouts
            (--threads option).
 test1.23   Verify node configuration specification (--mem, --mincpus, and 
diff --git a/testsuite/expect/test1.21 b/testsuite/expect/test1.21
index 8e2c1efa67bcfe9b8b91df5fc04d44cd233c3c6a..e920d7766a0789c2149b13aee632834025068ee9 100755
--- a/testsuite/expect/test1.21
+++ b/testsuite/expect/test1.21
@@ -1,14 +1,14 @@
 #!/usr/bin/expect
 ############################################################################
 # Purpose: Test of SLURM functionality
-#          Test srun stdin routing to specific task (--input option with 
-#          numeric argument).
+#          Test srun stdin/out routing with specific task number (--input
+#          and --output options with numeric argument).
 #
 # Output:  "TEST: #.#" followed by "SUCCESS" if test was successful, OR
 #          "FAILURE: ..." otherwise with an explanation of the failure, OR
 #          anything else indicates a failure mode that must be investigated.
 ############################################################################
-# Copyright (C) 2002 The Regents of the University of California.
+# Copyright (C) 2002-2007 The Regents of the University of California.
 # Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
 # Written by Morris Jette <jette1@llnl.gov>
 # UCRL-CODE-226842.
@@ -75,9 +75,46 @@ expect {
 		wait
 	}
 }
+if {$matches != 1} {
+	send_user "\nFAILURE: stdin to specific task_id failed\n"
+	set exit_code 1
+}
+if {$exit_code == 0} {
+	send_user "\nSo far... stdin to specific task worked fine\n\n\n"
+}
 
+#
+# Spawn program to print task number, we only expect to see output from task 2
+#
+set job_id  0
+set matches 0
+set srun_pid [spawn $srun --output=$task_id -N1 -n10 -O -v env]
+expect {
+	-re "launching ($number).0 on host" {
+		set job_id $expect_out(1,string)
+		exp_continue
+	}
+	-re "SLURM_PROCID=($number)" {
+		set proc_id $expect_out(1,string)
+		if {$task_id == $proc_id} {
+			incr matches
+		} else {
+			send_user "\nFAILURE: wrong task_id responded\n"
+			set exit_code 1
+		}
+		exp_continue
+	}
+	timeout {
+		send_user "\nFAILURE: srun not responding\n"
+		slow_kill $srun_pid
+		set exit_code 1
+	}
+	eof {
+		wait
+	}
+}
 if {$matches != 1} {
-	send_user "\nFAILURE: specific task_id failed to respond\n"
+	send_user "\nFAILURE: stdout from specific task_id failed\n"
 	set exit_code 1
 }
 
diff --git a/testsuite/expect/test1.89 b/testsuite/expect/test1.89
index da1a4aa8501a363fc6bc6161d6449665d7230cad..1d146bdc8e54d062f6ee6244b1d758f1af2556f1 100755
--- a/testsuite/expect/test1.89
+++ b/testsuite/expect/test1.89
@@ -481,6 +481,9 @@ expect {
 if {$exit_code == 0} {
 	exec $bin_rm -f $file_prog
 	send_user "\nSUCCESS\n"
+} else {
+	send_user "\nNOTE: This test can fail if the node configuration in slurm.conf \n"
+	send_user "  (sockets, cores, threads) differs from the actual configuration\n"
 }
 exit $exit_code