diff --git a/Makeconf b/Makeconf
index 580c870..ae10550 100644
--- a/Makeconf
+++ b/Makeconf
@@ -1,6 +1,6 @@
 TARGETS := libemu.a vgbc vgbc.test vgbc.inspect vgbc.gbdif vgbc.lcdtest
 
-sfml_packages := sfml-graphics
+sfml_packages := sfml-graphics sfml-system
 sfml_CXXFLAGS := $(shell pkg-config --cflags $(sfml_packages))
 sfml_LDFLAGS := $(shell pkg-config --libs $(sfml_packages))
 
@@ -21,6 +21,7 @@ modules_libemu.a := memory/device.o \
                     lcd/lcd.o \
                     lcd/palette.o \
                     input/joypad.o \
+                    timer/timer.o \
 
 modules_vgbc := main.o libemu.a
 verb_vgbc := link
diff --git a/timer/timer.cpp b/timer/timer.cpp
new file mode 100644
index 0000000..c1106d3
--- /dev/null
+++ b/timer/timer.cpp
@@ -0,0 +1,24 @@
+#include <timer/timer.h>
+
+void TimerDiv::write8(u16 addr, u8 data)
+{
+  switch(addr) {
+  case 0x0000: // DIV
+    divClock.restart();
+    break;
+  }
+}
+
+u8 TimerDiv::read8(u16 addr)
+{
+  switch(addr) {
+  case 0x0000: // DIV
+    {
+      sf::Time elapsed = divClock.getElapsedTime();
+      sf::Int64 regval = elapsed.asMicroseconds();
+      return (regval * 16384 / 1000000) & 0xFF;
+    }
+  default:
+    return 0x00;
+  }
+}
diff --git a/timer/timer.h b/timer/timer.h
new file mode 100644
index 0000000..9f20cc0
--- /dev/null
+++ b/timer/timer.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <cpu/cpu.h>
+#include <misc/types.h>
+#include <memory/device.h>
+#include <SFML/System/Clock.hpp>
+
+class TimerDiv : public Mem_device {
+private:
+  sf::Clock divClock;
+
+public:
+  TimerDiv() = default;
+
+  virtual void write8(u16 addr, u8 data);
+  virtual u8 read8(u16 addr);
+};