diff --git a/analytics/classes/default_bulk_actions.php b/analytics/classes/default_bulk_actions.php
index 4cc22839994..e07d389864f 100644
--- a/analytics/classes/default_bulk_actions.php
+++ b/analytics/classes/default_bulk_actions.php
@@ -41,13 +41,13 @@ class default_bulk_actions {
      * @return \core_analytics\bulk_action
      */
     public static function accept() {
-
-        $fixedattrs = array(
+        $attrs = [
             'data-bulk-actionname' => prediction::ACTION_FIXED
-        );
+        ] + self::bulk_action_base_attrs();
+
         return new bulk_action(prediction::ACTION_FIXED,
             new \moodle_url(''), new \pix_icon('t/check', get_string('fixedack', 'analytics')),
-            get_string('fixedack', 'analytics'), false, $fixedattrs, action::TYPE_POSITIVE);
+            get_string('fixedack', 'analytics'), false, $attrs, action::TYPE_POSITIVE);
     }
 
     /**
@@ -56,13 +56,13 @@ class default_bulk_actions {
      * @return \core_analytics\bulk_action
      */
     public static function not_applicable() {
-        $fixedattrs = array(
+        $attrs = [
             'data-bulk-actionname' => prediction::ACTION_NOT_APPLICABLE
-        );
+        ] + self::bulk_action_base_attrs();
 
         return new bulk_action(prediction::ACTION_NOT_APPLICABLE,
             new \moodle_url(''), new \pix_icon('fp/cross', get_string('notapplicable', 'analytics'), 'theme'),
-            get_string('notapplicable', 'analytics'), false, $fixedattrs, action::TYPE_NEUTRAL);
+            get_string('notapplicable', 'analytics'), false, $attrs, action::TYPE_NEUTRAL);
     }
 
     /**
@@ -71,13 +71,13 @@ class default_bulk_actions {
      * @return \core_analytics\bulk_action
      */
     public static function incorrectly_flagged() {
-
-        $notusefulattrs = array(
+        $attrs = [
             'data-bulk-actionname' => prediction::ACTION_INCORRECTLY_FLAGGED
-        );
+        ] + self::bulk_action_base_attrs();
+
         return new bulk_action(prediction::ACTION_INCORRECTLY_FLAGGED,
             new \moodle_url(''), new \pix_icon('i/incorrect', get_string('incorrectlyflagged', 'analytics')),
-            get_string('incorrectlyflagged', 'analytics'), false, $notusefulattrs, action::TYPE_NEGATIVE);
+            get_string('incorrectlyflagged', 'analytics'), false, $attrs, action::TYPE_NEGATIVE);
     }
 
     /**
@@ -86,13 +86,13 @@ class default_bulk_actions {
      * @return \core_analytics\bulk_action
      */
     public static function useful() {
-
-        $notusefulattrs = array(
+        $attrs = [
             'data-bulk-actionname' => prediction::ACTION_USEFUL
-        );
+        ] + self::bulk_action_base_attrs();
+
         return new bulk_action(prediction::ACTION_USEFUL,
             new \moodle_url(''), new \pix_icon('t/check', get_string('useful', 'analytics')),
-            get_string('useful', 'analytics'), false, $notusefulattrs, action::TYPE_POSITIVE);
+            get_string('useful', 'analytics'), false, $attrs, action::TYPE_POSITIVE);
 
     }
 
@@ -102,12 +102,25 @@ class default_bulk_actions {
      * @return \core_analytics\bulk_action
      */
     public static function not_useful() {
-
-        $notusefulattrs = array(
+        $attrs = [
             'data-bulk-actionname' => prediction::ACTION_NOT_USEFUL
-        );
+        ] + self::bulk_action_base_attrs();
+
         return new bulk_action(prediction::ACTION_NOT_USEFUL,
             new \moodle_url(''), new \pix_icon('t/delete', get_string('notuseful', 'analytics')),
-            get_string('notuseful', 'analytics'), false, $notusefulattrs, action::TYPE_NEGATIVE);
+            get_string('notuseful', 'analytics'), false, $attrs, action::TYPE_NEGATIVE);
+    }
+
+    /**
+     * Common attributes for all the action renderables.
+     *
+     * @return array
+     */
+    private static final function bulk_action_base_attrs() {
+        return [
+            'disabled' => 'disabled',
+            'data-toggle' => 'action',
+            'data-action' => 'toggle',
+        ];
     }
 }
\ No newline at end of file
diff --git a/lib/classes/output/icon_system_fontawesome.php b/lib/classes/output/icon_system_fontawesome.php
index 3e98597e48d..dc308e0b12b 100644
--- a/lib/classes/output/icon_system_fontawesome.php
+++ b/lib/classes/output/icon_system_fontawesome.php
@@ -223,7 +223,6 @@ class icon_system_fontawesome extends icon_system_font {
             'core:i/enrolmentsuspended' => 'fa-pause',
             'core:i/enrolusers' => 'fa-user-plus',
             'core:i/expired' => 'fa-exclamation text-warning',
-            'core:i/incorrect' => 'fa-exclamation',
             'core:i/export' => 'fa-download',
             'core:i/files' => 'fa-file',
             'core:i/filter' => 'fa-filter',
@@ -242,6 +241,7 @@ class icon_system_fontawesome extends icon_system_font {
             'core:i/hide' => 'fa-eye',
             'core:i/hierarchylock' => 'fa-lock',
             'core:i/import' => 'fa-level-up',
+            'core:i/incorrect' => 'fa-exclamation',
             'core:i/info' => 'fa-info',
             'core:i/invalid' => 'fa-times text-danger',
             'core:i/item' => 'fa-circle',
diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php
index 60e653b60aa..3267d02f666 100644
--- a/lib/db/upgrade.php
+++ b/lib/db/upgrade.php
@@ -3551,9 +3551,9 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2019090500.01);
     }
 
-    if ($oldversion < 2019092000.01) {
+    if ($oldversion < 2019092000.03) {
         upgrade_rename_prediction_actions_useful_incorrectly_flagged();
-        upgrade_main_savepoint(true, 2019092000.01);
+        upgrade_main_savepoint(true, 2019092000.03);
     }
 
     return true;
diff --git a/lib/upgrade.txt b/lib/upgrade.txt
index b9360cae1a2..88d411a13af 100644
--- a/lib/upgrade.txt
+++ b/lib/upgrade.txt
@@ -65,6 +65,7 @@ validation against and defaults to null (so, no user needed) if not provided.
   This setting can be set via the UI or by defining $CFG->cachetemplates in your config.php file. It is a boolean
   and should be set to either false or true. Developers will probably want to set this to false.
 * The core_enrol_edit_user_enrolment webservice has been deprecated. Please use core_enrol_submit_user_enrolment_form instead.
+* \single_button constructor has a new attributes param to add attributes to the button HTML tag.
 
 === 3.7 ===
 
diff --git a/report/insights/amd/build/actions.min.js b/report/insights/amd/build/actions.min.js
index bab16fb2942..4f731f74b3f 100644
Binary files a/report/insights/amd/build/actions.min.js and b/report/insights/amd/build/actions.min.js differ
diff --git a/report/insights/amd/build/actions.min.js.map b/report/insights/amd/build/actions.min.js.map
index 0e1d75bcaef..7916feaa79c 100644
Binary files a/report/insights/amd/build/actions.min.js.map and b/report/insights/amd/build/actions.min.js.map differ
diff --git a/report/insights/amd/build/message_users.min.js b/report/insights/amd/build/message_users.min.js
index c775ce78647..ef2ff628fd0 100644
Binary files a/report/insights/amd/build/message_users.min.js and b/report/insights/amd/build/message_users.min.js differ
diff --git a/report/insights/amd/build/message_users.min.js.map b/report/insights/amd/build/message_users.min.js.map
index 487d145de45..0ce620a1e45 100644
Binary files a/report/insights/amd/build/message_users.min.js.map and b/report/insights/amd/build/message_users.min.js.map differ
diff --git a/report/insights/amd/src/actions.js b/report/insights/amd/src/actions.js
index 583773ce1b4..dcc7d0b1a12 100644
--- a/report/insights/amd/src/actions.js
+++ b/report/insights/amd/src/actions.js
@@ -26,8 +26,8 @@
  *
  * @module report_insights/actions
  */
-define(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_factory', 'core/modal_events'],
-        function($, Str, Ajax, Notification, ModalFactory, ModalEvents) {
+define(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/url', 'core/modal_factory', 'core/modal_events'],
+        function($, Str, Ajax, Notification, Url, ModalFactory, ModalEvents) {
 
     return {
 
@@ -39,27 +39,6 @@ define(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_fact
          */
         initBulk: function(rootNode) {
 
-            /**
-             * Show the no items selected note.
-             *
-             * @param  {String} actionVisibleName
-             * @return {Promise}
-             */
-            var noItemsSelected = function(actionVisibleName) {
-                return Str.get_strings([
-                        {key: 'noitemsselected', component: 'report_insights'},
-                ]).then(function(strings) {
-                        return ModalFactory.create({
-                            type: ModalFactory.types.CANCEL,
-                            title: actionVisibleName,
-                            body: strings[0],
-                        });
-                }).then(function(modal) {
-                        modal.show();
-                        return modal;
-                }).catch(Notification.exception);
-            };
-
             /**
              * Executes the provided action.
              *
@@ -89,8 +68,12 @@ define(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_fact
                         el.remove();
                     });
 
-                    if (tableNode.find('tbody').length === 0) {
-                        window.location.reload();
+                    if (tableNode.find('tbody > tr').length === 0) {
+                        let params = {
+                            contextid: tableNode.closest('div.insight-container').data('context-id'),
+                            modelid: tableNode.closest('div.insight-container').data('model-id')
+                        };
+                        window.location.assign(Url.relativeUrl("report/insights/insights.php", params, false));
                     }
                     return;
                 }).catch(Notification.exception);
@@ -106,14 +89,14 @@ define(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_fact
                 var predictionContainers = [];
 
                 $('.insights-list input[data-togglegroup^="insight-bulk-action-"][data-toggle="slave"]:checked').each(function() {
-                    var container = $(this).closest('tbody[data-prediction-id]');
+                    var container = $(this).closest('tr[data-prediction-id]');
                     predictionContainers.push(container);
                     predictionIds.push(container.data('prediction-id'));
                 });
 
                 if (predictionIds.length === 0) {
                     // No items selected message.
-                    return noItemsSelected(actionVisibleName);
+                    return;
                 }
 
                 var strings = [];
diff --git a/report/insights/amd/src/message_users.js b/report/insights/amd/src/message_users.js
index 7c5eef86fde..55cde157b09 100644
--- a/report/insights/amd/src/message_users.js
+++ b/report/insights/amd/src/message_users.js
@@ -65,9 +65,9 @@ define(['jquery', 'core/str', 'core/log', 'core/modal_factory', 'core/modal_even
             var users = {};
             var predictionToUserMapping = cTarget.data('prediction-to-user-id');
 
-            var checkedSelector = '.insights-list input[data-togglegroup="insight-bulk-action"][data-toggle="slave"]:checked';
+            var checkedSelector = '.insights-list input[data-togglegroup^="insight-bulk-action"][data-toggle="slave"]:checked';
             $(checkedSelector).each(function(index, value) {
-                var predictionId = $(value).closest('tbody[data-prediction-id]').data('prediction-id');
+                var predictionId = $(value).closest('tr[data-prediction-id]').data('prediction-id');
 
                 if (typeof predictionToUserMapping[predictionId] === 'undefined') {
                     Log.error('Unknown user for prediction ' + predictionId);
@@ -80,19 +80,7 @@ define(['jquery', 'core/str', 'core/log', 'core/modal_factory', 'core/modal_even
             });
 
             if (Object.keys(users).length === 0) {
-                return Str.get_strings([
-                    {key: 'nousersselected', component: 'report_insights'},
-                ]).then(function(strings) {
-                    return ModalFactory.create({
-                        type: ModalFactory.types.CANCEL,
-                        title: cTarget.text().trim(),
-                        body: strings[0],
-                    });
-                }).then(function(modal) {
-                    modal.show();
-                    return modal;
-                }).catch(Notification.exception);
-
+                return;
             }
 
             this.showSendMessage(users);
diff --git a/report/insights/classes/output/actions_exporter.php b/report/insights/classes/output/actions_exporter.php
index bb2cefe1aeb..2b6df5210b5 100644
--- a/report/insights/classes/output/actions_exporter.php
+++ b/report/insights/classes/output/actions_exporter.php
@@ -65,9 +65,11 @@ class actions_exporter {
     /**
      * Add bulk actions renderables.
      *
+     * Note that if you are planning to render the bulk actions, the provided predictions must share the same predicted value.
+     *
      * @param  \core_analytics\local\target\base $target
      * @param  \renderer_base                    $output
-     * @param  \core_analytics\prediction[]      $predictions
+     * @param  \core_analytics\prediction[]      $predictions   Bulk actions for this set of predictions.
      * @param  \context                          $context       The context of these predictions.
      * @return \stdClass[]|false
      */
@@ -98,8 +100,12 @@ class actions_exporter {
 
         $actionsmenu = [];
 
+        // All the predictions share a common predicted value.
+        $predictionvalue = reset($predictions)->get_prediction_data()->prediction;
+
         // Add all actions defined by the target.
         foreach ($bulkactions as $action) {
+            $action->get_action_link()->set_attribute('data-togglegroup', 'insight-bulk-action-' . $predictionvalue);
             $actionsmenu[] = $action->get_action_link()->export_for_template($output);
         }
 
diff --git a/report/insights/classes/output/insight.php b/report/insights/classes/output/insight.php
index d4adf42b0cd..fe9788e065c 100644
--- a/report/insights/classes/output/insight.php
+++ b/report/insights/classes/output/insight.php
@@ -86,6 +86,8 @@ class insight implements \renderable, \templatable {
         $target = $this->model->get_target();
 
         $data = new \stdClass();
+        $data->modelid = $this->model->get_id();
+        $data->contextid = $this->context->id;
         $data->predictionid = $predictiondata->id;
         $data->insightname = format_string($target->get_name());
 
diff --git a/report/insights/classes/output/insights_list.php b/report/insights/classes/output/insights_list.php
index cc7c1a6123a..a74c9f733ba 100644
--- a/report/insights/classes/output/insights_list.php
+++ b/report/insights/classes/output/insights_list.php
@@ -90,6 +90,8 @@ class insights_list implements \renderable, \templatable {
         $target = $this->model->get_target();
 
         $data = new \stdClass();
+        $data->modelid = $this->model->get_id();
+        $data->contextid = $this->context->id;
         $data->insightname = format_string($target->get_name());
 
         $data->showpredictionheading = true;
diff --git a/report/insights/lang/en/report_insights.php b/report/insights/lang/en/report_insights.php
index 25557adcc8a..18d486b8022 100644
--- a/report/insights/lang/en/report_insights.php
+++ b/report/insights/lang/en/report_insights.php
@@ -29,8 +29,6 @@ $string['indicators'] = 'Indicators';
 $string['insight'] = 'Insight';
 $string['insights'] = 'Insights';
 $string['justpredictions'] = 'Please note that the following insights are only predictions. It is not possible to predict the future with any certainty. The insights are provided so that action can be taken as necessary to prevent any negative predictions becoming reality.';
-$string['noitemsselected'] = 'You have not selected any items.';
-$string['nousersselected'] = 'You have not selected any users.';
 $string['outcome'] = 'Outcome';
 $string['outcomenegative'] = 'Negative outcome';
 $string['outcomeneutral'] = 'Neutral outcome';
diff --git a/report/insights/templates/insight.mustache b/report/insights/templates/insight.mustache
index 58c89316644..6a96553a240 100644
--- a/report/insights/templates/insight.mustache
+++ b/report/insights/templates/insight.mustache
@@ -45,17 +45,17 @@
         ]
     }
 }}
-<tr>
+<tr data-prediction-id="{{predictionid}}" class="d-flex">
     <td class="insight-checkbox-cell col-xs-1{{^bulkactions}} hidden{{/bulkactions}}">
         {{{toggleslave}}}
     </td>
-    <td>
+    <td class="col-xs-8">
         {{#sampleimage}}
             {{{sampleimage}}}
         {{/sampleimage}}
         {{{sampledescription}}}
     </td>
-    <td {{^actions}}class="hidden"{{/actions}}>
+    <td class="col-xs-3{{^actions}} hidden{{/actions}}">
     {{#actions}}
         {{> core/action_menu}}
     {{/actions}}
diff --git a/report/insights/templates/insight_details.mustache b/report/insights/templates/insight_details.mustache
index 522f0ce7c5f..59bb62dd6f7 100644
--- a/report/insights/templates/insight_details.mustache
+++ b/report/insights/templates/insight_details.mustache
@@ -30,6 +30,8 @@
 
     Example context (json):
     {
+        "contextid": 123,
+        "modelid": 321,
         "insightname": "Best insight ever",
         "timecreated": "Thursday, 5 October 2017, 4:16 PM",
         "timerange": "Monday, 4 September 2017, 6:00 PM to Thursday, 5 October 2017, 12:00 AM",
@@ -84,60 +86,64 @@
     }
 }}
 
-<h2 class="mb-2">{{insightname}}</h2>
+<div class="insight-container" data-context-id="{{contextid}}" data-model-id="{{modelid}}">
 
-{{> report_insights/bulk_actions }}
+    <h2 class="mb-2">{{insightname}}</h2>
 
-<table class="generaltable insights-list mt-3">
-    {{#showpredictionheading}}
-        <caption>
-            {{#str}}prediction, report_insights{{/str}}:
-            <span class="{{#style}}table-{{style}}{{/style}}">
-                {{#outcomeicon}}
-                    {{> core/pix_icon}}
-                {{/outcomeicon}}
-                {{predictiondisplayvalue}}
-            </span>
-        </caption>
-    {{/showpredictionheading}}
-    <thead>
-        <tr>
-            <th scope="col" {{^bulkactions}}class="hidden"{{/bulkactions}}></th>
-            <th scope="col">{{#str}}description{{/str}}</th>
-            <th scope="col" {{^actions}}class="hidden"{{/actions}}>{{#str}}actions{{/str}}</th>
-        </tr>
-    </thead>
-    <tbody data-prediction-id="{{predictionid}}">
-        {{> report_insights/insight}}
-    </tbody>
-</table>
+    {{> report_insights/bulk_actions }}
 
-<table class="generaltable prediction-timedetails">
-    <caption>{{#str}}predictiondetails, report_insights{{/str}}</caption>
-    <tbody>
-        <tr>
-            <th scope="row">{{#str}}timecreated, report_insights{{/str}}</td>
-            <td>{{timecreated}}</td>
-        </tr>
-        {{#timerange}}
+    <table class="generaltable insights-list mt-3">
+        {{#showpredictionheading}}
+            <caption>
+                {{#str}}prediction, report_insights{{/str}}:
+                <span class="{{#style}}table-{{style}}{{/style}}">
+                    {{#outcomeicon}}
+                        {{> core/pix_icon}}
+                    {{/outcomeicon}}
+                    {{predictiondisplayvalue}}
+                </span>
+            </caption>
+        {{/showpredictionheading}}
+        <thead>
+            <tr class="d-flex">
+                <th scope="col" class="col-xs-1{{^bulkactions}} hidden{{/bulkactions}}"></th>
+                <th scope="col" class="col-xs-8">{{#str}}description{{/str}}</th>
+                <th scope="col" class="col-xs-3{{^actions}} hidden{{/actions}}">{{#str}}actions{{/str}}</th>
+            </tr>
+        </thead>
+        <tbody>
+            {{> report_insights/insight}}
+        </tbody>
+    </table>
+
+    <table class="generaltable prediction-timedetails">
+        <caption>{{#str}}predictiondetails, report_insights{{/str}}</caption>
+        <tbody>
             <tr>
-                <th scope="row">{{#str}}timerange, report_insights{{/str}}</td>
-                <td>{{.}}</td>
+                <th scope="row">{{#str}}timecreated, report_insights{{/str}}</td>
+                <td>{{timecreated}}</td>
             </tr>
-        {{/timerange}}
-    </tbody>
-</table>
-<table class="generaltable prediction-calculations">
-    <caption>{{#str}}indicators, report_insights{{/str}}</caption>
-    <tbody>
-    {{#calculations}}
-        <tr>
-            <th scope="row" class="{{#style}}table-{{style}}{{/style}}">{{name}}</td>
-            <td class="{{#style}}table-{{style}}{{/style}}">{{#outcomeicon}}{{> core/pix_icon}}{{/outcomeicon}} {{displayvalue}}</td>
-        </tr>
-    {{/calculations}}
-    </tbody>
-</table>
-{{#nocalculations}}
-    {{> core/notification_info}}
-{{/nocalculations}}
+            {{#timerange}}
+                <tr>
+                    <th scope="row">{{#str}}timerange, report_insights{{/str}}</td>
+                    <td>{{.}}</td>
+                </tr>
+            {{/timerange}}
+        </tbody>
+    </table>
+    <table class="generaltable prediction-calculations">
+        <caption>{{#str}}indicators, report_insights{{/str}}</caption>
+        <tbody>
+        {{#calculations}}
+            <tr>
+                <th scope="row" class="{{#style}}table-{{style}}{{/style}}">{{name}}</td>
+                <td class="{{#style}}table-{{style}}{{/style}}">{{#outcomeicon}}{{> core/pix_icon}}{{/outcomeicon}} {{displayvalue}}</td>
+            </tr>
+        {{/calculations}}
+        </tbody>
+    </table>
+    {{#nocalculations}}
+        {{> core/notification_info}}
+    {{/nocalculations}}
+
+</div>
diff --git a/report/insights/templates/insights_list.mustache b/report/insights/templates/insights_list.mustache
index 38653bef9c3..9083f141ae6 100644
--- a/report/insights/templates/insights_list.mustache
+++ b/report/insights/templates/insights_list.mustache
@@ -30,6 +30,8 @@
 
     Example context (json):
     {
+        "contextid": 123,
+        "modelid": 321,
         "insightname": "Best insight ever",
         "nostaticmodelnotification": {
             "message": "This is just a prediction."
@@ -102,64 +104,68 @@
     </div>
 {{/modelselector}}
 
-<h2 class="mb-2">{{{insightname}}}</h2>
+<div class="insight-container" data-context-id="{{contextid}}" data-model-id="{{modelid}}">
+
+    <h2 class="mb-2">{{{insightname}}}</h2>
+
+    {{^noinsights}}
+    {{#nostaticmodelnotification}}
+        <div class="mt-2">
+            {{> core/notification_info}}
+        </div>
+    {{/nostaticmodelnotification}}
+
+    {{{ pagingbar }}}
 
-{{^noinsights}}
-{{#nostaticmodelnotification}}
-    <div class="mt-2">
-        {{> core/notification_info}}
-    </div>
-{{/nostaticmodelnotification}}
-
-{{{ pagingbar }}}
-
-{{> report_insights/bulk_actions}}
-
-{{#predictions}}
-
-    <table class="generaltable insights-list mt-3">
-        {{#showpredictionheading}}
-            <caption>
-                {{#str}}prediction, report_insights{{/str}}:
-                <span class="{{#style}}table-{{style}}{{/style}}">
-                    {{#outcomeicon}}
-                        {{> core/pix_icon}}
-                    {{/outcomeicon}}
-                    {{predictiondisplayvalue}}
-                </span>
-            </caption>
-        {{/showpredictionheading}}
-        <thead>
-            <tr>
-                {{#multiplepredictions}}
-                    <th{{^bulkactions}} class="hidden"{{/bulkactions}}>
-                        {{{checkboxtoggleall}}}
-                    </th>
-                {{/multiplepredictions}}
-                {{^multiplepredictions}}
-                    <th{{^bulkactions}} class="hidden"{{/bulkactions}}></th>
-                {{/multiplepredictions}}
-                <th scope="col">{{#str}}description{{/str}}</th>
-                <th scope="col">{{#str}}actions{{/str}}</th>
-            </tr>
-        </thead>
-    {{#insights}}
-        <tbody data-prediction-id="{{predictionid}}">
-            {{> report_insights/insight}}
-        </tbody>
-    {{/insights}}
-    </table>
-
-{{/predictions}}
-
-{{#multiplepredictions}}
     {{> report_insights/bulk_actions}}
-{{/multiplepredictions}}
 
-{{{ pagingbar }}}
-{{/noinsights}}
-{{#noinsights}}
-    <div class="mt-2">
-        {{> core/notification_info}}
-    </div>
-{{/noinsights}}
+    {{#predictions}}
+
+        <table class="generaltable insights-list mt-3">
+            {{#showpredictionheading}}
+                <caption>
+                    {{#str}}prediction, report_insights{{/str}}:
+                    <span class="{{#style}}table-{{style}}{{/style}}">
+                        {{#outcomeicon}}
+                            {{> core/pix_icon}}
+                        {{/outcomeicon}}
+                        {{predictiondisplayvalue}}
+                    </span>
+                </caption>
+            {{/showpredictionheading}}
+            <thead>
+                <tr class="d-flex">
+                    {{#multiplepredictions}}
+                        <th class="col-xs-1{{^bulkactions}} hidden{{/bulkactions}}">
+                            {{{checkboxtoggleall}}}
+                        </th>
+                    {{/multiplepredictions}}
+                    {{^multiplepredictions}}
+                        <th class="col-xs-1{{^bulkactions}} hidden{{/bulkactions}}">
+                    {{/multiplepredictions}}
+                    <th scope="col" class="col-xs-8">{{#str}}description{{/str}}</th>
+                    <th scope="col" class="col-xs-3">{{#str}}actions{{/str}}</th>
+                </tr>
+            </thead>
+            <tbody>
+                {{#insights}}
+                    {{> report_insights/insight}}
+                {{/insights}}
+            </tbody>
+        </table>
+
+    {{/predictions}}
+
+    {{#multiplepredictions}}
+        {{> report_insights/bulk_actions}}
+    {{/multiplepredictions}}
+
+    {{{ pagingbar }}}
+    {{/noinsights}}
+    {{#noinsights}}
+        <div class="mt-2">
+            {{> core/notification_info}}
+        </div>
+    {{/noinsights}}
+
+</div>
\ No newline at end of file
diff --git a/version.php b/version.php
index fc6e40a3ec3..f03b7bb7234 100644
--- a/version.php
+++ b/version.php
@@ -29,7 +29,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2019092000.01;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2019092000.03;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.
 
