diff --git a/icbm.ino b/icbm.ino
index cb83fd8509e4a18a140a06e539773f54c7535da9..522114cc112ab1ef9f1fdb310d3351edbf3b3f14 100644
--- a/icbm.ino
+++ b/icbm.ino
@@ -7,6 +7,9 @@ unsigned long start;
 extern bool eth_connected;
 extern SNMP::Manager snmp;
 
+TaskHandle_t restServerTask;
+TaskHandle_t powerProcedureTask;
+
 void setup() {
     Serial.begin(115200);
 
@@ -22,6 +25,11 @@ void setup() {
     PINS.ramping = false;
 
     start = millis();
+
+    xTaskCreatePinnedToCore(webInterfaceLoop, "Web Interface", 10000, NULL, 1, &restServerTask, 0);
+
+    xTaskCreatePinnedToCore(mainLoop, "PowerProcedure Task", 10000, NULL, 1, &powerProcedureTask,
+                            1);
 }
 
 enum {
@@ -37,13 +45,26 @@ void serialLoop() {
     }
 }
 
-void loop() {
-    isr_check_loop();
-    snmp.loop();
-    restServer.handleClient();
-    toggle_status_led();
-    serialLoop();
-    if (eth_connected) {  // We may be triggered, but disconnected from the network.
-        powerOffCheckLoop();
+void webInterfaceLoop(void* pvParameters) {
+    Serial.print("Web loop running on core ");
+    Serial.println(xPortGetCoreID());
+    while (true) {
+        restServer.handleClient();
     }
 }
+
+void mainLoop(void* pvParameters) {
+    Serial.print("main loop running on core ");
+    Serial.println(xPortGetCoreID());
+    while (true) {
+        isr_check_loop();
+        snmp.loop();
+        toggle_status_led();
+        serialLoop();
+        if (eth_connected) {  // We may be triggered, but disconnected from the network.
+            powerOffCheckLoop();
+        }
+    }
+}
+
+void loop() {}