diff --git a/src/BeagleBone/GPIO.jl b/src/BeagleBone/GPIO.jl
new file mode 100644
index 0000000000000000000000000000000000000000..9a757ea889fca39f8bc18c6c0fad5a42ddef8fef
--- /dev/null
+++ b/src/BeagleBone/GPIO.jl
@@ -0,0 +1,86 @@
+"""
+Lowest form of communication woth the GPIO pins. The available pins are
+listed in the "channel" parameter, and appear as directories in /sys/class.
+Any of these GPIOs can be run in various ways, with any operation specified
+by a sequence of three entries
+
+  (channel, operation, entry) = (int32, int32, String)
+
+For instance, if the GPIO "gpio30" is to be configured as a output pin and set
+to high, the following two writes aould be done.
+
+  write!(GPIO, 14, 2, "out")
+  write!(GPIO, 14, 1, "1")
+
+"""
+struct GPIO
+end
+
+writeOperations = [
+    Dict("dir" => "value",     "entries"=>["1", "0"])
+    Dict("dir" => "direction", "entries"=>["in", "out"])
+]
+
+readOperations = [
+    "value"
+    "direction"
+    "edge"
+]
+
+channels =[
+    "gpio112"
+    "gpio114"
+    "gpio115"
+    "gpio116"
+    "gpio14"
+    "gpio15"
+    "gpio2"
+    "gpio20"
+    "gpio22"
+    "gpio23"
+    "gpio26"
+    "gpio27"
+    "gpio3"
+    "gpio30"
+    "gpio31"
+    "gpio4"
+    "gpio44"
+    "gpio45"
+    "gpio46"
+    "gpio47"
+    "gpio48"
+    "gpio49"
+    "gpio5"
+    "gpio50"
+    "gpio51"
+    "gpio60"
+    "gpio61"
+    "gpio65"
+    "gpio66"
+    "gpio67"
+    "gpio68"
+    "gpio69"
+    "gpio7"
+]
+
+function write!(::GPIO, index::Int32, operation::Int32, entry::String)
+    (index <= 0 || index > length(channels)) && error("Invalid GPIO index: $index")
+    (operation <= 0 || operation > length(writeOperations)) && error("Invalid GPIO operation: $operation")
+    filename = "/sys/class/gpio/$(channels[index])/$(writeOperations[operation]["dir"])"
+
+    if entry in writeOperations[operation]["entries"]
+        file = open(filename, "r+")
+        write(file, "$(entry)")
+        close(file)
+    else
+        error("Cannot write $(entry) to operation: $operation")
+    end
+    return
+end
+
+#function Base.read(::SysLED, ind::Int32)
+#    (ind < 0 || ind > length(channels)) && error("Invalid SysLEND ind: $ind")
+#    println("not yet supported")
+#    l = 0
+#    return l == "1"
+#end
diff --git a/test/BeagleBone/GPIO_test.jl b/test/BeagleBone/GPIO_test.jl
new file mode 100644
index 0000000000000000000000000000000000000000..a6e445d7597526a865c609aab27aaec7dba7eac5
--- /dev/null
+++ b/test/BeagleBone/GPIO_test.jl
@@ -0,0 +1,41 @@
+include("../../src/BeagleBone/BeagleBone.jl")
+
+using Base.Test
+
+#Fixture
+device = getdev("gpio")
+gpio_state = true
+write!(device, 31, 2, "out")
+
+device = getdev("gpio")
+
+@testset "GPIO Tests" begin
+    @testset "Error Handling" begin
+        # Attempt to initialize faulty device
+        @test_throws ErrorException  getdev("wrong_device_name")
+
+        # Test that an exception is thrown when a faulty channel is given
+        @test_throws ErrorException write!(device, 100, 1, "0")
+
+        # Test that an exception is thrown when a faulty channel is given
+        @test_throws ErrorException write!(device, 0, 1, "1")
+
+        # Test that an exepition is thrown when requiring bad entry
+        @test_throws ErrorException write!(device, 0, 123, "0")
+
+        # Test that an exepition is thrown when requiring bad entry
+        @test_throws ErrorException write!(device, 0, 1, "bad_entry")
+    end
+    @testset "IO Communication" begin
+        # Instanciate all possible leds and perform 10 read/write commands
+        # with the set high/low operation (1)
+        operation = 1
+        for i = 1:10
+            state = "$(i%2)"
+            for index = 1:length(channels)
+                write!(device, index, operation, state)
+            end
+            sleep(0.1)
+        end
+    end
+end