diff --git a/includes/QuizResult.class.inc b/includes/QuizResult.class.inc
index 985bba6..255a833 100644
--- a/includes/QuizResult.class.inc
+++ b/includes/QuizResult.class.inc
@@ -1,4 +1,6 @@
 <?php
 
 class QuizResult extends Entity {
-}
\ No newline at end of file
+
+}
+
diff --git a/includes/QuizResultAnswer.class.inc b/includes/QuizResultAnswer.class.inc
index d158d42..e4b0dab 100644
--- a/includes/QuizResultAnswer.class.inc
+++ b/includes/QuizResultAnswer.class.inc
@@ -2,4 +2,4 @@
 
 class QuizResultAnswer extends Entity {
 
-}
\ No newline at end of file
+}
diff --git a/includes/QuizResultAnswerController.class.inc b/includes/QuizResultAnswerController.class.inc
index b71dff9..3b53bda 100644
--- a/includes/QuizResultAnswerController.class.inc
+++ b/includes/QuizResultAnswerController.class.inc
@@ -2,4 +2,96 @@
 
 class QuizResultAnswerController extends EntityAPIController {
 
-}
\ No newline at end of file
+  public function buildContent($entity, $view_mode = 'full', $langcode = NULL) {
+    $out = parent::buildContent($entity, $view_mode, $langcode);
+    $node = node_load($entity->question_nid, $entity->question_vid);
+    $entity_info = entity_get_info('node');
+    foreach ($entity_info['view modes'] as $view_mode => $info) {
+      $instance = _quiz_question_response_get_instance($entity->result_id, $node);
+      if ($instance->canReview("quiz_question_view_" . $view_mode)) {
+        $build = node_view($node, $view_mode);
+        unset($build['#theme']);
+        unset($build['answers']);
+        unset($build['links']);
+
+        $out["quiz_question_view_" . $view_mode] = $build;
+      }
+    }
+
+    $rows = array();
+
+    $labels = array(
+      'attempt' => t('Your answer'),
+      'choice' => t('Choice'),
+      'correct' => t('Correct?'),
+      'score' => t('Score'),
+      'answer_feedback' => t('Feedback'),
+      'solution' => t('Correct answer'),
+    );
+    drupal_alter('quiz_feedback_labels', $labels);
+
+    foreach ($instance->getFeedbackValues() as $idx => $row) {
+      foreach ($labels as $reviewType => $label) {
+        if ((isset($row[$reviewType]) && $instance->canReview($reviewType))) {
+          $rows[$idx][$reviewType] = $row[$reviewType];
+          if (!empty($row[$reviewType])) {
+            $out[$reviewType] = array(
+              '#title' => $label,
+              '#type' => 'item',
+              '#markup' => $row[$reviewType],
+            );
+          }
+        }
+      }
+    }
+
+    if ($instance->isEvaluated()) {
+      $score = $instance->getScore();
+      if ($instance->isCorrect()) {
+        $class = 'q-correct';
+      }
+      else {
+        $class = 'q-wrong';
+      }
+    }
+    else {
+      $score = t('?');
+      $class = 'q-waiting';
+    }
+
+    if ($instance->canReview('score') || quiz_access_to_score()) {
+      $out['score']['#markup'] = theme('quiz_question_score', array('score' => $score, 'max_score' => $instance->getMaxScore(), 'class' => $class));
+    }
+
+    if ($rows) {
+      $headers = array_intersect_key($labels, $rows[0]);
+      $type = $instance->getQuizQuestion()->node->type;
+      $out['table']['#markup'] = theme('quiz_question_feedback__' . $type, array('labels' => $headers, 'data' => $rows));
+    }
+
+    if ($instance->canReview('question_feedback')) {
+      if ($properties = entity_load('quiz_question', FALSE, array('nid' => $instance->quizQuestion->node->nid, 'vid' => $instance->quizQuestion->node->vid))) {
+        $quiz_question = reset($properties);
+        $quiz_result = quiz_result_load($entity->result_id);
+        $account = user_load($quiz_result->uid);
+        $token_types = array(
+          'global' => NULL,
+          'node' => $instance->quizQuestion->node,
+          'user' => $account,
+        );
+        $quiz_question->feedback = token_replace($quiz_question->feedback, $token_types);
+        $out['question_feedback']['#markup'] = check_markup($quiz_question->feedback, $quiz_question->feedback_format);
+      }
+    }
+
+    if ($instance->canReview('score')) {
+      $out['max_score'] = array(
+        '#type' => 'value',
+        '#value' => $instance->getMaxScore(),
+      );
+    }
+
+    return $out;
+  }
+
+}
diff --git a/includes/QuizResultController.class.inc b/includes/QuizResultController.class.inc
index f1adcbc..ef7ab8c 100644
--- a/includes/QuizResultController.class.inc
+++ b/includes/QuizResultController.class.inc
@@ -170,4 +170,60 @@ class QuizResultController extends EntityAPIController {
     return FALSE;
   }
 
+  public function buildContent($entity, $view_mode = 'full', $langcode = NULL) {
+    $out = parent::buildContent($entity, $view_mode, $langcode);
+
+    if (!$entity->is_evaluated && empty($_POST)) {
+      $msg = t('Parts of this @quiz have not been evaluated yet. The score below is not final.', array('@quiz' => QUIZ_NAME));
+      drupal_set_message($msg, 'warning');
+    }
+
+    $score = quiz_calculate_score($entity->result_id);
+    $account = user_load($entity->uid);
+
+    $params = array(
+      '%num_correct' => $score['numeric_score'],
+      '%question_count' => $score['possible_score'],
+      '!username' => ($account->uid == $account->uid) ? t('You') : theme('username', array('account' => $account)),
+      '@score' => $score['percentage_score'],
+      '!yourtotal' => ($account->uid == $account->uid) ? t('Your') : t('Total'),
+    );
+
+    $out['questions'] = array();
+
+    foreach ($entity->layout as $question) {
+      // Loop through all the questions and get their feedback.
+      $question_node = node_load($question['nid'], $question['vid']);
+      $qras = entity_load('quiz_result_answer', FALSE, array('result_id' => $entity->result_id, 'question_nid' => $question_node->nid, 'question_vid' => $question_node->vid));
+      $qra = reset($qras);
+
+      $out[$question_node->nid] = array(
+        '#title' => t('Question @num', array('@num' => $question['display_number'])),
+        '#type' => 'fieldset',
+        'feedback' => $qra->view(),
+        '#weight' => $question['number'],
+      );
+    }
+
+    $quiz_feedback['#markup'] = '';
+    if (quiz_feedback_can_review('quiz_feedback', $entity)) {
+      $summary = _quiz_get_summary_text($entity);
+      // Show quiz feedback.
+      if (!empty($summary['passfail'])) {
+        $quiz_feedback['#markup'] .= '<div id="quiz-summary">' . $summary['passfail'] . '</div>';
+      }
+      if (!empty($summary['result'])) {
+        $quiz_feedback['#markup'] .= '<div id="quiz-summary">' . $summary['result'] . '</div>';
+      }
+    }
+    $out['quiz_feedback'] = $quiz_feedback;
+
+    if (quiz_feedback_can_review('score', $entity)) {
+      // Show score.
+      $out['score']['#markup'] = '<div id="quiz_score_possible">' . t('!username got %num_correct of %question_count possible points.', $params) . '</div>' . "\n";
+      $out['score']['#markup'] .= '<div id="quiz_score_percent">' . t('!yourtotal score: @score%', $params) . '</div>';
+    }
+    return array('content' => $out);
+  }
+
 }
diff --git a/question_types/quiz_question/quiz_question.core.inc b/question_types/quiz_question/quiz_question.core.inc
index c3dcc9e..46bb52c 100644
--- a/question_types/quiz_question/quiz_question.core.inc
+++ b/question_types/quiz_question/quiz_question.core.inc
@@ -712,6 +712,7 @@ abstract class QuizQuestionResponse {
      * Add general data, and data from the question type implementation
      */
     $form = array();
+
     $form['nid'] = array(
       '#type' => 'value',
       '#value' => $this->question->nid,
@@ -728,112 +729,19 @@ abstract class QuizQuestionResponse {
       '#type' => 'value',
       '#value' => $this->display_number,
     );
-    if (quiz_access_to_score() && $submit = $this->getReportFormSubmit()) {
-      $form['submit'] = array(
-        '#type' => 'value',
-        '#value' => $submit,
-      );
-    }
-
-    if (quiz_access_to_score() && $submit) {
-      $form['score'] = $this->getReportFormScore();
-    }
-    if (quiz_access_to_score() && $submit) {
-      $form['answer_feedback'] = $this->getReportFormAnswerFeedback();
-    }
-
-    foreach ($this->getFeedback() as $type => $render) {
-      $form[$type] = $render;
-    }
-
-    return $form;
-  }
-
-  /**
-   * Returns a renderable array of question feedback.
-   */
-  public function getFeedback() {
-    $out = array();
-    $node = node_load($this->question->nid, $this->question->vid);
-    $entity_info = entity_get_info('node');
-    foreach ($entity_info['view modes'] as $view_mode => $info) {
-      if ($this->canReview("quiz_question_view_" . $view_mode)) {
-        $build = node_view($node, $view_mode);
-        unset($build['#theme']);
-        unset($build['answers']);
-        unset($build['links']);
-
-        $out['question'][$node->nid] = $build;
-      }
-    }
-
-    $rows = array();
-
-    $labels = array(
-      'attempt' => t('Your answer'),
-      'choice' => t('Choice'),
-      'correct' => t('Correct?'),
-      'score' => t('Score'),
-      'answer_feedback' => t('Feedback'),
-      'solution' => t('Correct answer'),
-    );
-    drupal_alter('quiz_feedback_labels', $labels);
-
-    foreach ($this->getFeedbackValues() as $idx => $row) {
-      foreach ($labels as $reviewType => $label) {
-        if ((isset($row[$reviewType]) && $this->canReview($reviewType))) {
-          $rows[$idx][$reviewType] = $row[$reviewType];
-        }
-      }
-    }
-
-    if ($this->isEvaluated()) {
-      $score = $this->getScore();
-      if ($this->isCorrect()) {
-        $class = 'q-correct';
-      }
-      else {
-        $class = 'q-wrong';
-      }
-    }
-    else {
-      $score = t('?');
-      $class = 'q-waiting';
-    }
-
-    if ($this->canReview('score') || quiz_access_to_score()) {
-      $out['score_display']['#markup'] = theme('quiz_question_score', array('score' => $score, 'max_score' => $this->getMaxScore(), 'class' => $class));
-    }
-
-    if ($rows) {
-      $headers = array_intersect_key($labels, $rows[0]);
-      $type = $this->getQuizQuestion()->node->type;
-      $out['response']['#markup'] = theme('quiz_question_feedback__' . $type, array('labels' => $headers, 'data' => $rows));
-    }
-
-    if ($this->canReview('question_feedback')) {
-      if ($properties = entity_load('quiz_question', FALSE, array('nid' => $this->quizQuestion->node->nid, 'vid' => $this->quizQuestion->node->vid))) {
-        $quiz_question = reset($properties);
-        $quiz_result = quiz_result_load($this->result_id);
-        $account = user_load($quiz_result->uid);
-        $token_types = array(
-          'global' => NULL,
-          'node' => $this->quizQuestion->node,
-          'user' => $account,
+    if (quiz_access_to_score()) {
+
+      if ($submit = $this->getReportFormSubmit()) {
+        $form['score'] = $this->getReportFormScore();
+        $form['answer_feedback'] = $this->getReportFormAnswerFeedback();
+        $form['submit'] = array(
+          '#type' => 'value',
+          '#value' => $submit,
         );
-        $quiz_question->feedback = token_replace($quiz_question->feedback, $token_types);
-        $out['question_feedback']['#markup'] = check_markup($quiz_question->feedback, $quiz_question->feedback_format);
       }
-    }
 
-    if ($this->canReview('score')) {
-      $out['max_score'] = array(
-        '#type' => 'value',
-        '#value' => $this->getMaxScore(),
-      );
+      return $form;
     }
-
-    return $out;
   }
 
   /**
diff --git a/quiz.admin.inc b/quiz.admin.inc
index 186a0af..60a0662 100644
--- a/quiz.admin.inc
+++ b/quiz.admin.inc
@@ -370,13 +370,12 @@ function quiz_admin_node_form_submit($form, &$form_state) {
  * @param $result_id
  *   The result id
  */
-function quiz_admin_results($quiz, $result_id) {
+function quiz_admin_results($quiz, $quiz_result) {
   // Preserve "Results" tab.
   $item = menu_get_item("node/$quiz->nid/quiz");
   menu_set_item(NULL, $item);
 
-  module_load_include('inc', 'quiz', 'quiz.pages');
-  return quiz_user_results($result_id);
+  return entity_ui_get_form('quiz_result', $quiz_result);
 }
 
 // MANAGE QUESTIONS
diff --git a/quiz.css b/quiz.css
index 016e8ad..a7086d6 100644
--- a/quiz.css
+++ b/quiz.css
@@ -119,15 +119,16 @@ div.quiz-report .quiz-report-question-header h3 {
   float:left;
 }
 
-div.quiz-report .dt div.quiz-report-score-container {
+div.quiz-report-score-container {
   border-right: solid 1px gray;
   border-left: solid 1px gray;
   border-bottom: solid 1px gray;
+  border-top: solid 1px gray;
   float: right;
   padding: 4px 6px;
 }
 
-div.quiz-report .dt div.quiz-report-score-container span div.form-item {
+div.quiz-report-score-container span div.form-item {
   display: inline;
 }
 
diff --git a/quiz.module b/quiz.module
index 516fec3..a030bec 100644
--- a/quiz.module
+++ b/quiz.module
@@ -174,8 +174,9 @@ function quiz_admin_paths() {
  * @return boolean
  *   TRUE if user has permission.
  */
-function quiz_access_results($quiz, $result_id = NULL) {
+function quiz_access_results($quiz, $quiz_result) {
   global $user;
+  $result_id = $quiz_result->result_id;
 
   if ($quiz->type !== 'quiz') {
     return FALSE;
@@ -419,6 +420,14 @@ function quiz_menu() {
     'type' => MENU_NORMAL_ITEM,
   );
 
+  $items['admin/quiz/result_answer'] = array(
+    'title' => 'Quiz result answer',
+    'description' => 'Configure Quiz result answer behaviors',
+    'page callback' => 'quiz_result_answer_page',
+    'access arguments' => array('administer quiz'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
   $items['node/%quiz_menu/quiz-results/%quiz_rid/view'] = array(
     'title' => 'View',
     'type' => MENU_DEFAULT_LOCAL_TASK,
@@ -434,7 +443,7 @@ function quiz_menu() {
     'file' => 'quiz.pages.inc',
   );
 
-  $items['node/%quiz_menu/quiz/results/%quiz_rid/view'] = array(
+  $items['node/%quiz_menu/quiz/results/%quiz_result/view'] = array(
     'title' => 'Results',
     'page callback' => 'quiz_admin_results',
     'page arguments' => array(1, 4),
@@ -443,6 +452,16 @@ function quiz_menu() {
     'file' => 'quiz.admin.inc',
   );
 
+  $items['node/%quiz_menu/quiz/results/%quiz_result/edit'] = array(
+    'title' => 'Score',
+    'page callback' => 'quiz_admin_results',
+    'page arguments' => array(1, 4),
+    'access callback' => 'quiz_access_results',
+    'access arguments' => array(1, 4),
+    'file' => 'quiz.admin.inc',
+    'type' => MENU_LOCAL_ACTION,
+  );
+
   // Add questions to quiz.
   $items['node/%quiz_menu/quiz/questions'] = array(
     'title' => 'Manage questions',
@@ -518,6 +537,13 @@ function quiz_result_page() {
 }
 
 /**
+ * Page for Quiz result answer configuration and fields.
+ */
+function quiz_result_answer_page() {
+  return t('Here, you can configure how Quiz result answers behave.');
+}
+
+/**
  * Implements hook_theme().
  */
 function quiz_theme($existing, $type, $theme, $path) {
@@ -736,6 +762,8 @@ function quiz_update($node) {
  * Implements hook_field_extra_fields().
  */
 function quiz_field_extra_fields() {
+  $extra = array();
+
   $extra['node']['quiz'] = array(
     'display' => array(
       'take' => array(
@@ -782,6 +810,39 @@ function quiz_field_extra_fields() {
       ),
     ),
   );
+
+  $options = quiz_get_feedback_options();
+  foreach ($options as $option => $label) {
+    $extra['quiz_result_answer']['quiz_result_answer']['display'][$option] = array(
+      'label' => $label,
+      'description' => t('Feedback for @label.', array('@label' => $label)),
+      'weight' => 0,
+    );
+  }
+  $extra['quiz_result_answer']['quiz_result_answer']['display']['table'] = array(
+    'label' => t('Feedback table'),
+    'description' => t('A table of feedback.'),
+    'weight' => 0,
+  );
+
+  $extra['quiz_result']['quiz_result']['display'] = array(
+    'score' => array(
+      'label' => t('Score'),
+      'description' => t('The score of the result.'),
+      'weight' => 0,
+    ),
+    'questions' => array(
+      'label' => t('Questions'),
+      'description' => t('The questions in this result.'),
+      'weight' => 0,
+    ),
+    'summary' => array(
+      'label' => t('Summary'),
+      'description' => t('The summary and pass/fail text.'),
+      'weight' => 0,
+    ),
+  );
+
   return $extra;
 }
 
@@ -2805,7 +2866,7 @@ function _quiz_update_resultoptions($node) {
  * @return
  *   Filtered summary text or null if we are not displaying any summary.
  */
-function _quiz_get_summary_text($quiz_result, $score) {
+function _quiz_get_summary_text($quiz_result) {
   $quiz = node_load($quiz_result->nid);
   $account = user_load($quiz_result->uid);
   $token_types = array(
@@ -2816,13 +2877,13 @@ function _quiz_get_summary_text($quiz_result, $score) {
   );
   $summary = array();
 
-  if ($result_option = _quiz_pick_result_option($quiz->nid, $quiz->vid, $score['percentage_score'])) {
+  if ($result_option = _quiz_pick_result_option($quiz->nid, $quiz->vid, $quiz_result->score)) {
     // Range option.
     $summary['result'] = check_markup(token_replace($result_option->option_summary, $token_types), $result_option->option_summary_format);
   }
 
   if (variable_get('quiz_use_passfail', 1) && $quiz->pass_rate > 0) {
-    if ($score['percentage_score'] >= $quiz->pass_rate) {
+    if ($quiz_result->score >= $quiz->pass_rate) {
       // Pass/fail is enabled and user passed.
       $summary['passfail'] = check_markup(token_replace($quiz->summary_pass, $token_types), $quiz->summary_pass_format);
     }
@@ -3579,11 +3640,21 @@ function quiz_entity_info() {
     ),
     'quiz_result_answer' => array(
       'base table' => 'quiz_node_results_answers',
+      'bundles' => array(
+        'quiz_result_answer' => array(
+          'label' => 'Quiz result answer',
+          'admin' => array(
+            'path' => 'admin/quiz/result_answer',
+            'access arguments' => array('administer quiz'),
+          ),
+        ),
+      ),
       'controller class' => 'QuizResultAnswerController',
       'entity class' => 'QuizResultAnswer',
       'entity keys' => array(
         'id' => 'result_answer_id',
       ),
+      'fieldable' => TRUE,
       'label' => 'Quiz result answer',
       'metadata controller class' => 'QuizResultAnswerMetadataController',
       'views controller class' => 'EntityDefaultViewsController',
@@ -3952,14 +4023,46 @@ function quiz_result_form($form, &$form_state, $quiz_result) {
   }
 
   $form['actions'] = array('#type' => 'actions');
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Start @quiz', array('@quiz' => QUIZ_NAME)),
-  );
+
+  if ($quiz_result->result_id) {
+    foreach ($quiz_result->layout as $question) {
+      // Loop through all the questions and get their scoring form.
+      $question = node_load($question['nid'], $question['vid']);
+      $instance = _quiz_question_response_get_instance($quiz_result->result_id, $question);
+      $form['questions'][$question->nid] = array(
+        '#title' => check_plain($question->title),
+        '#type' => 'fieldset',
+      );
+      $qras = entity_load('quiz_result_answer', FALSE, array('result_id' => $quiz_result->result_id, 'question_nid' => $question->nid, 'question_vid' => $question->vid));
+      $qra = reset($qras);
+      // The display of the question.
+      $form['questions'][$question->nid]['#tree'] = TRUE;
+      $form['questions'][$question->nid][] = $qra->view();
+      // Get the feedback elements.
+      $form['questions'][$question->nid][] = $instance->getReportForm();
+    }
+  }
+
+  if (!$quiz_result->result_id) {
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Start @quiz', array('@quiz' => QUIZ_NAME)),
+    );
+  }
+  else {
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save score'),
+    );
+  }
 
   return $form;
 }
 
+function quiz_result_view() {
+  sdfsdfsdf;
+}
+
 /**
  * Quiz result submit handler.
  */
@@ -3975,4 +4078,7 @@ function quiz_result_form_submit($form, &$form_state) {
   entity_save('quiz_result', $quiz_result);
   $_SESSION['quiz'][$quiz_result->nid]['result_id'] = $quiz_result->result_id;
   $_SESSION['quiz'][$quiz_result->nid]['current'] = 1;
+
+  // Call the grading handler.
+  quiz_report_form_submit($form, $form_state);
 }
diff --git a/quiz.pages.inc b/quiz.pages.inc
index acac374..45fdc9a 100644
--- a/quiz.pages.inc
+++ b/quiz.pages.inc
@@ -13,6 +13,7 @@
  */
 function quiz_user_results($result_id) {
   $quiz_result = quiz_result_load($result_id);
+  return entity_view('quiz_result', array($quiz_result));
 
   if ($quiz_result->nid) {
     $quiz = node_load($quiz_result->nid, $quiz_result->vid);
@@ -61,76 +62,6 @@ function quiz_check_feedback(QuizResult $quiz_result) {
 }
 
 /**
- * Form for showing feedback, and for editing the feedback if necessary...
- *
- * @param $form_state
- *   FAPI form state(array)
- * @param $questions
- *   array of questions to inclide in the report
- * @return $form
- *   FAPI form array
- */
-function quiz_report_form($form, $form_state, $questions, $result_id) {
-  $form = array();
-  // The submit button is only shown if one or more of the questions has input elements
-  $show_submit = FALSE;
-  foreach ($questions as $question) {
-    $module = quiz_question_module_for_type($question->type);
-    if (!$module) {
-      return array();
-    }
-    $function = $module . '_report_form';
-    $form_to_add = $function($question, $result_id);
-    if (isset($form_to_add['submit'])) {
-      $show_submit = TRUE;
-      $form_to_add['#element_validate'][] = 'quiz_report_form_element_validate';
-    }
-    if (!isset($form_to_add['#no_report'])) {
-      $form[] = $form_to_add;
-    }
-  }
-
-  $form['#tree'] = TRUE;
-  $form['navigation']['#type'] = 'actions';
-  if ($show_submit) {
-    $form['navigation']['submit'] = array(
-      '#type' => 'submit',
-      '#submit' => array('quiz_report_form_submit'),
-      '#value' => t('Save score'),
-    );
-  }
-
-  if (arg(4) == 'feedback') {
-    // @todo Ugh, there is no way to determine if we are showing feedback as
-    // part of a try-until-correct or actual quiz after-question feedback, so we
-    // have to check arg() here to fix the "Next question" button showing up
-    // during adaptive mode.
-    $quiz_result = quiz_result_load($result_id);
-
-    if (count($questions) != count($quiz_result->layout)) {
-      $form['#quiz_result'] = $quiz_result;
-      if (empty($_SESSION['quiz'][$quiz_result->nid])) {
-        // Quiz is done.
-        $form['navigation']['finish'] = array(
-          '#type' => 'submit',
-          '#submit' => array('quiz_take_question_feedback_end_submit'),
-          '#value' => t('Finish'),
-        );
-      }
-      else {
-        $form['navigation']['next'] = array(
-          '#type' => 'submit',
-          '#submit' => array('quiz_take_question_feedback_submit'),
-          '#value' => t('Next question'),
-        );
-      }
-    }
-  }
-
-  return $form;
-}
-
-/**
  * Validate a single question sub-form.
  */
 function quiz_report_form_element_validate(&$element, &$form_state) {
@@ -143,51 +74,37 @@ function quiz_report_form_element_validate(&$element, &$form_state) {
  * Submit the report form
  */
 function quiz_report_form_submit($form, &$form_state) {
-  /* We go through the form state values and submit all
-   * questiontypes with validation functions declared.
-   */
   global $user;
+  $quiz_result = $form_state['quiz_result'];
+  $quiz = node_load($quiz_result->nid, $quiz_result->vid);
+
   foreach ($form_state['values'] as $key => $q_values) {
     // Questions has numeric keys in the report form
-    if (!is_numeric($key)) {
-      continue;
-    }
-    // Questions store the name of the validation function with the key 'submit'
-    if (!isset($q_values['submit'])) {
-      continue;
-    }
-    // The submit function must exist
-    if (!function_exists($q_values['submit'])) {
-      continue;
-    }
-
-    // Load the quiz
-    if (!isset($quiz)) {
-      $result = db_query('SELECT nid, uid, vid FROM {quiz_node_results} WHERE result_id = :result_id', array(':result_id' => $q_values['result_id']))->fetchObject();
-      $quiz = node_load($result->nid, $result->vid);
-      $result_id = $q_values['result_id'];
+    if (is_numeric($key)) {
+      $question_node = node_load($q_values[1]['nid'], $q_values[1]['vid']);
+      $instance = _quiz_question_response_get_instance($quiz_result->result_id, $question_node);
+      if ($instance->getReportFormSubmit()) {
+        $q_values[1]['quiz'] = node_load($quiz_result->nid, $quiz_result->vid);
+        call_user_func($instance->getReportFormSubmit(), $q_values[1]);
+      }
     }
-
-    $q_values['quiz'] = $quiz;
-
-    // We call the submit function provided by the question
-    call_user_func($q_values['submit'], $q_values);
   }
+
   // Scores may have been changed. We take the necessary actions
-  quiz_end_scoring($result_id);
-  $results_got_deleted = _quiz_maintain_results($quiz, $result_id);
+  quiz_end_scoring($quiz_result->result_id);
+  $results_got_deleted = _quiz_maintain_results($quiz, $quiz_result->result_id);
 
   // Notify the user if results got deleted as a result of him scoring an answer.
   $add = $quiz->keep_results == QUIZ_KEEP_BEST && $results_got_deleted ? ' ' . t('Note that this @quiz is set to only keep each users best answer.', array('@quiz' => QUIZ_NAME)) : '';
 
-  $score_data = quiz_get_score_array($result_id, $quiz->vid, TRUE);
+  $score_data = quiz_get_score_array($quiz_result->result_id, $quiz->vid, TRUE);
 
-  module_invoke_all('quiz_scored', $quiz, $score_data, $result_id);
+  module_invoke_all('quiz_scored', $quiz, $score_data, $quiz_result->result_id);
 
   drupal_set_message(t('The scoring data you provided has been saved.') . $add);
   if (user_access('score taken quiz answer') && !user_access('view any quiz results')) {
-    if ($result && $result->uid == $user->uid) {
-      $form_state['redirect'] = 'node/' . $quiz->nid . '/quiz/results/' . $result_id;
+    if ($quiz_result && $quiz_result->uid == $user->uid) {
+      $form_state['redirect'] = 'node/' . $quiz->nid . '/quiz/results/' . $quiz_result->result_id;
     }
   }
 }
@@ -397,71 +314,6 @@ function theme_quiz_view_stats($variables) {
 }
 
 /**
- * Theme the result page.
- *
- * @param $quiz
- *  The quiz node object.
- * @param $questions
- *  The questions array as defined by _quiz_get_answers.
- * @param $score
- *  Array of score information as returned by quiz_calculate_score().
- * @param $summary
- *  Filtered text of the summary.
- * @return
- *  Themed html.
- *
- * @ingroup themeable
- */
-function theme_quiz_result($variables) {
-  global $user;
-  $quiz = $variables['quiz'];
-  $questions = $variables['questions'];
-  $score = $variables['score'];
-  $summary = $variables['summary'];
-  $quiz_result = quiz_result_load($variables['result_id']);
-  $account = $variables['account'];
-
-  if (!$score['is_evaluated'] && empty($_POST)) {
-    $msg = t('Parts of this @quiz have not been evaluated yet. The score below is not final.', array('@quiz' => QUIZ_NAME));
-    drupal_set_message($msg, 'warning');
-  }
-
-  // Display overall result.
-  $output = '';
-  $params = array(
-    '%num_correct' => $score['numeric_score'],
-    '%question_count' => $score['possible_score'],
-    '!username' => ($user->uid == $account->uid) ? t('You') : theme('username', array('account' => $account)),
-    '@score' => $score['percentage_score'],
-    '!yourtotal' => ($user->uid == $account->uid) ? t('Your') : t('Total'),
-  );
-
-  $score_out = '';
-  if (quiz_feedback_can_review('score', $quiz_result)) {
-    // Show score.
-    $score_out .= '<div id="quiz_score_possible">' . t('!username got %num_correct of %question_count possible points.', $params) . '</div>' . "\n";
-    $score_out .= '<div id="quiz_score_percent">' . t('!yourtotal score: @score%', $params) . '</div>';
-  }
-
-  $report_form = drupal_get_form('quiz_report_form', $questions, $quiz_result->result_id);
-
-  $quiz_feedback['#markup'] = '';
-  if (quiz_feedback_can_review('quiz_feedback', $quiz_result)) {
-    // Show quiz feedback.
-    if (!empty($summary['passfail'])) {
-      $quiz_feedback['#markup'] .= '<div id="quiz-summary">' . $summary['passfail'] . '</div>';
-    }
-    if (!empty($summary['result'])) {
-      $quiz_feedback['#markup'] .= '<div id="quiz-summary">' . $summary['result'] . '</div>';
-    }
-  }
-  $report_form['quiz_feedback'] = $quiz_feedback;
-
-  $form = drupal_render($report_form);
-  return $score_out . $form;
-}
-
-/**
  * Help us with special pagination.
  *
  * Why not the Drupal theme_pager()?
