diff --git a/run-solleroot.py b/run-solleroot.py
index 74f3d4cae99f47a23e208ce78fd9ee94f812ecba..f2caeffb53f868590df3837d7571403f25dfabe3 100644
--- a/run-solleroot.py
+++ b/run-solleroot.py
@@ -11,6 +11,13 @@ uart_service_uuid = '6e400001-b5a3-f393-e0a9-e50e24dcca9e'
 tx_characteristic_uuid = '6e400002-b5a3-f393-e0a9-e50e24dcca9e' # Write
 rx_characteristic_uuid = '6e400003-b5a3-f393-e0a9-e50e24dcca9e' # Notify
 
+
+DATA_TYPE_COLOR_SENSOR = 4
+DATA_TYPE_BUMPER = 12
+DATA_TYPE_LIGHT = 13
+DATA_TYPE_TOUCH = 17
+DATA_TYPE_CLIFF = 20
+
 class BluetoothDeviceManager(gatt.DeviceManager):
     robot = None # root robot device
 
@@ -24,6 +31,8 @@ class BluetoothDeviceManager(gatt.DeviceManager):
 
 class RootDevice(gatt.Device):
     message = "no message"
+    edge_following_enabled = False
+    
     def print_message(self):
         print(self.message)
     
@@ -58,19 +67,78 @@ class RootDevice(gatt.Device):
         self.rx_characteristic.enable_notifications() # listen to RX messages
 
     def characteristic_value_updated(self, characteristic, value):
-        message = []
+        new_data = []
         type = ""
         for byte in value:
-            message.append(byte)
+            new_data.append(byte)
 #        print ("Messages from Root:")
-        if message[0] == 4: type = "Color Sensor"
-        if message[0] == 12: type = "Bumper"
-        if message[0] == 13: type = "Light Sensor"
-        if message[0] == 17: type = "Touch Sensor"
-        if message[0] == 20: type = "Cliff Sensor"
+        # Print sensor data
+        if new_data[0] == DATA_TYPE_COLOR_SENSOR : type = "Color Sensor"
+        if new_data[0] == DATA_TYPE_BUMPER: type = "Bumper"
+        if new_data[0] == DATA_TYPE_LIGHT: type = "Light Sensor"
+        if new_data[0] == DATA_TYPE_TOUCH: type = "Touch Sensor"
+        if new_data[0] == DATA_TYPE_CLIFF: type = "Cliff Sensor"
+#        print("{}: {}".format(type, new_data))
+
+        # Do the thing!
+        if new_data[0] == DATA_TYPE_COLOR_SENSOR:
+            did_adjust = adjust_for_perimeter_if_needed(new_data)
+            if did_adjust:
+                return
+        if type == "Color Sensor" and self.edge_following_enabled:
+            self.follow_edge(new_data)
+            
+            
+    def adjust_for_perimeter_if_needed(self, data):
+        adjusted = False
+        
+        # TODO: Check to see if you're at perimeter! If you are, update your state and set
+        # adjusted = True
         
-        self.message = "YAY IT WORKED" #message
-  #      print(type, message)
+        return adjusted
+        
+
+    def follow_edge(self, message):
+        if message[3] != 0 or message[4] != 0:
+            #drive_root("l")
+            manager.robot.turn_rate(-45)
+            #manager.robot.drive_left_slow()
+            #drive_root("z")
+            turn_state = 1  
+        elif message[5] != 0 or message[6] != 0:
+            #drive_root("l")
+            manager.robot.turn_rate(-30)
+            #manager.robot.drive_left_slow_slow()
+            #drive_root("x")
+            turn_state = 1                
+            #drive_root("f")
+            #print("test1")
+        elif message[7] != 0 or message[8] != 0:
+            drive_root("f")
+            
+        elif message[9] != 0 or message[10] != 0:
+            manager.robot.turn_rate(30)
+            
+        elif message[12] != 0 or message[11] != 0:
+            manager.robot.turn_rate(45)
+        elif message[14] != 0 or message[13] != 0:
+            #drive_root("r")
+            manager.robot.turn_rate(60)
+            #manager.robot.drive_right_slow_slow()
+            #drive_root("c")
+            turn_state = 2                
+            #drive_root("f")
+            #print("test2")
+        elif message[16] != 0 or message[15] != 0:
+            #drive_root("r")
+            manager.robot.turn_rate(60)
+            #manager.robot.drive_right_slow()
+            #drive_root("v")
+            turn_state = 2
+        else:
+             drive_root("f")
+             #manager.robot.drive_forward_slow()
+             #drive_root("a")
 
     def drive_forward(self):
         self.tx_characteristic.write_value([0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1])
@@ -151,7 +219,13 @@ def drive_root(command):
     if command == "p":
         print ("Steer")
         manager.robot.steer(30,40)
-
+    if command == "clear":
+        print ("clear all")
+        manager.robot.edge_following_enabled = False
+    if command == "edge":
+        print ("edge")
+        manager.robot.edge_following_enabled = True
+        
 # start here if run as program / not imported as module
 if __name__ == "__main__":
     manager = BluetoothDeviceManager(adapter_name = 'hci0')