diff --git a/testsuite/expect/test8.20 b/testsuite/expect/test8.20
index e51632cb05830475a5a929da492fcb6baf88f013..23530ce62bac88df5918231e7d86cf6cda603227 100755
--- a/testsuite/expect/test8.20
+++ b/testsuite/expect/test8.20
@@ -139,9 +139,10 @@ if {$actual_job_size != $job_size} {
 # NOTE: Change this to increment step size by one once SLURM logic can
 #       automatically increase step size as needed
 #
+set timeout 60
 set step_id 0
 set max_step_size 0
-for {set step_size 1 } {$step_size <= $job_size} {set step_size [expr $step_size * 2]} {
+for {set step_size 1 } {$step_size <= $job_size} {set step_size [expr $step_size + 1]} {
 	send_user "\nRunning step $job_id.$step_id at size $step_size\n"
 	set step_start1 -1
 	send "$srun -N$step_size --test-only $scontrol show step $job_id.$step_id\r"
diff --git a/testsuite/expect/test8.21 b/testsuite/expect/test8.21
index 014e133a2d0fdcb4744bf24bb5228cb71b6931ba..515498dd527ed87c49c76085f6036e2d417c73c5 100755
--- a/testsuite/expect/test8.21
+++ b/testsuite/expect/test8.21
@@ -149,8 +149,8 @@ for {set dim1 $job_start1} {$dim1 <= $job_fini1} {incr dim1} {
 	}
 }
 
-set timeout 30
-send "./$file_prog $srun $squeue $job_id $actual_job_size\r"
+set timeout 60
+send "./$file_prog $srun $squeue $job_id $actual_job_size 1\r"
 expect {
 	-re "BP_List=($alpha_numeric).($digit)($digit)($digit)($digit)($digit)x($digit)($digit)($digit)($digit)($digit)" {
 		set step_prefix $expect_out(1,string)
@@ -200,8 +200,7 @@ expect {
 		exp_continue
 	}
 	-re $prompt {
-		send "exit\r"
-		exp_continue
+		#break
 	}
 	timeout {
 		send_user "\nFAILURE: job not responding\n"
@@ -228,6 +227,109 @@ for {set dim1 $job_start1} {$dim1 <= $job_fini1} {incr dim1} {
 	}
 }
 
+if {$exit_code == 0} {
+	send_user "\nSo far, so good...\n\n"
+}
+
+#
+# Clear the count the job's c-nodes which have been allocated to steps
+#
+for {set dim1 $job_start1} {$dim1 <= $job_fini1} {incr dim1} {
+	for {set dim2 $job_start2} {$dim2 <= $job_fini2} {incr dim2} {
+		for {set dim3 $job_start3} {$dim3 <= $job_fini3} {incr dim3} {
+			for {set dim4 $job_start4} {$dim4 <= $job_fini4} {incr dim4} {
+				for {set dim5 $job_start5} {$dim5 <= $job_fini5} {incr dim5} {
+					set use_cnt($dim1,$dim2,$dim3,$dim4,$dim5) 0
+				}
+			}
+		}
+	}
+}
+
+#
+# This is a randomized variation on the above logic and includes a full
+# allocation job step. Some job steps may not start due to packing issues
+#
+set timeout 60
+send "./$file_prog $srun $squeue $job_id $actual_job_size 2\r"
+expect {
+	-re "BP_List=($alpha_numeric).($digit)($digit)($digit)($digit)($digit)x($digit)($digit)($digit)($digit)($digit)" {
+		set step_prefix $expect_out(1,string)
+		set step_start1 $expect_out(2,string)
+		set step_start2 $expect_out(3,string)
+		set step_start3 $expect_out(4,string)
+		set step_start4 $expect_out(5,string)
+		set step_start5 $expect_out(6,string)
+		set step_fini1 $expect_out(7,string)
+		set step_fini2 $expect_out(8,string)
+		set step_fini3 $expect_out(9,string)
+		set step_fini4 $expect_out(10,string)
+		set step_fini5 $expect_out(11,string)
+		for {set dim1 $step_start1} {$dim1 <= $step_fini1} {incr dim1} {
+			for {set dim2 $step_start2} {$dim2 <= $step_fini2} {incr dim2} {
+				for {set dim3 $step_start3} {$dim3 <= $step_fini3} {incr dim3} {
+					for {set dim4 $step_start4} {$dim4 <= $step_fini4} {incr dim4} {
+						for {set dim5 $step_start5} {$dim5 <= $step_fini5} {incr dim5} {
+							if [info exists use_cnt($dim1,$dim2,$dim3,$dim4,$dim5)] {
+								incr use_cnt($dim1,$dim2,$dim3,$dim4,$dim5)
+							} else {
+								send_user "\nFAILURE: invalid step cnode allocation at "
+								send_user "\[$dim1,$dim2,$dim3,$dim4,$dim5\]/"
+								set exit_code 1
+							}
+						}
+					}
+				}
+			}
+		}
+		exp_continue
+	}
+	-re "BP_List=($alpha_numeric).($digit)($digit)($digit)($digit)($digit)" {
+		set step_prefix $expect_out(1,string)
+		set dim1 $expect_out(2,string)
+		set dim2 $expect_out(3,string)
+		set dim3 $expect_out(4,string)
+		set dim4 $expect_out(5,string)
+		set dim5 $expect_out(6,string)
+		if [info exists use_cnt($dim1,$dim2,$dim3,$dim4,$dim5)] {
+			incr use_cnt($dim1,$dim2,$dim3,$dim4,$dim5)
+		} else {
+			send_user "\nFAILURE: invalid step cnode allocation at "
+			send_user "\[$dim1,$dim2,$dim3,$dim4,$dim5\]\n"
+			set exit_code 1
+		}
+		exp_continue
+	}
+	-re $prompt {
+		send_user "\nNOTE: Step create errors due to busy nodes are expected\n"
+		send "exit\r"
+		exp_continue
+	}
+	timeout {
+		send_user "\nFAILURE: job not responding\n"
+		set exit_code 1
+	}
+}
+
+#
+# Test that each of the job's c-nodes have been allocated no more than once to some step
+#
+for {set dim1 $job_start1} {$dim1 <= $job_fini1} {incr dim1} {
+	for {set dim2 $job_start2} {$dim2 <= $job_fini2} {incr dim2} {
+		for {set dim3 $job_start3} {$dim3 <= $job_fini3} {incr dim3} {
+			for {set dim4 $job_start4} {$dim4 <= $job_fini4} {incr dim4} {
+				for {set dim5 $job_start5} {$dim5 <= $job_fini5} {incr dim5} {
+					if {$use_cnt($dim1,$dim2,$dim3,$dim4,$dim5) > 1} {
+						send_user "\nFAILURE: cnode at \[$dim1,$dim2,$dim3,$dim4,$dim5\] "
+						send_user "allocated $use_cnt($dim1,$dim2,$dim3,$dim4,$dim5) times\n"
+						set exit_code 1
+					}
+				}
+			}
+		}
+	}
+}
+
 if {$exit_code == 0} {
 	send_user "\nSUCCESS\n"
 } else {
diff --git a/testsuite/expect/test8.21.bash b/testsuite/expect/test8.21.bash
index ff47de5004c279cc599b9fd9b466162a911d7649..c6494bc5d4d0ef1f24d8384b1851bdf0c98ab495 100755
--- a/testsuite/expect/test8.21.bash
+++ b/testsuite/expect/test8.21.bash
@@ -1,23 +1,43 @@
 #!/bin/bash
 
-if [ $# -ne 4 ]; then
-	echo "test8.21.bash <srun_path> <squeue_path> <job_id> <job_size>"
+if [ $# -ne 5 ]; then
+	echo "test8.21.bash <srun_path> <squeue_path> <job_id> <job_size> <mode:1|2?"
 	exit 1
 fi
 srun=$1
 squeue=$2
 job_id=$3
 job_size=$4
+test_mode=$5
 
-$srun -N1  --test-only /bin/true
-sleep 5
+delay_time=1
+while [ $delay_time -le 60 ]
+do
+	$srun -N1  --test-only --immediate /bin/true
+	rc=$?
+	if [ $rc -eq 0 ]
+	then
+		break
+	fi
+	sleep $delay_time
+	delay_time=`expr $delay_time + 1`
+done
+
+if [ $test_mode -gt 1 ]
+then
+	job_size=`expr $job_size + $job_size`
+	sleep_time=0
+else
+	sleep_time=1
+fi
 
 while [ $job_size -ge 2 ]
 do
 	job_size=`expr $job_size / 2`
 	$srun -N$job_size --test-only sleep 50 &
-	sleep 1
+	sleep $sleep_time
 done
+
 $srun -N1  --test-only sleep 50 &
 sleep 5
 $squeue --jobs=$job_id --steps --noheader --format='Step_ID=%i BP_List=%N'