--- /dev/null
+# A doors / keypads set
+
+import os
+from pgzero.loaders import images
+from ..actors.orientatedsurf import OrientatedSurfActor
+
+
+class Door(OrientatedSurfActor):
+
+    def __init__(self, x, y, angle):
+        self._closed = True
+        self._open_surf = images.load(os.path.join('fixtures', 'door_open'))
+        self._closed_surf = images.load(os.path.join('fixtures', 'door_closed'))
+        self.game_pos = (x, y)
+        super().__init__(self._closed_surf, angle)
+
+    def open(self):
+        self._closed = False
+        self.surf = self._open_surf
+
+    def is_closed(self):
+        return self._closed
 
--- /dev/null
+# A doors / keypads set
+
+import os
+from pgzero.loaders import images
+from ..actors.orientatedsurf import SurfActor
+
+
+class Keypad(SurfActor):
+
+    def __init__(self, x, y, doors):
+        self._doors = doors
+        self.game_pos = (x, y)
+        surf = images.load(os.path.join('fixtures', 'keypad'))
+        super().__init__(surf)
+
+    def activate(self):
+        # FIXME: Check stats
+        for door in self._doors:
+            door.open()
 
 """ Class holding the level info """
 
+from .keypad import Keypad
+from .door import Door
+
 
 class Level(object):
 
     def __init__(self):
         self.width = self.height = 0
         self.tiles = []
+        self.keypads = []
+        self.doors = []
         self.tileset = None
         self.start_pos = (0, 0)
 
                ]
 
     def can_walk(self, x, y, layer):
-        return 'walk' in self.tiles[y][x][layer]['behaviour']
+        if 'walk' in self.tiles[y][x][layer]['behaviour']:
+            # check doors
+            for door in self.doors:
+                if (x, y) == door.pos and door.closed():
+                    return False
+            return True
+        return False
 
     def can_fly(self, x, y, layer):
-        return 'fly' in self.tiles[y][x][layer]['behaviour']
+        if 'fly' in self.tiles[y][x][layer]['behaviour']:
+            for door in self.doors:
+                if (x, y) == door.pos and door.closed():
+                    return False
+            return True
+
+        return False
 
     def can_crawl(self, x, y, layer):
         return 'crawl' in self.tiles[y][x][layer]['behaviour']
+
+    def keypad_at(self, x, y):
+        for keypad in self.keypads:
+            if (x, y) == keypad.pos:
+                return keypad
+        return None
 
    "starting pos": [
       5, 
       6
+   ], 
+   "door_info": [
+      {
+         "keypads": [
+            [
+               6, 
+               7
+            ]
+         ], 
+         "doors": [
+            [
+               7, 
+               8
+            ]
+         ]
+      }, 
+      {
+         "keypads": [
+            [
+               12, 
+               5
+            ]
+         ], 
+         "doors": [
+            [
+               12, 
+               7
+            ], 
+            [
+               13, 
+               4
+            ]
+         ]
+      }, 
+      {
+         "keypads": [
+            [
+               18, 
+               9
+            ]
+         ], 
+         "doors": [
+            [
+               19, 
+               8
+            ]
+         ]
+      }
    ]
 }
\ No newline at end of file
 
 
 from ..gamelib.tiles import Wall, Floor, Tunnel, Underground, Grate
 from ..gamelib.level import Level
+from ..gamelib.door import Door
+from ..gamelib.keypad import Keypad
 
         
 
         for tile in TILES.values():
             tile.TILESET = self._level.tileset
         self._load_tile_images()
+        for door_info in level_data['door_info']:
+            # Create the doors first
+            doors = []
+            for door in door_info['doors']:
+                # Sort out angle
+                new_door = Door(0, door[0], door[1])
+                self._level.doors.append(new_door)
+            # Add the keypads
+            for keypad in door_info['keypads']:
+                new_keypad = Keypad(doors, keypad[0], keypad[1])
+                self._level.keypads.append(new_keypad)
         return self._level
 
     def _load_tile_images(self):
 
         for layer in ['floor', 'tunnels']:
             self._surfaces[layer] = self._render(layer)
         self._overlay = self._surfaces['floor'].copy()
+        self._doors = self.actors.add_layer("doors", level=15)
+        self._keypads = self.actors.add_layer("keypads", level=16)
+        # These are already Actors
+        for door in self._level.doors:
+            self._doors.append(door)
+        for keypad in self._level.keypads:
+            self._keypads.append(keypads)
 
     def _render(self, layer):
         # We cache the rendered surface to avoid doing a large number
 
     def _set_pos(self, x, y):
         self._player_pos = (x, y)
+        print('Now at ', x, y)
 
     def _can_move(self, x, y):
         if self._mode == 'walk':