diff --git a/src/incidents.php b/src/incidents.php
new file mode 100644
index 0000000..fb693b1
--- /dev/null
+++ b/src/incidents.php
@@ -0,0 +1,172 @@
+<?php
+require_once("core.php");
+security::checkType(security::ADMIN);
+
+incidentsView::handleIncidentShortcuts();
+
+incidentsView::buildSelect();
+
+$numRows = incidents::numRows($select);
+$companies = companies::getAll();
+?>
+<!DOCTYPE html>
+<html>
+<head>
+  <title><?php echo $conf["appName"]; ?></title>
+  <?php visual::includeHead(); ?>
+  <link rel="stylesheet" href="css/dashboard.css">
+  <link rel="stylesheet" href="css/incidents.css">
+
+  <style>
+  .addincident, .addrecurringincident, .filter {
+    z-index: 1000;
+  }
+
+  .addincident {
+    position: fixed;
+    bottom: 16px;
+    right: 16px;
+  }
+
+  .addrecurringincident {
+    position: fixed;
+    bottom: 80px;
+    right: 25px;
+  }
+
+  .filter {
+    position: fixed;
+    bottom: 126px;
+    right: 25px;
+  }
+
+  .helper-bellow-incidents-list {
+    text-align: center;
+    font-size: 13px;
+  }
+
+  @media (max-width: 655px) {
+    .extra {
+      display: none;
+    }
+  }
+  </style>
+</head>
+<?php visual::printBodyTag(); ?>
+  <div class="mdl-layout mdl-js-layout mdl-layout--fixed-header mdl-layout--fixed-drawer">
+    <?php visual::includeNav(); ?>
+    <button class="addincident mdl-button md-js-button mdl-button--fab mdl-js-ripple-effect mdl-button--accent"><i class="material-icons">add</i><span class="mdl-ripple"></span></button>
+    <button class="addrecurringincident mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-color--grey-200"><i class="material-icons">repeat</i><span class="mdl-ripple"></span></button>
+    <button class="filter mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-color--grey-200"><i class="material-icons">filter_list</i></button>
+    <main class="mdl-layout__content">
+      <div class="page-content">
+        <div class="main mdl-shadow--4dp">
+          <h2>Incidencias</h2>
+
+          <?php
+          if ($select["showPendingQueue"]) {
+            $numRowsPending = incidents::numPending();
+            ?>
+            <h4>Cola de revisión (<?=$numRowsPending?>)<?=($select["isAnyEnabled"] ? ' <i id="tt_filtersarenotapplied" class="material-icons help">info</i>' : '')?></h4>
+            <?php
+            if ($select["isAnyEnabled"]) {
+              visual::addTooltip("tt_filtersarenotapplied", "Los filtros no se han aplicado a la cola de revisión.");
+            }
+
+            $incidentsPending = incidents::getAll(true);
+            if (count($incidentsPending)) {
+              incidentsView::renderIncidents($incidentsPending, $companies);
+            } else {
+              echo "Todas las incidencias ya han sido revisadas.";
+            }
+          }
+
+
+          $page = ($select["showResultsPaginated"] ? (isset($_GET["page"]) ? (int)$_GET["page"] - 1 : null) : 0);
+
+          if ($select["showResultsPaginated"]) {
+            $limit = (int)($_GET["limit"] ?? incidents::PAGINATION_LIMIT);
+            if ($limit <= 0 || $limit > 100) $limit = incidents::PAGINATION_LIMIT;
+          } else $limit = 0;
+
+          $incidents = incidents::getAll(null, $page, $limit, "ALL", null, null, false, $select);
+
+          if (!$select["showResultsPaginated"]) $numRows = count($incidents);
+          ?>
+
+          <h4><?=($select["isAnyEnabled"] ? "Incidencias filtradas" : "Todas las incidencias")?> (<?=(int)$numRows?>)</h4>
+
+          <?php
+          if (count($incidents)) {
+            incidentsView::renderIncidents($incidents, $companies, false, true, false, false, true);
+            /*if (!$select["showResultsPaginated"]) {
+              echo "<p class=\"helper-bellow-incidents-list mdl-color-text--grey-600\">Se está truncando la lista de incidencias a un máximo de  resultados, así que es posible que algunas incidencias no se muestren en la lista.<br>Puedes encontrar más incidencias cambiando el selector de fecha final de la sección de filtros a la fecha de la última incidencia de la lista.</p>";
+            }*/
+          } else if ($select["isAnyEnabled"]) {
+            echo "No se ha encontrado ninguna incidencia con los filtros seleccionados.";
+          } else {
+            echo "Todavía no existe ninguna incidencia. Puedes añadir una haciendo clic en el botón de la esquina inferior derecha.";
+          }
+          ?>
+
+          <?php
+          if ($select["showResultsPaginated"]) visual::renderPagination($numRows, $select["pageUrl"], $limit, ($limit == incidents::PAGINATION_LIMIT ? false : true), $select["pageUrlHasParameters"], [
+            "elementName" => "incidencias",
+            "options" => incidentsView::$limitOptions
+          ], incidents::todayPage($limit));
+          if ($select["showPendingQueue"]) visual::printDebug("incidents::getAll(true)", $incidentsPending);
+          visual::printDebug("incidents::getAll(null, ".(int)$page.", ".(int)$limit.", \"ALL\", null, null, false, \$select)", $incidents);
+          visual::printDebug("\$select", $select);
+          ?>
+        </div>
+      </div>
+    </main>
+  </div>
+
+  <?php
+  $workers = people::getAll(false, true);
+  incidentsView::renderIncidentForm($workers, function(&$worker) {
+    return (int)$worker["workerid"];
+  }, function (&$worker, &$companies) {
+    return $worker["name"].' ('.$companies[$worker["companyid"]].')';
+  }, $companies, false, false, "incidents.php");
+
+  incidentsView::renderIncidentForm($workers, function(&$worker) {
+    return (int)$worker["workerid"];
+  }, function (&$worker, &$companies) {
+    return $worker["name"].' ('.$companies[$worker["companyid"]].')';
+  }, $companies, false, true, "incidents.php");
+
+  if (isset($_GET["openRecurringFormWorker"])) {
+    $openWorker = (int)$_GET["openRecurringFormWorker"];
+    ?>
+    <script>
+    document.getElementById("recurringworker").value = "<?=security::htmlsafe($openWorker)?>";
+    document.getElementById("addrecurringincident").showModal();
+    </script>
+    <?php
+  }
+
+  incidentsView::renderFilterDialog($select);
+
+  visual::renderTooltips();
+  ?>
+
+  <div class="mdl-snackbar mdl-js-snackbar">
+    <div class="mdl-snackbar__text"></div>
+    <button type="button" class="mdl-snackbar__action"></button>
+  </div>
+
+  <?php
+  visual::smartSnackbar(incidentsView::$incidentsMsgs, 10000, false);
+  ?>
+
+  <script>
+  var _showResultsPaginated = <?=($select["showResultsPaginated"] ? "true" : "false")?>;
+  var _limit = <?=(int)$limit?>;
+  var _page = <?=(int)$page?>;
+  </script>
+  <script src="js/incidents.js"></script>
+  <script src="js/incidentsgeneric.js"></script>
+</body>
+</html>
