diff --git a/app/AbstractSensor.php b/app/AbstractSensor.php
deleted file mode 100644
index db74caf9aad5e542220a7a5ed7072e9807b7917f..0000000000000000000000000000000000000000
--- a/app/AbstractSensor.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace App;
-
-/**
- * Description of AbstractSensor
- *
- * @author tibo
- */
-abstract class AbstractSensor implements Sensor
-{
-
-    private $server;
-
-    public function __construct(?Server $server = null)
-    {
-        $this->server = $server;
-    }
-
-    protected function server() : Server
-    {
-        return $this->server;
-    }
-
-    public function name() : string
-    {
-        return (new \ReflectionClass($this))->getShortName();
-    }
-
-    public static function getColorForStatus(int $status) : string
-    {
-        switch ($status) {
-            case 0:
-                return 'success';
-            case 10:
-                return 'warning';
-            case 20:
-                return 'danger';
-            default:
-                return 'secondary';
-        }
-    }
-}
diff --git a/app/Sensor.php b/app/Sensor.php
index 154cbaa3ba3d7f11dc93397474a253b580675ed1..e60166e7c2d50f69fcc085c254792e0516ef57b2 100644
--- a/app/Sensor.php
+++ b/app/Sensor.php
@@ -2,14 +2,44 @@
 
 namespace App;
 
-interface Sensor
+/**
+ * Base (abstract) class for sensors.
+ *
+ * @author tibo
+ */
+abstract class Sensor
 {
-    public function status(array $records) : int;
-    public function report(array $records) : string;
+
+    private $server;
+
+    public function __construct(?Server $server = null)
+    {
+        $this->server = $server;
+    }
+
+    protected function server() : Server
+    {
+        return $this->server;
+    }
 
     /**
-     * Get the name of this sensor (e.g meminfo, cpuload, heartbeat)
+     * Get the name of the sensor. Can be overridden by sub-classes to provide
+     * a more meaningful name.
+     *
      * @return string
      */
-    public function name() : string;
+    public function name() : string
+    {
+        return (new \ReflectionClass($this))->getShortName();
+    }
+    
+    /**
+     * Compute the status code from an array of Record.
+     */
+    abstract public function status(array $records) : int;
+    
+    /**
+     * Create the HTML report describing the result of this sensor's analysis.
+     */
+    abstract public function report(array $records) : string;
 }
diff --git a/app/Sensor/CPUtemperature.php b/app/Sensor/CPUtemperature.php
index c615e815abb2d4b56c94497522c39ee552105cff..d22b89c045f75d74f066e46163f2ef9b568d12b0 100644
--- a/app/Sensor/CPUtemperature.php
+++ b/app/Sensor/CPUtemperature.php
@@ -2,12 +2,14 @@
 
 namespace App\Sensor;
 
+use \App\Sensor;
+
 /**
      * Description of Update
  *
  * @author helha
  */
-class CPUtemperature extends \App\AbstractSensor
+class CPUtemperature extends Sensor
 {
 
     const REGEXP = "/^(Core \d+):\s+\+(\d+\.\d+)/m";
diff --git a/app/Sensor/ClientVersion.php b/app/Sensor/ClientVersion.php
index d860aa8b16c306c7d4da6549c4b16ff8c5b94585..6b629d155d4da67b5bf060c60560d47d723bc07a 100644
--- a/app/Sensor/ClientVersion.php
+++ b/app/Sensor/ClientVersion.php
@@ -2,6 +2,8 @@
 
 namespace App\Sensor;
 
+use \App\Sensor;
+
 use GuzzleHttp\Client;
 use GuzzleHttp\Exception\RequestException;
 
@@ -10,7 +12,7 @@ use GuzzleHttp\Exception\RequestException;
  *
  * @author tibo
  */
-class ClientVersion extends \App\AbstractSensor
+class ClientVersion extends Sensor
 {
 
     const MANIFEST = "https://download.cylab.be/monitor-php-client/manifest.json";
diff --git a/app/Sensor/Date.php b/app/Sensor/Date.php
index ad6dbbf3731a25b2975bab811852e5db59aa2be0..bc78b4f49589c42d92bb7afb1442fdf7054ab6d4 100644
--- a/app/Sensor/Date.php
+++ b/app/Sensor/Date.php
@@ -2,6 +2,7 @@
 
 namespace App\Sensor;
 
+use \App\Sensor;
 use App\Record;
 use App\Status;
 
@@ -10,7 +11,7 @@ use App\Status;
  *
  * @author tibo
  */
-class Date extends \App\AbstractSensor
+class Date extends Sensor
 {
     public function report(array $records) : string
     {
diff --git a/app/Sensor/DiskEvolution.php b/app/Sensor/DiskEvolution.php
index 0429065be3161ab665698c2b5b1257f242c6dcbc..28663a4bb8f55fabfcd5dab39ed240dff034726e 100644
--- a/app/Sensor/DiskEvolution.php
+++ b/app/Sensor/DiskEvolution.php
@@ -2,7 +2,9 @@
 
 namespace App\Sensor;
 
-class DiskEvolution extends \App\AbstractSensor
+use \App\Sensor;
+
+class DiskEvolution extends Sensor
 {
     public function report(array $records) : string
     {
diff --git a/app/Sensor/Disks.php b/app/Sensor/Disks.php
index c812fccf081a2e3bb0b2a1f4584ad92fc19eef90..9030a9df4995df936198d656e5541746ebd5b61d 100644
--- a/app/Sensor/Disks.php
+++ b/app/Sensor/Disks.php
@@ -2,12 +2,14 @@
 
 namespace App\Sensor;
 
+use \App\Sensor;
+
 /**
  * Description of Update
  *
  * @author tibo
  */
-class Disks extends \App\AbstractSensor
+class Disks extends Sensor
 {
 
     const REGEXP = "/\\n([A-z\/0-9:\\-\\.]+)\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)%\s*([A-z\/0-9]+)/";
diff --git a/app/Sensor/Heartbeat.php b/app/Sensor/Heartbeat.php
index bfff411fcc27f05cb053bf9cbeab286d3de01ea3..bf25216faf96706d4d368d33c7b0369ffb3e755c 100644
--- a/app/Sensor/Heartbeat.php
+++ b/app/Sensor/Heartbeat.php
@@ -2,12 +2,14 @@
 
 namespace App\Sensor;
 
+use \App\Sensor;
+
 /**
  * Description of Reboot
  *
  * @author tibo
  */
-class Heartbeat extends \App\AbstractSensor
+class Heartbeat extends Sensor
 {
     //put your code here
     public function report(array $records) : string
diff --git a/app/Sensor/Ifconfig.php b/app/Sensor/Ifconfig.php
index 3f6266ab133f0bd843954d3486d6da6f8c887a7a..fc0ef923c9a85e01a2de9aab287dbee2fb3d713a 100644
--- a/app/Sensor/Ifconfig.php
+++ b/app/Sensor/Ifconfig.php
@@ -2,7 +2,7 @@
 
 namespace App\Sensor;
 
-use \App\AbstractSensor;
+use \App\Sensor;
 use \App\Record;
 
 /**
@@ -10,7 +10,7 @@ use \App\Record;
  *
  * @author tibo
  */
-class Ifconfig extends AbstractSensor
+class Ifconfig extends Sensor
 {
 
     public function report(array $records) : string
diff --git a/app/Sensor/Inodes.php b/app/Sensor/Inodes.php
index 250dc98c95f5cbb9c855131390440c52a1398255..44e3017c5816f101011e331906ea492ea6a47e81 100644
--- a/app/Sensor/Inodes.php
+++ b/app/Sensor/Inodes.php
@@ -7,7 +7,7 @@ namespace App\Sensor;
  *
  * @author tibo
  */
-class Inodes extends \App\AbstractSensor
+class Inodes extends \App\Sensor
 {
 
     const REGEXP = "/\\n([A-z\/0-9:\\-\\.]+)\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)\s*([0-9]+)%\s*([A-z\/0-9]+)/";
diff --git a/app/Sensor/ListeningPorts.php b/app/Sensor/ListeningPorts.php
index 0ab1b8811b71a1954cf4fde8723c033c866ee1e6..ada94ecc0affa34221a8e8d88c9e46d32ff81bcb 100644
--- a/app/Sensor/ListeningPorts.php
+++ b/app/Sensor/ListeningPorts.php
@@ -7,7 +7,7 @@ namespace App\Sensor;
  *
  * @author tibo
  */
-class ListeningPorts extends \App\AbstractSensor
+class ListeningPorts extends \App\Sensor
 {
 
     const REGEXP = "/(tcp6|tcp|udp6|udp)\s*\d\s*\d\s*(\S*):(\d*).*LISTEN\s*(\S*)/m";
diff --git a/app/Sensor/LoadAvg.php b/app/Sensor/LoadAvg.php
index 78b6f1522e3dbb8334b0fc82d21d40043d4585f9..17ca99abd649d538621d4b9cee9ee9bcc5d34ac9 100644
--- a/app/Sensor/LoadAvg.php
+++ b/app/Sensor/LoadAvg.php
@@ -2,7 +2,7 @@
 
 namespace App\Sensor;
 
-use \App\AbstractSensor;
+use \App\Sensor;
 use \App\Status;
 
 /**
@@ -10,7 +10,7 @@ use \App\Status;
  *
  * @author tibo
  */
-class LoadAvg extends AbstractSensor
+class LoadAvg extends Sensor
 {
 
     /**
diff --git a/app/Sensor/MemInfo.php b/app/Sensor/MemInfo.php
index d64062e2fa0a0801af2e8fd3b6db82a6c36e7ff1..5ea0f8e5c67149f6cb4e5e4545eca9c725f68309 100644
--- a/app/Sensor/MemInfo.php
+++ b/app/Sensor/MemInfo.php
@@ -2,14 +2,14 @@
 
 namespace App\Sensor;
 
-use \App\AbstractSensor;
+use \App\Sensor;
 
 /**
  * Description of MemInfo
  *
  * @author tibo
  */
-class MemInfo extends AbstractSensor
+class MemInfo extends Sensor
 {
 
     public function report(array $records) : string
diff --git a/app/Sensor/Netstat.php b/app/Sensor/Netstat.php
index a059dcdc261ae985b9f386a5ef72d7d92efd864a..9c7513b6330bd072388efc994e44b7e21da4e24f 100644
--- a/app/Sensor/Netstat.php
+++ b/app/Sensor/Netstat.php
@@ -2,14 +2,14 @@
 
 namespace App\Sensor;
 
-use \App\AbstractSensor;
+use \App\Sensor;
 
 /**
  * Parse netstat
  *
  * @author tibo
  */
-class Netstat extends AbstractSensor
+class Netstat extends Sensor
 {
 
     public function report(array $records) : string
diff --git a/app/Sensor/Perccli.php b/app/Sensor/Perccli.php
index 752ffe270d0879672c4a15c52d4dda1c1d36979d..70a3bf1f78f02e2f50ea44d1780906f65003b490 100644
--- a/app/Sensor/Perccli.php
+++ b/app/Sensor/Perccli.php
@@ -7,7 +7,7 @@ namespace App\Sensor;
  *
  * @author tibo
  */
-class Perccli extends \App\AbstractSensor
+class Perccli extends \App\Sensor
 {
     const REGEXP = "/(\d+:\d+)\s+\d+\s+(\w+)\s+\d+\s+(.*(GB|TB))\s+\w+\s+(\w+)/";
 
diff --git a/app/Sensor/Reboot.php b/app/Sensor/Reboot.php
index 5b131fa5c79adb64101519611e55c6f0df2bdd2e..1053b320e2a13e95a8e490b287e9d9df52dbf5ae 100644
--- a/app/Sensor/Reboot.php
+++ b/app/Sensor/Reboot.php
@@ -7,7 +7,7 @@ namespace App\Sensor;
  *
  * @author tibo
  */
-class Reboot extends \App\AbstractSensor
+class Reboot extends \App\Sensor
 {
     
     public function report(array $records) : string
diff --git a/app/Sensor/Ssacli.php b/app/Sensor/Ssacli.php
index 949c7329cacb8bd1177de54f28a723198fefcb9b..3c0ea91f82b0e4daabf6b504355c348541745f8d 100644
--- a/app/Sensor/Ssacli.php
+++ b/app/Sensor/Ssacli.php
@@ -1,11 +1,5 @@
 <?php
 
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-
 namespace App\Sensor;
 
 /**
@@ -13,7 +7,7 @@ namespace App\Sensor;
  *
  * @author tibo
  */
-class Ssacli extends \App\AbstractSensor
+class Ssacli extends \App\Sensor
 {
     const REGEXP = "/\s*physicaldrive .*\(port (.*):box (\d*):bay (\d*), (.*), (.*), (\w*)\)/";
 
diff --git a/app/Sensor/USBtemperature.php b/app/Sensor/USBtemperature.php
index af00f8605aa7d3933b504c738ecced1b50e150cf..acf6a2f7df2947680af3c1e53b89962f13657c88 100644
--- a/app/Sensor/USBtemperature.php
+++ b/app/Sensor/USBtemperature.php
@@ -7,7 +7,7 @@ namespace App\Sensor;
  *
  * @author helha
  */
-class USBtemperature extends \App\AbstractSensor
+class USBtemperature extends \App\Sensor
 {
     //get device responce (8 bytes) :
     const REGEXP = "/^(80 80)\s*([A-z\/0-9]+) \s*([A-z\/0-9]+)/m";
diff --git a/app/Sensor/Updates.php b/app/Sensor/Updates.php
index 54b06d00b1c8425ecc59c86e85f5d80d31b80211..43ed148c5f07effd356ed8498f3797c8cd25ebf9 100644
--- a/app/Sensor/Updates.php
+++ b/app/Sensor/Updates.php
@@ -7,7 +7,7 @@ namespace App\Sensor;
  *
  * @author tibo
  */
-class Updates extends \App\AbstractSensor
+class Updates extends \App\Sensor
 {
 
     const REGEXP = "/(\d+)\spackages? can be updated\.\n(\d+)\supdates? (is a|are) security updates?./";