diff --git a/src/tanklabgui.jl b/src/tanklabgui.jl
index b9542fa5df4f17e2094a9d7ecc21d92ae622ae0b..41019d16197da6594560a7b0a4202b543593ecf0 100644
--- a/src/tanklabgui.jl
+++ b/src/tanklabgui.jl
@@ -1,4 +1,9 @@
-function makegui(P, plottingframerate = 10, guiframerate = 10)
+"""
+makegui(P, run_process, plottingframerate = 10, guiframerate = 10)
+
+Used to create a gui for the tanklab, returns the gui, the responder (to be served as a web app) and the controller. The plottingframerate and guiframerate determine the bandwidth required for the app. More than 20fps may be more than the plotting method can handle.
+"""
+function makegui(P, run_process, plottingframerate = 10, guiframerate = 10)
     tankpid = PID()
     boundsupper = (0,1)
     boundslower = (-2,2)
@@ -6,9 +11,14 @@ function makegui(P, plottingframerate = 10, guiframerate = 10)
     gui = GUI()
     ptfr = 3.8 #pump to flow ratio, approximate
 
+
+    """
+    We have below 4 construct calls which produce all widgets and graphics for the gui. Two are used to create the graphics and use dummy widgets (used to animate the graphics). Two are used to create the widgets, and use dummy graphics. These graphics must be manually added to the gui DOM or the widgets won't function. Widgets must also be included in the gui DOM but calling the gui() function will take care of this as long as the widgets containers are added to the GUI.
+    """
     #This allows external access to the r value, the rbox string is parsed into this value 
     rcont, dummygraphic1 = @construct for
         r in slider(0.0:0.01:1.0)
+
         Node(:div)
     end
 
@@ -28,31 +38,32 @@ function makegui(P, plottingframerate = 10, guiframerate = 10)
         rbox   in textbox(" r "),
         expcsv in button("Export Data")
 
-        rv = obs(r)[]
+        tankpid.K  = K
+        tankpid.Ti = Ti
+        tankpid.Td = Td
+
+        rv = observe(r)[]
         if !endswith(rbox, ".") && rbox != "0"
             try 
-                #obs(r).val = parse(Float64, rbox)
                 rv = parse(Float64, rbox)
             end
             if 0.0<rv<1.0
-                obs(r).val = rv
+                observe(r).val = rv
             end
         end
-        Node(:div)
+        Node(:div) #empty node
     end
 
     widgets, graphic1 = @construct for 
         svgdummy in checkbox(false, label="This button does nothing")
-        tankpid.K = obs(K)[]
-        tankpid.Ti = obs(Ti)[]
-        tankpid.Td = obs(Td)[]
-
-        if obs(tankno)[]=="Upper"
-            tankg = tank_construct(measure(P)..., obs(u)[]*ptfr, 1, obs(r).val)
-        elseif obs(tankno)[]=="Lower"
-            tankg = tank_construct(measure(P)..., obs(u)[]*ptfr, 2, obs(r).val)
+
+
+        if observe(tankno)[]=="Upper"
+            tankg = tank_construct(measure(P)..., observe(u)[]*ptfr, 1, observe(r).val)
+        elseif observe(tankno)[]=="Lower"
+            tankg = tank_construct(measure(P)..., observe(u)[]*ptfr, 2, observe(r).val)
         else
-            tankg = tank_construct(measure(P)..., obs(u)[]*ptfr)
+            tankg = tank_construct(measure(P)..., observe(u)[]*ptfr)
         end
         Node(:div, tankg, id="tanks", attributes=tankattr)
     end
@@ -60,6 +71,7 @@ function makegui(P, plottingframerate = 10, guiframerate = 10)
     glnv = (0:maxplotlength)*P.h
     w2, graphic2 = @construct for 
         plotdummy in checkbox(false, label="This button does nothing")
+
         dataln = length(gui.data[1])
         if dataln>maxplotlength
             start = dataln-maxplotlength
@@ -78,25 +90,34 @@ function makegui(P, plottingframerate = 10, guiframerate = 10)
 
     #-----------------------------------------------#
     #This should only exist in the simulated version#
-    on(obs(run)) do val
+    on(observe(run)) do val
         if val==1
-            @async prbs_experiment(P, gui, tankpid)
+            @async run_process(P, gui, tankpid)
         else
-            obs(run).listeners[end] = x ->()
+            observe(run).listeners[end] = x ->()
         end
     end
     #-----------------------------------------------#
     # And this should only exist in the real version#
-    on(obs(cali)) do val
+    on(observe(cali)) do val
         calibrate(P)
     end
     #-----------------------------------------------#
-    on(obs(expcsv)) do val
-        writecsv("datatanklab.csv", 
-                 [gui.data[1] gui.data[2] gui.data[3] gui.data[4] gui.data[5] gui.data[6]])
+    on(observe(expcsv)) do val
+        f = open("datatanklab.csv", "w")
+        writedlm(f, ["t" "y" "r" "P" "I" "D" "Tot"], ',')
+        writedlm(f, [gui.data[7] gui.data[1] gui.data[2] gui.data[3] gui.data[4] gui.data[5] gui.data[6]], ',')
+        close(f)
         print("Data exported to datatanklab.csv\n")
     end
 
+    on(observe(mode)) do val
+        if val=="Manual"
+            observe(u)[] = observe(u)[]
+        end
+    end
+
+    # Below is the construction of the gui DOM
     LabGUI.set!(gui, widgets)
     add!(gui, rcont)
     add!(gui, w0)
@@ -145,6 +166,7 @@ function makegui(P, plottingframerate = 10, guiframerate = 10)
 
     LabGUI.animate(gui, :svgdummy, 1/guiframerate)
     LabGUI.animate(gui, :plotdummy, 1/plottingframerate)
+
     function responder(req)
         @async (sleep(1); gui[:rbox] = "0.5") #Inits r textbox, must be done after dom is loaded in browser
         gui()