diff --git a/carla_environment.py b/carla_environment.py
index 5fde8310ae4877ddc05cc0a42cf84bb113107256..4bfa8c7d3055e82d6aacbeb870ab35be4debc613 100644
--- a/carla_environment.py
+++ b/carla_environment.py
@@ -7,6 +7,7 @@ import numpy as np
 import pygame
 import math
 import atexit
+from steering_wheel import Controller
 
 # find carla module
 try:
@@ -19,34 +20,46 @@ except IndexError:
 
 import carla
 
-
 class Camera:
+    """ Add camera sensor to the carla world """
     sensor = None
+    display = None
+    surface = None
     width = None
     height = None
     surface = None
 
-    def __init__(self, width=640, height=480):
+    def __init__(self, world, width=640, height=480):
         self.width = width
         self.height = height
- 
-    def spawn(self, camera_actor):
-        self.sensor = camera_actor
+        self.display = pygame.display.set_mode(
+            (width, height),
+            pygame.HWSURFACE | pygame.DOUBLEBUF)
+        self.display.fill((0,0,0))
+        camera_blueprint = world.world.get_blueprint_library().find('sensor.camera.rgb')
+        camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
+        camera_blueprint.set_attribute('image_size_x', f'{self.width}')
+        camera_blueprint.set_attribute('image_size_y', f'{self.height}')
+        camera_blueprint.set_attribute('fov', '110')
+        self.sensor = world.world.spawn_actor(camera_blueprint, camera_transform, attach_to=world.player)
         self.sensor.listen(lambda data: self.process_img(data))
     
     def process_img(self, data):
         array = np.frombuffer(data.raw_data, dtype=np.dtype("uint8"))
-        array = np.reshape(array, (self.width, self.height, 4))
+        array = np.reshape(array, (self.height, self.width, 4))
         array = array[:, :, :3]
         array = array[:, :, ::-1]
         self.surface = pygame.surfarray.make_surface(array.swapaxes(0, 1))
-
+    
+    def on_update(self):
+        if self.surface is not None:
+            self.display.blit(self.surface, (0, 0))
+            pygame.display.flip()
 
 class World:
+    """ Wrapper for the carla environment, incl. player/vehicle """
     player = None
     world = None
-    camera = None
-    surface = None
     blueprint_library = None
     spawn_points = None
 
@@ -54,7 +67,6 @@ class World:
         self.world = world
         self.blueprint_library = self.world.get_blueprint_library()
         self.spawn_points = self.world.get_map().get_spawn_points()
-        self.camera = Camera()
         self.reset()
     
     def reset(self):
@@ -66,58 +78,42 @@ class World:
             blueprint = random.choice(self.blueprint_library.filter('vehicle'))
             position = random.choice(self.spawn_points)
             self.player = self.world.try_spawn_actor(blueprint, position)
-        self.player.set_autopilot(True)
-        self.spawn_camera()
-
-    def spawn_camera(self):
-        camera_blueprint = self.blueprint_library.find('sensor.camera.rgb')
-        camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
-        camera_blueprint.set_attribute('image_size_x', f'{self.camera.width}')
-        camera_blueprint.set_attribute('image_size_y', f'{self.camera.height}')
-        camera_blueprint.set_attribute('fov', '110')
-        self.camera.spawn(self.world.spawn_actor(camera_blueprint, camera_transform, attach_to=self.player))
 
     def destroy(self):
         if self.player is not None:
             self.player.destroy()
 
-    def __del__(self):
-        self.player.destroy()
+    def step(self, action):
+        self.player.apply_control(action)
+
+
 
 class CarlaEnvironment:
     world = None
     client = None
-    display = None
 
     def __init__(self, host="127.0.0.1", port=2000, width=1280, height=720):
-        pygame.init()
         self.client = carla.Client(host, port)
         self.client.set_timeout(2.0)
         self.world = World(self.client.get_world())
-        self.display = pygame.display.set_mode(
-            (width, height),
-            pygame.HWSURFACE | pygame.DOUBLEBUF)
-        self.display.fill((0,0,0))
     
-    def on_update(self):
-        if self.world.camera.surface is not None:
-            self.display.blit(self.world.camera.surface, (0, 0))
-            pygame.display.flip()
-
-    def __del__(self):
-        pygame.quit()
-
+    def step(self, action):
+        control = carla.VehicleControl(throttle=action[0], steer=action[2], brake=action[1])
+        self.world.step(control)
+        
 
 if __name__ == "__main__":
+    pygame.init()
+
     env = CarlaEnvironment()
+    cam = Camera(env.world)
+    ctrl = Controller()
     running = True
 
-    while running:
-        env.on_update()
-        for event in pygame.event.get():
-            if event.type == pygame.KEYUP:
-                if event.key == pygame.K_q:
-                    running = False
+    while ctrl.is_running():
+        ctrl.on_update()
+        env.step(ctrl.get_action())
+        cam.on_update()
         
     env.world.destroy()
-    env = None
+    pygame.quit()
diff --git a/steering_wheel.py b/steering_wheel.py
index 089d20591a064421eec836ea55ab939c0099c4ae..22dde87dc1708db3741d167fa76ad1ae9ad02642 100644
--- a/steering_wheel.py
+++ b/steering_wheel.py
@@ -3,22 +3,22 @@
 import pygame
 
 DIRECTION=0
-SPEED=1
-BREAKS=2
+THROTTLE=1
+BRAKES=2
 INPUTS=3
 
 OFFSET = 2.0
 
 class ManualSteeringWheel:
     """ Steering wheel """
-    axis_count = 0
+    axis_count = 0.0
     joystick = None
-    direction = 0
-    speed = 0
-    breaks = 0
+    direction = 0.0
+    throttle = 0.0
+    brakes = 0.0
+    reverse = False
 
     def __init__(self):
-        pygame.init()
         self.joystick = pygame.joystick.Joystick(0)
         self.joystick.init()
         self.axis_count = self.joystick.get_numaxes()
@@ -30,28 +30,50 @@ class ManualSteeringWheel:
         self.direction = self.joystick.get_axis(DIRECTION)
         return self.direction
     
-    def get_speed(self, update=True):
-        """ Update and return speed."""
+    def get_throttle(self, update=True):
+        """ Update and return throttle."""
         if update:
             pygame.event.get()
-        self.speed = (OFFSET - (self.joystick.get_axis(SPEED) + 1.0)) / OFFSET
-        return self.speed
+        self.throttle = (OFFSET - (self.joystick.get_axis(THROTTLE) + 1.0)) / OFFSET
+        return self.throttle
 
-    def get_breaks(self, update=True):
-        """ Update and return breaks. """
+    def get_brakes(self, update=True):
+        """ Update and return brakes. """
         if update:
             pygame.event.get()
-        self.breaks = (OFFSET - (self.joystick.get_axis(BREAKS) + 1.0)) / OFFSET
-        return self.breaks
+        self.brakes = (OFFSET - (self.joystick.get_axis(BRAKES) + 1.0)) / OFFSET
+        if self.brakes < 0.01:
+            self.brakes = 0.0
+        return self.brakes
 
-    def on_update(self):
+    def update_controls(self):
         """ Poll for pygame events. """
-        pygame.event.get()
         self.get_direction(update=False)
-        self.get_speed(update=False)
-        self.get_breaks(update=False)
+        self.get_throttle(update=False)
+        self.get_brakes(update=False)
+
+    def get_action(self):
+        return [self.throttle, self.brakes, self.direction, self.reverse]
+
+
+class Controller(ManualSteeringWheel):
+    running = True
+
+    def is_running(self):
+        return self.running
+
+    def on_update(self):
+        for event in pygame.event.get():
+            if event.type == pygame.KEYUP:
+                if event.key == pygame.K_r:
+                    self.reverse = not self.reverse
+                elif event.key == pygame.K_q:
+                    self.running = False
+                    
+        self.update_controls()
 
 if __name__ == '__main__':
+    pygame.init()
     clock = pygame.time.Clock()
     sw = ManualSteeringWheel()
 
@@ -59,6 +81,6 @@ if __name__ == '__main__':
         # Receive all occured events
         print("")
         print("Direction: " + str(sw.get_direction()))
-        print("Speed:     " + str(sw.get_speed()))
-        print("Breaks:    " + str(sw.get_breaks()))
+        print("Speed:     " + str(sw.get_throttle()))
+        print("Brakes:    " + str(sw.get_brakes()))
         clock.tick(2)