diff --git a/lamps.c b/lamps.c
new file mode 100644
index 0000000..350cdeb
--- /dev/null
+++ b/lamps.c
@@ -0,0 +1,64 @@
+
+#include <helianthus.h>
+
+#define SIZE 5
+#define LAMPSIZE 100
+
+
+int lamps[SIZE][SIZE];
+
+
+void toggle(int i, int j) {
+  if (i < 0 || j < 0 || i >= SIZE || j >= SIZE) return;
+  if (i > 0     ) lamps[i-1][j] = !lamps[i-1][j];
+  if (i < SIZE-1) lamps[i+1][j] = !lamps[i+1][j];
+  if (j > 0     ) lamps[i][j-1] = !lamps[i][j-1];
+  if (j < SIZE-1) lamps[i][j+1] = !lamps[i][j+1];
+  lamps[i][j] = !lamps[i][j];
+}
+
+
+void toggleRandom() {
+  toggle(randomNumber(0, SIZE-1), randomNumber(0, SIZE-1));
+}
+
+
+void init() {
+  background(colorByName("black"));
+  for(int i = 0; i < SIZE*SIZE; ++i)
+    toggleRandom();
+}
+
+
+void draw() {
+  saveState();
+  zoom(LAMPSIZE);
+
+  strokeWidth(0.1);
+  stroke( colorByRGB(0.25, 0.25, 0.25) );
+  for(int i = 0; i < SIZE; ++i) {
+    for(int j = 0; j < SIZE; ++j) {
+      fill(colorByName( lamps[i][j] ? "yellow" : "black" ));
+      ellipse(j + 0.2, i + 0.2, 0.6, 0.6);
+    }
+  }
+
+  if (mouseWentDown("left"))
+    toggle((int)transformedMouseY(), (int)transformedMouseX());
+  if (keyWentDown("space"))
+    toggleRandom();
+
+  restoreState();
+}
+
+
+int main() {
+  worldSetTitle("Lamps");
+  worldSetSize(SIZE*LAMPSIZE, SIZE*LAMPSIZE);
+  worldSetVariableFrameRate();
+  worldSetInit(&init);
+  worldSetDraw(&draw);
+  worldRun();
+  return 0;
+}
+