--- loncom/homework/grades.pm	2010/04/12 12:55:18	1.611
+++ loncom/homework/grades.pm	2010/04/27 00:06:34	1.632
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.611 2010/04/12 12:55:18 www Exp $
+# $Id: grades.pm,v 1.632 2010/04/27 00:06:34 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -43,6 +43,7 @@ use Apache::lonmsg();
 use Apache::Constants qw(:common);
 use Apache::lonlocal;
 use Apache::lonenc;
+use Apache::lonstathelpers;
 use String::Similarity;
 use LONCAPA;
 
@@ -137,6 +138,7 @@ sub nameUserString {
 
 #--- Get the partlist and the response type for a given problem. ---
 #--- Indicate if a response type is coded handgraded or not. ---
+#--- Sets response_error pointer to "1" if navmaps object broken ---
 sub response_type {
     my ($symb,$response_error) = @_;
 
@@ -617,7 +619,6 @@ sub jscriptNform {
 	"\n");
     $jscript.= '<form action="/adm/grades" method="post" name="onestudent">'."\n".
 	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n".
 	'<input type="hidden" name="Status"  value="'.$stu_status.'" />'."\n".
 	'<input type="hidden" name="command" value="submission" />'."\n".
 	'<input type="hidden" name="student" value="" />'."\n".
@@ -801,7 +802,7 @@ sub verifyreceipt {
 	    $contents.
 	    &Apache::loncommon::end_data_table()."\n";
     }
-    return $string.&show_grading_menu_form($symb);
+    return $string;
 }
 
 #--- This is called by a number of programs.
@@ -809,22 +810,19 @@ sub verifyreceipt {
 #--- Also called directly when one clicks on the subm button 
 #    on the problem page.
 sub listStudents {
-    my ($request,$symb) = @_;
+    my ($request,$symb,$submitonly) = @_;
 
     my $cdom      = $env{"course.$env{'request.course.id'}.domain"};
     my $cnum      = $env{"course.$env{'request.course.id'}.num"};
     my $getsec    = $env{'form.section'} eq '' ? 'all' : $env{'form.section'};
     my $getgroup  = $env{'form.group'} eq '' ? 'all' : $env{'form.group'};
-    my $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'};
-    my $viewgrade = $env{'form.showgrading'} eq 'yes' ? 'View/Grade/Regrade' : 'View';
-
-    my $result='<h3><span class="LC_info">&nbsp;'
-	.&mt("$viewgrade Submissions for a Student or a Group of Students")
-	.'</span></h3>';
+    unless ($submitonly) {
+       $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'};
+    }
 
-    my ($partlist,$handgrade,$responseType) = &response_type($symb
-#,$res_error
-    );
+    my $result='';
+    my $res_error;
+    my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error);
 
     my %lt = &Apache::lonlocal::texthash (
 		'multiple' => 'Please select a student or group of students before clicking on the Next button.',
@@ -864,8 +862,6 @@ LISTJAVASCRIPT
     &commonJSfunctions($request);
     $request->print($result);
 
-    my $checkhdgrade = ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked="checked"' : '';
-    my $checklastsub = $checkhdgrade eq '' ? 'checked="checked"' : '';
     my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'.
 	"\n";
 	
@@ -882,22 +878,18 @@ LISTJAVASCRIPT
                   .&Apache::lonhtmlcommon::row_closure();
 
     my $submission_options;
-    if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) {
-	$submission_options.=
-	    '<label><input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> '.&mt('essay part only').' </label>'."\n";
-    }
     my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
     my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status;
     $env{'form.Status'} = $saveStatus;
     $submission_options.=
         '<span class="LC_nobreak">'.
-        '<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '.
+        '<label><input type="radio" name="lastSub" value="lastonly" /> '.
         &mt('last submission only').' </label></span>'."\n".
         '<span class="LC_nobreak">'.
         '<label><input type="radio" name="lastSub" value="last" /> '.
         &mt('last submission &amp; parts info').' </label></span>'."\n".
         '<span class="LC_nobreak">'.
-        '<label><input type="radio" name="lastSub" value="datesub" /> '.
+        '<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '.
         &mt('by dates and submissions').'</label></span>'."\n".
         '<span class="LC_nobreak">'.
         '<label><input type="radio" name="lastSub" value="all" /> '.
@@ -918,13 +910,10 @@ LISTJAVASCRIPT
     $gradeTable .= 
         &build_section_inputs().
 	'<input type="hidden" name="submitonly"  value="'.$submitonly.'" />'."\n".
-	'<input type="hidden" name="handgrade"   value="'.$env{'form.handgrade'}.'" /><br />'."\n".
-	'<input type="hidden" name="showgrading" value="'.$env{'form.showgrading'}.'" /><br />'."\n".
-	'<input type="hidden" name="saveState"   value="'.$env{'form.saveState'}.'" />'."\n".
 	'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
 	'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n";
 
-    if (exists($env{'form.gradingMenu'}) && exists($env{'form.Status'})) {
+    if (exists($env{'form.Status'})) {
 	$gradeTable .= '<input type="hidden" name="Status" value="'.$stu_status.'" />'."\n";
     } else {
         $gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Student Status'))
@@ -939,7 +928,7 @@ LISTJAVASCRIPT
                   .&Apache::lonhtmlcommon::end_pick_box();
 
     $gradeTable .= '<p>'
-                  .&mt('To '.lc($viewgrade)." a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.")."\n"
+                  .&mt("To view/grade/regrade a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.")."\n"
                   .'<input type="hidden" name="command" value="processGroup" />'
                   .'</p>';
 
@@ -956,9 +945,7 @@ LISTJAVASCRIPT
     while ($loop < 2) {
 	$gradeTable.='<th>'.&mt('No.').'</th><th>'.&mt('Select').'</th>'.
 	    '<th>'.&nameUserString('header').'&nbsp;'.&mt('Section/Group').'</th>';
-	if ($env{'form.showgrading'} eq 'yes' 
-	    && $submitonly ne 'queued'
-	    && $submitonly ne 'all') {
+	if (($submitonly ne 'queued') && ($submitonly ne 'all')) {
 	    foreach my $part (sort(@$partlist)) {
 		my $display_part=
 		    &get_display_part((split(/_/,$part))[0],$symb);
@@ -994,9 +981,7 @@ LISTJAVASCRIPT
 	    $status{'gradingqueue'} = $queue_status{'gradingqueue'};
 	}
 
-	if ($env{'form.showgrading'} eq 'yes' 
-	    && $submitonly ne 'queued'
-	    && $submitonly ne 'all') {
+	if (($submitonly ne 'queued') && ($submitonly ne 'all')) {
 	    (%status) =&student_gradeStatus($symb,$udom,$uname,$partlist);
 	    my $submitted = 0;
 	    my $graded = 0;
@@ -1037,7 +1022,7 @@ LISTJAVASCRIPT
 	       &nameUserString(undef,$$fullname{$student},$uname,$udom).
 	       '&nbsp;'.$section.($group ne '' ?'/'.$group:'').'</td>'."\n";
 
-	    if ($env{'form.showgrading'} eq 'yes' && $submitonly ne 'all') {
+	    if ($submitonly ne 'all') {
 		foreach (sort(keys(%status))) {
 		    next if ($_ =~ /^resource.*?submitted_by$/);
 		    $gradeTable.='<td align="center">&nbsp;'.&mt($status{$_}).'&nbsp;</td>'."\n";
@@ -1051,9 +1036,7 @@ LISTJAVASCRIPT
     }
     if ($ctr%2 ==1) {
 	$gradeTable.='<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>';
-	    if ($env{'form.showgrading'} eq 'yes' 
-		&& $submitonly ne 'queued'
-		&& $submitonly ne 'all') {
+	    if (($submitonly ne 'queued') && ($submitonly ne 'all')) {
 		foreach (@$partlist) {
 		    $gradeTable.='<td>&nbsp;</td>';
 		}
@@ -1084,7 +1067,6 @@ LISTJAVASCRIPT
     } elsif ($ctr == 1) {
 	$gradeTable =~ s/type="checkbox"/type="checkbox" checked="checked"/;
     }
-    $gradeTable.=&show_grading_menu_form($symb);
     $request->print($gradeTable);
     return '';
 }
@@ -1138,7 +1120,7 @@ sub check_buttons {
 
 #     Displays the submissions for one student or a group of students
 sub processGroup {
-    my ($request)  = shift;
+    my ($request,$symb)  = @_;
     my $ctr        = 0;
     my @stuchecked = &Apache::loncommon::get_env_multiple('form.stuinfo');
     my $total      = scalar(@stuchecked)-1;
@@ -1148,7 +1130,7 @@ sub processGroup {
 	$env{'form.student'}        = $uname;
 	$env{'form.userdom'}        = $udom;
 	$env{'form.fullname'}       = $fullname;
-	&submission($request,$ctr,$total);
+	&submission($request,$ctr,$total,$symb);
 	$ctr++;
     }
     return '';
@@ -1286,7 +1268,6 @@ sub sub_page_js {
 	    
 	}
 	if (val == "Grade Student") {
-	    formname.showgrading.value = "yes";
 	    if (formname.Status.value == "") {
 		formname.Status.value = "Active";
 	    }
@@ -1340,7 +1321,8 @@ sub sub_page_kw_js {
     my $iconpath = $request->dir_config('lonIconsURL');
     &commonJSfunctions($request);
 
-    my $inner_js_msg_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS);
+    my $inner_js_msg_central= (<<INNERJS);
+<script type="text/javascript">
     function checkInput() {
       opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value);
       var nmsg   = opener.document.SCORE.savemsgN.value;
@@ -1377,9 +1359,11 @@ sub sub_page_kw_js {
       self.close()
 
     }
+</script>
 INNERJS
 
-    my $inner_js_highlight_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS);
+    my $inner_js_highlight_central= (<<INNERJS);
+<script type="text/javascript">
     function updateChoice(flag) {
       opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr);
       opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize);
@@ -1390,6 +1374,7 @@ INNERJS
       }
       self.close()
     }
+</script>
 INNERJS
 
     my $start_page_msg_central = 
@@ -1750,8 +1735,8 @@ sub gradeBox {
 }
 
 sub handback_box {
-    my ($symb,$uname,$udom,$counter,$partid,$record,$res_error) = @_;
-    my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error);
+    my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_;
+    my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error_pointer);
     my (@respids);
      my @part_response_id = &flatten_responseType($responseType);
     foreach my $part_response_id (@part_response_id) {
@@ -1855,6 +1840,11 @@ sub files_exist {
 
 sub download_all_link {
     my ($r,$symb) = @_;
+    unless (&files_exist($r, $symb)) {
+       $r->print(&mt('There are currently no submitted documents.'));
+       return;
+    }
+
     my $all_students = 
 	join("\n", &Apache::loncommon::get_env_multiple('form.stuinfo'));
 
@@ -1867,7 +1857,14 @@ sub download_all_link {
                              'cgi.'.$identifier.'.parts' => $parts,});
     $r->print('<a href="/cgi-bin/multidownload.pl?'.$identifier.'">'.
 	      &mt('Download All Submitted Documents').'</a>');
-    return
+    return;
+}
+
+sub submit_download_link {
+    my ($request,$symb) = @_;
+    if (!$symb) { return ''; }
+#FIXME: Figure out which type of problem this is and provide appropriate download
+    &download_all_link($request,$symb);
 }
 
 sub build_section_inputs {
@@ -1898,7 +1895,6 @@ sub submission {
 	$request->print('<span class="LC_warning">Unable to view requested student.('.
 			$uname.':'.$udom.' in section '.$usec.' in course id '.
 			$env{'request.course.id'}.')</span>');
-	$request->print(&show_grading_menu_form($symb));
 	return;
     }
 
@@ -1914,11 +1910,7 @@ sub submission {
     # header info
     if ($counter == 0) {
 	&sub_page_js($request);
-	&sub_page_kw_js($request) if ($env{'form.handgrade'} eq 'yes');
-	if ($env{'form.handgrade'} eq 'yes' && &files_exist($request, $symb)) {
-	    &download_all_link($request, $symb);
-	}
-	$request->print('<h3>&nbsp;<span class="LC_info">'.&mt('Submission Record').'</span></h3>');
+	&sub_page_kw_js($request);
 
 	# option to display problem, only once else it cause problems 
         # with the form later since the problem has a form.
@@ -1938,7 +1930,8 @@ sub submission {
 	# kwclr is the only variable that is guaranteed to be non blank 
         # if this subroutine has been called once.
 	my %keyhash = ();
-	if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') {
+#	if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') {
+        if (1) {
 	    %keyhash = &Apache::lonnet::dump('nohist_handgrade',
 					     $env{'course.'.$env{'request.course.id'}.'.domain'},
 					     $env{'course.'.$env{'request.course.id'}.'.num'});
@@ -1956,23 +1949,21 @@ sub submission {
 	my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
 	$request->print('<form action="/adm/grades" method="post" name="SCORE" enctype="multipart/form-data">'."\n".
 			'<input type="hidden" name="command"    value="handgrade" />'."\n".
-			'<input type="hidden" name="saveState"  value="'.$env{'form.saveState'}.'" />'."\n".
 			'<input type="hidden" name="Status"     value="'.$stu_status.'" />'."\n".
 			'<input type="hidden" name="overRideScore" value="'.$overRideScore.'" />'."\n".
 			'<input type="hidden" name="refresh"    value="off" />'."\n".
 			'<input type="hidden" name="studentNo"  value="" />'."\n".
 			'<input type="hidden" name="gradeOpt"   value="" />'."\n".
 			'<input type="hidden" name="symb"       value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-			'<input type="hidden" name="showgrading" value="'.$env{'form.showgrading'}.'" />'."\n".
 			'<input type="hidden" name="vProb"      value="'.$env{'form.vProb'}.'" />'."\n".
 			'<input type="hidden" name="vAns"       value="'.$env{'form.vAns'}.'" />'."\n".
 			'<input type="hidden" name="lastSub"    value="'.$env{'form.lastSub'}.'" />'."\n".
 			&build_section_inputs().
 			'<input type="hidden" name="submitonly" value="'.$env{'form.submitonly'}.'" />'."\n".
-			'<input type="hidden" name="handgrade"  value="'.$env{'form.handgrade'}.'" />'."\n".
 			'<input type="hidden" name="NCT"'.
 			' value="'.($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : $total+1).'" />'."\n");
-	if ($env{'form.handgrade'} eq 'yes') {
+#	if ($env{'form.handgrade'} eq 'yes') {
+        if (1) {
 	    $request->print('<input type="hidden" name="keywords" value="'.$env{'form.keywords'}.'" />'."\n".
 			    '<input type="hidden" name="kwclr"    value="'.$env{'form.kwclr'}.'" />'."\n".
 			    '<input type="hidden" name="kwsize"   value="'.$env{'form.kwsize'}.'" />'."\n".
@@ -1997,7 +1988,8 @@ sub submission {
 	}
 	$request->print($prnmsg);
 
-	if ($env{'form.handgrade'} eq 'yes' && $env{'form.showgrading'} eq 'yes') {
+#	if ($env{'form.handgrade'} eq 'yes') {
+        if (1) {
 #
 # Print out the keyword options line
 #
@@ -2073,7 +2065,8 @@ KEYWORDS
               .'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>';
     $result.='<input type="hidden" name="name'.$counter.
              '" value="'.$env{'form.fullname'}.'" />'."\n";
-    if ($env{'form.handgrade'} eq 'no') {
+#    if ($env{'form.handgrade'} eq 'no') {
+    if (1) {
         $result.='<p class="LC_info">'
                 .&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon)
                 ."</p>\n";
@@ -2082,7 +2075,8 @@ KEYWORDS
     # If any part of the problem is an essay-response (handgraded), then check for collaborators
     my $fullname;
     my $col_fullnames = [];
-    if ($env{'form.handgrade'} eq 'yes') {
+#    if ($env{'form.handgrade'} eq 'yes') {
+    if (1) {
 	(my $sub_result,$fullname,$col_fullnames)=
 	    &check_collaborators($symb,$uname,$udom,\%record,$handgrade,
 				 $counter);
@@ -2133,7 +2127,7 @@ KEYWORDS
                     $lastsubonly.="\n".'<div class="LC_grade_submission_part">'.
                         '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
                         ' <span class="LC_internal_info">'.
-                        '('.&mt('Part ID: [_1]',$respid).')'.
+                        '('.&mt('Response ID: [_1]',$respid).')'.
                         '</span>&nbsp; &nbsp;'.
 			'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>';
 		    next;
@@ -2178,7 +2172,7 @@ KEYWORDS
                         $lastsubonly.='<div class="LC_grade_submission_part">'.
                             '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
                             ' <span class="LC_internal_info">'.
-                            '('.&mt('Part ID: [_1]',$respid).')'.
+                            '('.&mt('Response ID: [_1]',$respid).')'.
                             '</span>&nbsp; &nbsp;';
 			my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record);
 			if (@$files) {
@@ -2209,9 +2203,7 @@ KEYWORDS
 	}
 	$request->print($lastsubonly);
    } elsif ($env{'form.lastSub'} eq 'datesub') {
-#	my (undef,$responseType,undef,$parts) = &showResourceInfo($symb);
-    my ($parts,$handgrade,$responseType) = &response_type($symb);
-
+        my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error);
 	$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom));
     } elsif ($env{'form.lastSub'} =~ /^(last|all)$/) {
 	$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom,
@@ -2219,19 +2211,15 @@ KEYWORDS
 								 $last,'.submission',
 								 'Apache::grades::keywords_highlight'));
     }
-
     $request->print('<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':'
 	.$udom.'" />'."\n");
     # return if view submission with no grading option
-    if ($env{'form.showgrading'} eq '' || (!&canmodify($usec))) {
+# FIXME: the logic seems off here. Why show the grade button if you cannot grade?
+    if (!&canmodify($usec)) {
 	my $toGrade.='<input type="button" value="Grade Student" '.
 	    'onclick="javascript:checksubmit(this.form,\'Grade Student\',\''
 	    .$counter.'\');" target="_self" /> &nbsp;'."\n" if (&canmodify($usec));
 	$toGrade.='</div>'."\n";
-	if (($env{'form.command'} eq 'submission') || 
-	    ($env{'form.command'} eq 'processGroup' && $counter == $total)) {
-	    $toGrade.='</form>'.&show_grading_menu_form($symb); 
-	}
 	$request->print($toGrade);
 	return;
     } else {
@@ -2239,7 +2227,8 @@ KEYWORDS
     }
 
     # essay grading message center
-    if ($env{'form.handgrade'} eq 'yes') {
+#    if ($env{'form.handgrade'} eq 'yes') {
+    if (1) {
 	my $result='<div class="LC_grade_message_center">';
     
 	$result.='<div class="LC_grade_message_center_header">'.
@@ -2331,7 +2320,6 @@ KEYWORDS
         $endform.="<input type='hidden' value='".&get_increment().
             "' name='increment' />";
 	$endform.='</td></tr></table></form>';
-	$endform.=&show_grading_menu_form($symb);
 	$request->print($endform);
     }
     return '';
@@ -2350,10 +2338,10 @@ sub check_collaborators {
 	next if ($record->{'resource.'.$part.'.collaborators'} eq '');
 	my (@good_collaborators, @bad_collaborators);
 	foreach my $possible_collaborator
-	    (split(/,?\s+/,$record->{'resource.'.$part.'.collaborators'})) { 
+	    (split(/[,;\s]+/,$record->{'resource.'.$part.'.collaborators'})) { 
 	    $possible_collaborator =~ s/[\$\^\(\)]//g;
 	    next if ($possible_collaborator eq '');
-	    my ($co_name,$co_dom) = split(/\@|:/,$possible_collaborator);
+	    my ($co_name,$co_dom) = split(/:/,$possible_collaborator);
 	    $co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i);
 	    next if ($co_name eq $uname && $co_dom eq $udom);
 	    # Doing this grep allows 'fuzzy' specification
@@ -2366,13 +2354,13 @@ sub check_collaborators {
 	    }
 	}
 	if (scalar(@good_collaborators) != 0) {
-	    $result.='<br />'.&mt('Collaborators: ');
+	    $result.='<br />'.&mt('Collaborators:').'<ol>';
 	    foreach my $name (@good_collaborators) {
 		my ($lastname,$givenn) = split(/,/,$$fullname{$name});
 		push(@col_fullnames, $givenn.' '.$lastname);
-		$result.=$fullname->{$name}.'&nbsp; &nbsp; &nbsp;';
+		$result.='<li>'.$fullname->{$name}.'</li>';
 	    }
-	    $result.='<br />'."\n";
+	    $result.='</ol><br />'."\n";
 	    my ($part)=split(/\./,$part);
 	    $result.='<input type="hidden" name="collaborator'.$counter.
 		'" value="'.$part.':'.(join ':',@good_collaborators).'" />'.
@@ -2545,7 +2533,8 @@ sub processHandGrade {
 	}
     }
 
-    if ($env{'form.handgrade'} eq 'yes') {
+#    if ($env{'form.handgrade'} eq 'yes') {
+    if (1) {
 	# Keywords sorted in alphabatical order
 	my $loginuser = $env{'user.name'}.':'.$env{'user.domain'};
 	my %keyhash = ();
@@ -2598,19 +2587,19 @@ sub processHandGrade {
 	    my $processUser = $env{'form.unamedom'.$ctr};
 	    ($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser);
 	    $env{'form.fullname'} = $$fullname{$processUser};
-	    &submission($request,$ctr,$total-1);
+	    &submission($request,$ctr,$total-1,$symb);
 	    $ctr++;
 	}
 	return '';
     }
 
 # Go directly to grade student - from submission or link from chart page
+# FIXME: looks like reading off the button label!
     if ($button eq 'Grade Student') {
-#	(undef,undef,$env{'form.handgrade'},undef,undef) = &showResourceInfo($symb);
 	my $processUser = $env{'form.unamedom'.$env{'form.studentNo'}};
 	($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser);
 	$env{'form.fullname'} = $$fullname{$processUser};
-	&submission($request,0,0);
+	&submission($request,0,0,$symb);
 	return '';
     }
 
@@ -2697,14 +2686,11 @@ sub processHandGrade {
 	$env{'form.student'}  = $uname;
 	$env{'form.userdom'}  = $udom;
 	$env{'form.fullname'} = $$fullname{$_};
-	&submission($request,$ctr,$total);
+	&submission($request,$ctr,$total,$symb);
 	$ctr++;
     }
     if ($total < 0) {
-	my $the_end = '<h3><span class="LC_info">'.&mt('LON-CAPA User Message').'</span></h3><br />'."\n";
-	$the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n";
-	$the_end.=&mt('Click on the button below to return to the grading menu.').'<br /><br />'."\n";
-	$the_end.=&show_grading_menu_form($symb);
+	my $the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n";
 	$request->print($the_end);
     }
     return '';
@@ -3289,7 +3275,6 @@ sub viewgrades {
 	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
 	'<input type="hidden" name="command" value="editgrades" />'."\n".
 	&build_section_inputs().
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n".
 	'<input type="hidden" name="Status" value="'.$env{'stu_status'}.'" />'."\n".
 
     my ($common_header,$specific_header);
@@ -3385,6 +3370,9 @@ sub viewgrades {
 	if  (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
 	my ($partid) = &split_part_type($part);
         push(@partids,$partid);
+#
+# FIXME: Looks like $display looks at English text
+#
 	my $display_part=&get_display_part($partid,$symb);
 	if ($display =~ /^Partial Credit Factor/) {
 	    $result.='<th>'.
@@ -3436,7 +3424,6 @@ sub viewgrades {
 	        $section_display, $stu_status).
 	    '</span>';
     }
-    $result.=&show_grading_menu_form($symb);
     return $result;
 }
 
@@ -3719,8 +3706,7 @@ sub editgrades {
 		&Apache::loncommon::end_data_table_row();
 	}
     }
-    $result .= &Apache::loncommon::end_data_table().
-	&show_grading_menu_form($symb);
+    $result .= &Apache::loncommon::end_data_table();
     my $msg = '<p><b>'.
 	&mt('Number of records updated = [_1] for [quant,_2,student].',
 	    $rec_update,$count).'</b><br />'.
@@ -3833,21 +3819,14 @@ sub csvuploadmap_header {
 	$javascript=&csvupload_javascript_forward_associate();
     }
 
-    my $result='';
-    my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
-    my $ignore=&mt('Ignore First Line');
     $symb = &Apache::lonenc::check_encrypt($symb);
+    $request->print('<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">'.
+                    &mt('Total number of records found in file: [_1]',$distotal).'<hr />'.
+                    &mt('Associate entries from the uploaded file with as many fields as you can.'));
+    my $reverse=&mt("Reverse Association");
     $request->print(<<ENDPICK);
-<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
-<h3><span class="LC_info">Uploading Class Grades</span></h3>
-$result
-<hr />
-<h3>Identify fields</h3>
-Total number of records found in file: $distotal <hr />
-Enter as many fields as you can. The system will inform you and bring you back
-to this page if the data selected is insufficient to run your class.<hr />
-<input type="button" value="Reverse Association" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
-<label><input type="checkbox" name="noFirstLine" $checked />$ignore</label>
+<br />
+<input type="button" value="$reverse" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
 <input type="hidden" name="associate"  value="" />
 <input type="hidden" name="phase"      value="three" />
 <input type="hidden" name="datatoken"  value="$datatoken" />
@@ -3856,7 +3835,6 @@ to this page if the data selected is ins
 <input type="hidden" name="upfile_associate" 
                                        value="$env{'form.upfile_associate'}" />
 <input type="hidden" name="symb"       value="$symb" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 <input type="hidden" name="command"    value="csvuploadoptions" />
 <hr />
 ENDPICK
@@ -3921,11 +3899,11 @@ sub upcsvScores_form {
     my ($request,$symb) = @_;
     if (!$symb) {return '';}
     my $result=&checkforfile_js();
-    $result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n";
-    $result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n";
-    $result.='&nbsp;<b>'.&mt('Specify a file containing the class scores for current resource.').
-	'</b></td></tr>'."\n";
-    $result.='<tr bgcolor=#ffffe6><td>'."\n";
+    $result.=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Specify a file containing the class scores for current resource.').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row().'<td>';
     my $upload=&mt("Upload Scores");
     my $upfile_select=&Apache::loncommon::upfile_select_html();
     my $ignore=&mt('Ignore First Line');
@@ -3934,17 +3912,15 @@ sub upcsvScores_form {
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
 <input type="hidden" name="symb" value="$symb" />
 <input type="hidden" name="command" value="csvuploadmap" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 $upfile_select
 <br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" />
-<label><input type="checkbox" name="noFirstLine" />$ignore</label>
 </form>
 ENDUPFORM
     $result.=&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
-                           &mt("How do I create a CSV file from a spreadsheet"))
-    .'</td></tr></table>'."\n";
-    $result.='</td></tr></table><br /><br />'."\n";
-    $result.=&show_grading_menu_form($symb);
+                           &mt("How do I create a CSV file from a spreadsheet")).
+             '</td>'.
+            &Apache::loncommon::end_data_table_row().
+            &Apache::loncommon::end_data_table();
     return $result;
 }
 
@@ -3961,7 +3937,6 @@ sub csvuploadmap {
 	&Apache::loncommon::load_tmp_file($request);
     }
     my @records=&Apache::loncommon::upfile_record_sep();
-    if ($env{'form.noFirstLine'}) { shift(@records); }
     &csvuploadmap_header($request,$symb,$datatoken,$#records+1);
     my ($i,$keyfields);
     if (@records) {
@@ -3991,38 +3966,27 @@ sub csvuploadmap {
 	}
     }
     &csvuploadmap_footer($request,$i,$keyfields);
-    $request->print(&show_grading_menu_form($symb));
 
     return '';
 }
 
 sub csvuploadoptions {
     my ($request,$symb)= @_;
-    my $checked=(($env{'form.noFirstLine'})?'1':'0');
-    my $ignore=&mt('Ignore First Line');
+    my $overwrite=&mt('Overwrite any existing score');
     $request->print(<<ENDPICK);
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
-<h3><span class="LC_info">Uploading Class Grade Options</span></h3>
 <input type="hidden" name="command"    value="csvuploadassign" />
-<!--
-<p>
-<label>
-   <input type="checkbox" name="show_full_results" />
-   Show a table of all changes
-</label>
-</p>
--->
 <p>
 <label>
    <input type="checkbox" name="overwite_scores" checked="checked" />
-   Overwrite any existing score
+   $overwrite
 </label>
 </p>
 ENDPICK
     my %fields=&get_fields();
     if (!defined($fields{'domain'})) {
 	my $domform = &Apache::loncommon::select_dom_form($env{'request.role.domain'},'default_domain');
-	$request->print("\n<p> Users are in domain: ".$domform."</p>\n");
+	$request->print("\n<p>".&mt('Users are in domain: [_1]',$domform)."</p>\n");
     }
     foreach my $key (sort(keys(%env))) {
 	if ($key !~ /^form\.(.*)$/) { next; }
@@ -4035,7 +3999,6 @@ ENDPICK
     # FIXME do a check for any invalid user ids?...
     $request->print('<input type="submit" value="Assign Grades" /><br />
 <hr /></form>'."\n");
-    $request->print(&show_grading_menu_form($symb));
     return '';
 }
 
@@ -4062,9 +4025,7 @@ sub csvuploadassign {
     my $error_msg = '';
     &Apache::loncommon::load_tmp_file($request);
     my @gradedata = &Apache::loncommon::upfile_record_sep();
-    if ($env{'form.noFirstLine'}) { shift(@gradedata); }
     my %fields=&get_fields();
-    $request->print('<h3>Assigning Grades</h3>');
     my $courseid=$env{'request.course.id'};
     my ($classlist) = &getclasslist('all',0);
     my @notallowed;
@@ -4144,14 +4105,20 @@ sub csvuploadassign {
 					   $env{'request.course.id'},
 					   $domain,$username);
 	   if ($result eq 'ok') {
+# Successfully stored
 	      $request->print('.');
-	   } else {
+# Remove from grading queue
+              &Apache::bridgetask::remove_from_queue('gradingqueue',$symb,
+                                             $env{'course.'.$env{'request.course.id'}.'.domain'},
+                                             $env{'course.'.$env{'request.course.id'}.'.num'},
+                                             $domain,$username);
+              $countdone++;
+           } else {
 	      $request->print("<p><span class=\"LC_error\">".
                               &mt("Failed to save data for student [_1]. Message when trying to save was: [_2]",
                                   "$username:$domain",$result)."</span></p>");
 	   }
 	   $request->rflush();
-	   $countdone++;
         }
     }
     $request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0));
@@ -4164,7 +4131,6 @@ sub csvuploadassign {
 	$request->print(join(', ',@notallowed));
     }
     $request->print("<br />\n");
-    $request->print(&show_grading_menu_form($symb));
     return $error_msg;
 }
 #------------- end of section for handling csv file upload ---------
@@ -4248,8 +4214,7 @@ LISTJAVASCRIPT
     my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
     $result.='<input type="hidden" name="Status"  value="'.$stu_status.'" />'."\n".
 	'<input type="hidden" name="command" value="displayPage" />'."\n".
-	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."<br />\n";
+	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."<br />\n";
 
     $result.='&nbsp;<b>'.&mt('Use CODE').': </b> <input type="text" name="CODE" value="" /> <br />'."\n";
 
@@ -4295,7 +4260,6 @@ LISTJAVASCRIPT
     $studentTable.='<input type="button" '.
                    'onclick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' &rarr;" /></form>'."\n";
 
-    $studentTable.=&show_grading_menu_form($symb);
     $request->print($studentTable);
 
     return '';
@@ -4350,7 +4314,6 @@ sub displayPage {
 
     if (!&canview($usec)) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to view requested student. ([_1])',$env{'form.student'}).'</span>');
-	$request->print(&show_grading_menu_form($symb));
 	return;
     }
     my $result='<h3><span class="LC_info">&nbsp;'.$env{'form.title'}.'</span></h3>';
@@ -4368,14 +4331,12 @@ sub displayPage {
     my $navmap = Apache::lonnavmaps::navmap->new();
     unless (ref($navmap)) {
         $request->print(&navmap_errormsg());
-        $request->print(&show_grading_menu_form($symb));
         return;
     }
     my ($mapUrl, $id, $resUrl)=&Apache::lonnet::decode_symb($env{'form.page'});
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
     if (!$map) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to view requested sequence. ([_1])',$resUrl).'</span>');
-	$request->print(&show_grading_menu_form($symb));
 	return; 
     }
     my $iterator = $navmap->getIterator($map->map_start(),
@@ -4388,8 +4349,7 @@ sub displayPage {
 	'<input type="hidden" name="page"    value="'.$pageTitle.'" />'."\n".
 	'<input type="hidden" name="title"   value="'.$env{'form.title'}.'" />'."\n".
 	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="overRideScore" value="no" />'."\n".
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n";
+	'<input type="hidden" name="overRideScore" value="no" />'."\n";
 
     if (defined($env{'form.CODE'})) {
 	$studentTable.=
@@ -4491,7 +4451,6 @@ sub displayPage {
         '<input type="button" value="'.&mt('Save').'" '.
         'onclick="javascript:checkSubmitPage(this.form,'.$question.');" />'.
         '</form>'."\n";
-    $studentTable.=&show_grading_menu_form($symb);
     $request->print($studentTable);
 
     return '';
@@ -4555,7 +4514,7 @@ sub displaySubByDates {
                     $displaySub[0].='<span class="LC_nobreak"';
                     $displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>'
                                    .' <span class="LC_internal_info">'
-                                   .'('.&mt('Part ID: [_1]',$responseId).')'
+                                   .'('.&mt('Response ID: [_1]',$responseId).')'
                                    .'</span>'
                                    .' <b>';
                     if ($hidden) {
@@ -4629,7 +4588,6 @@ sub updateGradeByPage {
     my $usec=$classlist->{$env{'form.student'}}[5];
     if (!&canmodify($usec)) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to modify requested student ([_1])',$env{'form.student'}).'</span>');
-	$request->print(&show_grading_menu_form($env{'form.symb'}));
 	return;
     }
     my $result='<h3><span class="LC_info">&nbsp;'.$env{'form.title'}.'</span></h3>';
@@ -4648,7 +4606,6 @@ sub updateGradeByPage {
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
     if (!$map) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to grade requested sequence ([_1]).',$resUrl).'</span>');
-	$request->print(&show_grading_menu_form($symb));
 	return; 
     }
     my $iterator = $navmap->getIterator($map->map_start(),
@@ -4774,7 +4731,6 @@ sub updateGradeByPage {
     }
 
     $studentTable.=&Apache::loncommon::end_data_table();
-    $studentTable.=&show_grading_menu_form($env{'form.symb'});
     my $grademsg=($changeflag == 0 ? &mt('No score was changed or updated.') :
 		  &mt('The scores were changed for [quant,_1,problem].',
 		  $changeflag));
@@ -4852,8 +4808,7 @@ the homework problem.
 
 sub defaultFormData {
     my ($symb)=@_;
-    return '<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-     '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />';
+    return '<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />';
 }
 
 
@@ -5148,7 +5103,6 @@ sub scantron_selectphase {
         return;
     }
     my $default_form_data=&defaultFormData($symb);
-    my $grading_menu_button=&show_grading_menu_form($symb);
     my $file_selector=&scantron_uploads($file2grade);
     my $format_selector=&scantron_scantab();
     my $CODE_selector=&scantron_CODElist();
@@ -5310,7 +5264,6 @@ sub scantron_selectphase {
               &Apache::loncommon::end_data_table_row()."\n".
               &Apache::loncommon::end_data_table()."\n".
               '</form><br />');
-    $r->print($grading_menu_button);
     return;
 }
 
@@ -6235,7 +6188,7 @@ sub scantron_do_warning {
 <input type="hidden" name="command" value="scantron_validate" />
 ');
     }
-    $r->print("</form><br />".&show_grading_menu_form($symb));
+    $r->print("</form><br />");
     return '';
 }
 
@@ -6383,7 +6336,7 @@ sub scantron_validate_file {
 	    $r->print(" ".&mt("this scanline saving it for later."));
 	}
     }
-    $r->print(" </form><br />".&show_grading_menu_form($symb));
+    $r->print(" </form><br />");
     return '';
 }
 
@@ -7646,7 +7599,6 @@ SCANTRONFORM
     if ($ssi_error) {
 	$r->print("</form>");
 	&ssi_print_error($r);
-	$r->print(&show_grading_menu_form($symb));
         &Apache::lonnet::remove_lock($lock);
 	return '';		# Dunno why the other returns return '' rather than just returning.
     }
@@ -7724,7 +7676,6 @@ SCANTRONFORM
             $ssi_error = 0; # So end of handler error message does not trigger.
             $r->print("</form>");
             &ssi_print_error($r);
-            $r->print(&show_grading_menu_form($symb));
             &Apache::lonnet::remove_lock($lock);
             return '';      # Why return ''?  Beats me.
         }
@@ -7752,7 +7703,6 @@ SCANTRONFORM
                     $ssi_error = 0; # So end of handler error message does not trigger.
                     $r->print("</form>");
                     &ssi_print_error($r);
-                    $r->print(&show_grading_menu_form($symb));
                     &Apache::lonnet::remove_lock($lock);
                     delete($completedstudents{$uname});
                     return '';
@@ -7808,7 +7758,6 @@ SCANTRONFORM
 #    $r->print("<p>took $lasttime</p>");
 
     $r->print("</form>");
-    $r->print(&show_grading_menu_form($symb));
     return '';
 }
 
@@ -7944,9 +7893,7 @@ sub scantron_upload_scantron_data_save {
 	!&Apache::lonnet::allowed('usc',
 			    $env{'form.domainid'}.'_'.$env{'form.courseid'})) {
 	$r->print(&mt("You are not allowed to upload bubblesheet data to the requested course.")."<br />");
-	if ($symb) {
-	    $r->print(&show_grading_menu_form($symb));
-	} else {
+	unless ($symb) {
 	    $r->print($doanotherupload);
 	}
 	return '';
@@ -7974,7 +7921,7 @@ sub scantron_upload_scantron_data_save {
 	}
     }
     if ($symb) {
-	$r->print(&scantron_selectphase($r,$uploadedfile));
+	$r->print(&scantron_selectphase($r,$uploadedfile,$symb));
     } else {
 	$r->print($doanotherupload);
     }
@@ -8087,7 +8034,6 @@ sub scantron_download_scantron_data {
 	    '.&mt('The requested file name was invalid.').'
         </p>
 ');
-	$r->print(&show_grading_menu_form($symb));
 	return;
     }
     my $orig='/uploaded/'.$cdom.'/'.$cname.'/scantron_orig_'.$file;
@@ -8110,14 +8056,12 @@ sub scantron_download_scantron_data {
 	      '<a href="'.$skipped.'">','</a>').'
     </p>
 ');
-    $r->print(&show_grading_menu_form($symb));
     return '';
 }
 
 sub checkscantron_results {
     my ($r,$symb) = @_;
     if (!$symb) {return '';}
-    my $grading_menu_button=&show_grading_menu_form($symb);
     my $cid = $env{'request.course.id'};
     my %lettdig = &letter_to_digits();
     my $numletts = scalar(keys(%lettdig));
@@ -8270,7 +8214,7 @@ sub checkscantron_results {
                  &Apache::loncommon::end_data_table()).'<br />'.
                  &mt('Differences can occur if submissions were modified using manual grading after a bubblesheet grading pass.').'<br />'.&mt('If unexpected discrepancies were detected, it is recommended that you inspect the original bubblesheets.');  
     }
-    $r->print('</form><br />'.$grading_menu_button);
+    $r->print('</form><br />');
     return;
 }
 
@@ -8412,16 +8356,11 @@ sub letter_to_digits {
 
 #-------------------------- Menu interface -------------------------
 #
-#--- Show a Grading Menu button - Calls the next routine ---
-sub show_grading_menu_form {
-    my ($symb)=@_;
-    my $result.='<br /><form action="/adm/grades" method="post">'."\n".
-	'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="saveState"  value="'.$env{'form.saveState'}.'" />'."\n".
-	'<input type="hidden" name="command" value="gradingmenu" />'."\n".
-	'<input type="submit" name="submit" value="'.&mt('Grading Menu').'" />'."\n".
-	'</form>'."\n";
-    return $result;
+#--- Href with symb and command ---
+
+sub href_symb_cmd {
+    my ($symb,$cmd)=@_;
+    return '/adm/grades?symb='.&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'<>&"').'&command='.$cmd;
 }
 
 sub grading_menu {
@@ -8429,9 +8368,7 @@ sub grading_menu {
     if (!$symb) {return '';}
 
     my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb),
-                  'command'=>'individual',
-                  'gradingMenu'=>1,
-                  'showgrading'=>"yes");
+                  'command'=>'individual');
     
     my $url1a = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
 
@@ -8444,6 +8381,9 @@ sub grading_menu {
     $fields{'command'}='all_for_one';
     my $url1d=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
 
+    $fields{'command'}='downloadfilesselect';
+    my $url1e=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
     $fields{'command'} = 'csvform';
     my $url2 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
     
@@ -8477,11 +8417,17 @@ sub grading_menu {
                                 icon => 'edit-find-replace.png',
                                 linktitle => 'Grade current resource for all students.'
                         },
-                        {       linktext => 'Grade complete page/sequence/folder for one student',
+                        {       linktext => 'Grade page/folder for one student',
                                 url => $url1d,
                                 permission => 'F',
                                 icon => 'edit-find-replace.png',
                                 linktitle => 'Grade all resources in current page/sequence/folder for one student.'
+                        },
+                        {       linktext => 'Download submissions',
+                                url => $url1e,
+                                permission => 'F',
+                                icon => 'edit-find-replace.png',
+                                linktitle => 'Download all students submissions.'
                         }]},
                          { categorytitle=>'Automated Grading',
                items =>[
@@ -8504,7 +8450,7 @@ sub grading_menu {
                     		icon => 'stat.png',
                     		linktitle => 'Grade scantron exams, upload/download scantron data files, and review previously graded scantron exams.'
                 	    },
-                            {   linktext => 'Verify Receipt No.',
+                            {   linktext => 'Verify Receipt Number',
                                 url => $url5,
                                 permission => 'F',
                                 icon => 'edit-find-replace.png',
@@ -8518,9 +8464,7 @@ sub grading_menu {
     my $Str;
     $Str .= '<form method="post" action="" name="gradingMenu">';
     $Str .= '<input type="hidden" name="command" value="" />'.
-    	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="gradingMenu" value="1" />'."\n".
-	'<input type="hidden" name="showgrading" value="yes" />'."\n";
+    	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
 
     $Str .= &Apache::lonhtmlcommon::generate_menu(@menu);
     return $Str;    
@@ -8539,22 +8483,14 @@ sub submit_options_sequence {
     my $result;
 
     $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
-        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-        '<input type="hidden" name="gradingMenu" value="1" />'."\n".
-        '<input type="hidden" name="showgrading" value="yes" />'."\n";
-
-    $result.='
-<h2>
-  '.&mt('Grade complete page/sequence/folder for one student').'
-</h2>'.
-            &selectfield(0).
+        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+    $result.=&selectfield(0).
             '<input type="hidden" name="command" value="pickStudentPage" />
             <div>
               <input type="submit" value="'.&mt('Next').' &rarr;" />
             </div>
         </div>
   </form>';
-    $result .= &show_grading_menu_form($symb);
     return $result;
 }
 
@@ -8565,26 +8501,39 @@ sub submit_options_table {
     my $result;
 
     $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
-        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-        '<input type="hidden" name="gradingMenu" value="1" />'."\n".
-        '<input type="hidden" name="showgrading" value="yes" />'."\n";
+        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
 
-    $result.='
-<h2>
-  '.&mt('Grading table').'
-</h2>'.
-            &selectfield(0).
+    $result.=&selectfield(0).
             '<input type="hidden" name="command" value="viewgrades" />
             <div>
               <input type="submit" value="'.&mt('Next').' &rarr;" />
             </div>
         </div>
   </form>';
-    $result .= &show_grading_menu_form($symb);
     return $result;
 }
 
+sub submit_options_download {
+    my ($request,$symb) = @_;
+    if (!$symb) {return '';}
 
+    &commonJSfunctions($request);
+
+    my $result='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
+        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+    $result.='
+<h2>
+  '.&mt('Select Students for Which to Download Submissions').'
+</h2>'.&selectfield(1).'
+                <input type="hidden" name="command" value="downloadfileslink" /> 
+              <input type="submit" value="'.&mt('Next').' &rarr;" />
+            </div>
+          </div>
+
+
+  </form>';
+    return $result;
+}
 
 #--- Displays the submissions first page -------
 sub submit_options {
@@ -8595,14 +8544,8 @@ sub submit_options {
     my $result;
 
     $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
-	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="gradingMenu" value="1" />'."\n".
-	'<input type="hidden" name="showgrading" value="yes" />'."\n";
-
-    $result.='
-<h2>
-  '.&mt('Select individual students to grade').'
-</h2>'.&selectfield(1).'
+	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+    $result.=&selectfield(1).'
                 <input type="hidden" name="command" value="submission" /> 
 	      <input type="submit" value="'.&mt('Next').' &rarr;" />
             </div>
@@ -8610,7 +8553,6 @@ sub submit_options {
 
 
   </form>';
-    $result .= &show_grading_menu_form($symb);
     return $result;
 }
 
@@ -8745,11 +8687,11 @@ sub process_clicker {
     my ($r,$symb)=@_;
     if (!$symb) {return '';}
     my $result=&checkforfile_js();
-    $result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n";
-    $result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n";
-    $result.='&nbsp;<b>'.&mt('Specify a file containing the clicker information for this resource.').
-        '</b></td></tr>'."\n";
-    $result.='<tr bgcolor="#ffffe6"><td>'."\n";
+    $result.=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Specify a file containing clicker information and set grading options.').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row()."<td>\n";
 # Attempt to restore parameters from last session, set defaults if not present
     my %Saveable_Parameters=&clicker_grading_parameters();
     &Apache::loncommon::restore_course_settings('grades_clicker',
@@ -8766,7 +8708,7 @@ sub process_clicker {
        }
     }
 
-    my $upload=&mt("Upload File");
+    my $upload=&mt("Evaluate File");
     my $type=&mt("Type");
     my $attendance=&mt("Award points just for participation");
     my $personnel=&mt("Correctness determined from response by course personnel");
@@ -8822,10 +8764,12 @@ ENDUPFORM
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
 <input type="hidden" name="symb" value="$symb" />
 <input type="hidden" name="command" value="processclickerfile" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 <input type="file" name="upfile" size="50" />
 <br /><label>$type: $selectform</label>
-<br /><label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label>
+ENDUPFORM
+    $result.='</td>'.&Apache::loncommon::end_data_table_row().
+                     &Apache::loncommon::start_data_table_row().'<td>'.(<<ENDGRADINGFORM);
+      <label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label>
 <br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onclick="sanitycheck()" />$personnel</label>
 <br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onclick="sanitycheck()" />$specific </label>
 <input type="text" name="specificid" value="$env{'form.specificid'}" size="20" />
@@ -8833,14 +8777,17 @@ ENDUPFORM
 <br />&nbsp;&nbsp;&nbsp;
 <input type="text" name="givenanswer" size="50" />
 <input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" />
-<br /><label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label>
+ENDGRADINGFORM
+         $result.='</td>'.&Apache::loncommon::end_data_table_row().
+                     &Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM);
+      <label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label>
 <br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label>
 <br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" />
 </form>'
-ENDUPFORM
-    $result.='</td></tr></table>'."\n".
-             '</td></tr></table><br /><br />'."\n";
-    $result.=&show_grading_menu_form($symb);
+ENDPERCFORM
+    $result.='</td>'.
+             &Apache::loncommon::end_data_table_row().
+             &Apache::loncommon::end_data_table();
     return $result;
 }
 
@@ -8854,11 +8801,11 @@ sub process_clicker_file {
     my $result='';
     if (($env{'form.gradingmechanism'} eq 'specific') && ($env{'form.specificid'}!~/\w/)) {
 	$result.='<span class="LC_error">'.&mt('You need to specify a clicker ID for the correct answer').'</span>';
-	return $result.&show_grading_menu_form($symb);
+	return $result;
     }
     if (($env{'form.gradingmechanism'} eq 'given') && ($env{'form.givenanswer'}!~/\S/)) {
         $result.='<span class="LC_error">'.&mt('You need to specify the correct answer').'</span>';
-        return $result.&show_grading_menu_form($symb);
+        return $result;
     }
     my $foundgiven=0;
     if ($env{'form.gradingmechanism'} eq 'given') {
@@ -8905,7 +8852,7 @@ sub process_clicker_file {
         $result.="</p>\n";
 	if ($number==0) {
 	    $result.='<span class="LC_error">'.&mt('No IDs found to determine correct answer').'</span>';
-	    return $result.&show_grading_menu_form($symb);
+	    return $result;
 	}
     }
     if (length($env{'form.upfile'}) < 2) {
@@ -8913,22 +8860,22 @@ sub process_clicker_file {
 		     '<span class="LC_error">',
 		     '</span>',
 		     '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>');
-        return $result.&show_grading_menu_form($symb);
+        return $result;
     }
 
 # Were able to get all the info needed, now analyze the file
 
     $result.=&Apache::loncommon::studentbrowser_javascript();
     $symb = &Apache::lonenc::check_encrypt($symb);
-    my $heading=&mt('Scanning clicker file');
-    $result.=(<<ENDHEADER);
-<br /><table width="100%" border="0"><tr><td bgcolor="#777777">
-<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>
-<b>$heading</b></td></tr><tr bgcolor=#ffffe6><td>
+    $result.=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Evaluate clicker file').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row().(<<ENDHEADER);
+<td>
 <form method="post" action="/adm/grades" name="clickeranalysis">
 <input type="hidden" name="symb" value="$symb" />
 <input type="hidden" name="command" value="assignclickergrades" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 <input type="hidden" name="gradingmechanism" value="$env{'form.gradingmechanism'}" />
 <input type="hidden" name="pcorrect" value="$env{'form.pcorrect'}" />
 <input type="hidden" name="pincorrect" value="$env{'form.pincorrect'}" />
@@ -8953,7 +8900,7 @@ ENDHEADER
              '<br />';
     if (($env{'form.gradingmechanism'} eq 'given') && ($number!=$foundgiven)) {
        $result.='<span class="LC_error">'.&mt('Number of given answers does not agree with number of questions in file.').'</span>';
-       return $result.&show_grading_menu_form($symb);
+       return $result;
     } 
 # Remember Question Titles
 # FIXME: Possibly need delimiter other than ":"
@@ -8973,7 +8920,9 @@ ENDHEADER
        } elsif ($clicker_ids{$id}) {
           if ($clicker_ids{$id}=~/\,/) {
 # More than one user with the same clicker!
-             $result.="\n<hr />".&mt('Clicker registered more than once').": <tt>".$id."</tt><br />";
+             $result.="</td>".&Apache::loncommon::end_data_table_row().
+                           &Apache::loncommon::start_data_table_row()."<td>".
+                       &mt('Clicker registered more than once').": <tt>".$id."</tt><br />";
              $result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'.
                            "<select name='multi".$id."'>";
              foreach my $reguser (sort(split(/\,/,$clicker_ids{$id}))) {
@@ -8987,7 +8936,9 @@ ENDHEADER
              $student_count++;
           }
        } else {
-          $result.="\n<hr />".&mt('Unregistered Clicker')." <tt>".$id."</tt><br />";
+          $result.="</td>".&Apache::loncommon::end_data_table_row().
+                           &Apache::loncommon::start_data_table_row()."<td>".
+                    &mt('Unregistered Clicker')." <tt>".$id."</tt><br />";
           $result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'.
                    "\n".&mt("Username").": <input type='text' name='uname".$id."' />&nbsp;".
                    "\n".&mt("Domain").": ".
@@ -9013,9 +8964,10 @@ ENDHEADER
     } else {
        $result.='<br /><input type="submit" name="finalize" value="'.&mt('Finalize Grading').'" />';
     }
-    $result.='</form></td></tr></table>'."\n".
-             '</td></tr></table><br /><br />'."\n";
-    return $result.&show_grading_menu_form($symb);
+    $result.='</form></td>'.
+             &Apache::loncommon::end_data_table_row().
+             &Apache::loncommon::end_data_table();
+    return $result;
 }
 
 sub iclicker_eval {
@@ -9088,14 +9040,11 @@ sub assign_clicker_grades {
 # FIXME: This should probably look for the first handgradeable part
     my $part=$$partlist[0];
 # Start screen output
-    my $result='';
-
-    my $heading=&mt('Assigning grades based on clicker file');
-    $result.=(<<ENDHEADER);
-<br /><table width="100%" border="0"><tr><td bgcolor="#777777">
-<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>
-<b>$heading</b></td></tr><tr bgcolor=#ffffe6><td>
-ENDHEADER
+    my $result=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Assigning grades based on clicker file').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row().'<td>';
 # Get correct result
 # FIXME: Possibly need delimiter other than ":"
     my @correct=();
@@ -9130,6 +9079,7 @@ ENDHEADER
     my $pcorrect=$env{'form.pcorrect'};
     my $pincorrect=$env{'form.pincorrect'};
     my $storecount=0;
+    my %users=();
     foreach my $key (keys(%env)) {
        my $user='';
        if ($key=~/^form\.student\:(.*)$/) {
@@ -9143,7 +9093,13 @@ ENDHEADER
              $user=$env{'form.multi'.$id};
           }
        }
-       if ($user) { 
+       if ($user) {
+          if ($users{$user}) {
+             $result.='<br /><span class="LC_warning">'.
+                      &mt("More than one entry found for <tt>[_1]</tt>!",$user).
+                      '</span><br />';
+          }
+          $users{$user}=1; 
           my @answer=split(/\,/,$env{$key});
           my $sum=0;
           my $realnumber=$number;
@@ -9183,9 +9139,10 @@ ENDHEADER
     }
 # We are done
     $result.='<br />'.&mt('Successfully stored grades for [quant,_1,student].',$storecount).
-             '</td></tr></table>'."\n".
-             '</td></tr></table><br /><br />'."\n";
-    return $result.&show_grading_menu_form($symb);
+             '</td>'.
+             &Apache::loncommon::end_data_table_row().
+             &Apache::loncommon::end_data_table();
+    return $result;
 }
 
 sub navmap_errormsg {
@@ -9196,11 +9153,22 @@ sub navmap_errormsg {
 }
 
 sub startpage {
-    my ($r,$symb,$crumbs,$onlyfolderflag) = @_;
-    unshift(@$crumbs,{href=>"/adm/grades?command=gradingmenu&symb=".&HTML::Entities::encode($symb,'<>&"'),text=>"Grading"});
+    my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag) = @_;
+    unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
     $r->print(&Apache::loncommon::start_page('Grading',undef,
                                           {'bread_crumbs' => $crumbs}));
-    $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag));
+    $r->print('<h3>'.$$crumbs[-1]{'text'}.'</h3>');
+    unless ($nodisplayflag) {
+       $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag));
+    }
+}
+
+sub select_problem {
+    my ($r)=@_;
+    $r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">');
+    $r->print(&Apache::lonstathelpers::problem_selector('.',undef,1));
+    $r->print('<input type="hidden" name="command" value="gradingmenu" />');
+    $r->print('<input type="submit" value="'.&mt('Next').' &rarr;" /></form>');
 }
 
 sub handler {
@@ -9234,79 +9202,96 @@ sub handler {
     &Apache::lonenc::check_decrypt(\$symb);                             
 
     $ssi_error = 0;
-    if ($symb eq '' && $command eq '') {
+    if ($symb eq '' || $command eq '') {
 #
 # Not called from a resource
 #    
-
+        &startpage($request,undef,[],1,1);
+        &select_problem($request);
     } else {
 	&init_perm();
 	if ($command eq 'submission' && $perm{'vgr'}) {
             &startpage($request,$symb,[{href=>"", text=>"Student Submissions"}]);
 	    ($env{'form.student'} eq '' ? &listStudents($request,$symb) : &submission($request,0,0,$symb));
 	} elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
+                                       {href=>'',text=>'Select student'}],1,1);
 	    &pickStudentPage($request,$symb);
 	} elsif ($command eq 'displayPage' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,
+                                      [{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
+                                       {href=>'',text=>'Select student'},
+                                       {href=>'',text=>'Grade student'}],1,1);
 	    &displayPage($request,$symb);
 	} elsif ($command eq 'gradeByPage' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
+                                       {href=>'',text=>'Select student'},
+                                       {href=>'',text=>'Grade student'},
+                                       {href=>'',text=>'Store grades'}],1,1);
 	    &updateGradeByPage($request,$symb);
 	} elsif ($command eq 'processGroup' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'',text=>'...'},
+                                       {href=>'',text=>'Modify grades'}]);
 	    &processGroup($request,$symb);
 	} elsif ($command eq 'gradingmenu' && $perm{'vgr'}) {
             &startpage($request,$symb);
 	    $request->print(&grading_menu($request,$symb));
 	} elsif ($command eq 'individual' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'',text=>'Select individual students to grade'}]);
 	    $request->print(&submit_options($request,$symb));
         } elsif ($command eq 'ungraded' && $perm{'vgr'}) {
-            &startpage($request,$symb);
-            $request->print(&submit_options($request,$symb));
+            &startpage($request,$symb,[{href=>'',text=>'Grade ungraded submissions'}]);
+            $request->print(&listStudents($request,$symb,'graded'));
         } elsif ($command eq 'table' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>"", text=>"Grading table"}]);
             $request->print(&submit_options_table($request,$symb));
         } elsif ($command eq 'all_for_one' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'',text=>'Grade page/folder for one student'}],1,1);
             $request->print(&submit_options_sequence($request,$symb));
 	} elsif ($command eq 'viewgrades' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,"table"), text=>"Grading table"},{href=>'', text=>"Modify grades"}]);
 	    $request->print(&viewgrades($request,$symb));
 	} elsif ($command eq 'handgrade' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'',text=>'...'},
+                                       {href=>'',text=>'Store grades'}]);
 	    $request->print(&processHandGrade($request,$symb));
 	} elsif ($command eq 'editgrades' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,"table"), text=>"Grading table"},
+                                       {href=>&href_symb_cmd($symb,'viewgrades').'&group=all&section=all&Status=Active',
+                                                                             text=>"Modify grades"},
+                                       {href=>'', text=>"Store grades"}]);
 	    $request->print(&editgrades($request,$symb));
         } elsif ($command eq 'initialverifyreceipt' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'',text=>'Verify Receipt Number'}]);
             $request->print(&initialverifyreceipt($request,$symb));
 	} elsif ($command eq 'verify' && $perm{'vgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,"initialverifyreceipt"),text=>'Verify Receipt Number'},
+                                       {href=>'',text=>'Verification Result'}]);
 	    $request->print(&verifyreceipt($request,$symb));
         } elsif ($command eq 'processclicker' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Process clicker'}]);
             $request->print(&process_clicker($request,$symb));
         } elsif ($command eq 'processclickerfile' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'processclicker'), text=>'Process clicker'},
+                                       {href=>'', text=>'Process clicker file'}]);
             $request->print(&process_clicker_file($request,$symb));
         } elsif ($command eq 'assignclickergrades' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'processclicker'), text=>'Process clicker'},
+                                       {href=>'', text=>'Process clicker file'},
+                                       {href=>'', text=>'Store grades'}]);
             $request->print(&assign_clicker_grades($request,$symb));
 	} elsif ($command eq 'csvform' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
 	    $request->print(&upcsvScores_form($request,$symb));
 	} elsif ($command eq 'csvupload' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
 	    $request->print(&csvupload($request,$symb));
 	} elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
 	    $request->print(&csvuploadmap($request,$symb));
 	} elsif ($command eq 'csvuploadoptions' && $perm{'mgr'}) {
 	    if ($env{'form.associate'} ne 'Reverse Association') {
-                &startpage($request,$symb);
+                &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
 		$request->print(&csvuploadoptions($request,$symb));
 	    } else {
 		if ( $env{'form.upfile_associate'} ne 'reverse' ) {
@@ -9314,43 +9299,51 @@ sub handler {
 		} else {
 		    $env{'form.upfile_associate'} = 'forward';
 		}
-                &startpage($request,$symb);
+                &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
 		$request->print(&csvuploadmap($request,$symb));
 	    }
 	} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
 	    $request->print(&csvuploadassign($request,$symb));
 	} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {
-            &startpage($request,$symb);
-	    $request->print(&scantron_selectphase($request,$symb));
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+	    $request->print(&scantron_selectphase($request,undef,$symb));
  	} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
  	    $request->print(&scantron_do_warning($request,$symb));
 	} elsif ($command eq 'scantron_validate' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
 	    $request->print(&scantron_validate_file($request,$symb));
 	} elsif ($command eq 'scantron_process' && $perm{'mgr'}) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
 	    $request->print(&scantron_process_students($request,$symb));
  	} elsif ($command eq 'scantronupload' && 
  		 (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
 		  &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
  	    $request->print(&scantron_upload_scantron_data($request,$symb)); 
  	} elsif ($command eq 'scantronupload_save' &&
  		 (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
 		  &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
  	    $request->print(&scantron_upload_scantron_data_save($request,$symb));
  	} elsif ($command eq 'scantron_download' &&
 		 &Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
  	    $request->print(&scantron_download_scantron_data($request,$symb));
         } elsif ($command eq 'checksubmissions' && $perm{'vgr'}) {
-            &startpage($request,$symb);
-            $request->print(&checkscantron_results($request,$symb));     
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+            $request->print(&checkscantron_results($request,$symb));
+        } elsif ($command eq 'downloadfilesselect' && $perm{'vgr'}) {
+            &startpage($request,$symb,[{href=>'', text=>'Select which submissions to download'}]);
+            $request->print(&submit_options_download($request,$symb));
+         } elsif ($command eq 'downloadfileslink' && $perm{'vgr'}) {
+            &startpage($request,$symb,
+   [{href=>&href_symb_cmd($symb,'downloadfilesselect'), text=>'Select which submissions to download'},
+    {href=>'', text=>'Download submissions'}]);
+            &submit_download_link($request,$symb);
 	} elsif ($command) {
-            &startpage($request,$symb);
+            &startpage($request,$symb,[{href=>'', text=>'Access denied'}]);
 	    $request->print('<p class="LC_error">'.&mt('Access Denied ([_1])',$command).'</p>');
 	}
     }