Index: moodle/mod/choice/lang/en/choice.php
--- moodle/mod/choice/lang/en/choice.php Base (1.11)
+++ moodle/mod/choice/lang/en/choice.php Locally Modified (Based On 1.11)
@@ -52,6 +52,7 @@
 $string['choice:readresponses'] = 'Read responses';
 $string['choicesaved'] = 'Your choice has been saved';
 $string['choicetext'] = 'Choice text';
+$string['chooseaction'] = 'Choose an action ...';
 $string['limit'] = 'Limit';
 $string['limitanswers'] = 'Limit the number of responses allowed';
 $string['modulename'] = 'Choice';
Index: moodle/mod/choice/lib.php
--- moodle/mod/choice/lib.php Base (1.141)
+++ moodle/mod/choice/lib.php Locally Modified (Based On 1.141)
@@ -221,19 +221,20 @@
             }
             if ( $choice->limitanswers && ($option->countanswers >= $option->maxanswers) && empty($option->attributes->checked)) {
                 $option->attributes->disabled = true;
-                }
-            $cdisplay['options'][] = $option;
             }
+            $cdisplay['options'][] = $option;
         }
+    }
 
     $cdisplay['hascapability'] = is_enrolled($context, NULL, 'mod/choice:choose'); //only enrolled users are allowed to make a choice
+    $cdisplay['hasreadcapability'] = has_capability('mod/choice:readresponses', $context, $user);
 
     if ($choice->allowupdate && $DB->record_exists('choice_answers', array('choiceid'=> $choice->id, 'userid'=> $user->id))) {
         $cdisplay['allowupdate'] = true;
-                }
+    }
 
     return $cdisplay;
-                    }
+}
 
 /**
  * @global object
@@ -358,7 +359,7 @@
         $display->options[$optionid]->maxanswer = $choice->maxanswers[$optionid];
 
         if (array_key_exists($optionid, $allresponses)) {
-            $display->options[$optionid]->user = $allresponses[$optionid]; //->user;
+            $display->options[$optionid]->user = $allresponses[$optionid];
             $totaluser += count($allresponses[$optionid]);
         }
     }
@@ -841,7 +842,7 @@
     $choice = $DB->get_record('choice', array('id'=>$cm->instance), '*',
             MUST_EXIST);
 
-    // If completion option is enabled, evaluate it and return true/false 
+    // If completion option is enabled, evaluate it and return true/false
     if($choice->completionsubmit) {
         return $DB->record_exists('choice_answers', array(
                 'choiceid'=>$choice->id, 'userid'=>$userid));
Index: moodle/mod/choice/renderer.php
--- moodle/mod/choice/renderer.php Base (1.4)
+++ moodle/mod/choice/renderer.php Locally Modified (Based On 1.4)
@@ -57,6 +57,11 @@
                 $availableoption--;
             }
 
+            if (empty($options['hascapability']) &&
+                !empty($options['hasreadcapability']) && ($options['hasreadcapability'])) {
+                $option->attributes->disabled = true;
+            }
+            
             $html .= html_writer::empty_tag('input', (array)$option->attributes);
             $html .= html_writer::tag('label', $labeltext, array('for'=>$option->attributes->name));
             $html .= html_writer::end_tag('li');
@@ -78,6 +83,8 @@
                 $url = new moodle_url('view.php', array('id'=>$coursemoduleid, 'action'=>'delchoice', 'sesskey'=>sesskey()));
                 $html .= html_writer::link($url, get_string('removemychoice','choice'));
             }
+        } else if (!empty($options['hasreadcapability']) && ($options['hasreadcapability'])) {
+            $html .= html_writer::tag('label', get_string('notenrolledchoose', 'choice'));
         } else {
             $html .= html_writer::tag('label', get_string('havetologin', 'choice'));
         }
@@ -122,9 +129,14 @@
         $html .= html_writer::tag('h2',format_string(get_string("responses", "choice")), array('class'=>'main'));
 
         $attributes = array('method'=>'POST');
-        $attributes['action'] = new moodle_url('/mod/choice/view.php');
         $attributes['id'] = 'attemptsform';
 
+        if (!empty($choices->url)) {
+            $attributes['action'] = $choices->url;
+        } else {
+            $attributes['action'] = new moodle_url('/mod/choice/view.php');
+        }
+
         if ($choices->viewresponsecapability) {
             $html .= html_writer::start_tag('form', $attributes);
             $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'id', 'value'=> $choices->coursemoduleid));
@@ -214,7 +226,7 @@
             $actiondata .= html_writer::tag('label', ' ' . get_string('withselected', 'quiz') . ' ', array('for'=>'menuaction'));
 
             $actionurl = new moodle_url('/mod/choice/view.php', array('sesskey'=>sesskey(), 'action'=>'delete_confirmation()'));
-            $select = new single_select($actionurl, 'action', array('delete'=>get_string('delete')), null, array(''=>get_string('moveselectedusersto', 'choice')), 'attemptsform');
+            $select = new single_select($actionurl, 'action', array('delete'=>get_string('delete')), null, array(''=>get_string('chooseaction', 'choice')), 'attemptsform');
 
             $actiondata .= $this->output->render($select);
         }
Index: moodle/mod/choice/report.php
--- moodle/mod/choice/report.php Base (1.83)
+++ moodle/mod/choice/report.php Locally Modified (Based On 1.83)
@@ -2,6 +2,7 @@
 
     require_once("../../config.php");
     require_once("lib.php");
+    require_once($CFG->libdir . '/completionlib.php');
 
     $id         = required_param('id', PARAM_INT);   //moduleid
     $format     = optional_param('format', CHOICE_PUBLISH_NAMES, PARAM_INT);
@@ -47,7 +48,7 @@
 
     if (data_submitted() && $action == 'delete' && has_capability('mod/choice:deleteresponses',$context) && confirm_sesskey()) {
         choice_delete_responses($attemptids, $choice, $cm, $course); //delete responses.
-        redirect("report.php?id=$cm->id");
+        redirect($PAGE->url);
     }
 
     if (!$download) {
@@ -217,9 +218,10 @@
     }
 
     $results = prepare_choice_show_results($choice, $course, $cm, $users);
+    $results->url = $PAGE->url;
     $renderer = $PAGE->get_renderer('mod_choice');
     echo $renderer->display_result($results, has_capability('mod/choice:readresponses', $context));
-    
+
    //now give links for downloading spreadsheets.
     if (!empty($users) && has_capability('mod/choice:downloadresponses',$context)) {
         $downloadoptions = array();
Index: moodle/mod/choice/view.php
--- moodle/mod/choice/view.php Base (1.143)
+++ moodle/mod/choice/view.php Locally Modified (Based On 1.143)
@@ -35,7 +35,8 @@
         print_error('badcontext');
     }
 
-    if ($action == 'delchoice' and confirm_sesskey() and is_enrolled($context, NULL, 'mod/choice:choose') and $choice->allowupdate) {
+    if ($action == 'delchoice' && confirm_sesskey() &&
+       ((is_enrolled($context, NULL, 'mod/choice:choose') && $choice->allowupdate) || has_capability('mod/choice:deleteresponses', $context))) {
         if ($answer = $DB->get_record('choice_answers', array('choiceid' => $choice->id, 'userid' => $USER->id))) {
             $DB->delete_records('choice_answers', array('id' => $answer->id));
 
@@ -51,28 +52,25 @@
     $PAGE->set_heading($course->fullname);
 
 /// Submit any new data if there is any
-    if ($form = data_submitted() && is_enrolled($context, NULL, 'mod/choice:choose') && confirm_sesskey()) {
-        $timenow = time();
-        if (has_capability('mod/choice:deleteresponses', $context)) {
-            if ($action == 'delete') { //some responses need to be deleted
-                choice_delete_responses($attemptids, $choice, $cm, $course); //delete responses.
-                redirect("view.php?id=$cm->id");
+    $notification = null;
+    if ($form = data_submitted() && confirm_sesskey()) {
+        if (is_enrolled($context, NULL, 'mod/choice:choose')) {
+            $answer = optional_param('answer', '', PARAM_INT);
+
+            if (empty($answer)) {
+                redirect($PAGE->url, get_string('mustchooseone', 'choice'));
+            } else {
+                choice_user_submit_response($answer, $choice, $USER->id, $course, $cm);
             }
+            $notification = get_string('choicesaved', 'choice');
         }
-        $answer = optional_param('answer', '', PARAM_INT);
+    }
 
-        if (empty($answer)) {
-            redirect("view.php?id=$cm->id", get_string('mustchooseone', 'choice'));
-        } else {
-            choice_user_submit_response($answer, $choice, $USER->id, $course, $cm);
-        }
-        echo $OUTPUT->header();
-        echo $OUTPUT->notification(get_string('choicesaved', 'choice'),'notifysuccess');
-    } else {
-        echo $OUTPUT->header();
+    echo $OUTPUT->header();
+    if (!empty($notification)) {
+        echo $OUTPUT->notification($notification,'notifysuccess');
     }
 
-
 /// Display the choice and possibly results
     add_to_log($course->id, "choice", "view", "view.php?id=$cm->id", $choice->id, $cm->id);
 
@@ -117,8 +115,9 @@
         }
     }
 
-    if ( (!$current or $choice->allowupdate) and $choiceopen and is_enrolled($context, NULL, 'mod/choice:choose')) {
-    // They haven't made their choice yet or updates allowed and choice is open
+    if ( (!$current or $choice->allowupdate) && $choiceopen &&
+         (is_enrolled($context, NULL, 'mod/choice:choose') || has_capability('mod/choice:readresponses', $context))) {
+        // They haven't made their choice yet or updates allowed and choice is open
 
         $options = choice_prepare_options($choice, $USER, $cm, $allresponses);
         $renderer = $PAGE->get_renderer('mod_choice');
