diff --git a/c/gtk3/lamps/lamps.c b/c/gtk3/lamps/lamps.c
new file mode 100644
index 0000000..693a093
--- /dev/null
+++ b/c/gtk3/lamps/lamps.c
@@ -0,0 +1,90 @@
+#include <stdlib.h>
+#include <time.h>
+#include <gtk/gtk.h>
+
+#define ROWS 4
+#define COLS 4
+
+const double pi = 3.141592653589793;
+
+const int diameter = 40;
+
+int board[ROWS][COLS];
+GtkWidget *drawing_area;
+
+
+void turn(int r, int c) {
+  board[r][c] = !board[r][c];
+  if (c > 0)        board[r][c - 1] = !board[r][c - 1];
+  if (c < COLS - 1) board[r][c + 1] = !board[r][c + 1];
+  if (r > 0)        board[r - 1][c] = !board[r - 1][c];
+  if (r < ROWS - 1) board[r + 1][c] = !board[r + 1][c];
+  gtk_widget_queue_draw(drawing_area);
+}
+
+gboolean draw(GtkWidget *widget, cairo_t *cr, gpointer data) {
+  cairo_set_source_rgba(cr, 0.9, 0.9, 0.9, 1);
+  cairo_paint(cr);
+  for(int r = 0; r < ROWS; ++r) {
+    for(int c = 0; c < COLS; ++c) {
+      if (board[r][c]) {
+        cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
+      } else {
+        cairo_set_source_rgba(cr, 1.0, 1.0, 0.0, 1.0);
+      }
+      cairo_arc(cr, (c + 0.5)*diameter, (r + 0.5)*diameter, 0.5*diameter, 0.0, 2.0*pi);
+      cairo_fill_preserve(cr);
+      cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
+      cairo_stroke(cr);
+    }
+  }
+  return TRUE;
+}
+
+gboolean button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) {
+  int c = (int)(event->x)/diameter;
+  int r = (int)(event->y)/diameter;
+  if (r >= 0 && c >= 0 && r < ROWS && c < COLS)
+    turn(r, c);
+  return TRUE;
+}
+
+void clicked(GtkButton *button, gpointer data) {
+  for(int i = 0; i < ROWS*COLS*10; ++i) {
+    int r = rand() % ROWS;
+    int c = rand() % COLS;
+    turn(r, c);
+  }
+}
+
+void activate(GtkApplication* app, gpointer data) {
+  srand(time(NULL));
+
+  GtkWidget *window = gtk_application_window_new (app);
+
+  GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
+  gtk_container_add(GTK_CONTAINER(window), hbox);
+  
+  drawing_area = gtk_drawing_area_new();
+  gtk_widget_set_size_request(GTK_WIDGET(drawing_area), COLS*diameter, ROWS*diameter);
+  gtk_widget_set_hexpand(drawing_area, TRUE);
+  gtk_widget_add_events(drawing_area, GDK_BUTTON_PRESS_MASK);
+  g_signal_connect(drawing_area, "draw", G_CALLBACK(draw), NULL);
+  g_signal_connect(drawing_area, "button-press-event", G_CALLBACK(button_press), NULL);
+  gtk_container_add(GTK_CONTAINER(hbox), drawing_area);
+
+  GtkWidget *button = gtk_button_new_with_label("Randomize");
+  gtk_widget_set_valign(button, GTK_ALIGN_START);
+  g_signal_connect(button, "clicked", G_CALLBACK(clicked), NULL);
+  gtk_container_add(GTK_CONTAINER(hbox), button);
+  
+  gtk_widget_show_all(window);
+}
+
+int main(int argc, char **argv) {
+  GtkApplication *application = gtk_application_new(NULL, 0);
+  g_signal_connect(application, "activate", G_CALLBACK(activate), NULL);
+  int status = g_application_run(G_APPLICATION(application), argc, argv);
+  g_object_unref(application);
+  return status;
+}