diff --git a/main.js b/main.js
index eef21a7656a4502dd428169a921619ce34cbdf27..42f233a90cdf22097b0c06032e2934dee4c617be 100644
--- a/main.js
+++ b/main.js
@@ -5,6 +5,11 @@ const fs = require('node:fs');
 // Prepend timestamp and severity to all console messages
 require('console-stamp')(console);
 
+class DoorInfo {
+  state = null;
+  opener = null;
+}
+
 const web_host = process.env.HTTP_BIND;
 const web_port = process.env.HTTP_PORT;
 
@@ -27,35 +32,64 @@ client.on('connect', () => {
   client.subscribe('door/#', () => {});
 });
 
-let doorState = null;
-let doorOpener = null;
+let doors = {
+  'ucc-door': new DoorInfo(),
+};
+
+const update_door_state = (door, state) => {
+  if (doors[door] === undefined) {
+    console.log(`Tried to update state for unknown door ${door}`);
+    return;
+  }
+
+  switch (state) {
+    case "ON":
+      console.log(`Door ${door} opened!`);
+      doors[door].state = true;
+      break;
+
+    case "OFF":
+      console.log(`Door ${door} closed!`);
+      doors[door].state = false;
+      break;
+
+    default:
+      console.log(`Unknown message received for door ${door}`);
+      break;
+  }
+};
+
+const update_door_opener = (door, opener) => {
+  if (doors[door] === undefined) {
+    console.log(`Tried to update opener for unknown door ${door}`);
+    return;
+  }
+
+  if (opener) {
+    console.log(`Marked door ${door} as opened by ${opener}`);
+    doors[door].opener = opener;
+  }
+};
 
 // Receive messages
 client.on('message', (topic, message) => {
   console.log(`Received message on topic ${topic}`);
 
-  if (topic === 'door/ucc-door/state') {
-    switch (message.toString()) {
-      case "ON":
-        console.log("Door opened!");
-        doorState = true;
-        break;
-
-      case "OFF":
-        console.log("Door closed!");
-        doorState = false;
-        break;
-
-      default:
-        console.log("Unknown message received...");
-        break;
-    }
+  const topicparts = topic.split('/');
+  if (topicparts.length != 3) {
+    console.log(`Unknown topic ${topic} received`);
+    return;
   }
-  else if (topic === 'door/ucc-door/openedby') {
-    const opener = message.toString();
-    if (opener) {
-      doorOpener = opener;
-    }
+
+  if (topicparts[0] === 'door' && topicparts[2] === 'state') {
+    update_door_state(topicparts[1], message.toString());
+  }
+  else if (topicparts[0] === 'door' && topicparts[2] === 'openedby') {
+    update_door_opener(topicparts[1], message.toString());
+  }
+  else {
+    console.log(`Unknown topic ${topic} received`);
+
   }
 });
 
@@ -85,28 +119,28 @@ const server = http.createServer((req, res) => {
   }
 
   if (req.url === '/') {
-    if (doorState === null) {
+    if (doors['ucc-door'].state === null) {
       return send_file(res, 500, './pages/ucc_door_unavail.html', 'text/html');
     }
 
-    const fname = doorState ? './pages/ucc_door_open.html' : './pages/ucc_door_closed.html';
+    const fname = doors['ucc-door'].state ? './pages/ucc_door_open.html' : './pages/ucc_door_closed.html';
     return send_file(res, 200, fname, 'text/html');
   }
 
   if (req.url === '/state') {
-    if (doorState === null) {
+    if (doors['ucc-door'].state === null) {
       return send_json(res, 500, null);
     }
 
-    return send_json(res, 200, doorState);
+    return send_json(res, 200, doors['ucc-door'].state);
   }
 
   if (req.url === '/opener') {
-    if (doorOpener === null) {
+    if (doors['ucc-door'].opener === null) {
       return send_json(res, 500, null);
     }
 
-    return send_json(res, 200, doorState ? doorOpener : null);
+    return send_json(res, 200, doors['ucc-door'].state ? doors['ucc-door'].opener : null);
   }
 
   if (req.url === '/static/door_ucc_open.jpg') {