diff --git a/locallib.php b/locallib.php
index c1ce49e..6b16690 100755
--- a/locallib.php
+++ b/locallib.php
@@ -1479,11 +1479,40 @@ class questionnaire {
             $col = ',' . implode(',', array_map(create_function('$a','return "q.$a";'), $col));
         }
 
+        static $allresponsescache = null;
+
+        if($allresponsescache === null){
+            // This is pretty ugly optimisation to stop us running sql on every
+            // response type for every response 
+            $allresponsessql = "SELECT
+                r.id as recordid,
+                count(bool.id) as bool,
+                count(single.id) as single,
+                count(multiple.id) as multiple,
+                count(other.id) as other,
+                count(rank.id) as rank,
+                count(text.id) as text,
+                count(date.id) as date
+                FROM {$CFG->prefix}questionnaire_response r
+                LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_bool bool ON bool.response_id = r.id
+                LEFT OUTER JOIN {$CFG->prefix}questionnaire_resp_single single ON single.response_id = r.id
+                LEFT OUTER JOIN {$CFG->prefix}questionnaire_resp_multiple multiple ON multiple.response_id = r.id
+                LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_other other ON other.response_id = r.id
+                LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_rank rank ON rank.response_id = r.id
+                LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_text text ON text.response_id = r.id
+                LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_date date ON date.response_id = r.id
+                GROUP BY r.id";
+
+            $allresponsescache = get_records_sql($allresponsessql);
+        }
+
+        $responseexists = $allresponsescache[$rid];
+
         // --------------------- response_bool (yes/no)---------------------
         $sql = 'SELECT q.id '.$col.', a.choice_id '.
                'FROM '.$CFG->prefix.'questionnaire_response_bool a, '.$CFG->prefix.'questionnaire_question q '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->bool && $records = get_records_sql($sql)) {
             foreach ($records as $qid => $row) {
                 $choice = $row->choice_id;
                 if (isset ($row->name) && $row->name == '') {
@@ -1512,7 +1541,7 @@ class questionnaire {
                        $CFG->prefix.'questionnaire_question q, '.
                        $CFG->prefix.'questionnaire_quest_choice c '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id AND a.choice_id=c.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->single && $records = get_records_sql($sql)) {
             foreach ($records as $qid => $row) {
                 $cid = $row->cid;
                 $qtype = $row->q_type;
@@ -1573,7 +1602,7 @@ class questionnaire {
         if ($csvexport) {
                 $tmp = null;
 
-                if ($records = get_records_sql($sql)) {
+                if ($responseexists->multiple && $records = get_records_sql($sql)) {
                     $qids2 = array();
                     $oldqid = '';
                     foreach ($records as $qid => $row) {
@@ -1587,9 +1616,23 @@ class questionnaire {
                     } else {
                         $qids2 = 'question_id= ' . $qids2;
                     }
-                    $sql = 'SELECT * FROM '.$CFG->prefix.'questionnaire_quest_choice WHERE '.$qids2.
-                        'ORDER BY id';
-                    if ($records2 = get_records_sql($sql)) {
+
+                    /* Begin really ugly static cache!!! */
+                    static $questionaire_quest_choice_cache = array();
+
+                    if(!isset($questionaire_quest_choice_cache["$qids2"])){
+                        $sql = "SELECT c.id, c.question_id, c.content, q.name, q.type_id as type, q.position as pos
+                                FROM {$CFG->prefix}questionnaire_quest_choice c
+                                JOIN {$CFG->prefix}questionnaire_question q ON q.id = c.question_id
+                                WHERE {$qids2} ORDER BY id";
+                        $records2 = get_records_sql($sql);
+                        $questionaire_quest_choice_cache["$qids2"] = $records2;
+                    }else{
+                        $records2 = $questionaire_quest_choice_cache["$qids2"];
+                    }
+                    /* End really ugly static cache!!! */
+
+                    if ($records2){
                         foreach ($records2 as $qid => $row2) {
                             $selected = '0';
                             $qid2 = $row2->question_id;
@@ -1609,14 +1652,7 @@ class questionnaire {
                                     $c2 = $contents->title;
                                 }
                             }
-                            $sql = 'SELECT a.name as name, a.type_id as q_type, a.position as pos ' .
-                                    'FROM '.$CFG->prefix.'questionnaire_question a WHERE id = '.$qid2;
-                            if ($currentquestion = get_records_sql($sql)) {
-                                foreach ($currentquestion as $question) {
-                                    $name1 = $question->name;
-                                    $type1 = $question->q_type;
-                                }
-                            }
+
                             $newrow = array();
                             foreach ($records as $qid => $row1) {
                                 $qid1 = $row1->qid;
@@ -1628,17 +1664,17 @@ class questionnaire {
                             }
                             if ($otherend) {
                                 $newrow2 = array();
-                                $newrow2[] = $question->pos;
-                                $newrow2[] = $type1;
-                                $newrow2[] = $name1;
+                                $newrow2[] = $row2->pos;
+                                $newrow2[] = $row2->type;
+                                $newrow2[] = $row2->name;
                                 $newrow2[] = '['.get_string('other','questionnaire').']';
                                 $newrow2[] = $selected;
                                 $tmp2 = $qid2.'_other';
                                 $values["$tmp2"]=$newrow2;
                             }
-                            $newrow[] = $question->pos;
-                            $newrow[] = $type1;
-                            $newrow[] = $name1;
+                            $newrow[] = $row2->pos;
+                            $newrow[] = $row2->type;
+                            $newrow[] = $row2->name;
                             $newrow[] = $c2;
                             $newrow[] = $selected;
                             $tmp = $qid2.'_'.$cid2;
@@ -1652,7 +1688,7 @@ class questionnaire {
         } else {
                 $arr = array();
                 $tmp = null;
-                if ($records = get_records_sql($sql)) {
+                if ($responseexists->multiple && $records = get_records_sql($sql)) {
                     foreach ($records as $aid => $row) {
                         $qid = $row->qid;
                         $cid = $row->cid;
@@ -1699,7 +1735,7 @@ class questionnaire {
                        $CFG->prefix.'questionnaire_quest_choice c '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id AND a.choice_id=c.id '.
                'ORDER BY a.question_id,c.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->other && $records = get_records_sql($sql)) {
             foreach ($records as $record) {
                 $newrow = array();
                 $position = $record->position;
@@ -1734,7 +1770,7 @@ class questionnaire {
                        $CFG->prefix.'questionnaire_quest_choice c '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id AND a.choice_id=c.id '.
                'ORDER BY aid, a.question_id,c.id';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->rank && $records = get_records_sql($sql)) {
             foreach ($records as $row) {
                 /// Next two are 'qid' and 'cid', each with numeric and hash keys.
                 $osgood = false;
@@ -1786,7 +1822,7 @@ class questionnaire {
         $sql = 'SELECT q.id '.$col.',a.response as aresponse '.
                'FROM '.$CFG->prefix.'questionnaire_response_text a, '.$CFG->prefix.'questionnaire_question q '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->text && $records = get_records_sql($sql)) {
             foreach ($records as $qid => $row) {
                 unset($row->id);
                 $row = (array)$row;
@@ -1806,7 +1842,7 @@ class questionnaire {
         $sql = 'SELECT q.id '.$col.',a.response as aresponse '.
                'FROM '.$CFG->prefix.'questionnaire_response_date a, '.$CFG->prefix.'questionnaire_question q '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->date && $records = get_records_sql($sql)) {
             $dateformat = get_string('strfdate', 'questionnaire');
             foreach ($records as $qid => $row) {
                 unset ($row->id);
@@ -2565,9 +2601,17 @@ class questionnaire {
             $institution = '';
             $department = '';
             $username  = $record->username;
-            if ($user = get_record('user', 'id', $username)) {
-                $institution = $user->institution;
-                $department = $user->department;
+
+            // yet another horrible optimisation!
+            static $allusers = null;
+            if ($allusers === null) {
+                $allusers = get_records('user', '', '', '', 'id, username, firstname, lastname, institution, department');
+            }
+
+
+            if (isset($allusers[$username])) {
+                $institution = $allusers[$username]->institution;
+                $department =  $allusers[$username]->department;
             }
             /// Moodle:
             //  Get the course name that this questionnaire belongs to.
@@ -2591,10 +2635,10 @@ class questionnaire {
             /// Moodle:
             //  If the username is numeric, try it as a Moodle user id.
             if (is_numeric($username)) {
-                if ($user = get_record('user', 'id', $username)) {
+                if (isset($allusers[$username])) {
                     $uid = $username;
-                    $fullname = fullname($user);
-                    $username = $user->username;
+                    $fullname = fullname($allusers[$username]);
+                    $username = $allusers[$username]->username;
                 }
             }
 
@@ -2985,4 +3029,4 @@ function questionnaire_response_key_cmp($l, $r) {
          }
         return $contents;
     }
-?>
\ No newline at end of file
+?>
