--- loncom/homework/grades.pm	2013/08/16 15:36:08	1.596.2.12.2.19
+++ loncom/homework/grades.pm	2012/12/10 01:13:08	1.677
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.596.2.12.2.19 2013/08/16 15:36:08 raeburn Exp $
+# $Id: grades.pm,v 1.677 2012/12/10 01:13:08 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -43,6 +43,8 @@ use Apache::lonmsg();
 use Apache::Constants qw(:common :http);
 use Apache::lonlocal;
 use Apache::lonenc;
+use Apache::lonstathelpers;
+use Apache::lonquickgrades;
 use Apache::bridgetask();
 use String::Similarity;
 use LONCAPA;
@@ -98,6 +100,9 @@ sub ssi_print_error {
 
 #
 # --- Retrieve the parts from the metadata file.---
+# Returns an array of everything that the resources stores away
+#
+
 sub getpartlist {
     my ($symb,$errorref) = @_;
 
@@ -122,24 +127,6 @@ sub getpartlist {
     return @stores;
 }
 
-# --- Get the symbolic name of a problem and the url
-sub get_symb {
-    my ($request,$silent) = @_;
-    my $symb=$env{'form.symb'};
-    unless ($symb) {
-        (my $url=$env{'form.url'}) =~ s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
-        $symb = &Apache::lonnet::symbread($url);
-        if ($symb eq '') { 
-	    if (!$silent) {
-                $request->print(&mt("Unable to handle ambiguous references: [_1].",$url));
-	        return ();
-	    }
-        }
-    }
-    &Apache::lonenc::check_decrypt(\$symb);
-    return ($symb);
-}
-
 #--- Format fullname, username:domain if different for display
 #--- Use anywhere where the student names are listed
 sub nameUserString {
@@ -154,6 +141,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) = @_;
 
@@ -212,55 +200,6 @@ sub get_display_part {
     return $display;
 }
 
-#--- Show resource title
-#--- and parts and response type
-sub showResourceInfo {
-    my ($symb,$probTitle,$checkboxes,$res_error) = @_;
-    my $result = '<h3>'.&mt('Current Resource').': '.$probTitle.'</h3>'."\n";
-    my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error);
-    if (ref($res_error)) {
-        if ($$res_error) {
-            return;
-        }
-    }
-    $result.=&Apache::loncommon::start_data_table()
-            .&Apache::loncommon::start_data_table_header_row();
-    if ($checkboxes) {
-        $result.='<th>&nbsp;</th>';
-    }
-    $result.='<th>'.&mt('Problem Part').'</th>'
-            .'<th>'.&mt('Res. ID').'</th>'
-            .'<th>'.&mt('Type').'</th>'
-            .&Apache::loncommon::end_data_table_header_row();
-    my %resptype = ();
-    my $hdgrade='no';
-    my %partsseen;
-    foreach my $partID (sort(keys(%$responseType))) {
-        foreach my $resID (sort(keys(%{ $responseType->{$partID} }))) {
-            my $handgrade=$$handgrade{$partID.'_'.$resID};
-            my $responsetype = $responseType->{$partID}->{$resID};
-            $hdgrade = $handgrade if ($handgrade eq 'yes');
-            $result.=&Apache::loncommon::start_data_table_row();
-            if ($checkboxes) {
-                if (exists($partsseen{$partID})) {
-                    $result.="<td>&nbsp;</td>";
-                } else {
-                    $result.="<td><input type='checkbox' name='vPart' value='$partID' checked='checked' /></td>";
-                }
-                $partsseen{$partID}=1;
-            }
-            my $display_part=&get_display_part($partID,$symb);
-            $result.='<td>'.$display_part.'</td>'
-                    .'<td>'.'<span class="LC_internal_info">'.$resID.'</span></td>'
-                    .'<td>'.&mt($responsetype).'</td>'
-#                   .'<td><b>'.&mt('Handgrade: [_1]',$handgrade).'</b></td>'
-                    .&Apache::loncommon::end_data_table_row();
-        }
-    }
-    $result.=&Apache::loncommon::end_data_table();
-    return $result,$responseType,$hdgrade,$partlist,$handgrade;
-}
-
 sub reset_caches {
     &reset_analyze_cache();
     &reset_perm();
@@ -362,7 +301,7 @@ sub reset_caches {
             if ($check_for_randomlist) {
                 $add_to_form = { 'check_parts_withrandomlist' => 1,};
             }
-            my $analyze =
+            my $analyze = 
                 &get_analyze($symb,$uname,$udom,undef,$add_to_form,
                              undef,undef,undef,$bubbles_per_row);
             if (ref($analyze) eq 'HASH') {
@@ -509,8 +448,7 @@ sub cleanRecord {
 #-- A couple of common js functions
 sub commonJSfunctions {
     my $request = shift;
-    $request->print(<<COMMONJSFUNCTIONS);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<COMMONJSFUNCTIONS));
     function radioSelection(radioButton) {
 	var selection=null;
 	if (radioButton.length > 1) {
@@ -538,7 +476,6 @@ sub commonJSfunctions {
 	    return selectOne.value;
 	}
     }
-</script>
 COMMONJSFUNCTIONS
 }
 
@@ -693,17 +630,15 @@ sub student_gradeStatus {
 sub jscriptNform {
     my ($symb) = @_;
     my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
-    my $jscript='<script type="text/javascript" language="javascript">'."\n".
+    my $jscript= &Apache::lonhtmlcommon::scripttag(
 	'    function viewOneStudent(user,domain) {'."\n".
 	'	document.onestudent.student.value = user;'."\n".
 	'	document.onestudent.userdom.value = domain;'."\n".
 	'	document.onestudent.submit();'."\n".
 	'    }'."\n".
-	'</script>'."\n";
+	"\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="probTitle" value="'.$env{'form.probTitle'}.'" />'."\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".
@@ -797,22 +732,31 @@ sub most_similar {
 
 #------------------------------------ Receipt Verification Routines
 #
+
+sub initialverifyreceipt {
+   my ($request,$symb) = @_;
+   &commonJSfunctions($request);
+   return '<form name="gradingMenu"><input type="submit" value="'.&mt('Verify Receipt Number.').'" />'.
+        &Apache::lonnet::recprefix($env{'request.course.id'}).
+        '-<input type="text" name="receipt" size="4" />'.
+        '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
+        '<input type="hidden" name="command" value="verify" />'.
+        "</form>\n";
+}
+
 #--- Check whether a receipt number is valid.---
 sub verifyreceipt {
-    my $request  = shift;
+    my ($request,$symb)  = @_;
 
     my $courseid = $env{'request.course.id'};
     my $receipt  = &Apache::lonnet::recprefix($courseid).'-'.
 	$env{'form.receipt'};
     $receipt     =~ s/[^\-\d]//g;
-    my ($symb)   = &get_symb($request);
 
     my $title.=
 	'<h3><span class="LC_info">'.
-	&mt('Verifying Receipt No. [_1]',$receipt).
-	'</span></h3>'."\n".
-	'<h4>'.&mt('<b>Resource: </b>[_1]',$env{'form.probTitle'}).
-	'</h4>'."\n";
+	&mt('Verifying Receipt Number [_1]',$receipt).
+	'</span></h3>'."\n";
 
     my ($string,$contents,$matches) = ('','',0);
     my (undef,undef,$fullname) = &getclasslist('all','0');
@@ -882,7 +826,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.
@@ -890,30 +834,25 @@ sub verifyreceipt {
 #--- Also called directly when one clicks on the subm button 
 #    on the problem page.
 sub listStudents {
-    my ($request) = shift;
+    my ($request,$symb,$submitonly) = @_;
 
-    my ($symb) = &get_symb($request);
     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';
-    $env{'form.probTitle'} = $env{'form.probTitle'} eq '' ? 
-	&Apache::lonnet::gettitle($symb) : $env{'form.probTitle'};
-
-    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 ($table,undef,$hdgrade,$partlist,$handgrade) = &showResourceInfo($symb,$env{'form.probTitle'},($env{'form.showgrading'} eq 'yes'));
+    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.',
 		'single'   => 'Please select the student before clicking on the Next button.',
 	     );
-    $request->print(<<LISTJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT));
     function checkSelect(checkBox) {
 	var ctr=0;
 	var sense="";
@@ -942,16 +881,13 @@ sub listStudents {
 	formname.command.value = 'submission';
 	formname.submit();
     }
-</script>
 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".$table;
+	"\n";
 	
     $gradeTable .= &Apache::lonhtmlcommon::start_pick_box();
     $gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text'))
@@ -966,22 +902,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" /> '.
@@ -1002,14 +934,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="probTitle"   value="'.$env{'form.probTitle'}.'" />'."\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'))
@@ -1024,7 +952,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>';
 
@@ -1041,9 +969,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);
@@ -1079,9 +1005,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;
@@ -1122,7 +1046,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";
@@ -1136,9 +1060,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>';
 		}
@@ -1169,7 +1091,6 @@ LISTJAVASCRIPT
     } elsif ($ctr == 1) {
 	$gradeTable =~ s/type="checkbox"/type="checkbox" checked="checked"/;
     }
-    $gradeTable.=&show_grading_menu_form($symb);
     $request->print($gradeTable);
     return '';
 }
@@ -1178,7 +1099,7 @@ LISTJAVASCRIPT
 
 sub check_script {
     my ($form, $type)=@_;
-    my $chkallscript='<script type="text/javascript">
+    my $chkallscript= &Apache::lonhtmlcommon::scripttag('
     function checkall() {
         for (i=0; i<document.forms.'.$form.'.elements.length; i++) {
             ele = document.forms.'.$form.'.elements[i];
@@ -1209,7 +1130,7 @@ sub check_script {
         }
     }
 
-</script>'."\n";
+'."\n");
     return $chkallscript;
 }
 
@@ -1223,7 +1144,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;
@@ -1233,7 +1154,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 '';
@@ -1248,8 +1169,7 @@ sub processGroup {
 sub sub_page_js {
     my $request = shift;
 	    my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = ');
-    $request->print(<<SUBJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT));
     function updateRadio(formname,id,weight) {
 	var gradeBox = formname["GD_BOX"+id];
 	var radioButton = formname["RADVAL"+id];
@@ -1371,13 +1291,6 @@ sub sub_page_js {
 	    }
 	    
 	}
-	if (val == "Grade Student") {
-	    formname.showgrading.value = "yes";
-	    if (formname.Status.value == "") {
-		formname.Status.value = "Active";
-	    }
-	    formname.studentNo.value = total;
-	}
 	formname.submit();
     }
 
@@ -1417,7 +1330,6 @@ sub sub_page_js {
 
 	formname.submit();
     }
-</script>
 SUBJAVASCRIPT
 }
 
@@ -1427,8 +1339,8 @@ sub sub_page_kw_js {
     my $iconpath = $request->dir_config('lonIconsURL');
     &commonJSfunctions($request);
 
-    my $inner_js_msg_central=<<INNERJS;
-    <script text="text/javascript">
+    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;
@@ -1465,11 +1377,11 @@ sub sub_page_kw_js {
       self.close()
 
     }
-    </script>
+</script>
 INNERJS
 
-    my $inner_js_highlight_central=<<INNERJS;
- <script type="text/javascript">
+    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);
@@ -1520,8 +1432,7 @@ INNERJS
                 font => 'Font Size',
                 fnst => 'Font Style',
              );
-    $request->print(<<SUBJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT));
 
 //===================== Show list of keywords ====================
   function keywords(formname) {
@@ -1635,39 +1546,38 @@ INNERJS
 
     pDoc.write("<form action=\\"inactive\\" name=\\"msgcenter\\">");
     pDoc.write("<input value=\\""+usrctr+"\\" name=\\"usrctr\\" type=\\"hidden\\">");
-    pDoc.write("<h3><span class=\\"LC_info\\">&nbsp;$lt{'comp'}\"+fullname+\"<\\/span><\\/h3><br /><br />");
+    pDoc.write("<h1>&nbsp;$lt{'comp'}\"+fullname+\"<\\/h1>");
 
-    pDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">');
-    pDoc.write('<table border="0" width="100%"><tr bgcolor="#DDFFFF">');
-    pDoc.write("<td><b>$lt{'type'}<\\/b><\\/td><td><b>$lt{'incl'}<\\/b><\\/td><td><b>$lt{'mesa'}<\\/td><\\/tr>");
+    pDoc.write('<table style="border:1px solid black;"><tr>');
+    pDoc.write("<td><b>$lt{'incl'}<\\/b><\\/td><td><b>$lt{'type'}<\\/b><\\/td><td><b>$lt{'mesa'}<\\/td><\\/tr>");
 }
     function displaySubject(msg,shwsel) {
     pDoc = pWin.document;
-    pDoc.write("<tr bgcolor=\\"#ffffdd\\">");
-    pDoc.write("<td>$lt{'subj'}<\\/td>");
+    pDoc.write("<tr>");
     pDoc.write("<td align=\\"center\\"><input name=\\"subchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>");
-    pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"><\\/td><\\/tr>");
+    pDoc.write("<td>$lt{'subj'}<\\/td>");
+    pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"40\\" maxlength=\\"80\\"><\\/td><\\/tr>");
 }
 
   function displaySavedMsg(ctr,msg,shwsel) {
     pDoc = pWin.document;
-    pDoc.write("<tr bgcolor=\\"#ffffdd\\">");
-    pDoc.write("<td align=\\"center\\">"+ctr+"<\\/td>");
+    pDoc.write("<tr>");
     pDoc.write("<td align=\\"center\\"><input name=\\"msgn"+ctr+"\\" type=\\"checkbox\\"" +shwsel+"><\\/td>");
+    pDoc.write("<td align=\\"center\\">"+ctr+"<\\/td>");
     pDoc.write("<td><textarea name=\\"msg"+ctr+"\\" cols=\\"60\\" rows=\\"3\\">"+msg+"<\\/textarea><\\/td><\\/tr>");
 }
 
   function newMsg(newmsg,shwsel) {
     pDoc = pWin.document;
-    pDoc.write("<tr bgcolor=\\"#ffffdd\\">");
-    pDoc.write("<td align=\\"center\\">$lt{'new'}<\\/td>");
+    pDoc.write("<tr>");
     pDoc.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>");
+    pDoc.write("<td align=\\"center\\">$lt{'new'}<\\/td>");
     pDoc.write("<td><textarea name=\\"newmsg\\" cols=\\"60\\" rows=\\"3\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" >"+newmsg+"<\\/textarea><\\/td><\\/tr>");
 }
 
   function msgTail() {
     pDoc = pWin.document;
-    pDoc.write("<\\/table>");
+    //pDoc.write("<\\/table>");
     pDoc.write("<\\/td><\\/tr><\\/table>&nbsp;");
     pDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:checkInput()\\">&nbsp;&nbsp;");
     pDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />");
@@ -1750,7 +1660,6 @@ INNERJS
     hDoc.close();
   }
 
-</script>
 SUBJAVASCRIPT
 }
 
@@ -1793,7 +1702,7 @@ sub gradeBox {
     $wgt       = ($wgt > 0 ? $wgt : '1');
     my $score  = ($$record{'resource.'.$partid.'.awarded'} eq '' ?
 		  '' : &compute_points($$record{'resource.'.$partid.'.awarded'},$wgt));
-    my $data_WGT='<input type="hidden" name="WGT'.$counter.'_'.$partid.'" value="'.$wgt.'" />'."\n";
+    my $result='<input type="hidden" name="WGT'.$counter.'_'.$partid.'" value="'.$wgt.'" />'."\n";
     my $display_part= &get_display_part($partid,$symb);
     my %last_resets = &get_last_resets($symb,$env{'request.course.id'},
 				       [$partid]);
@@ -1801,7 +1710,7 @@ sub gradeBox {
     if ($last_resets{$partid}) {
         $aggtries = &get_num_tries($record,$last_resets{$partid},$partid);
     }
-    my $result=&Apache::loncommon::start_data_table_row();
+    $result.=&Apache::loncommon::start_data_table_row();
     my $ctr = 0;
     my $thisweight = 0;
     my $increment = &get_increment();
@@ -1838,8 +1747,8 @@ sub gradeBox {
 
 
     $result .= 
-	    '<td>'.$data_WGT.$display_part.'</td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>';
-    $result.=&Apache::loncommon::end_data_table_row().'<td colspan="6">';
+	    '<td>'.$display_part.'</td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>';
+    $result.=&Apache::loncommon::end_data_table_row();
     $result.='<input type="hidden" name="stores'.$counter.'_'.$partid.'" value="" />'."\n".
 	'<input type="hidden" name="oldpts'.$counter.'_'.$partid.'" value="'.$score.'" />'."\n".
 	'<input type="hidden" name="solved'.$counter.'_'.$partid.'" value="'.
@@ -1850,7 +1759,6 @@ sub gradeBox {
         $aggtries.'" />'."\n";
     my $res_error;
     $result.=&handback_box($symb,$uname,$udom,$counter,$partid,$record,\$res_error);
-    $result.='</td>'.&Apache::loncommon::end_data_table_row();
     if ($res_error) {
         return &navmap_errormsg();
     }
@@ -1858,8 +1766,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) {
@@ -1980,6 +1888,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'));
 
@@ -1992,7 +1905,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 {
@@ -2010,19 +1930,19 @@ sub build_section_inputs {
 
 # --------------------------- show submissions of a student, option to grade 
 sub submission {
-    my ($request,$counter,$total) = @_;
+    my ($request,$counter,$total,$symb) = @_;
     my ($uname,$udom)     = ($env{'form.student'},$env{'form.userdom'});
     $udom = ($udom eq '' ? $env{'user.domain'} : $udom); #has form.userdom changed for a student?
     my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'});
     $env{'form.fullname'} = &Apache::loncommon::plainname($uname,$udom,'lastname') if $env{'form.fullname'} eq '';
-    my ($symb) = &get_symb($request); 
+
+    my $probtitle=&Apache::lonnet::gettitle($symb); 
     if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; }
 
     if (!&canview($usec)) {
 	$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;
     }
 
@@ -2037,14 +1957,7 @@ sub submission {
     # header info
     if ($counter == 0) {
 	&sub_page_js($request);
-	&sub_page_kw_js($request) if ($env{'form.handgrade'} eq 'yes');
-	$env{'form.probTitle'} = $env{'form.probTitle'} eq '' ? 
-	    &Apache::lonnet::gettitle($symb) : $env{'form.probTitle'};
-	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>'."\n".
-			'<h4>&nbsp;'.&mt('<b>Resource: </b> [_1]',$env{'form.probTitle'}).'</h4>'."\n");
+	&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.
@@ -2064,7 +1977,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'});
@@ -2075,31 +1989,28 @@ sub submission {
 	    $env{'form.kwsize'}   = $keyhash{$loginuser.'_kwsize'} ne '' ? $keyhash{$loginuser.'_kwsize'} : '0';
 	    $env{'form.kwstyle'}  = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : '';
 	    $env{'form.msgsub'}   = $keyhash{$symb.'_subject'} ne '' ? 
-		$keyhash{$symb.'_subject'} : $env{'form.probTitle'};
+		$keyhash{$symb.'_subject'} : $probtitle;
 	    $env{'form.savemsgN'} = $keyhash{$symb.'_savemsgN'} ne '' ? $keyhash{$symb.'_savemsgN'} : '0';
 	}
 	my $overRideScore = $env{'form.overRideScore'} eq '' ? 'no' : $env{'form.overRideScore'};
 	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="probTitle"  value="'.$env{'form.probTitle'}.'" />'."\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".
@@ -2124,22 +2035,23 @@ sub submission {
 	}
 	$request->print($prnmsg);
 
-	if ($env{'form.handgrade'} eq 'yes' && $env{'form.showgrading'} eq 'yes') {
+#	if ($env{'form.handgrade'} eq 'yes') {
+        if (1) {
 
             my %lt = &Apache::lonlocal::texthash(
                           keyw => 'Keyword Options',
                           list => 'List',
                           past => 'Paste Selection to List',
                           high => 'Highlight Attribute',
-                     );
+                     );    
 #
 # Print out the keyword options line
 #
 	    $request->print(<<KEYWORDS);
-&nbsp;<b>$lt{'keyw'}:</b>&nbsp;
+<br /><b>$lt{'keyw'}:</b>&nbsp;
 <a href="javascript:keywords(document.SCORE);" target="_self">$lt{'list'}</a>&nbsp; &nbsp;
 <a href="#" onmousedown="javascript:getSel(); return false"
- class="page">$lt{'past'}</a>&nbsp; &nbsp;
+ CLASS="page">$lt{'past'}</a>&nbsp; &nbsp;
 <a href="javascript:kwhighlight();" target="_self">$lt{'high'}</a><br /><br />
 KEYWORDS
 #
@@ -2207,7 +2119,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";
@@ -2216,7 +2129,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);
@@ -2253,14 +2167,13 @@ KEYWORDS
 		if ($env{"form.$uname:$udom:$partid:submitted_by"}) {
 		    if (exists($seenparts{$partid})) { next; }
 		    $seenparts{$partid}=1;
-                    $request->print(
-                        '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
-                        ' <b>'.&mt('Collaborative submission by: [_1]',
-                                   '<a href="javascript:viewSubmitter(\''.
-                                   $env{"form.$uname:$udom:$partid:submitted_by"}.
-                                   '\');" target="_self">'.
-                                   $$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a>').
-                        '<br />');
+		    my $submitby='<b>Part:</b> '.$display_part.
+			' <b>Collaborative submission by:</b> '.
+			'<a href="javascript:viewSubmitter(\''.
+			$env{"form.$uname:$udom:$partid:submitted_by"}.
+			'\');" target="_self">'.
+			$$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a><br />';
+		    $request->print($submitby);
 		    next;
 		}
 		my $responsetype = $responseType->{$partid}->{$respid};
@@ -2327,26 +2240,18 @@ KEYWORDS
                             if ($hide eq 'anon') {
                                 $lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files}));
                             } else {
-                                $lastsubonly.='<br /><br />'.'<b>'.&mt('Submitted Files:').'</b>'
-                                            .'<br /><span class="LC_warning">';
-                                if(@$files == 1) {
-                                    $lastsubonly .= &mt('Like all files provided by users, this file may contain viruses!');
-                                } else {
-                                    $lastsubonly .= &mt('Like all files provided by users, these files may contain viruses!');
-                                }
-                                $lastsubonly .= '</span>';
-
+                                $lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />';
                                 foreach my $file (@$files) {
                                     &Apache::lonnet::allowuploaded('/adm/grades',$file);
-                                    $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" alt="" /> '.$file.'</a>';
+                                    $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" /> '.$file.'</a>';
                                 }
                             }
 			    $lastsubonly.='<br />';
 			}
                         if ($hide eq 'anon') {
-                            $lastsubonly.='<br /><b>'.&mt('Anonymous Survey').'</b>'; 
+                            $lastsubonly.='<b>'.&mt('Anonymous Survey').'</b>'; 
                         } else {
-			    $lastsubonly.='<br /><b>'.&mt('Submitted Answer:').' </b>'.
+			    $lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'.
 			        &cleanRecord($subval,$responsetype,$symb,$partid,
 					     $respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed);
                         }
@@ -2359,7 +2264,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,\$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,
@@ -2367,27 +2272,19 @@ 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))) {
-	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);
+    if (!&canmodify($usec)) {
+	$request->print('<p><span class="LC_warning">'.&mt('No grading privileges').'</span></p></div>');
 	return;
     } else {
 	$request->print('</div>'."\n");
     }
 
     # 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">'.
@@ -2403,9 +2300,9 @@ KEYWORDS
 	    '<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n";
 	$result.='&nbsp;<a href="javascript:msgCenter(document.SCORE,'.$counter.
 	    ',\''.$msgfor.'\');" target="_self">'.
-	    &mt('Compose message to student'.(scalar(@$col_fullnames) >= 1 ? 's' : '')).'</a><label> ('.
+	    &mt('Compose message to student').(scalar(@$col_fullnames) >= 1 ? 's' : '').'</a><label> ('.
 	    &mt('incl. grades').' <input type="checkbox" name="withgrades'.$counter.'" /></label>)'.
-	    ' <img src="'.$request->dir_config('lonIconsURL').
+	    '<img src="'.$request->dir_config('lonIconsURL').
 	    '/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n".
 	    '<br />&nbsp;('.
 	    &mt('Message will be sent when you click on Save &amp; Next below.').")\n";
@@ -2479,7 +2376,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 '';
@@ -2806,8 +2702,7 @@ ENDJS
 
 #--- Called from submission routine
 sub processHandGrade {
-    my ($request) = shift;
-    my ($symb)   = &get_symb($request);
+    my ($request,$symb) = @_;
     my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb);
     my $button = $env{'form.gradeOpt'};
     my $ngrade = $env{'form.NCT'};
@@ -2847,7 +2742,7 @@ sub processHandGrade {
 		if ($env{'form.withgrades'.$ctr}) {
 		    $message.="\n\nPoint".($pts > 1 ? 's':'').' awarded = '.$pts.' out of '.$wgt;
 		    $messagetail = " for <a href=\"".
-		                   $feedurl."?symb=$showsymb\">$env{'form.probTitle'}</a>";
+		                   $feedurl."?symb=$showsymb\">$restitle</a>";
 		}
 		$msgstatus = 
                     &Apache::lonmsg::user_normal_msg($uname,$udom,$subject,
@@ -2875,7 +2770,7 @@ sub processHandGrade {
 						      $udom);
 			    if ($env{'form.withgrades'.$ctr}) {
 				$messagetail = " for <a href=\"".
-                                    $baseurl."?symb=$showsymb\">$env{'form.probTitle'}</a>";
+                                    $baseurl."?symb=$showsymb\">$restitle</a>";
 			    }
 			    $msgstatus = 
 				&Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message.$messagetail,undef,$baseurl,undef,undef,undef,$showsymb,$restitle);
@@ -2887,7 +2782,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 = ();
@@ -2940,22 +2836,12 @@ 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
-    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);
-	return '';
-    }
-
     # Get the next/previous one or group of students
     my $firststu = $env{'form.unamedom0'};
     my $laststu = $env{'form.unamedom'.($ngrade-1)};
@@ -2975,6 +2861,7 @@ sub processHandGrade {
 		 }
 		 return $a cmp $b;
 	     } (keys(%$fullname))) {
+# FIXME: this is fishy, looks like the button label
 	if ($nextflg == 1 && $button =~ /Next$/) {
 	    push(@parsedlist,$item);
 	}
@@ -2985,6 +2872,7 @@ sub processHandGrade {
 	}
     }
     $ctr = 0;
+# FIXME: this is fishy, looks like the button label
     @parsedlist = reverse @parsedlist if ($button eq 'Previous');
     my $res_error;
     my ($partlist) = &response_type($symb,\$res_error);
@@ -3037,14 +2925,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.='<p>'.&mt('[_1]Message:[_2] No more students for this section or class.','<b>','</b>').'</p>'."\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.='<p>'.&mt('[_1]Message:[_2] No more students for this section or class.','<b>','</b>').'</p>'."\n";
 	$request->print($the_end);
     }
     return '';
@@ -3203,8 +3088,8 @@ sub handback_files {
 	my $part_resp = join('_',@{ $part_response_id });
         if (($env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'} =~ /^\d+$/) & ($new_part eq $part_id)) {
             for (my $counter=1; $counter<=$env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'}; $counter++) {
-                # if multiple files are uploaded names will be 'returndoc2','returndoc3'
-		if ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter}) {
+                # if multiple files are uploaded names will be 'returndoc2','returndoc3' 
+                if ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter}) {
                     my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter.'.filename'};
                     my ($directory,$answer_file) = 
                         ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter} =~ /^(.*?)([^\/]*)$/);
@@ -3212,11 +3097,11 @@ sub handback_files {
 		        &file_name_version_ext($answer_file);
 		    my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/);
                     my $getpropath = 1;
-                    my ($dir_list,$listerror) =
+                    my ($dir_list,$listerror) = 
                         &Apache::lonnet::dirlist($portfolio_root.$portfolio_path,
                                                  $domain,$stuname,$getpropath);
 		    my $version = &get_next_version($answer_name,$answer_ext,$dir_list);
-                    # fix filename
+                    # fix file name
                     my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/);
                     my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain,
             	                                $newflg.'_'.$part_resp.'_returndoc'.$counter,
@@ -3233,10 +3118,9 @@ sub handback_files {
 			    $$newrecord{"resource.$new_part.$resp_id.handback"}.=',';
 			}
                         $$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name;
-			$file_msg.='<span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span> <br />";
-
+			$file_msg.= '<span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span> <br />";
                     }
-                    $request->print('<br />'.&mt('[_1] will be the uploaded filename [_2]','<span class="LC_info">'.$fname.'</span>','<span class="LC_filename">'.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter}.'</span>'));
+                    $request->print('<br />'.&mt('[_1] will be the uploaded file name [_2]','<span class="LC_info">'.$fname.'</span>','<span class="LC_filename">'.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter}.'</span>'));
                 }
             }
         }
@@ -3245,10 +3129,11 @@ sub handback_files {
         $request->print('<br />');
         my @what = ($symb,$env{'request.course.id'},'handback');
         &Apache::lonnet::mark_as_readonly($domain,$stuname,\@handedback,\@what);
-        my $user_lh = &Apache::loncommon::user_lang($stuname,$domain,$env{'request.course.id'});
+        my $user_lh = &Apache::loncommon::user_lang($stuname,$domain,$env{'request.course.id'});    
         my ($subject,$message);
         if (scalar(@handedback) == 1) {
             $subject = &mt_user($user_lh,'File Handed Back by Instructor');
+            $message = &mt_user($user_lh,'A file has been returned that was originally submitted in response to: ');
         } else {
             $subject = &mt_user($user_lh,'Files Handed Back by Instructor');
             $message = &mt_user($user_lh,'Files have been returned that were originally submitted in response to: ');
@@ -3375,8 +3260,8 @@ sub version_portfiles {
                 my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/);
 		my ($answer_name,$answer_ver,$answer_ext) =
 		    &file_name_version_ext($answer_file);
-                my $getpropath = 1;
-                my ($dir_list,$listerror) =
+                my $getpropath = 1;    
+                my ($dir_list,$listerror) = 
                     &Apache::lonnet::dirlist($portfolio_root.$directory,$domain,
                                              $stu_name,$getpropath);
                 my $version = &get_next_version($answer_name,$answer_ext,$dir_list);
@@ -3405,14 +3290,14 @@ sub get_next_version {
 	        &file_name_version_ext($file);
             if (($file_name eq $answer_name) && 
 	        ($file_ext eq $answer_ext)) {
-                # gets here if filename and extension match, 
-                # regardless of version
+                     # gets here if filename and extension match, 
+                     # regardless of version
                 if ($file_version ne '') {
                     # a versioned file is found  so save it for later
                     if ($file_version > $version) {
 		        $version = $file_version;
-                    }
-	        }
+	            }
+                }
             }
         }
     }
@@ -3462,8 +3347,7 @@ sub viewgrades_js {
     my ($request) = shift;
 
     my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = ');
-    $request->print(<<VIEWJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<VIEWJAVASCRIPT));
    function writePoint(partid,weight,point) {
 	var radioButton = document.classgrade["RADVAL_"+partid];
 	var textbox = document.classgrade["TEXTVAL_"+partid];
@@ -3624,16 +3508,14 @@ sub viewgrades_js {
 	}
     }
 
-</script>
 VIEWJAVASCRIPT
 }
 
 #--- show scores for a section or whole class w/ option to change/update a score
 sub viewgrades {
-    my ($request) = shift;
+    my ($request,$symb) = @_;
     &viewgrades_js($request);
 
-    my ($symb) = &get_symb($request);
     #need to make sure we have the correct data for later EXT calls, 
     #thus invalidate the cache
     &Apache::lonnet::devalidatecourseresdata(
@@ -3642,7 +3524,6 @@ sub viewgrades {
     &Apache::lonnet::clear_EXT_cache_status();
 
     my $result='<h3><span class="LC_info">'.&mt('Manual Grading').'</span></h3>';
-    $result.='<h4><b>'.&mt('Current Resource').':</b> '.$env{'form.probTitle'}.'</h4>'."\n";
 
     #view individual student submission form - called using Javascript viewOneStudent
     $result.=&jscriptNform($symb);
@@ -3653,9 +3534,7 @@ 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".
-	'<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n";
 
     my ($common_header,$specific_header);
     if ($env{'form.section'} eq 'all') {
@@ -3705,9 +3584,8 @@ sub viewgrades {
 	    $partid.'" size="4" '.'onchange="javascript:writePoint(\''.
 		$partid.'\','.$weight{$partid}.',\'textval\')" /> /'.
 	    $weight{$partid}.' '.&mt('(problem weight)').'</td>'."\n";
-	$line.= '<td><b>'.&mt('Grade Status').':</b>'.
-                '<select name="SELVAL_'.$partid.'" '.
-	        'onchange="javascript:writeRadText(\''.$partid.'\','.
+	$line.= '<td><b>'.&mt('Grade Status').':</b><select name="SELVAL_'.$partid.'"'.
+	    'onchange="javascript:writeRadText(\''.$partid.'\','.
 		$weight{$partid}.')"> '.
 	    '<option selected="selected"> </option>'.
 	    '<option value="excused">'.&mt('excused').'</option>'.
@@ -3751,11 +3629,14 @@ 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>'.
-                &mt('Score Part: [_1][_2](weight = [_3])',
-                    $display_part,'<br />',$weight{$partid}).'</th>'."\n";
+		&mt('Score Part: [_1]<br /> (weight = [_2])',
+		    $display_part,$weight{$partid}).'</th>'."\n";
 	    next;
 	    
 	} else {
@@ -3802,7 +3683,6 @@ sub viewgrades {
 	        $section_display, $stu_status).
 	    '</span>';
     }
-    $result.=&show_grading_menu_form($symb);
     return $result;
 }
 
@@ -3874,13 +3754,11 @@ sub viewstudentgrade {
 #--- change scores for all the students in a section/class
 #    record does not get update if unchanged
 sub editgrades {
-    my ($request) = @_;
+    my ($request,$symb) = @_;
 
-    my ($symb)=&get_symb($request);
     my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section'));
     my $title='<h2>'.&mt('Current Grade Status').'</h2>';
-    $title.='<h4><b>'.&mt('Current Resource').':</b> '.$env{'form.probTitle'}.'</h4>'."\n";
-    $title.='<h4><b>'.&mt('Section:').'</b> '.$section_display.'</h4>'."\n";
+    $title.='<h4>'.&mt('<b>Section: </b>[_1]',$section_display).'</h4>'."\n";
 
     my $result= &Apache::loncommon::start_data_table().
 	&Apache::loncommon::start_data_table_header_row().
@@ -4087,8 +3965,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 />'.
@@ -4201,21 +4078,14 @@ sub csvuploadmap_header {
 	$javascript=&csvupload_javascript_forward_associate();
     }
 
-    my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
-    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" />
@@ -4224,14 +4094,10 @@ 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="probTitle"  value="$env{'form.probTitle'}" />
 <input type="hidden" name="command"    value="csvuploadoptions" />
 <hr />
-<script type="text/javascript" language="Javascript">
-$javascript
-</script>
 ENDPICK
+    $request->print(&Apache::lonhtmlcommon::scripttag($javascript));
     return '';
 
 }
@@ -4276,8 +4142,7 @@ ENDPICK
 
 sub checkforfile_js {
     my $alertmsg = &mt('Please use the browse button to select a file from your local directory.');
-    my $result =<<CSVFORMJS;
-<script type="text/javascript" language="javascript">
+    my $result = &Apache::lonhtmlcommon::scripttag(<<CSVFORMJS);
     function checkUpload(formname) {
 	if (formname.upfile.value == "") {
 	    alert("$alertmsg");
@@ -4285,24 +4150,19 @@ sub checkforfile_js {
 	}
 	formname.submit();
     }
-    </script>
 CSVFORMJS
     return $result;
 }
 
 sub upcsvScores_form {
-    my ($request) = shift;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb) = @_;
     if (!$symb) {return '';}
     my $result=&checkforfile_js();
-    $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
-    my ($table) = &showResourceInfo($symb,$env{'form.probTitle'});
-    $result.=$table;
-    $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');
@@ -4311,25 +4171,21 @@ 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="probTitle" value="$env{'form.probTitle'}" />
-<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;
 }
 
 
 sub csvuploadmap {
-    my ($request)= @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb)= @_;
     if (!$symb) {return '';}
 
     my $datatoken;
@@ -4340,7 +4196,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) {
@@ -4370,39 +4225,27 @@ sub csvuploadmap {
 	}
     }
     &csvuploadmap_footer($request,$i,$keyfields);
-    $request->print(&show_grading_menu_form($symb));
 
     return '';
 }
 
 sub csvuploadoptions {
-    my ($request)= @_;
-    my ($symb)=&get_symb($request);
-    my $checked=(($env{'form.noFirstLine'})?'1':'0');
-    my $ignore=&mt('Ignore First Line');
+    my ($request,$symb)= @_;
+    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; }
@@ -4415,7 +4258,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 '';
 }
 
@@ -4437,15 +4279,12 @@ sub get_fields {
 }
 
 sub csvuploadassign {
-    my ($request)= @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb)= @_;
     if (!$symb) {return '';}
     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;
@@ -4500,7 +4339,7 @@ sub csvuploadassign {
                     my $award=($pcr == 0) ? 'incorrect_by_override'
                                           : 'correct_by_override';
                     if ($pcr>1) {
-                        push(@warnings,&mt("[_1]: point value larger than weight","$username:$domain"));
+                       push(@warnings,&mt("[_1]: point value larger than weight","$username:$domain"));
                     }
                     $grades{"resource.$part.awarded"}=$pcr;
                     $grades{"resource.$part.solved"}=$award;
@@ -4529,19 +4368,20 @@ sub csvuploadassign {
 					   $env{'request.course.id'},
 					   $domain,$username);
 	   if ($result eq 'ok') {
+# Successfully stored
 	      $request->print('.');
 # 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);
-	   } else {
+              $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));
@@ -4558,7 +4398,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 ---------
@@ -4569,11 +4408,10 @@ sub csvuploadassign {
 #
 #--- Select a page/sequence and a student to grade
 sub pickStudentPage {
-    my ($request) = shift;
+    my ($request,$symb) = @_;
 
     my $alertmsg = &mt('Please select the student you wish to grade.');
-    $request->print(<<LISTJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT));
 
 function checkPickOne(formname) {
     if (radioSelection(formname.student) == null) {
@@ -4586,10 +4424,9 @@ function checkPickOne(formname) {
     formname.submit();
 }
 
-</script>
 LISTJAVASCRIPT
     &commonJSfunctions($request);
-    my ($symb) = &get_symb($request);
+
     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'};
@@ -4644,8 +4481,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";
 
@@ -4691,7 +4527,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 '';
@@ -4728,9 +4563,7 @@ sub getSymbMap {
 #
 #--- Displays a page/sequence w/wo problems, w/wo submissions
 sub displayPage {
-    my ($request) = shift;
-
-    my ($symb) = &get_symb($request);
+    my ($request,$symb) = @_;
     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'};
@@ -4748,7 +4581,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>';
@@ -4766,14 +4598,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(),
@@ -4786,8 +4616,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.=
@@ -4821,8 +4650,8 @@ sub displayPage {
 		&Apache::loncommon::start_data_table_row().
 		'<td align="center" valign="top" >'.$prob.
 		(scalar(@{$parts}) == 1 ? '' 
-		                        : '<br />('.&mt('[_1]parts',
-							scalar(@{$parts}).'&nbsp;').')'
+		                        : '<br />('.&mt('[_1]parts)',
+							scalar(@{$parts}).'&nbsp;')
 		 ).
 		 '</td>';
 	    $studentTable.='<td valign="top">';
@@ -4889,7 +4718,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 '';
@@ -4981,6 +4809,7 @@ sub displaySubByDates {
                                     $newvariation = '&nbsp;('.&mt('New variation this try').')';
                                 }
                             }
+                            $lastrndseed{$partid} = $rndseed;
 		        }
 		        my $responseType=($isTask ? 'Task'
                                               : $responseType->{$partid}->{$responseId});
@@ -5033,7 +4862,7 @@ sub displaySubByDates {
 }
 
 sub updateGradeByPage {
-    my ($request) = shift;
+    my ($request,$symb) = @_;
 
     my $cdom      = $env{"course.$env{'request.course.id'}.domain"};
     my $cnum      = $env{"course.$env{'request.course.id'}.num"};
@@ -5044,7 +4873,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>';
@@ -5063,8 +4891,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>');
-	my ($symb)=&get_symb($request);
-	$request->print(&show_grading_menu_form($symb));
 	return; 
     }
     my $iterator = $navmap->getIterator($map->map_start(),
@@ -5190,7 +5016,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));
@@ -5268,9 +5093,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'}.'" />'."\n".
-     '<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n";
+    return '<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />';
 }
 
 
@@ -5319,11 +5142,6 @@ my %subdivided_bubble_lines;       # no.
 
 my %responsetype_per_response;     # responsetype for each response
 
-my %masterseq_id_responsenum;      # src_id (e.g., 12.3_0.11 etc.) for each
-                                   # numbered response. Needed when randomorder
-                                   # or randompick are in use. Key is ID, value 
-                                   # is response number.
-
 # Save and restore the bubble lines array to the form env.
 
 
@@ -5337,17 +5155,12 @@ sub save_bubble_lines {
         $env{"form.scantron.responsetype.$line"} =
             $responsetype_per_response{$line};
     }
-    foreach my $resid (keys(%masterseq_id_responsenum)) {
-        my $line = $masterseq_id_responsenum{$resid};
-        $env{"form.scantron.residpart.$line"} = $resid;
-    }
 }
 
 
 sub restore_bubble_lines {
     my $line = 0;
     %bubble_lines_per_response = ();
-    %masterseq_id_responsenum = ();
     while ($env{"form.scantron.bubblelines.$line"}) {
 	my $value = $env{"form.scantron.bubblelines.$line"};
 	$bubble_lines_per_response{$line} = $value;
@@ -5357,12 +5170,28 @@ sub restore_bubble_lines {
             $env{"form.scantron.sub_bubblelines.$line"};
         $responsetype_per_response{$line} =
             $env{"form.scantron.responsetype.$line"};
-        my $id = $env{"form.scantron.residpart.$line"};
-        $masterseq_id_responsenum{$id} = $line;
 	$line++;
     }
 }
 
+#  Given the parsed scanline, get the response for 
+#  'answer' number n:
+
+sub get_response_bubbles {
+    my ($parsed_line, $response)  = @_;
+
+    my $bubble_line = $first_bubble_line{$response-1} +1;
+    my $bubble_lines= $bubble_lines_per_response{$response-1};
+    
+    my $selected = "";
+
+    for (my $bline = 0; $bline < $bubble_lines; $bline++) {
+	$selected .= $$parsed_line{"scantron.$bubble_line.answer"}.":";
+	$bubble_line++;
+    }
+    return $selected;
+}
+
 =pod 
 
 =item scantron_filenames
@@ -5552,8 +5381,7 @@ sub scantron_CODEunique {
 =cut
 
 sub scantron_selectphase {
-    my ($r,$file2grade) = @_;
-    my ($symb)=&get_symb($r);
+    my ($r,$file2grade,$symb) = @_;
     if (!$symb) {return '';}
     my $map_error;
     my $sequence_selector=&getSequenceDropDown($symb,\$map_error);
@@ -5562,7 +5390,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();
@@ -5574,7 +5401,7 @@ sub scantron_selectphase {
     if (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) ||
         &Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
 
-        # Chunk of form to prompt for a scantron file upload.
+	# Chunk of form to prompt for a scantron file upload.
 
         $r->print('
     <br />
@@ -5587,20 +5414,18 @@ sub scantron_selectphase {
        '.&Apache::loncommon::start_data_table_row().'
             <td>
 ');
-    my $default_form_data=&defaultFormData(&get_symb($r,1));
+    my $default_form_data=&defaultFormData($symb);
     my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'};
-    $r->print('
-              <script type="text/javascript" language="javascript">
+    $r->print(&Apache::lonhtmlcommon::scripttag('
     function checkUpload(formname) {
-        if (formname.upfile.value == "") {
-            alert("'.&mt('Please use the browse button to select a file from your local directory.').'");
-            return false;
-        }
-        formname.submit();
-    }
-              </script>
-
+	if (formname.upfile.value == "") {
+	    alert("'.&mt('Please use the browse button to select a file from your local directory.').'");
+	    return false;
+	}
+	formname.submit();
+    }'));
+    $r->print('
               <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post">
                 '.$default_form_data.'
                 <input name="courseid" type="hidden" value="'.$cnum.'" />
@@ -5666,6 +5491,8 @@ sub scantron_selectphase {
    
     $r->print($result);
 
+
+
     # Chunk of the form that prompts to view a scoring office file,
     # corrected file, skipped records in a file.
 
@@ -5692,7 +5519,7 @@ sub scantron_selectphase {
 
     &Apache::lonpickcode::code_list($r,2);
 
-    $r->print('<br /><form method="post" name="checkscantron" action="">'.
+    $r->print('<br /><form method="post" name="checkscantron">'.
              $default_form_data."\n".
              &Apache::loncommon::start_data_table('LC_scantron_action')."\n".
              &Apache::loncommon::start_data_table_header_row()."\n".
@@ -5724,7 +5551,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;
 }
 
@@ -5782,7 +5608,7 @@ sub scantron_selectphase {
  
       LastName    - column that the last name starts in
       LastNameLength - number of columns that the last name spans
-      BubblesPerRow - number of bubbles available in each row used to
+      BubblesPerRow - number of bubbles available in each row used to 
                       bubble an answer. (If not specified, 10 assumed).
 
 =cut
@@ -6026,27 +5852,6 @@ sub digits_to_letters {
                        (see scantron_getfile for more information)
     just_header      - True if should not process question answers but only
                        the stuff to the left of the answers.
-    randomorder      - True if randomorder in use
-    randompick       - True if randompick in use
-    sequence         - Exam folder URL
-    master_seq       - Ref to array containing symbs in exam folder
-    symb_to_resource - Ref to hash of symbs for resources in exam folder
-                       (corresponding values are resource objects)
-    partids_by_symb  - Ref to hash of symb -> array ref of partIDs
-    orderedforcode   - Ref to hash of arrays. keys are CODEs and values
-                       are refs to an array of resource objects, ordered
-                       according to order used for CODE, when randomorder
-                       and or randompick are in use.
-    respnumlookup    - Ref to hash mapping question numbers in bubble lines
-                       for current line to question number used for same question
-                        in "Master Sequence" (as seen by Course Coordinator).
-    startline        - Ref to hash where key is question number (0 is first)
-                       and value is number of first bubble line for current 
-                       student or code-based randompick and/or randomorder.
-    totalref         - Ref of scalar used to score total number of bubble
-                       lines needed for responses in a scan line (used when
-                       randompick in use. 
-
  Returns:
    Hash containing the result of parsing the scanline
 
@@ -6091,12 +5896,12 @@ sub digits_to_letters {
 =cut
 
 sub scantron_parse_scanline {
-    my ($line,$whichline,$scantron_config,$scan_data,$just_header,$idmap,
-        $randomorder,$randompick,$sequence,$master_seq,$symb_to_resource,
-        $partids_by_symb,$orderedforcode,$respnumlookup,$startline,$totalref)=@_;
+    my ($line,$whichline,$scantron_config,$scan_data,$just_header)=@_;
 
     my %record;
-    my $data=substr($line,0,$$scantron_config{'Qstart'}-1); # stuff before answers
+    my $lastpos = $env{'form.scantron_maxbubble'}*$$scantron_config{'Qlength'};
+    my $questions=substr($line,$$scantron_config{'Qstart'}-1,$lastpos);  # Answers
+    my $data=substr($line,0,$$scantron_config{'Qstart'}-1);     # earlier stuff
     if (!($$scantron_config{'CODElocation'} eq 0 ||
 	  $$scantron_config{'CODElocation'} eq 'none')) {
 	if ($$scantron_config{'CODElocation'} < 0 ||
@@ -6132,29 +5937,10 @@ sub scantron_parse_scanline {
     my $questnum=0;
     my $ansnum  =1;		# Multiple 'answer lines'/question.
 
-    my $lastpos = $env{'form.scantron_maxbubble'}*$$scantron_config{'Qlength'};
-    if ($randompick || $randomorder) {
-        my $total = &get_respnum_lookups($sequence,$scan_data,$idmap,$line,\%record,
-                                         $master_seq,$symb_to_resource,
-                                         $partids_by_symb,$orderedforcode,
-                                         $respnumlookup,$startline);
-        if ($total) {
-            $lastpos = $total*$$scantron_config{'Qlength'};
-        }
-        if (ref($totalref)) {
-            $$totalref = $total;
-        }
-    }
-    my $questions=substr($line,$$scantron_config{'Qstart'}-1,$lastpos);  # Answers
     chomp($questions);		# Get rid of any trailing \n.
     $questions =~ s/\r$//;      # Get rid of trailing \r too (MAC or Win uploads).
     while (length($questions)) {
-        my $answers_needed;
-        if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
-            $answers_needed = $bubble_lines_per_response{$respnumlookup->{$questnum}};
-        } else {
-            $answers_needed = $bubble_lines_per_response{$questnum};
-        }
+	my $answers_needed = $bubble_lines_per_response{$questnum};
         my $answer_length  = ($$scantron_config{'Qlength'} * $answers_needed)
                              || 1;
         $questnum++;
@@ -6163,16 +5949,11 @@ sub scantron_parse_scanline {
         $questions       = substr($questions,$answer_length);
         if (length($currentquest) < $answer_length) { next; }
 
-        my $subdivided;
-        if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
-            $subdivided = $subdivided_bubble_lines{$respnumlookup->{$questnum-1}};
-        } else {
-            $subdivided = $subdivided_bubble_lines{$questnum-1};
-        }
-        if ($subdivided =~ /,/) {
+        if ($subdivided_bubble_lines{$questnum-1} =~ /,/) {
             my $subquestnum = 1;
             my $subquestions = $currentquest;
-            my @subanswers_needed = split(/,/,$subdivided);
+            my @subanswers_needed = 
+                split(/,/,$subdivided_bubble_lines{$questnum-1});  
             foreach my $subans (@subanswers_needed) {
                 my $subans_length =
                     ($$scantron_config{'Qlength'} * $subans)  || 1;
@@ -6183,13 +5964,10 @@ sub scantron_parse_scanline {
                     ($$scantron_config{'Qon'} eq 'number')) {
                     $ansnum = &scantron_validator_lettnum($ansnum, 
                         $questnum,$quest_id,$subans,$currsubquest,$whichline,
-                        \@alphabet,\%record,$scantron_config,$scan_data,
-                        $randomorder,$randompick,$respnumlookup);
+                        \@alphabet,\%record,$scantron_config,$scan_data);
                 } else {
                     $ansnum = &scantron_validator_positional($ansnum,
-                        $questnum,$quest_id,$subans,$currsubquest,$whichline,
-                        \@alphabet,\%record,$scantron_config,$scan_data,
-                        $randomorder,$randompick,$respnumlookup);
+                        $questnum,$quest_id,$subans,$currsubquest,$whichline,                        \@alphabet,\%record,$scantron_config,$scan_data);
                 }
                 $subquestnum ++;
             }
@@ -6198,13 +5976,11 @@ sub scantron_parse_scanline {
                 ($$scantron_config{'Qon'} eq 'number')) {
                 $ansnum = &scantron_validator_lettnum($ansnum,$questnum,
                     $quest_id,$answers_needed,$currentquest,$whichline,
-                    \@alphabet,\%record,$scantron_config,$scan_data,
-                    $randomorder,$randompick,$respnumlookup);
+                    \@alphabet,\%record,$scantron_config,$scan_data);
             } else {
                 $ansnum = &scantron_validator_positional($ansnum,$questnum,
                     $quest_id,$answers_needed,$currentquest,$whichline,
-                    \@alphabet,\%record,$scantron_config,$scan_data,
-                    $randomorder,$randompick,$respnumlookup);
+                    \@alphabet,\%record,$scantron_config,$scan_data);
             }
         }
     }
@@ -6212,66 +5988,9 @@ sub scantron_parse_scanline {
     return \%record;
 }
 
-sub get_master_seq {
-    my ($resources,$master_seq,$symb_to_resource) = @_;
-    return unless ((ref($resources) eq 'ARRAY') && (ref($master_seq) eq 'ARRAY') &&
-                   (ref($symb_to_resource) eq 'HASH'));
-    my $resource_error;
-    foreach my $resource (@{$resources}) {
-        my $ressymb;
-        if (ref($resource)) {
-            $ressymb = $resource->symb();
-            push(@{$master_seq},$ressymb);
-            $symb_to_resource->{$ressymb} = $resource;
-        } else {
-            $resource_error = 1;
-            last;
-        }
-    }
-    return $resource_error;
-}
-
-sub get_respnum_lookups {
-    my ($sequence,$scan_data,$idmap,$line,$record,$master_seq,$symb_to_resource,
-        $partids_by_symb,$orderedforcode,$respnumlookup,$startline) = @_;
-    return unless ((ref($record) eq 'HASH') && (ref($master_seq) eq 'ARRAY') &&
-                   (ref($symb_to_resource) eq 'HASH') && (ref($partids_by_symb) eq 'HASH') &&
-                   (ref($orderedforcode) eq 'HASH') && (ref($respnumlookup) eq 'HASH') &&
-                   (ref($startline) eq 'HASH'));
-    my ($user,$scancode);
-    if ((exists($record->{'scantron.CODE'})) &&
-        (&Apache::lonnet::validCODE($record->{'scantron.CODE'}))) {
-        $scancode = $record->{'scantron.CODE'};
-    } else {
-        $user = &scantron_find_student($record,$scan_data,$idmap,$line);
-    }
-    my @mapresources =
-        &users_order($user,$scancode,$sequence,$master_seq,$symb_to_resource,
-                     $orderedforcode);
-    my $total = 0;
-    my $count = 0;
-    foreach my $resource (@mapresources) {
-        my $id = $resource->id();
-        my $symb = $resource->symb();
-        if (ref($partids_by_symb->{$symb}) eq 'ARRAY') {
-            foreach my $partid (@{$partids_by_symb->{$symb}}) {
-                my $respnum = $masterseq_id_responsenum{$id.'_'.$partid};
-                if ($respnum ne '') {
-                    $respnumlookup->{$count} = $respnum;
-                    $startline->{$count} = $total;
-                    $total += $bubble_lines_per_response{$respnum};
-                    $count ++;
-                }
-            }
-        }
-    }
-    return $total;
-}
-
 sub scantron_validator_lettnum {
     my ($ansnum,$questnum,$quest_id,$answers_needed,$currquest,$whichline,
-        $alphabet,$record,$scantron_config,$scan_data,$randomorder,
-        $randompick,$respnumlookup) = @_;
+        $alphabet,$record,$scantron_config,$scan_data) = @_;
 
     # Qon 'letter' implies for each slot in currquest we have:
     #    ? or * for doubles, a letter in A-Z for a bubble, and
@@ -6290,23 +6009,19 @@ sub scantron_validator_lettnum {
         $matchon = '\d';
     }
     my $occurrences = 0;
-    my $responsenum = $questnum-1;
-    if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
-       $responsenum = $respnumlookup->{$questnum-1}
-    }
-    if (($responsetype_per_response{$responsenum} eq 'essayresponse') ||
-        ($responsetype_per_response{$responsenum} eq 'formularesponse') ||
-        ($responsetype_per_response{$responsenum} eq 'stringresponse') ||
-        ($responsetype_per_response{$responsenum} eq 'imageresponse') ||
-        ($responsetype_per_response{$responsenum} eq 'reactionresponse') ||
-        ($responsetype_per_response{$responsenum} eq 'organicresponse')) {
+    if (($responsetype_per_response{$questnum-1} eq 'essayresponse') ||
+        ($responsetype_per_response{$questnum-1} eq 'formularesponse') ||
+        ($responsetype_per_response{$questnum-1} eq 'stringresponse') ||
+        ($responsetype_per_response{$questnum-1} eq 'imageresponse') ||
+        ($responsetype_per_response{$questnum-1} eq 'reactionresponse') ||
+        ($responsetype_per_response{$questnum-1} eq 'organicresponse')) {
         my @singlelines = split('',$currquest);
         foreach my $entry (@singlelines) {
             $occurrences = &occurence_count($entry,$matchon);
             if ($occurrences > 1) {
                 last;
             }
-        }
+        } 
     } else {
         $occurrences = &occurence_count($currquest,$matchon); 
     }
@@ -6354,8 +6069,7 @@ sub scantron_validator_lettnum {
 
 sub scantron_validator_positional {
     my ($ansnum,$questnum,$quest_id,$answers_needed,$currquest,
-        $whichline,$alphabet,$record,$scantron_config,$scan_data,
-        $randomorder,$randompick,$respnumlookup) = @_;
+        $whichline,$alphabet,$record,$scantron_config,$scan_data) = @_;
 
     # Otherwise there's a positional notation;
     # each bubble line requires Qlength items, and there are filled in
@@ -6397,16 +6111,12 @@ sub scantron_validator_positional {
         #  record all the bubbles filled in as well as the
         #  fact this response consists of multiple bubbles.
         #
-        my $responsenum = $questnum-1;
-        if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
-            $responsenum = $respnumlookup->{$questnum-1}
-        }
-        if (($responsetype_per_response{$responsenum} eq 'essayresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'formularesponse') ||
-            ($responsetype_per_response{$responsenum} eq 'stringresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'imageresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'reactionresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'organicresponse')) {
+        if (($responsetype_per_response{$questnum-1} eq 'essayresponse') ||
+            ($responsetype_per_response{$questnum-1} eq 'formularesponse') ||
+            ($responsetype_per_response{$questnum-1} eq 'stringresponse') ||
+            ($responsetype_per_response{$questnum-1} eq 'imageresponse') ||
+            ($responsetype_per_response{$questnum-1} eq 'reactionresponse') ||
+            ($responsetype_per_response{$questnum-1} eq 'organicresponse')) {
             my $doubleerror = 0;
             while (($currquest >= $$scantron_config{'Qlength'}) && 
                    (!$doubleerror)) {
@@ -6702,7 +6412,7 @@ sub check_for_error {
 =cut
 
 sub scantron_warning_screen {
-    my ($button_text)=@_;
+    my ($button_text,$symb)=@_;
     my $title=&Apache::lonnet::gettitle($env{'form.selectpage'});
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
     my $CODElist;
@@ -6731,9 +6441,8 @@ sub scantron_warning_screen {
 <tr><td><b>'.&mt('Data File that will be used:').'</b></td><td><tt>'.$env{'form.scantron_selectfile'}.'</tt></td></tr>
 '.$CODElist.$lastbubblepoints.'
 </table>
-<br />
-<p> '.&mt("If this information is correct, please click on '[_1]'.",&mt($button_text)).'</p>
-<p> '.&mt("If something is incorrect, please click the 'Grading Menu' button to start over.").'</p>
+<p> '.&mt('If this information is correct, please click on \'[_1]\'.',&mt($button_text)).'<br />
+'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p>
 
 <br />
 ');
@@ -6749,8 +6458,7 @@ sub scantron_warning_screen {
 =cut
 
 sub scantron_do_warning {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
     my $default_form_data=&defaultFormData($symb);
     $r->print(&scantron_form_start().$default_form_data);
@@ -6768,7 +6476,7 @@ sub scantron_do_warning {
 	    $r->print('<p><span class="LC_error">'.&mt("You have not selected the format of the student's response data.").'</span></p>');
 	} 
     } else {
-	my $warning=&scantron_warning_screen('Grading: Validate Records');
+	my $warning=&scantron_warning_screen('Grading: Validate Records',$symb);
         my $bubbledbyhand=&hand_bubble_option();
 	$r->print('
 '.$warning.$bubbledbyhand.'
@@ -6776,7 +6484,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 '';
 }
 
@@ -6813,11 +6521,9 @@ SCANTRONFORM
            '<input type="hidden" name="scantron.sub_bubblelines.'.$line.'" value="'.$env{"form.scantron.sub_bubblelines.$line"}.'" />'."\n";
        $chunk .=
            '<input type="hidden" name="scantron.responsetype.'.$line.'" value="'.$env{"form.scantron.responsetype.$line"}.'" />'."\n";
-       $chunk .=
-           '<input type="hidden" name="scantron.residpart.'.$line.'" value="'.$env{"form.scantron.residpart.$line"}.'" />'."\n";
        $result .= $chunk;
        $line++;
-    }
+   }
     return $result;
 }
 
@@ -6834,8 +6540,7 @@ SCANTRONFORM
 =cut
 
 sub scantron_validate_file {
-    my ($r) = @_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb) = @_;
     if (!$symb) {return '';}
     my $default_form_data=&defaultFormData($symb);
     
@@ -6890,7 +6595,6 @@ sub scantron_validate_file {
     while (!$stop && $currentphase < scalar(@validate_phases)) {
 	$r->print(&mt('Validating '.$validate_phases[$currentphase]).'<br />');
 	$r->rflush();
-
 	my $which="scantron_validate_".$validate_phases[$currentphase];
 	{
 	    no strict 'refs';
@@ -6898,7 +6602,7 @@ sub scantron_validate_file {
 	}
     }
     if (!$stop) {
-	my $warning=&scantron_warning_screen('Start Grading');
+	my $warning=&scantron_warning_screen('Start Grading',$symb);
 	$r->print(&mt('Validation process complete.').'<br />'.
                   $warning.
                   &mt('Perform verification for each student after storage of submissions?').
@@ -6908,7 +6612,7 @@ sub scantron_validate_file {
                   '<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No').
                   '</label></span><br />'.
                   &mt('Grading will take longer if you use verification.').'<br />'.
-                  &mt("Alternatively, the 'Review bubblesheet data' utility (see grading menu) can be used for all students after grading is complete.").'<br /><br />'.
+                  &mt('Otherwise, Grade/Manage/Review Bubblesheets [_1] Review bubblesheet data can be used once grading is complete.','&raquo;').'<br /><br />'.
                   '<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'.
                   '<input type="hidden" name="command" value="scantron_process" />'."\n");
     } else {
@@ -6920,7 +6624,7 @@ sub scantron_validate_file {
 	    $r->print('<input type="submit" name="submit" value="'.&mt('Ignore').' &rarr; " />');
 	    $r->print(' '.&mt('this error').' <br />');
 
-	    $r->print(" <p>".&mt("Or click the 'Grading Menu' button to start over.")."</p>");
+	    $r->print('<p>'.&mt('Or return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p>');
 	} else {
             if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') {
 	        $r->print('<input type="button" name="submitbutton" value="'.&mt('Continue').' &rarr;" onclick="javascript:verify_bubble_radio(this.form)" />');
@@ -6932,7 +6636,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 '';
 }
 
@@ -7299,7 +7003,8 @@ sub scantron_validate_sequence {
 	my @resources=
 	    $navmap->retrieveResources($map,\&scantron_filter_not_exam,1,0);
 	if (@resources) {
-	    $r->print('<p class="LC_warning">'
+	    $r->print(
+                '<p class="LC_warning">'
                .&mt('Some resources in the sequence currently are not set to'
                    .' exam mode. Grading these resources currently may not'
                    .' work correctly.')
@@ -7385,8 +7090,7 @@ sub scantron_validate_ID {
 
 
 sub scantron_get_correction {
-    my ($r,$i,$scan_record,$scan_config,$line,$error,$arg,
-        $randomorder,$randompick,$respnumlookup,$startline)=@_;
+    my ($r,$i,$scan_record,$scan_config,$line,$error,$arg)=@_;
 #FIXME in the case of a duplicated ID the previous line, probably need
 #to show both the current line and the previous one and allow skipping
 #the previous one or the current one
@@ -7423,10 +7127,10 @@ sub scantron_get_correction {
 
     if ($error =~ /ID$/) {
 	if ($error eq 'incorrectID') {
-	    $r->print('<p class="LC_warning">'.&mt("The encoded ID is not in the classlist").
+            $r->print('<p class="LC_warning">'.&mt("The encoded ID is not in the classlist").
 		      "</p>\n");
 	} elsif ($error eq 'duplicateID') {
-	    $r->print('<p class="LC_warning">'.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n");
+            $r->print('<p class="LC_warning">'.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n");
 	}
 	$r->print($message);
 	$r->print("<p>".&mt("How should I handle this?")." <br /> \n");
@@ -7436,7 +7140,7 @@ sub scantron_get_correction {
 	$r->print(&Apache::loncommon::selectstudent_link('scantronupload',
 				       'scantron_username','scantron_domain'));
 	$r->print(": <input type='text' name='scantron_username' value='' />");
-	$r->print("\n:\n".
+	$r->print("\n@".
 		 &Apache::loncommon::select_dom_form($env{'request.role.domain'},'scantron_domain'));
 
 	$r->print('</li>');
@@ -7446,8 +7150,8 @@ sub scantron_get_correction {
 	} elsif ($error eq 'duplicateCODE') {
 	    $r->print('<p class="LC_warning">'.&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."</p>\n");
 	}
-        $r->print("<p>".&mt('The CODE on the form is [_1]',
-                            "<tt>'$$scan_record{'scantron.CODE'}'</tt>")
+	$r->print("<p>".&mt('The CODE on the form is [_1]',
+			    "<tt>'$$scan_record{'scantron.CODE'}'</tt>")
                  ."</p>\n");
 	$r->print($message);
 	$r->print("<p>".&mt("How should I handle this?")."</p>\n");
@@ -7483,8 +7187,7 @@ sub scantron_get_correction {
 	    $r->print("\n<br />");
 	}
 
-	$r->print(<<ENDSCRIPT);
-<script type="text/javascript">
+	$r->print(&Apache::lonhtmlcommon::scripttag(<<ENDSCRIPT));
 function change_radio(field) {
     var slct=document.scantronupload.scantron_CODE_resolution;
     var i;
@@ -7492,7 +7195,6 @@ function change_radio(field) {
         if (slct[i].value==field) { slct[i].checked=true; }
     }
 }
-</script>
 ENDSCRIPT
 	my $href="/adm/pickcode?".
 	   "form=".&escape("scantronupload").
@@ -7522,8 +7224,7 @@ ENDSCRIPT
 	# The form field scantron_questions is acutally a list of line numbers.
 	# represented by this form so:
 
-	my $line_list = &questions_to_line_list($arg,$randomorder,$randompick,
-                                                $respnumlookup,$startline);
+	my $line_list = &questions_to_line_list($arg);
 
 	$r->print('<input type="hidden" name="scantron_questions" value="'.
 		  $line_list.'" />');
@@ -7531,9 +7232,7 @@ ENDSCRIPT
 	$r->print("<p>".&mt("Please indicate which bubble should be used for grading")."</p>");
 	foreach my $question (@{$arg}) {
 	    my @linenums = &prompt_for_corrections($r,$question,$scan_config,
-                                                   $scan_record, $error,
-                                                   $randomorder,$randompick,
-                                                   $respnumlookup,$startline);
+                                                   $scan_record, $error);
             push(@lines_to_correct,@linenums);
 	}
         $r->print(&verify_bubbles_checked(@lines_to_correct));
@@ -7547,16 +7246,13 @@ ENDSCRIPT
 	# a list of question numbers. Therefore:
 	#
 	
-	my $line_list = &questions_to_line_list($arg,$randomorder,$randompick,
-                                                $respnumlookup,$startline);
+	my $line_list = &questions_to_line_list($arg);
 
 	$r->print('<input type="hidden" name="scantron_questions" value="'.
 		  $line_list.'" />');
 	foreach my $question (@{$arg}) {
 	    my @linenums = &prompt_for_corrections($r,$question,$scan_config,
-                                                   $scan_record, $error,
-                                                   $randomorder,$randompick,
-                                                   $respnumlookup,$startline);
+                                                   $scan_record, $error);
             push(@lines_to_correct,@linenums);
 	}
         $r->print(&verify_bubbles_checked(@lines_to_correct));
@@ -7570,8 +7266,7 @@ sub verify_bubbles_checked {
     my (@ansnums) = @_;
     my $ansnumstr = join('","',@ansnums);
     my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines.");
-    my $output = (<<ENDSCRIPT);
-<script type="text/javascript">
+    my $output = &Apache::lonhtmlcommon::scripttag((<<ENDSCRIPT));
 function verify_bubble_radio(form) {
     var ansnumArray = new Array ("$ansnumstr");
     var need_bubble_count = 0;
@@ -7594,7 +7289,6 @@ function verify_bubble_radio(form) {
     }
     form.submit(); 
 }
-</script>
 ENDSCRIPT
     return $output;
 }
@@ -7609,20 +7303,12 @@ used to fill in the scantron_questions f
 
   Arguments:
      questions    - Reference to an array of questions.
-     randomorder  - True if randomorder in use.
-     randompick   - True if randompick in use.
-     respnumlookup - Reference to HASH mapping question numbers in bubble lines
-                     for current line to question number used for same question
-                     in "Master Seqence" (as seen by Course Coordinator).
-     startline    - Reference to hash where key is question number (0 is first)
-                    and key is number of first bubble line for current student
-                    or code-based randompick and/or randomorder.
 
 =cut
 
 
 sub questions_to_line_list {
-    my ($questions,$randomorder,$randompick,$respnumlookup,$startline) = @_;
+    my ($questions) = @_;
     my @lines;
 
     foreach my $item (@{$questions}) {
@@ -7631,16 +7317,8 @@ sub questions_to_line_list {
         if ($item =~ /^(\d+)\.(\d+)$/) {
             $question = $1;
             my $subquestion = $2;
-            my $responsenum = $question-1;
-            if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH')) {
-                $responsenum = $respnumlookup->{$question-1};
-                if (ref($startline) eq 'HASH') {
-                    $first = $startline->{$question-1} + 1;
-                }
-            } else {
-                $first = $first_bubble_line{$responsenum} + 1;
-            }
-            my @subans = split(/,/,$subdivided_bubble_lines{$responsenum});
+            $first = $first_bubble_line{$question-1} + 1;
+            my @subans = split(/,/,$subdivided_bubble_lines{$question-1});
             my $subcount = 1;
             while ($subcount<$subquestion) {
                 $first += $subans[$subcount-1];
@@ -7648,16 +7326,8 @@ sub questions_to_line_list {
             }
             $count = $subans[$subquestion-1];
         } else {
-            my $responsenum = $question-1;
-            if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH')) {
-                $responsenum = $respnumlookup->{$question-1};
-                if (ref($startline) eq 'HASH') {
-                    $first = $startline->{$question-1} + 1;
-                }
-            } else {
-                $first = $first_bubble_line{$responsenum} + 1;
-            }
-            $count   = $bubble_lines_per_response{$responsenum};
+	    $first   = $first_bubble_line{$question-1} + 1;
+	    $count   = $bubble_lines_per_response{$question-1};
         }
         $last = $first+$count-1;
         push(@lines, ($first..$last));
@@ -7679,14 +7349,6 @@ for multi and missing bubble cases).
    $scan_config - The scantron file configuration hash.
    $scan_record - Reference to the hash that has the the parsed scanlines.
    $error       - Type of error
-   $randomorder - True if randomorder in use.
-   $randompick  - True if randompick in use.
-   $respnumlookup - Reference to HASH mapping question numbers in bubble lines
-                    for current line to question number used for same question
-                    in "Master Seqence" (as seen by Course Coordinator).
-   $startline   - Reference to hash where key is question number (0 is first)
-                  and value is number of first bubble line for current student
-                  or code-based randompick and/or randomorder.
 
  Implicit inputs:
    %bubble_lines_per_response   - Starting line numbers for each question.
@@ -7711,26 +7373,15 @@ for multi and missing bubble cases).
 =cut
 
 sub prompt_for_corrections {
-    my ($r, $question, $scan_config, $scan_record, $error, $randomorder,
-        $randompick, $respnumlookup, $startline) = @_;
+    my ($r, $question, $scan_config, $scan_record, $error) = @_;
     my ($current_line,$lines);
     my @linenums;
     my $questionnum = $question;
-    my ($first,$responsenum);
     if ($question =~ /^(\d+)\.(\d+)$/) {
         $question = $1;
+        $current_line = $first_bubble_line{$question-1} + 1 ;
         my $subquestion = $2;
-        if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH')) {
-            $responsenum = $respnumlookup->{$question-1};
-            if (ref($startline) eq 'HASH') {
-                $first = $startline->{$question-1};
-            }
-        } else {
-            $responsenum = $question-1;
-            $first = $first_bubble_line{$responsenum} + 1;
-        }
-        $current_line = $first + 1 ;
-        my @subans = split(/,/,$subdivided_bubble_lines{$responsenum});
+        my @subans = split(/,/,$subdivided_bubble_lines{$question-1});
         my $subcount = 1;
         while ($subcount<$subquestion) {
             $current_line += $subans[$subcount-1];
@@ -7738,34 +7389,25 @@ sub prompt_for_corrections {
         }
         $lines = $subans[$subquestion-1];
     } else {
-        if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH')) {
-            $responsenum = $respnumlookup->{$question-1};
-            if (ref($startline) eq 'HASH') {
-                $first = $startline->{$question-1};
-            }
-        } else {
-            $responsenum = $question-1;
-            $first = $first_bubble_line{$responsenum};
-        }
-        $current_line = $first + 1;
-        $lines        = $bubble_lines_per_response{$responsenum};
+        $current_line = $first_bubble_line{$question-1} + 1 ;
+        $lines        = $bubble_lines_per_response{$question-1};
     }
     if ($lines > 1) {
         $r->print(&mt('The group of bubble lines below responds to a single question.').'<br />');
-        if (($responsetype_per_response{$responsenum} eq 'essayresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'formularesponse') ||
-            ($responsetype_per_response{$responsenum} eq 'stringresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'imageresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'reactionresponse') ||
-            ($responsetype_per_response{$responsenum} eq 'organicresponse')) {
-            $r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the bubblesheet exam directed students to leave [quant,_1,line] blank on their bubblesheets.",$lines).'<br /><br />'.&mt('A non-zero score can be assigned to the student during bubblesheet grading by selecting a bubble in at least one line.').'<br />'.&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.').'<br />'.&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.").'<br /><br />');
+        if (($responsetype_per_response{$question-1} eq 'essayresponse') ||
+            ($responsetype_per_response{$question-1} eq 'formularesponse') ||
+            ($responsetype_per_response{$question-1} eq 'stringresponse') ||
+            ($responsetype_per_response{$question-1} eq 'imageresponse') ||
+            ($responsetype_per_response{$question-1} eq 'reactionresponse') ||
+            ($responsetype_per_response{$question-1} eq 'organicresponse')) {
+            $r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the exam directed students to leave [quant,_1,line] blank on their bubblesheets.",$lines).'<br /><br />'.&mt('A non-zero score can be assigned to the student during bubblesheet grading by selecting a bubble in at least one line.').'<br />'.&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.').'<br />'.&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.").'<br /><br />');
         } else {
             $r->print(&mt("Select at most one bubble in a single line and select 'No Bubble' in all the other lines. ")."<br />");
         }
     }
     for (my $i =0; $i < $lines; $i++) {
         my $selected = $$scan_record{"scantron.$current_line.answer"};
-	&scantron_bubble_selector($r,$scan_config,$current_line,
+	&scantron_bubble_selector($r,$scan_config,$current_line, 
 	        		  $questionnum,$error,split('', $selected));
         push(@linenums,$current_line);
 	$current_line++;
@@ -7798,7 +7440,7 @@ sub scantron_bubble_selector {
     my $max=$$scan_config{'Qlength'};
 
     my $scmode=$$scan_config{'Qon'};
-    if ($scmode eq 'number' || $scmode eq 'letter') {
+    if ($scmode eq 'number' || $scmode eq 'letter') { 
         if (($$scan_config{'BubblesPerRow'} =~ /^\d+$/) &&
             ($$scan_config{'BubblesPerRow'} > 0)) {
             $max=$$scan_config{'BubblesPerRow'};
@@ -8019,42 +7661,11 @@ sub scantron_validate_doublebubble {
     #get student info
     my $classlist=&Apache::loncoursedata::get_classlist();
     my %idmap=&username_to_idmap($classlist);
-    my (undef,undef,$sequence)=
-        &Apache::lonnet::decode_symb($env{'form.selectpage'});
 
     #get scantron line setup
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
-
-    my $navmap = Apache::lonnavmaps::navmap->new();
-    unless (ref($navmap)) {
-        $r->print(&navmap_errormsg());
-        return(1,$currentphase);
-    }
-    my $map=$navmap->getResourceByUrl($sequence);
-    my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
-    my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
-        %grader_randomlists_by_symb,%orderedforcode,%respnumlookup,%startline);
-    my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
-
     my $nav_error;
-    if (ref($map)) {
-        $randomorder = $map->randomorder();
-        $randompick = $map->randompick();
-        if ($randomorder || $randompick) {
-            $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
-            if ($nav_error) {
-                $r->print(&navmap_errormsg());
-                return(1,$currentphase);
-            }
-            &graders_resources_pass(\@resources,\%grader_partids_by_symb,
-                                    \%grader_randomlists_by_symb,$bubbles_per_row);
-        }
-    } else {
-        $r->print(&navmap_errormsg());
-        return(1,$currentphase);
-    }
-
     &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble line array.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
@@ -8065,15 +7676,11 @@ sub scantron_validate_doublebubble {
 	my $line=&scantron_get_line($scanlines,$scan_data,$i);
 	if ($line=~/^[\s\cz]*$/) { next; }
 	my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
-						 $scan_data,undef,\%idmap,$randomorder,
-                                                 $randompick,$sequence,\@master_seq,
-                                                 \%symb_to_resource,\%grader_partids_by_symb,
-                                                 \%orderedforcode,\%respnumlookup,\%startline);
+						 $scan_data);
 	if (!defined($$scan_record{'scantron.doubleerror'})) { next; }
 	&scantron_get_correction($r,$i,$scan_record,\%scantron_config,$line,
 				 'doublebubble',
-				 $$scan_record{'scantron.doubleerror'},
-                                 $randomorder,$randompick,\%respnumlookup,\%startline);
+				 $$scan_record{'scantron.doubleerror'});
     	return (1,$currentphase);
     }
     return (0,$currentphase+1);
@@ -8112,12 +7719,10 @@ sub scantron_get_maxbubble {
     %first_bubble_line         = ();
     %subdivided_bubble_lines   = ();
     %responsetype_per_response = ();
-    %masterseq_id_responsenum  = ();
 
     my $response_number = 0;
     my $bubble_line     = 0;
     foreach my $resource (@resources) {
-        my $resid = $resource->id();
         my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,
                                                           $udom,undef,$bubbles_per_row);
         if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) {
@@ -8168,7 +7773,6 @@ sub scantron_get_maxbubble {
 	        $bubble_lines_per_response{$response_number} = $lines;
                 $responsetype_per_response{$response_number} = 
                     $analysis->{$part_id.'.type'};
-                $masterseq_id_responsenum{$resid.'_'.$part_id} = $response_number;
 	        $response_number++;
 
 	        $bubble_line +=  $lines;
@@ -8201,59 +7805,21 @@ sub scantron_validate_missingbubbles {
     #get student info
     my $classlist=&Apache::loncoursedata::get_classlist();
     my %idmap=&username_to_idmap($classlist);
-    my (undef,undef,$sequence)=
-        &Apache::lonnet::decode_symb($env{'form.selectpage'});
 
     #get scantron line setup
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
-
-    my $navmap = Apache::lonnavmaps::navmap->new();
-    unless (ref($navmap)) {
-        $r->print(&navmap_errormsg());
-        return(1,$currentphase);
-    }
-
-    my $map=$navmap->getResourceByUrl($sequence);
-    my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
-    my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
-        %grader_randomlists_by_symb,%orderedforcode,%respnumlookup,%startline);
-    my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
-
     my $nav_error;
-    if (ref($map)) {
-        $randomorder = $map->randomorder();
-        $randompick = $map->randompick();
-        if ($randomorder || $randompick) {
-            $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
-            if ($nav_error) {
-                $r->print(&navmap_errormsg());
-                return(1,$currentphase);
-            }
-            &graders_resources_pass(\@resources,\%grader_partids_by_symb,
-                                    \%grader_randomlists_by_symb,$bubbles_per_row);
-        }
-    } else {
-        $r->print(&navmap_errormsg());
-        return(1,$currentphase);
-    }
-
-
     my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
     if ($nav_error) {
-        $r->print(&navmap_errormsg());
         return(1,$currentphase);
     }
-
     if (!$max_bubble) { $max_bubble=2**31; }
     for (my $i=0;$i<=$scanlines->{'count'};$i++) {
 	my $line=&scantron_get_line($scanlines,$scan_data,$i);
 	if ($line=~/^[\s\cz]*$/) { next; }
-        my $scan_record =
-            &scantron_parse_scanline($line,$i,\%scantron_config,$scan_data,undef,\%idmap,
-                                     $randomorder,$randompick,$sequence,\@master_seq,
-                                     \%symb_to_resource,\%grader_partids_by_symb,
-                                     \%orderedforcode,\%respnumlookup,\%startline);
+	my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
+						 $scan_data);
 	if (!defined($$scan_record{'scantron.missingerror'})) { next; }
 	my @to_correct;
 	
@@ -8262,45 +7828,28 @@ sub scantron_validate_missingbubbles {
 	foreach my $missing (@{$$scan_record{'scantron.missingerror'}}) {
             my $lastbubble;
             if ($missing =~ /^(\d+)\.(\d+)$/) {
-                my $question = $1;
-                my $subquestion = $2;
-                my ($first,$responsenum);
-                if ($randomorder || $randompick) {
-                    $responsenum = $respnumlookup{$question-1};
-                    $first = $startline{$question-1};
-                } else {
-                    $responsenum = $question-1;
-                    $first = $first_bubble_line{$responsenum};
-                }
-                if (!defined($first)) { next; }
-                my @subans = split(/,/,$subdivided_bubble_lines{$responsenum});
-                my $subcount = 1;
-                while ($subcount<$subquestion) {
-                    $first += $subans[$subcount-1];
-                    $subcount ++;
-                }
-                my $count = $subans[$subquestion-1];
-                $lastbubble = $first + $count;
+               my $question = $1;
+               my $subquestion = $2;
+               if (!defined($first_bubble_line{$question -1})) { next; }
+               my $first = $first_bubble_line{$question-1};
+               my @subans = split(/,/,$subdivided_bubble_lines{$question-1});
+               my $subcount = 1;
+               while ($subcount<$subquestion) {
+                   $first += $subans[$subcount-1];
+                   $subcount ++;
+               }
+               my $count = $subans[$subquestion-1];
+               $lastbubble = $first + $count;
             } else {
-                my ($first,$responsenum);
-                if ($randomorder || $randompick) {
-                    $responsenum = $respnumlookup{$missing-1};
-                    $first = $startline{$missing-1};
-                } else {
-                    $responsenum = $missing-1;
-                    $first = $first_bubble_line{$responsenum};
-                }
-                if (!defined($first)) { next; }
-                $lastbubble = $first + $bubble_lines_per_response{$responsenum};
+                if (!defined($first_bubble_line{$missing - 1})) { next; }
+                $lastbubble = $first_bubble_line{$missing - 1} + $bubble_lines_per_response{$missing - 1};
             }
             if ($lastbubble > $max_bubble) { next; }
 	    push(@to_correct,$missing);
 	}
 	if (@to_correct) {
 	    &scantron_get_correction($r,$i,$scan_record,\%scantron_config,
-				     $line,'missingbubble',\@to_correct,
-                                     $randomorder,$randompick,\%respnumlookup,
-                                     \%startline);
+				     $line,'missingbubble',\@to_correct);
 	    return (1,$currentphase);
 	}
 
@@ -8345,17 +7894,17 @@ sub hand_bubble_option {
 }
 
 sub scantron_process_students {
-    my ($r) = @_;
+    my ($r,$symb) = @_;
 
     my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($env{'form.selectpage'});
-    my ($symb)=&get_symb($r);
     if (!$symb) {
 	return '';
     }
     my $default_form_data=&defaultFormData($symb);
 
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
-    my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
+    my $bubbles_per_row =
+        &bubblesheet_bubbles_per_row(\%scantron_config);
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $classlist=&Apache::loncoursedata::get_classlist();
     my %idmap=&username_to_idmap($classlist);
@@ -8363,29 +7912,43 @@ sub scantron_process_students {
     unless (ref($navmap)) {
         $r->print(&navmap_errormsg());
         return '';
-    }
+    }  
     my $map=$navmap->getResourceByUrl($sequence);
-    my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
-        %grader_randomlists_by_symb);
+    my $randomorder;
     if (ref($map)) {
         $randomorder = $map->randomorder();
-        $randompick = $map->randompick();
-    } else {
-        $r->print(&navmap_errormsg());
-        return '';
     }
-    my $nav_error;
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
     my (%grader_partids_by_symb,%grader_randomlists_by_symb,%ordered);
-    if ($randomorder || $randompick) {
-        $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
-        if ($nav_error) {
-            $r->print(&navmap_errormsg());
-            return '';
-        }
-    }
     &graders_resources_pass(\@resources,\%grader_partids_by_symb,
                             \%grader_randomlists_by_symb,$bubbles_per_row);
+    my ($resource_error,%symb_to_resource,@master_seq);
+    foreach my $resource (@resources) {
+        my $ressymb;
+        if (ref($resource)) {
+            $ressymb = $resource->symb();
+            push(@master_seq,$ressymb);
+            $symb_to_resource{$ressymb} = $resource;
+        } else {
+            $resource_error = 1;
+            last;
+        }
+        my ($analysis,$parts) =
+            &scantron_partids_tograde($resource,$env{'request.course.id'},
+                                      $env{'user.name'},$env{'user.domain'},
+                                      1,$bubbles_per_row);
+        $grader_partids_by_symb{$ressymb} = $parts;
+        if (ref($analysis) eq 'HASH') {
+            if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') {
+                $grader_randomlists_by_symb{$ressymb} = 
+                    $analysis->{'parts_withrandomlist'};
+            }
+        }
+    }
+    if ($resource_error) {
+        $r->print(&navmap_errormsg());
+        return '';
+    }
 
     my ($uname,$udom);
     my $result= <<SCANTRONFORM;
@@ -8401,13 +7964,13 @@ SCANTRONFORM
     my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam'));
     my $count=&get_todo_count($scanlines,$scan_data);
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count);
-    &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
-					  'Processing first student');
+    &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,'Processing first student');
     $r->print('<br />');
     my $start=&Time::HiRes::time();
     my $i=-1;
     my $started;
 
+    my $nav_error;
     &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
@@ -8420,14 +7983,12 @@ 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.
     }
 
     my %lettdig = &letter_to_digits();
     my $numletts = scalar(keys(%lettdig));
-    my %orderedforcode;
 
     while ($i<$scanlines->{'count'}) {
  	($uname,$udom)=('','');
@@ -8435,19 +7996,11 @@ SCANTRONFORM
  	my $line=&scantron_get_line($scanlines,$scan_data,$i);
  	if ($line=~/^[\s\cz]*$/) { next; }
 	if ($started) {
-	    &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
-						     'last student');
+	    &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
 	}
 	$started=1;
-        my %respnumlookup = ();
-        my %startline = ();
-        my $total;
  	my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
- 						 $scan_data,undef,\%idmap,$randomorder,
-                                                 $randompick,$sequence,\@master_seq,
-                                                 \%symb_to_resource,\%grader_partids_by_symb,
-                                                 \%orderedforcode,\%respnumlookup,\%startline,
-                                                 \$total);
+ 						 $scan_data);
  	unless ($uname=&scantron_find_student($scan_record,$scan_data,
  					      \%idmap,$i)) {
   	    &scantron_add_delay(\@delayqueue,$line,
@@ -8472,10 +8025,22 @@ SCANTRONFORM
         }
 
         my @mapresources = @resources;
-        if ($randomorder || $randompick) {
-            @mapresources =
-                &users_order($user,$scancode,$sequence,\@master_seq,\%symb_to_resource,
-                             \%orderedforcode);
+        if ($randomorder && $scancode) {
+            unless (ref($ordered{$scancode}) eq 'ARRAY') {
+                $env{'form.CODE'} = $scancode;
+                my $actual_seq =
+                    &Apache::lonprintout::master_seq_to_person_seq($sequence,
+                                                                   \@master_seq,
+                                                                   $user,$scancode);
+                if (ref($actual_seq) eq 'ARRAY') {
+                    @{$ordered{$scancode}} = 
+                        map { $symb_to_resource{$_}; } @{$actual_seq};
+                }
+                delete($env{'form.CODE'});
+            }
+            if (ref($ordered{$scancode}) eq 'ARRAY') {
+                @mapresources = @{$ordered{$scancode}};
+            }
         }
         my (%partids_by_symb,$res_error);
         foreach my $resource (@mapresources) {
@@ -8512,33 +8077,17 @@ SCANTRONFORM
 	
         if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
                                    \@mapresources,\%partids_by_symb,
-                                   $bubbles_per_row,$randomorder,$randompick,
-                                   \%respnumlookup,\%startline) 
-            eq 'ssi_error') {
+                                   $bubbles_per_row) eq 'ssi_error') {
             $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.
         }
 
-        if (($scancode) && ($randomorder || $randompick)) {
-            my $parmresult =
-                &Apache::lonparmset::storeparm_by_symb($symb,
-                                                       '0_examcode',2,$scancode,
-                                                       'string_examcode',$uname,
-                                                       $udom);
-        }
 	$completedstudents{$uname}={'line'=>$line};
         if ($env{'form.verifyrecord'}) {
             my $lastpos = $env{'form.scantron_maxbubble'}*$scantron_config{'Qlength'};
-            if ($randompick) {
-                if ($total) {
-                    $lastpos = $total*$scantron_config{'Qlength'};
-                }
-            }
-
             my $studentdata = substr($line,$scantron_config{'Qstart'}-1,$lastpos);
             chomp($studentdata);
             $studentdata =~ s/\r$//;
@@ -8549,21 +8098,17 @@ SCANTRONFORM
                 ($counter,my $recording) =
                     &verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'},
                                              $counter,$studentdata,$partids_by_symb{$ressymb},
-                                             \%scantron_config,\%lettdig,$numletts,$randomorder,
-                                             $randompick,\%respnumlookup,\%startline);
+                                             \%scantron_config,\%lettdig,$numletts);
                 $studentrecord .= $recording;
             }
             if ($studentrecord ne $studentdata) {
                 &Apache::lonxml::clear_problem_counter();
                 if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
                                            \@mapresources,\%partids_by_symb,
-                                           $bubbles_per_row,$randomorder,$randompick,
-                                           \%respnumlookup,\%startline)
-                    eq 'ssi_error') {
+                                           $bubbles_per_row) eq 'ssi_error') {
                     $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 '';
@@ -8575,9 +8120,7 @@ SCANTRONFORM
                     ($counter,my $recording) =
                         &verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'},
                                                  $counter,$studentdata,$partids_by_symb{$ressymb},
-                                                 \%scantron_config,\%lettdig,$numletts,
-                                                 $randomorder,$randompick,\%respnumlookup,
-                                                 \%startline);
+                                                 \%scantron_config,\%lettdig,$numletts);
                     $studentrecord .= $recording;
                 }
                 if ($studentrecord ne $studentdata) {
@@ -8595,11 +8138,11 @@ SCANTRONFORM
                               &Apache::loncommon::end_data_table_header_row()."\n".
                               &Apache::loncommon::start_data_table_row().
                               '<td>'.&mt('Bubblesheet').'</td>'.
-                              '<td><span class="LC_nobreak">'.$studentdata.'</span></td>'.
+                              '<td><span class="LC_nobreak"><tt>'.$studentdata.'</tt></span></td>'.
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::start_data_table_row().
                               '<td>'.&mt('Stored submissions').'</td>'.
-                              '<td><span class="LC_nobreak">'.$studentrecord.'</span></td>'."\n".
+                              '<td><span class="LC_nobreak"><tt>'.$studentrecord.'</tt></span></td>'."\n".
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::end_data_table().'</p>');
                 } else {
@@ -8621,7 +8164,6 @@ SCANTRONFORM
 #    $r->print("<p>took $lasttime</p>");
 
     $r->print("</form>");
-    $r->print(&show_grading_menu_form($symb));
     return '';
 }
 
@@ -8648,67 +8190,8 @@ sub graders_resources_pass {
     return;
 }
 
-=pod
-
-=item users_order
-
-  Returns array of resources in current map, ordered based on either CODE,
-  if this is a CODEd exam, or based on student's identity if this is a
-  "NAMEd" exam.
-
-  Should be used when randomorder and/or randompick applied when the 
-  corresponding exam was printed, prior to students completing bubblesheets 
-  for the version of the exam the student received.
-
-=cut
-
-sub users_order  {
-    my ($user,$scancode,$mapurl,$master_seq,$symb_to_resource,$orderedforcode) = @_;
-    my @mapresources;
-    unless ((ref($master_seq) eq 'ARRAY') && (ref($symb_to_resource) eq 'HASH')) {
-        return @mapresources;
-    }
-    if ($scancode) {
-        if ((ref($orderedforcode) eq 'HASH') && (ref($orderedforcode->{$scancode}) eq 'ARRAY')) {
-            @mapresources = @{$orderedforcode->{$scancode}};
-        } else {
-            $env{'form.CODE'} = $scancode;
-            my $actual_seq =
-                &Apache::lonprintout::master_seq_to_person_seq($mapurl,
-                                                               $master_seq,
-                                                               $user,$scancode,1);
-            if (ref($actual_seq) eq 'ARRAY') {
-                @mapresources = map { $symb_to_resource->{$_}; } @{$actual_seq};
-                if (ref($orderedforcode) eq 'HASH') {
-                    if (@mapresources > 0) {
-                        $orderedforcode->{$scancode} = \@mapresources;
-                    }
-                }
-            }
-            delete($env{'form.CODE'});
-        }
-    } else {
-        my $actual_seq =
-            &Apache::lonprintout::master_seq_to_person_seq($mapurl,
-                                                           $master_seq,
-                                                           $user,undef,1);
-        if (ref($actual_seq) eq 'ARRAY') {
-            @mapresources =
-                map { $symb_to_resource->{$_}; } @{$actual_seq};
-        }
-    }
-    return @mapresources;
-}
-
 sub grade_student_bubbles {
-    my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts,$bubbles_per_row,
-        $randomorder,$randompick,$respnumlookup,$startline) = @_;
-    my $uselookup = 0;
-    if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH') &&
-        (ref($startline) eq 'HASH')) {
-        $uselookup = 1;
-    }
-
+    my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts,$bubbles_per_row) = @_; 
     if (ref($resources) eq 'ARRAY') {
         my $count = 0;
         foreach my $resource (@{$resources}) {
@@ -8730,12 +8213,8 @@ sub grade_student_bubbles {
             if (ref($parts) eq 'HASH') {
                 if (ref($parts->{$ressymb}) eq 'ARRAY') {
                     foreach my $part (@{$parts->{$ressymb}}) {
-                        if ($uselookup) {
-                            $form{'scantron_questnum_start.'.$part} = $startline->{$count} + 1;
-                        } else {
-                            $form{'scantron_questnum_start.'.$part} =
-                                1+$env{'form.scantron.first_bubble_line.'.$count};
-                        }
+                        $form{'scantron_questnum_start.'.$part} =
+                            1+$env{'form.scantron.first_bubble_line.'.$count};
                         $count++;
                     }
                 }
@@ -8749,7 +8228,7 @@ sub grade_student_bubbles {
 }
 
 sub scantron_upload_scantron_data {
-    my ($r)=@_;
+    my ($r,$symb)=@_;
     my $dom = $env{'request.role.domain'};
     my $domdesc = &Apache::lonnet::domain($dom,'description');
     $r->print(&Apache::loncommon::coursebrowser_javascript($dom));
@@ -8757,13 +8236,11 @@ sub scantron_upload_scantron_data {
 							  'domainid',
 							  'coursename',$dom);
     my $syllabuslink = '<a href="javascript:ToSyllabus();">'.&mt('Syllabus').'</a>'.
-                       ('&nbsp'x2).&mt('(shows course personnel)');
-    my ($symb) = &get_symb($r,1);
+                       ('&nbsp'x2).&mt('(shows course personnel)'); 
     my $default_form_data=&defaultFormData($symb);
     my $nofile_alert = &mt('Please use the browse button to select a file from your local directory.');
     my $nocourseid_alert = &mt("Please use the 'Select Course' link to open a separate window where you can search for a course to which a file can be uploaded.");
-    $r->print('
-<script type="text/javascript" language="javascript">
+    $r->print(&Apache::lonhtmlcommon::scripttag('
     function checkUpload(formname) {
 	if (formname.upfile.value == "") {
 	    alert("'.$nofile_alert.'");
@@ -8790,8 +8267,8 @@ sub scantron_upload_scantron_data {
         return;
     }
 
-</script>
-
+'));
+    $r->print('
 <h3>'.&mt('Send bubblesheet data to a course').'</h3>
 
 <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post">
@@ -8820,8 +8297,7 @@ sub scantron_upload_scantron_data {
 
 
 sub scantron_upload_scantron_data_save {
-    my($r)=@_;
-    my ($symb)=&get_symb($r,1);
+    my($r,$symb)=@_;
     my $doanotherupload=
 	'<br /><form action="/adm/grades" method="post">'."\n".
 	'<input type="hidden" name="command" value="scantronupload" />'."\n".
@@ -8831,9 +8307,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 '';
@@ -8861,7 +8335,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);
     }
@@ -8963,8 +8437,7 @@ sub valid_file {
 }
 
 sub scantron_download_scantron_data {
-    my ($r)=@_;
-    my ($symb) = &get_symb($r,1);
+    my ($r,$symb)=@_;
     my $default_form_data=&defaultFormData($symb);
     my $cname=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
@@ -8972,10 +8445,9 @@ sub scantron_download_scantron_data {
     if (! &valid_file($file)) {
 	$r->print('
 	<p>
-	    '.&mt('The requested filename was invalid.').'
+	    '.&mt('The requested file name was invalid.').'
         </p>
 ');
-	$r->print(&show_grading_menu_form($symb));
 	return;
     }
     my $orig='/uploaded/'.$cdom.'/'.$cname.'/scantron_orig_'.$file;
@@ -8998,15 +8470,12 @@ sub scantron_download_scantron_data {
 	      '<a href="'.$skipped.'">','</a>').'
     </p>
 ');
-    $r->print(&show_grading_menu_form($symb));
     return '';
 }
 
 sub checkscantron_results {
-    my ($r) = @_;
-    my ($symb)=&get_symb($r);
+    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));
@@ -9026,18 +8495,12 @@ sub checkscantron_results {
         return '';
     }
     my $map=$navmap->getResourceByUrl($sequence);
-    my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
-        %grader_randomlists_by_symb,%orderedforcode);
-    if (ref($map)) {
+    my $randomorder;
+    if (ref($map)) { 
         $randomorder=$map->randomorder();
-        $randompick=$map->randompick();
     }
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
-    my $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
-    if ($nav_error) {
-        $r->print(&navmap_errormsg());
-        return '';
-    }
+    my (%grader_partids_by_symb,%grader_randomlists_by_symb);
     &graders_resources_pass(\@resources,\%grader_partids_by_symb,
                             \%grader_randomlists_by_symb,$bubbles_per_row);
     my ($uname,$udom);
@@ -9048,17 +8511,17 @@ sub checkscantron_results {
     my @delayqueue;
     my %completedstudents;
 
-    my $count=&get_todo_count($scanlines,$scan_data);
+    my $count=&Apache::grades::get_todo_count($scanlines,$scan_data);
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count);
-    my ($username,$domain,$started,%ordered);
+    my ($username,$domain,$started);
+    my $nav_error;
     &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return '';
     }
 
-    &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
-                                          'Processing first student');
+    &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,'Processing first student');
     my $start=&Time::HiRes::time();
     my $i=-1;
 
@@ -9068,15 +8531,14 @@ sub checkscantron_results {
         my $line=&Apache::grades::scantron_get_line($scanlines,$scan_data,$i);
         if ($line=~/^[\s\cz]*$/) { next; }
         if ($started) {
-            &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
-                                                     'last student');
+            &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
         }
         $started=1;
         my $scan_record=
             &Apache::grades::scantron_parse_scanline($line,$i,\%scantron_config,
                                                      $scan_data);
-        unless ($uname=&scantron_find_student($scan_record,$scan_data,
-                                              \%idmap,$i)) {
+        unless ($uname=&Apache::grades::scantron_find_student($scan_record,$scan_data,
+                                                              \%idmap,$i)) {
             &Apache::grades::scantron_add_delay(\@delayqueue,$line,
                                 'Unable to find a student that matches',1);
             next;
@@ -9089,11 +8551,13 @@ sub checkscantron_results {
         my $pid = $scan_record->{'scantron.ID'};
         $lastname{$pid} = $scan_record->{'scantron.LastName'};
         push(@{$bylast{$lastname{$pid}}},$pid);
-        my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION];
-        my $user = $uname.':'.$usec;
+        my $lastpos = $env{'form.scantron_maxbubble'}*$scantron_config{'Qlength'};
+        $scandata{$pid} = substr($line,$scantron_config{'Qstart'}-1,$lastpos);
+        chomp($scandata{$pid});
+        $scandata{$pid} =~ s/\r$//;
         ($username,$domain)=split(/:/,$uname);
 
-        my $scancode;
+        my ($scancode,%ordered);
         if ((exists($scan_record->{'scantron.CODE'})) &&
             (&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'}))) {
             $scancode = $scan_record->{'scantron.CODE'};
@@ -9102,25 +8566,19 @@ sub checkscantron_results {
         }
 
         my @mapresources = @resources;
-        my $lastpos = $env{'form.scantron_maxbubble'}*$scantron_config{'Qlength'};
-        my %respnumlookup=();
-        my %startline=();
-        if ($randomorder || $randompick) {
-            @mapresources =
-                &users_order($user,$scancode,$sequence,\@master_seq,\%symb_to_resource,
-                             \%orderedforcode);
-            my $total = &get_respnum_lookups($sequence,$scan_data,\%idmap,$line,
-                                             $scan_record,\@master_seq,\%symb_to_resource,
-                                             \%grader_partids_by_symb,\%orderedforcode,
-                                             \%respnumlookup,\%startline);
-            if ($randompick && $total) {
-                $lastpos = $total*$scantron_config{'Qlength'};
+        if ($randomorder && $scancode) {
+            unless (ref($ordered{$scancode}) eq 'ARRAY') {
+                $env{'form.CODE'} = $scancode;
+                $ordered{$scancode} = 
+                    &Apache::lonprintout::master_seq_to_person_seq($sequence,
+                                                                   \@resources,
+                                                                   $uname,$scancode);
+                delete($env{'form.CODE'});
+            }
+            if (ref($ordered{$scancode}) eq 'ARRAY') {
+                @mapresources = @{$ordered{$scancode}};
             }
         }
-        $scandata{$pid} = substr($line,$scantron_config{'Qstart'}-1,$lastpos);
-        chomp($scandata{$pid});
-        $scandata{$pid} =~ s/\r$//;
-
         my $counter = -1;
         foreach my $resource (@mapresources) {
             my $parts;
@@ -9137,9 +8595,7 @@ sub checkscantron_results {
             ($counter,my $recording) =
                 &verify_scantron_grading($resource,$domain,$username,$cid,$counter,
                                          $scandata{$pid},$parts,
-                                         \%scantron_config,\%lettdig,$numletts,
-                                         $randomorder,$randompick,
-                                         \%respnumlookup,\%startline);
+                                         \%scantron_config,\%lettdig,$numletts);
             $record{$pid} .= $recording;
         }
     }
@@ -9177,19 +8633,16 @@ sub checkscantron_results {
             }
         }
     }
-    $r->print('<p>'.
-              &mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for [_1][quant,_2,student][_3] ([quant,_4,bubblesheet line] per student).',
-                  '<b>',
-                  $numstudents,
-                  '</b>',
-                  $env{'form.scantron_maxbubble'}).
-              '</p>'
+    $r->print(
+        '<p>'
+       .&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for [_1][quant,_2,student][_3] ([quant,_4,bubblesheet line] per student).',
+            '<b>',
+            $numstudents,
+            '</b>',
+            $env{'form.scantron_maxbubble'})
+       .'</p>'
     );
-    $r->print('<p>'
-             .&mt('Exact matches for [_1][quant,_2,student][_3].','<b>',$passed,'</b>')
-             .'<br />'
-             .&mt('Discrepancies detected for [_1][quant,_2,student][_3].','<b>',$failed,'</b>')
-             .'</p>');
+    $r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>');
     if ($passed) {
         $r->print(&mt('Students with exact correspondence between bubblesheet data and submissions are as follows:').'<br /><br />');
         $r->print(&Apache::loncommon::start_data_table()."\n".
@@ -9209,14 +8662,13 @@ 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;
 }
 
 sub verify_scantron_grading {
     my ($resource,$domain,$username,$cid,$counter,$scandata,$partids,
-        $scantron_config,$lettdig,$numletts,$randomorder,$randompick,
-        $respnumlookup,$startline) = @_;
+        $scantron_config,$lettdig,$numletts) = @_;
     my ($record,%expected,%startpos);
     return ($counter,$record) if (!ref($resource));
     return ($counter,$record) if (!$resource->is_problem());
@@ -9225,21 +8677,15 @@ sub verify_scantron_grading {
     foreach my $part_id (@{$partids}) {
         $counter ++;
         $expected{$part_id} = 0;
-        my $respnum = $counter;
-        if ($randomorder || $randompick) {
-            $respnum = $respnumlookup->{$counter};
-            $startpos{$part_id} = $startline->{$counter} + 1;
-        } else {
-            $startpos{$part_id} = $env{"form.scantron.first_bubble_line.$counter"};
-        }
-        if ($env{"form.scantron.sub_bubblelines.$respnum"}) {
-            my @sub_lines = split(/,/,$env{"form.scantron.sub_bubblelines.$respnum"});
+        if ($env{"form.scantron.sub_bubblelines.$counter"}) {
+            my @sub_lines = split(/,/,$env{"form.scantron.sub_bubblelines.$counter"});
             foreach my $item (@sub_lines) {
                 $expected{$part_id} += $item;
             }
         } else {
-            $expected{$part_id} = $env{"form.scantron.bubblelines.$respnum"};
+            $expected{$part_id} = $env{"form.scantron.bubblelines.$counter"};
         }
+        $startpos{$part_id} = $env{"form.scantron.first_bubble_line.$counter"};
     }
     if ($symb) {
         my %recorded;
@@ -9335,7 +8781,7 @@ sub verify_scantron_grading {
     return ($counter,$record);
 }
 
-sub letter_to_digits {
+sub letter_to_digits { 
     my %lettdig = (
                     A => 1,
                     B => 2,
@@ -9358,30 +8804,6 @@ 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;
-}
-
-# -- Retrieve choices for grading form
-sub savedState {
-    my %savedState = ();
-    if ($env{'form.saveState'}) {
-	foreach (split(/:/,$env{'form.saveState'})) {
-	    my ($key,$value) = split(/=/,$_,2);
-	    $savedState{$key} = $value;
-	}
-    }
-    return \%savedState;
-}
-
 #--- Href with symb and command ---
 
 sub href_symb_cmd {
@@ -9390,23 +8812,26 @@ sub href_symb_cmd {
 }
 
 sub grading_menu {
-    my ($request) = @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb) = @_;
     if (!$symb) {return '';}
-    my $probTitle = &Apache::lonnet::gettitle($symb);
-    my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle);
 
-    $request->print($table);
     my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb),
-                  'handgrade'=>$hdgrade,
-                  'probTitle'=>$probTitle,
-                  'command'=>'submit_options',
-                  'saveState'=>"",
-                  'gradingMenu'=>1,
-                  'showgrading'=>"yes");
-    
-    my $url1 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
+                  'command'=>'individual');
     
+    my $url1a = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'}='ungraded';
+    my $url1b=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'}='table';
+    my $url1c=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $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);
     
@@ -9415,15 +8840,46 @@ sub grading_menu {
     
     $fields{'command'} = 'scantron_selectphase';
     my $url4 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'} = 'initialverifyreceipt';
+    my $url5 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
     
-    my @menu = ({	categorytitle=>'Course Grading',
+    my @menu = ({	categorytitle=>'Hand Grading',
             items =>[
-                        {	linktext => 'Manual Grading/View Submissions',
-                    		url => $url1,
+                        {	linktext => 'Select individual students to grade',
+                    		url => $url1a,
                     		permission => 'F',
-                    		icon => 'edit-find-replace.png',
-                    		linktitle => 'Start the process of hand grading submissions.'
+                    		icon => 'grade_students.png',
+                    		linktitle => 'Grade current resource for a selection of students.'
+                        }, 
+                        {       linktext => 'Grade ungraded submissions.',
+                                url => $url1b,
+                                permission => 'F',
+                                icon => 'ungrade_sub.png',
+                                linktitle => 'Grade all submissions that have not been graded yet.'
+                        },
+
+                        {       linktext => 'Grading table',
+                                url => $url1c,
+                                permission => 'F',
+                                icon => 'grading_table.png',
+                                linktitle => 'Grade current resource for all students.'
+                        },
+                        {       linktext => 'Grade page/folder for one student',
+                                url => $url1d,
+                                permission => 'F',
+                                icon => 'grade_PageFolder.png',
+                                linktitle => 'Grade all resources in current page/sequence/folder for one student.'
                         },
+                        {       linktext => 'Download submissions',
+                                url => $url1e,
+                                permission => 'F',
+                                icon => 'download_sub.png',
+                                linktitle => 'Download all students submissions.'
+                        }]},
+                         { categorytitle=>'Automated Grading',
+               items =>[
+
                 	    {	linktext => 'Upload Scores',
                     		url => $url2,
                     		permission => 'F',
@@ -9439,168 +8895,132 @@ sub grading_menu {
                 	    {	linktext => 'Grade/Manage/Review Bubblesheets',
                     		url => $url4,
                     		permission => 'F',
-                    		icon => 'stat.png',
+                    		icon => 'bubblesheet.png',
                     		linktitle => 'Grade bubblesheet exams, upload/download bubblesheet data files, and review previously graded bubblesheet exams.'
-                	    }
+                	    },
+                            {   linktext => 'Verify Receipt Number',
+                                url => $url5,
+                                permission => 'F',
+                                icon => 'receipt_number.png',
+                                linktitle => 'Verify a system-generated receipt number for correct problem solution.'
+                            }
+
                     ]
             });
 
-    #$fields{'command'} = 'verify';
-    #$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
-    #
     # Create the menu
     my $Str;
-    # $Str .= '<h2>'.&mt('Please select a grading task').'</h2>';
     $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="handgrade"   value="'.$hdgrade.'" />'."\n".
-	'<input type="hidden" name="probTitle"   value="'.$probTitle.'" />'."\n".
-	'<input type="hidden" name="saveState"   value="" />'."\n".
-	'<input type="hidden" name="gradingMenu" value="1" />'."\n".
-	'<input type="hidden" name="showgrading" value="yes" />'."\n";
-
-    $Str .= Apache::lonhtmlcommon::generate_menu(@menu);
-    #$menudata->{'jscript'}
-    $Str .='<hr /><input type="button" value="'.&mt('Verify Receipt No.').'" '.
-        ' onclick="javascript:checkChoice(document.forms.gradingMenu,\'5\',\'verify\')" '.
-        ' /> '.
-        &Apache::lonnet::recprefix($env{'request.course.id'}).
-        '-<input type="text" name="receipt" size="4" onchange="javascript:checkReceiptNo(this.form,\'OK\')" />';
+    	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
 
-    $Str .="</form>\n";
-    my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box.");
-    $request->print(<<GRADINGMENUJS);
-<script type="text/javascript" language="javascript">
-    function checkChoice(formname,val,cmdx) {
-	if (val <= 2) {
-	    var cmd = radioSelection(formname.radioChoice);
-	    var cmdsave = cmd;
-	} else {
-	    cmd = cmdx;
-	    cmdsave = 'submission';
-	}
-	formname.command.value = cmd;
-	if (val < 5) formname.submit();
-	if (val == 5) {
-	    if (!checkReceiptNo(formname,'notOK')) { 
-	        return false;
-	    } else {
-	        formname.submit();
-	    }
-	}
-    }
+    $Str .= &Apache::lonhtmlcommon::generate_menu(@menu);
+    return $Str;    
+}
 
-    function checkReceiptNo(formname,nospace) {
-	var receiptNo = formname.receipt.value;
-	var checkOpt = false;
-	if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;}
-	if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;}
-	if (checkOpt) {
-	    alert("$receiptalert");
-	    formname.receipt.value = "";
-	    formname.receipt.focus();
-	    return false;
-	}
-	return true;
-    }
-</script>
-GRADINGMENUJS
+
+sub ungraded {
+    my ($request)=@_;
+    &submit_options($request);
+}
+
+sub submit_options_sequence {
+    my ($request,$symb) = @_;
+    if (!$symb) {return '';}
     &commonJSfunctions($request);
-    return $Str;    
+    my $result;
+
+    $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
+        '<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>';
+    return $result;
+}
+
+sub submit_options_table {
+    my ($request,$symb) = @_;
+    if (!$symb) {return '';}
+    &commonJSfunctions($request);
+    my $result;
+
+    $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
+        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+
+    $result.=&selectfield(0).
+            '<input type="hidden" name="command" value="viewgrades" />
+            <div>
+              <input type="submit" value="'.&mt('Next').' &rarr;" />
+            </div>
+        </div>
+  </form>';
+    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 {
-    my ($request) = @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb) = @_;
     if (!$symb) {return '';}
-    my $probTitle = &Apache::lonnet::gettitle($symb);
 
-    my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box."); 
-    $request->print(<<GRADINGMENUJS);
-<script type="text/javascript" language="javascript">
-    function checkChoice(formname,val,cmdx) {
-	if (val <= 2) {
-	    var cmd = radioSelection(formname.radioChoice);
-	    var cmdsave = cmd;
-	} else {
-	    cmd = cmdx;
-	    cmdsave = 'submission';
-	}
-	formname.command.value = cmd;
-	formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+
-	    ":saveSub="+pullDownSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status);
-	if (val < 5) formname.submit();
-	if (val == 5) {
-	    if (!checkReceiptNo(formname,'notOK')) { return false;}
-	    formname.submit();
-	}
-	if (val < 7) formname.submit();
-    }
-
-    function checkReceiptNo(formname,nospace) {
-	var receiptNo = formname.receipt.value;
-	var checkOpt = false;
-	if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;}
-	if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;}
-	if (checkOpt) {
-	    alert("$receiptalert");
-	    formname.receipt.value = "";
-	    formname.receipt.focus();
-	    return false;
-	}
-	return true;
-    }
-</script>
-GRADINGMENUJS
     &commonJSfunctions($request);
-    my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle);
     my $result;
-    my (undef,$sections) = &getclasslist('all','0');
-    my $savedState = &savedState();
-    my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'submission' : $$savedState{'saveCmd'});
-    my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'});
-    my $saveSub = ($$savedState{'saveSub'} eq '' ? 'all' : $$savedState{'saveSub'});
-    my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'});
-
-    # Preselect sections
-    my $selsec="";
-    if (ref($sections)) {
-        foreach my $section (sort(@$sections)) {
-            $selsec.='<option value="'.$section.'" '.
-                ($saveSec eq $section ? 'selected="selected"':'').'>'.$section.'</option>'."\n";
-        }
-    }
 
     $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="handgrade"   value="'.$hdgrade.'" />'."\n".
-	'<input type="hidden" name="probTitle"   value="'.$probTitle.'" />'."\n".
-	'<input type="hidden" name="command"     value="" />'."\n".
-	'<input type="hidden" name="saveState"   value="" />'."\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.=&selectfield(1).'
+                <input type="hidden" name="command" value="submission" /> 
+	      <input type="submit" value="'.&mt('Next').' &rarr;" />
+            </div>
+          </div>
 
-    $result.='
-<h2>
-  '.&mt('Grade Current Resource').'
-</h2>
-<div>
-  '.$table.'
-</div>
 
-<div class="LC_columnSection">
+  </form>';
+    return $result;
+}
+
+sub selectfield {
+   my ($full)=@_;
+   my %options = 
+          (&Apache::lonlocal::texthash(
+             'yes'       => 'with submissions',
+             'queued'    => 'in grading queue',
+             'graded'    => 'with ungraded submissions',
+             'incorrect' => 'with incorrect submissions',
+             'all'       => 'with any status'),
+             'select_form_order' => ['yes','queued','graded','incorrect','all']);
+   my $result='<div class="LC_columnSection">
   
     <fieldset>
       <legend>
        '.&mt('Sections').'
       </legend>
-      <select name="section" multiple="multiple" size="5">'."\n";
-    $result.= $selsec;
-    $result.= '<option value="all" '.($saveSec eq 'all' ? 'selected="selected"' : ''). '>all</option></select> &nbsp; ';
-    $result.='
+      '.&Apache::lonstatistics::SectionSelect('section','multiple',5).'
     </fieldset>
   
     <fieldset>
@@ -9614,63 +9034,18 @@ GRADINGMENUJS
       <legend>
         '.&mt('Access Status').'
       </legend>
-      '.&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,5,undef,'mult').'
-    </fieldset>
-  
+      '.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').'
+    </fieldset>';
+    if ($full) {
+       $result.='
     <fieldset>
       <legend>
         '.&mt('Submission Status').'
-      </legend>
-      <select name="submitonly" size="5">
-	         <option value="yes" '.      ($saveSub eq 'yes'       ? 'selected="selected"' : '').'>'.&mt('with submissions').'</option>
-	         <option value="queued" '.   ($saveSub eq 'queued'    ? 'selected="selected"' : '').'>'.&mt('in grading queue').'</option>
-	         <option value="graded" '.   ($saveSub eq 'graded'    ? 'selected="selected"' : '').'>'.&mt('with ungraded submissions').'</option>
-	         <option value="incorrect" '.($saveSub eq 'incorrect' ? 'selected="selected"' : '').'>'.&mt('with incorrect submissions').'</option>
-                 <option value="all" '.      ($saveSub eq 'all'       ? 'selected="selected"' : '').'>'.&mt('with any status').'</option>
-      </select>
-    </fieldset>
-  
-</div>
-
-<br />
-          <div>
-            <div>
-              <label>
-                <input type="radio" name="radioChoice" value="submission" '.
-                  ($saveCmd eq 'submission' ? 'checked="checked"' : '').' /> '.
-             &mt('Select individual students to grade and view submissions.').'
-	      </label> 
-            </div>
-            <div>
-	      <label>
-                <input type="radio" name="radioChoice" value="viewgrades" '.
-                  ($saveCmd eq 'viewgrades' ? 'checked="checked"' : '').' /> '.
-                    &mt('Grade all selected students in a grading table.').'
-              </label>
-            </div>
-            <div>
-	      <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
-            </div>
-          </div>
-
-
-        <h2>
-         '.&mt('Grade Complete Folder for One Student').'
-        </h2>
-        <div>
-            <div>
-              <label>
-                <input type="radio" name="radioChoice" value="pickStudentPage" '.
-	  ($saveCmd eq 'pickStudentPage' ? 'checked="checked"' : '').' /> '.
-  &mt('The <b>complete</b> page/sequence/folder: For one student').'
-              </label>
-            </div>
-            <div>
-	      <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
-            </div>
-        </div>
-  </form>';
-    $result .= &show_grading_menu_form($symb);
+      </legend>'.
+       &Apache::loncommon::select_form('all','submitonly',\%options).
+   '</fieldset>';
+    }
+    $result.='</div><br />';
     return $result;
 }
 
@@ -9773,18 +9148,14 @@ sub clicker_grading_parameters {
 }
 
 sub process_clicker {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
     my $result=&checkforfile_js();
-    $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
-    my ($table) = &showResourceInfo($symb,$env{'form.probTitle'});
-    $result.=$table;
-    $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',
@@ -9801,7 +9172,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");
@@ -9811,12 +9182,11 @@ sub process_clicker {
     my $pcorrect=&mt("Percentage points for correct solution");
     my $pincorrect=&mt("Percentage points for incorrect solution");
     my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype',
-                                                   {'iclicker' => 'i>clicker',
+						   {'iclicker' => 'i>clicker',
                                                     'interwrite' => 'interwrite PRS',
                                                     'turning' => 'Turning Technologies'});
     $symb = &Apache::lonenc::check_encrypt($symb);
-    $result.=<<ENDUPFORM;
-<script type="text/javascript">
+    $result.= &Apache::lonhtmlcommon::scripttag(<<ENDUPFORM);
 function sanitycheck() {
 // Accept only integer percentages
    document.forms.gradesupload.pcorrect.value=Math.round(document.forms.gradesupload.pcorrect.value);
@@ -9854,15 +9224,17 @@ function sanitycheck() {
 // Remember the old state
    document.forms.gradesupload.waschecked.value=newgradingchoice;
 }
-</script>
+ENDUPFORM
+    $result.= <<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="probTitle" value="$env{'form.probTitle'}" />
-<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" />
@@ -9870,34 +9242,35 @@ function sanitycheck() {
 <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);
+</form>'
+ENDPERCFORM
+    $result.='</td>'.
+             &Apache::loncommon::end_data_table_row().
+             &Apache::loncommon::end_data_table();
     return $result;
 }
 
 sub process_clicker_file {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
 
     my %Saveable_Parameters=&clicker_grading_parameters();
     &Apache::loncommon::store_course_settings('grades_clicker',
                                               \%Saveable_Parameters);
-
-    my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
+    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') {
@@ -9944,7 +9317,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) {
@@ -9952,23 +9325,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="probTitle" value="$env{'form.probTitle'}" />
-<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'}" />
@@ -9996,7 +9368,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 ":"
@@ -10016,7 +9388,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}))) {
@@ -10030,7 +9404,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").": ".
@@ -10043,7 +9419,7 @@ ENDHEADER
              &mt('Found [_1] registered and [_2] unregistered clickers.',$student_count,$unknown_count);
     if (($env{'form.gradingmechanism'} ne 'attendance') && ($env{'form.gradingmechanism'} ne 'given')) {
        if ($correct_count==0) {
-          $errormsg.="Found no correct answers for grading!";
+          $errormsg.="Found no correct answers answers for grading!";
        } elsif ($correct_count>1) {
           $result.='<br /><span class="LC_warning">'.&mt("Found [_1] entries for grading!",$correct_count).'</span>';
        }
@@ -10056,9 +9432,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 {
@@ -10145,9 +9522,9 @@ sub turning_eval {
     return ($errormsg,$number);
 }
 
+
 sub assign_clicker_grades {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
 # See which part we are saving to
     my $res_error;
@@ -10158,15 +9535,11 @@ sub assign_clicker_grades {
 # FIXME: This should probably look for the first handgradeable part
     my $part=$$partlist[0];
 # Start screen output
-    my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
-
-    $result .= '<br />'.
-               &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>';
-
+    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=();
@@ -10218,17 +9591,17 @@ sub assign_clicker_grades {
        if ($user) {
           if ($users{$user}) {
              $result.='<br /><span class="LC_warning">'.
-                      &mt('More than one entry found for [_1]!','<tt>'.$user.'</tt>').
+                      &mt("More than one entry found for <tt>[_1]</tt>!",$user).
                       '</span><br />';
           }
-          $users{$user}=1;
+          $users{$user}=1; 
           my @answer=split(/\,/,$env{$key});
           my $sum=0;
           my $realnumber=$number;
           for (my $i=0;$i<$number;$i++) {
              if  ($correct[$i] eq '-') {
                 $realnumber--;
-             } elsif ($answer[$i]) {
+             } elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/))  {
                 if ($gradingmechanism eq 'attendance') {
                    $sum+=$pcorrect;
                 } elsif ($correct[$i] eq '*') {
@@ -10275,8 +9648,8 @@ sub assign_clicker_grades {
     $result.='<br />'.&mt('Successfully stored grades for [quant,_1,student].',$storecount).
              '</td>'.
              &Apache::loncommon::end_data_table_row().
-             &Apache::loncommon::end_data_table()."<br /><br />\n";
-    return $result.&show_grading_menu_form($symb);
+             &Apache::loncommon::end_data_table();
+    return $result;
 }
 
 sub navmap_errormsg {
@@ -10291,14 +9664,24 @@ sub startpage {
     if ($nomenu) {
         $r->print(&Apache::loncommon::start_page("Student's Version",$js,{'only_body' => '1'}));
     } else {
+        unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
         $r->print(&Apache::loncommon::start_page('Grading',$js,
                                                  {'bread_crumbs' => $crumbs}));
+        &Apache::lonquickgrades::startGradeScreen($r,($env{'form.symb'}?'probgrading':'grading'));
     }
     unless ($nodisplayflag) {
        $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp));
     }
 }
 
+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 {
     my $request=$_[0];
     &reset_caches();
@@ -10309,74 +9692,46 @@ sub handler {
     }
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
 
-    my $symb=&get_symb($request,1);
+# see what command we need to execute
+
     my @commands=&Apache::loncommon::get_env_multiple('form.command');
     my $command=$commands[0];
 
+    &init_perm();
+    if (!$env{'request.course.id'}) {
+        unless ((&Apache::lonnet::allowed('usc',$env{'request.role.domain'})) &&
+                ($command =~ /^scantronupload/)) {
+            # Not in a course.
+            $env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context";
+            return HTTP_NOT_ACCEPTABLE;
+        }
+    } elsif (!%perm) {
+        $request->internal_redirect('/adm/quickgrades');
+    }
+    &Apache::loncommon::content_type($request,'text/html');
+    $request->send_http_header;
+
     if ($#commands > 0) {
 	&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands));
     }
 
+# see what the symb is
+
+    my $symb=$env{'form.symb'};
+    unless ($symb) {
+       (my $url=$env{'form.url'}) =~ s-^https*://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
+       $symb=&Apache::lonnet::symbread($url);
+    }
+    &Apache::lonenc::check_decrypt(\$symb);
+
     $ssi_error = 0;
-    my $brcrum = [{href=>"/adm/grades",text=>"Grading"}];
-    my $start_page = &Apache::loncommon::start_page('Grading',undef,
-                                                    {'bread_crumbs' => $brcrum});
-    if ($symb eq '' && $command eq '') {
-	if ($env{'user.adv'}) {
-            &Apache::loncommon::content_type($request,'text/html');
-            $request->send_http_header;
-            $request->print($start_page);
-	    if (($env{'form.codeone'}) && ($env{'form.codetwo'}) &&
-		($env{'form.codethree'})) {
-		my $token=$env{'form.codeone'}.'*'.$env{'form.codetwo'}.'*'.
-		    $env{'form.codethree'};
-		my ($tsymb,$tuname,$tudom,$tcrsid)=
-		    &Apache::lonnet::checkin($token);
-		if ($tsymb) {
-		    my ($map,$id,$url)=&Apache::lonnet::decode_symb($tsymb);
-		    if (&Apache::lonnet::allowed('mgr',$tcrsid)) {
-			$request->print(&ssi_with_retries('/res/'.$url, $ssi_retries,
-					  ('grade_username' => $tuname,
-					   'grade_domain' => $tudom,
-					   'grade_courseid' => $tcrsid,
-					   'grade_symb' => $tsymb)));
-		    } else {
-			$request->print('<h3>Not authorized: '.$token.'</h3>');
-		    }
-		} else {
-		    $request->print('<h3>Not a valid DocID: '.$token.'</h3>');
-		}
-	    } else {
-		$request->print(&Apache::lonxml::tokeninputfield());
-	    }
-        } elsif ($env{'request.course.id'}) {
-            &init_perm(); 
-            if (!%perm) {
-                $request->internal_redirect('/adm/quickgrades');
-                return OK;
-            } else {
-                &Apache::loncommon::content_type($request,'text/html');
-                $request->send_http_header;
-                $request->print($start_page);
-            }
-        }
+    if (($symb eq '' || $command eq '') && ($env{'request.course.id'})) {
+#
+# Not called from a resource, but inside a course
+#    
+        &startpage($request,undef,[],1,1);
+        &select_problem($request);
     } else {
-        &init_perm();
-        if (!$env{'request.course.id'}) {
-            unless ((&Apache::lonnet::allowed('usc',$env{'request.role.domain'})) &&
-                    ($command =~ /^scantronupload/)) {
-                # Not in a course.
-                $env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context";
-                return HTTP_NOT_ACCEPTABLE;
-            }
-        } elsif (!%perm) {
-            $request->internal_redirect('/adm/quickgrades');
-        }
-        &Apache::loncommon::content_type($request,'text/html');
-        $request->send_http_header;
-        unless ((($command eq 'submission' || $command eq 'versionsub')) && ($perm{'vgr'})) {
-            $request->print($start_page); 
-        }
 	if ($command eq 'submission' && $perm{'vgr'}) {
             my ($stuvcurrent,$stuvdisp,$versionform,$js);
             if (($env{'form.student'} ne '') && ($env{'form.userdom'} ne '')) {
@@ -10389,7 +9744,7 @@ sub handler {
                 $request->print($versionform);
             }
             $request->print('<br clear="all" />');
-	    ($env{'form.student'} eq '' ? &listStudents($request) : &submission($request,0,0));
+	    ($env{'form.student'} eq '' ? &listStudents($request,$symb) : &submission($request,0,0,$symb));
         } elsif ($command eq 'versionsub' && $perm{'vgr'}) {
             my ($stuvcurrent,$stuvdisp,$versionform,$js) =
                 &choose_task_version_form($symb,$env{'form.student'},
@@ -10402,79 +9757,147 @@ sub handler {
             $request->print('<br clear="all" />');
             $request->print(&show_previous_task_version($request,$symb));
 	} elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) {
-	    &pickStudentPage($request);
+            &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'}) {
-	    &displayPage($request);
+            &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'}) {
-	    &updateGradeByPage($request);
+            &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'}) {
-	    &processGroup($request);
+            &startpage($request,$symb,[{href=>'',text=>'...'},
+                                       {href=>'',text=>'Modify grades'}]);
+	    &processGroup($request,$symb);
 	} elsif ($command eq 'gradingmenu' && $perm{'vgr'}) {
-	    $request->print(&grading_menu($request));
-	} elsif ($command eq 'submit_options' && $perm{'vgr'}) {
-	    $request->print(&submit_options($request));
+            &startpage($request,$symb);
+	    $request->print(&grading_menu($request,$symb));
+	} elsif ($command eq 'individual' && $perm{'vgr'}) {
+            &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,[{href=>'',text=>'Grade ungraded submissions'}]);
+            $request->print(&listStudents($request,$symb,'graded'));
+        } elsif ($command eq 'table' && $perm{'vgr'}) {
+            &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,[{href=>'',text=>'Grade page/folder for one student'}],1,1);
+            $request->print(&submit_options_sequence($request,$symb));
 	} elsif ($command eq 'viewgrades' && $perm{'vgr'}) {
-	    $request->print(&viewgrades($request));
+            &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'}) {
-	    $request->print(&processHandGrade($request));
+            &startpage($request,$symb,[{href=>'',text=>'...'},
+                                       {href=>'',text=>'Store grades'}]);
+	    $request->print(&processHandGrade($request,$symb));
 	} elsif ($command eq 'editgrades' && $perm{'mgr'}) {
-	    $request->print(&editgrades($request));
+            &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,[{href=>'',text=>'Verify Receipt Number'}]);
+            $request->print(&initialverifyreceipt($request,$symb));
 	} elsif ($command eq 'verify' && $perm{'vgr'}) {
-	    $request->print(&verifyreceipt($request));
+            &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'}) {
-            $request->print(&process_clicker($request));
+            &startpage($request,$symb,[{href=>'', text=>'Process clicker'}]);
+            $request->print(&process_clicker($request,$symb));
         } elsif ($command eq 'processclickerfile' && $perm{'mgr'}) {
-            $request->print(&process_clicker_file($request));
+            &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'}) {
-            $request->print(&assign_clicker_grades($request));
+            &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'}) {
-	    $request->print(&upcsvScores_form($request));
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+	    $request->print(&upcsvScores_form($request,$symb));
 	} elsif ($command eq 'csvupload' && $perm{'mgr'}) {
-	    $request->print(&csvupload($request));
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+	    $request->print(&csvupload($request,$symb));
 	} elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) {
-	    $request->print(&csvuploadmap($request));
+            &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') {
-		$request->print(&csvuploadoptions($request));
+                &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+		$request->print(&csvuploadoptions($request,$symb));
 	    } else {
 		if ( $env{'form.upfile_associate'} ne 'reverse' ) {
 		    $env{'form.upfile_associate'} = 'reverse';
 		} else {
 		    $env{'form.upfile_associate'} = 'forward';
 		}
-		$request->print(&csvuploadmap($request));
+                &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+		$request->print(&csvuploadmap($request,$symb));
 	    }
 	} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) {
-	    $request->print(&csvuploadassign($request));
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+	    $request->print(&csvuploadassign($request,$symb));
 	} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {
-	    $request->print(&scantron_selectphase($request));
+            &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'}) {
- 	    $request->print(&scantron_do_warning($request));
+            &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'}) {
-	    $request->print(&scantron_validate_file($request));
+            &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'}) {
-	    $request->print(&scantron_process_students($request));
+            &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'}))) {
- 	    $request->print(&scantron_upload_scantron_data($request)); 
+            &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'}))) {
- 	    $request->print(&scantron_upload_scantron_data_save($request));
+            &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'})) {
- 	    $request->print(&scantron_download_scantron_data($request));
+            &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'}) {
-            $request->print(&checkscantron_results($request));     
+            &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,[{href=>'', text=>'Access denied'}]);
 	    $request->print('<p class="LC_error">'.&mt('Access Denied ([_1])',$command).'</p>');
 	}
     }
     if ($ssi_error) {
 	&ssi_print_error($request);
     }
-    $request->print(&Apache::loncommon::end_page());
+    if ($env{'form.inhibitmenu'}) {
+        $request->print(&Apache::loncommon::end_page());
+    } else {
+        &Apache::lonquickgrades::endGradeScreen($request);
+    }
     &reset_caches();
     return OK;
 }
@@ -10545,6 +9968,75 @@ ssi_with_retries()
 
 =over
 
+=head1 Routines to display previous version of a Task for a specific student
+
+Tasks are graded pass/fail. Students who have yet to pass a particular Task
+can receive another opportunity. Access to tasks is slot-based. If a slot
+requires a proctor to check-in the student, a new version of the Task will
+be created when the student is checked in to the new opportunity.
+
+If a particular student has tried two or more versions of a particular task,
+the submission screen provides a user with vgr privileges (e.g., a Course
+Coordinator) the ability to display a previous version worked on by the
+student.  By default, the current version is displayed. If a previous version
+has been selected for display, submission data are only shown that pertain
+to that particular version, and the interface to submit grades is not shown.
+
+=over 4
+
+=item show_previous_task_version()
+
+Displays a specified version of a student's Task, as the student sees it.
+
+Inputs: 2
+        request - request object
+        symb    - unique symb for current instance of resource
+
+Output: None.
+
+Side Effects: calls &show_problem() to print version of Task, with
+              version contained in form item: $env{'form.previousversion'}
+
+=item choose_task_version_form()
+
+Displays a web form used to select which version of a student's view of a
+Task should be displayed.  Either launches a pop-up window, or replaces
+content in existing pop-up, or replaces page in main window.
+
+Inputs: 4
+        symb    - unique symb for current instance of resource
+        uname   - username of student
+        udom    - domain of student
+        nomenu  - 1 if display is in a pop-up window, and hence no menu
+                  breadcrumbs etc., are displayed
+
+Output: 4
+        current   - student's current version
+        displayed - student's version being displayed
+        result    - scalar containing HTML for web form used to switch to
+                    a different version (or a link to close window, if pop-up).
+        js        - javascript for processing selection in versions web form
+
+Side Effects: None.
+
+=item previous_display_javascript()
+
+Inputs: 2
+        nomenu  - 1 if display is in a pop-up window, and hence no menu
+                  breadcrumbs etc., are displayed.
+        current - student's current version number.
+
+Output: 1
+        js      - javascript for processing selection in versions web form.
+
+Side Effects: None.
+
+=back
+
+=head1 Routines to process bubblesheet data.
+
+=over 4
+
 =item scantron_get_correction() : 
 
    Builds the interface screen to interact with the operator to fix a
@@ -10571,16 +10063,6 @@ ssi_with_retries()
          - missingbubble - array ref of the bubble lines that have missing
                            bubble errors
 
-   $randomorder - True if exam folder has randomorder set
-   $randompick  - True if exam folder has randompick set
-   $respnumlookup - Reference to HASH mapping question numbers in bubble lines
-                     for current line to question number used for same question
-                     in "Master Seqence" (as seen by Course Coordinator).
-   $startline   - Reference to hash where key is question number (0 is first)
-                  and value is number of first bubble line for current student
-                  or code-based randompick and/or randomorder.
-
-
 =item  scantron_get_maxbubble() : 
 
    Arguments:
@@ -10601,7 +10083,7 @@ ssi_with_retries()
    $env{'form.scantron.bubble_lines.n'}, 
    $env{'form.scantron.first_bubble_line.n'} and
    $env{"form.scantron.sub_bubblelines.n"}
-   which are the total number of bubble lines, the number of bubble
+   which are the total number of bubble, lines, the number of bubble
    lines for response n and number of the first bubble line for response n,
    and a comma separated list of numbers of bubble lines for sub-questions
    (for optionresponse, matchresponse, and rankresponse items), for response n.  
@@ -10660,7 +10142,9 @@ ssi_with_retries()
 =item navmap_errormsg() :
 
    Returns HTML mark-up inside a <div></div> with a link to re-initialize the course.
-   Should be called whenever the request to instantiate a navmap object fails.  
+   Should be called whenever the request to instantiate a navmap object fails.
+
+=back
 
 =back