diff --git a/hal/module.go b/hal/module.go
index 8458eab..bc42034 100644
--- a/hal/module.go
+++ b/hal/module.go
@@ -16,6 +16,7 @@ type Module struct {
 	programStorage Program
 	register       []float64
 	IO             map[int64]IO
+	pageTable      *PageTable
 
 	isStopped    bool
 	debugEnabled bool
diff --git a/hal/paging.go b/hal/paging.go
new file mode 100644
index 0000000..48e4ecc
--- /dev/null
+++ b/hal/paging.go
@@ -0,0 +1,30 @@
+package hal
+
+type Page struct {
+	Referenced bool
+	PageNumber uint16
+}
+
+type PageTable []*Page
+
+type Address uint16
+
+func (address Address) PageNumber() uint16 {
+	return uint16(address) >> 10
+}
+
+func (address Address) Offset() uint16 {
+	return uint16(address) & 0x03FF
+}
+
+func (table *PageTable) Find(address Address) {
+	// 10 bit for one register in a page
+	// 6 bit to address the page
+	// 000010 | 0000000011
+	// -> Page 2, offset 3
+
+	// Find the page with that number
+
+	// Check if it is already loaded
+	// Load it if not
+}
diff --git a/hal/paging_test.go b/hal/paging_test.go
new file mode 100644
index 0000000..08cb47c
--- /dev/null
+++ b/hal/paging_test.go
@@ -0,0 +1,14 @@
+package hal
+
+import (
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestAddress(t *testing.T) {
+	// 000010 | 0000000011
+	address := Address(0b0000100000000011)
+
+	assert.Equal(t, uint16(0b10), address.PageNumber())
+	assert.Equal(t, uint16(0b11), address.Offset())
+}