diff --git a/quad/src/quad_app/iic_utils.h b/quad/src/quad_app/iic_utils.h
index 276ac22ca5c22325c371b5ae85b71dd10674d872..b1ccb6861d9fdb779debe8e42f56b866573f97d2 100644
--- a/quad/src/quad_app/iic_utils.h
+++ b/quad/src/quad_app/iic_utils.h
@@ -96,7 +96,7 @@
 #define ACCEL_Y_BIAS	0.009f
 #define ACCEL_Z_BIAS	0.087f
 
-void iic_set_global(struct I2CDriver *given_i2c);
+void iic_set_globals(struct I2CDriver *given_i2c, struct SystemDriver *given_system);
 
 void iic0_mpu9150_write(u8 register_addr, u8 data);
 void iic0_mpu9150_read(u8* recv_buffer, u8 register_addr, int size);
diff --git a/quad/src/quad_app/initialize_components.c b/quad/src/quad_app/initialize_components.c
index 7328e381a1db6e5e7bf1721e92f464b014175141..e5f73528fa3a37bb94ccb2ceadac5da5e00a0d13 100644
--- a/quad/src/quad_app/initialize_components.c
+++ b/quad/src/quad_app/initialize_components.c
@@ -8,6 +8,7 @@
 #include "initialize_components.h"
 #include "communication.h"
 #include "sensor.h"
+#include "iic_utils.h"
 
 //#define BENCH_TEST
 
@@ -39,8 +40,9 @@ int protection_loops(modular_structs_t *structs)
 
 int init_structs(modular_structs_t *structs) {
   struct LEDDriver *mio7_led = &structs->hardware_struct.mio7_led;
+  struct SystemDriver *sys = &structs->hardware_struct.sys;
   if (mio7_led->reset(mio7_led)) return -1;
-  mio7_init_global(mio7_led);
+  mio7_init_globals(mio7_led, sys);
   // Turn off LED 7 to let observers know that the quad is not yet active
 
   mio7_led->turn_off(mio7_led);
@@ -73,7 +75,7 @@ int init_structs(modular_structs_t *structs) {
   if (i2c->reset(i2c)) {
     return -1;
   }
-  iic_set_global(i2c);
+  iic_set_globals(i2c, sys);
 
   // Initialize PWM Recorders and Motor outputs
   struct PWMInputDriver *pwm_inputs = &structs->hardware_struct.pwm_inputs;
diff --git a/quad/src/quad_app/mio7_led.h b/quad/src/quad_app/mio7_led.h
index 52e9e8faab89e225591667027b9a9b7654385159..6244e2c1157cff657170783303506a8303ff07f5 100644
--- a/quad/src/quad_app/mio7_led.h
+++ b/quad/src/quad_app/mio7_led.h
@@ -24,7 +24,7 @@
  */
 void flash_MIO_7_led(int how_many_times, int ms_between_flashes);
 
-void mio7_init_global(struct LEDDriver *given_mio7_led);
+void mio7_init_globals(struct LEDDriver *given_mio7_led, struct SystemDriver *sys);
 void MIO7_led_on();
 void MIO7_led_off();
 
diff --git a/quad/src/quad_app/quad_app.h b/quad/src/quad_app/quad_app.h
index ef4cab71f718e52eb7b200b05e555a3f8ad3bffa..85e753a1e14a5a87c91d36f2410651e4b696264c 100644
--- a/quad/src/quad_app/quad_app.h
+++ b/quad/src/quad_app/quad_app.h
@@ -1,6 +1,8 @@
 #ifndef QUAD_APP_H
 #define QUAD_APP_H
 
+#include "type_def.h"
+
 int quad_main(int (*setup_hardware)(hardware_t *hardware_struct));
 
 #endif
diff --git a/quad/src/quad_app/type_def.h b/quad/src/quad_app/type_def.h
index 5263c31254deca9c6d01bc80841b0a2c81937fba..1dad790da9f3c65d7e4c46153cf033ae2bcbd765 100644
--- a/quad/src/quad_app/type_def.h
+++ b/quad/src/quad_app/type_def.h
@@ -400,6 +400,7 @@ typedef struct hardware_t {
   struct TimerDriver global_timer;
   struct TimerDriver axi_timer;
   struct LEDDriver mio7_led;
+  struct SystemDriver sys;
 } hardware_t;
 
 /**
diff --git a/quad/xsdk_workspace/modular_quad_pid/.cproject b/quad/xsdk_workspace/modular_quad_pid/.cproject
index 2a974bb61e6abb6f71e0b057d0beb3c3c2a5b789..63ab92a73ddc5e18f02c14a2a0a35a750e67eee4 100644
--- a/quad/xsdk_workspace/modular_quad_pid/.cproject
+++ b/quad/xsdk_workspace/modular_quad_pid/.cproject
@@ -18,7 +18,7 @@
 			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 				<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="xilinx.gnu.arm.exe.debug.980189137" name="Debug" parent="xilinx.gnu.arm.exe.debug">
 					<folderInfo id="xilinx.gnu.arm.exe.debug.980189137." name="/" resourcePath="">
-						<toolChain id="xilinx.gnu.arm.exe.debug.toolchain.1195127676" name="Xilinx ARM GNU Toolchain" superClass="xilinx.gnu.arm.exe.debug.toolchain">
+						<toolChain id="xilinx.gnu.arm.exe.debug.toolchain.1195127676" name="Xilinx ARM GNU Toolchain" resourceTypeBasedDiscovery="true" superClass="xilinx.gnu.arm.exe.debug.toolchain">
 							<targetPlatform binaryParser="com.xilinx.sdk.managedbuilder.XELF.arm" id="xilinx.arm.target.gnu.base.debug.2072264921" isAbstract="false" name="Debug Platform" superClass="xilinx.arm.target.gnu.base.debug"/>
 							<builder buildPath="${workspace_loc:/modular_quad_pid}/Debug" enableAutoBuild="true" id="xilinx.gnu.arm.toolchain.builder.debug.2124876787" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="GNU make" superClass="xilinx.gnu.arm.toolchain.builder.debug"/>
 							<tool id="xilinx.gnu.arm.c.toolchain.assembler.debug.192056667" name="ARM gcc assembler" superClass="xilinx.gnu.arm.c.toolchain.assembler.debug">
@@ -27,10 +27,14 @@
 							<tool id="xilinx.gnu.arm.c.toolchain.compiler.debug.177835003" name="ARM gcc compiler" superClass="xilinx.gnu.arm.c.toolchain.compiler.debug">
 								<option defaultValue="gnu.c.optimization.level.none" id="xilinx.gnu.compiler.option.optimization.level.1900496019" name="Optimization Level" superClass="xilinx.gnu.compiler.option.optimization.level" value="gnu.c.optimization.level.none" valueType="enumerated"/>
 								<option id="xilinx.gnu.compiler.option.debugging.level.1207856754" name="Debug Level" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<option id="xilinx.gnu.compiler.inferred.swplatform.includes.2123463819" name="Software Platform Include Path" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath">
+								<option id="xilinx.gnu.compiler.inferred.swplatform.includes.2123463819" name="Software Platform Include Path" superClass="xilinx.gnu.compiler.inferred.swplatform.includes"/>
+								<option id="xilinx.gnu.compiler.symbols.defined.1696008720" name="Defined symbols (-D)" superClass="xilinx.gnu.compiler.symbols.defined"/>
+								<option id="xilinx.gnu.compiler.dircategory.includes.1211006365" name="Include Paths" superClass="xilinx.gnu.compiler.dircategory.includes" valueType="includePath">
 									<listOptionValue builtIn="false" value="../../system_bsp/ps7_cortexa9_0/include"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/modular_quad_pid/ext/computation_graph}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/modular_quad_pid/ext/quad_app}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/modular_quad_pid/ext/queue}&quot;"/>
 								</option>
-								<option id="xilinx.gnu.compiler.symbols.defined.1696008720" name="Defined symbols (-D)" superClass="xilinx.gnu.compiler.symbols.defined"/>
 								<inputType id="xilinx.gnu.arm.c.compiler.input.909725989" name="C source files" superClass="xilinx.gnu.arm.c.compiler.input"/>
 							</tool>
 							<tool id="xilinx.gnu.arm.cxx.toolchain.compiler.debug.1470236349" name="ARM g++ compiler" superClass="xilinx.gnu.arm.cxx.toolchain.compiler.debug">
@@ -52,6 +56,7 @@
 								<option id="xilinx.gnu.c.link.option.libs.1025826490" name="Libraries (-l)" superClass="xilinx.gnu.c.link.option.libs" valueType="libs">
 									<listOptionValue builtIn="false" value="m"/>
 								</option>
+								<option id="xilinx.gnu.c.link.option.paths.1462160427" name="Library search path (-L)" superClass="xilinx.gnu.c.link.option.paths"/>
 								<inputType id="xilinx.gnu.linker.input.777404607" superClass="xilinx.gnu.linker.input">
 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
 									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
@@ -101,12 +106,16 @@
 							<tool id="xilinx.gnu.arm.c.toolchain.compiler.release.85270120" name="ARM gcc compiler" superClass="xilinx.gnu.arm.c.toolchain.compiler.release">
 								<option defaultValue="gnu.c.optimization.level.more" id="xilinx.gnu.compiler.option.optimization.level.515686013" name="Optimization Level" superClass="xilinx.gnu.compiler.option.optimization.level" valueType="enumerated"/>
 								<option id="xilinx.gnu.compiler.option.debugging.level.1121150517" name="Debug Level" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
-								<option id="xilinx.gnu.compiler.inferred.swplatform.includes.687694973" name="Software Platform Include Path" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath">
-									<listOptionValue builtIn="false" value="../../system_bsp/ps7_cortexa9_0/include"/>
-								</option>
+								<option id="xilinx.gnu.compiler.inferred.swplatform.includes.687694973" name="Software Platform Include Path" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath"/>
 								<option id="xilinx.gnu.compiler.symbols.defined.1562495938" name="Defined symbols (-D)" superClass="xilinx.gnu.compiler.symbols.defined" valueType="definedSymbols">
 									<listOptionValue builtIn="false" value="NDEBUG=1"/>
 								</option>
+								<option id="xilinx.gnu.compiler.dircategory.includes.1873624761" superClass="xilinx.gnu.compiler.dircategory.includes" valueType="includePath">
+									<listOptionValue builtIn="false" value="../../system_bsp/ps7_cortexa9_0/include"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/modular_quad_pid/ext/computation_graph}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/modular_quad_pid/ext/quad_app}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/modular_quad_pid/ext/queue}&quot;"/>
+								</option>
 								<inputType id="xilinx.gnu.arm.c.compiler.input.846429887" name="C source files" superClass="xilinx.gnu.arm.c.compiler.input"/>
 							</tool>
 							<tool id="xilinx.gnu.arm.cxx.toolchain.compiler.release.1846278293" name="ARM g++ compiler" superClass="xilinx.gnu.arm.cxx.toolchain.compiler.release">
@@ -158,6 +167,15 @@
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 		<project id="modular_quad_pid.xilinx.gnu.arm.exe.832182557" name="Xilinx ARM Executable" projectType="xilinx.gnu.arm.exe"/>
 	</storageModule>
+	<storageModule moduleId="refreshScope" versionNumber="2">
+		<configuration configurationName="Release">
+			<resource resourceType="PROJECT" workspacePath="/modular_quad_pid"/>
+		</configuration>
+		<configuration configurationName="Debug">
+			<resource resourceType="PROJECT" workspacePath="/modular_quad_pid"/>
+		</configuration>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
 	<storageModule moduleId="scannerConfiguration">
 		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
 		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.debug.980189137;xilinx.gnu.arm.exe.debug.980189137.">
@@ -166,6 +184,9 @@
 		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.release.255973624;xilinx.gnu.arm.exe.release.255973624.;xilinx.gnu.arm.c.toolchain.compiler.release.85270120;xilinx.gnu.arm.c.compiler.input.846429887">
 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
 		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.debug.980189137">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
+		</scannerConfigBuildInfo>
 		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.release.255973624;xilinx.gnu.arm.exe.release.255973624.">
 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
 		</scannerConfigBuildInfo>
@@ -173,13 +194,4 @@
 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
 		</scannerConfigBuildInfo>
 	</storageModule>
-	<storageModule moduleId="refreshScope" versionNumber="2">
-		<configuration configurationName="Release">
-			<resource resourceType="PROJECT" workspacePath="/modular_quad_pid"/>
-		</configuration>
-		<configuration configurationName="Debug">
-			<resource resourceType="PROJECT" workspacePath="/modular_quad_pid"/>
-		</configuration>
-	</storageModule>
-	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
 </cproject>
diff --git a/quad/xsdk_workspace/modular_quad_pid/.project b/quad/xsdk_workspace/modular_quad_pid/.project
index bb5f1cfda9ec5d0ae27231be921b55d9fed41736..61b0bf7e40e000c5d6a0812b1b46aa8230584d8a 100644
--- a/quad/xsdk_workspace/modular_quad_pid/.project
+++ b/quad/xsdk_workspace/modular_quad_pid/.project
@@ -3,8 +3,8 @@
 	<name>modular_quad_pid</name>
 	<comment></comment>
 	<projects>
-		<project>system_bsp_new</project>
 		<project>system_bsp</project>
+		<project>system_bsp_new</project>
 	</projects>
 	<buildSpec>
 		<buildCommand>
@@ -24,4 +24,119 @@
 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
 	</natures>
+	<linkedResources>
+		<link>
+			<name>ext/computation_graph</name>
+			<type>2</type>
+			<locationURI>QUAD_LOC/src/computation_graph</locationURI>
+		</link>
+		<link>
+			<name>ext/quad_app</name>
+			<type>2</type>
+			<locationURI>QUAD_LOC/src/quad_app</locationURI>
+		</link>
+		<link>
+			<name>ext/queue</name>
+			<type>2</type>
+			<locationURI>QUAD_LOC/src/queue</locationURI>
+		</link>
+	</linkedResources>
+	<filteredResources>
+		<filter>
+			<id>1489164394345</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-obj</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/computation_graph</name>
+			<type>5</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*.c</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/computation_graph</name>
+			<type>5</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*.h</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/computation_graph</name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/quad_app</name>
+			<type>5</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*.c</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/quad_app</name>
+			<type>5</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*.h</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/quad_app</name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/queue</name>
+			<type>5</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*.c</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/queue</name>
+			<type>5</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*.h</arguments>
+			</matcher>
+		</filter>
+		<filter>
+			<id>0</id>
+			<name>ext/queue</name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-*</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+	<variableList>
+		<variable>
+			<name>QUAD_LOC</name>
+			<value>$%7BPARENT-1-WORKSPACE_LOC%7D</value>
+		</variable>
+	</variableList>
 </projectDescription>
diff --git a/quad/xsdk_workspace/modular_quad_pid/ext/__CAUTION__.md b/quad/xsdk_workspace/modular_quad_pid/ext/__CAUTION__.md
new file mode 100644
index 0000000000000000000000000000000000000000..6f7e2a00feb6d7083997b71389dcad6b36a0d616
--- /dev/null
+++ b/quad/xsdk_workspace/modular_quad_pid/ext/__CAUTION__.md
@@ -0,0 +1,12 @@
+****************************************
+  Do not edit files in this directory!
+****************************************
+
+The fine print
+----
+
+Files in this directory are simlinked to external libraries. They exist here
+purely to help fascilitate the build process and permit debugging of those
+libraries within XSDK. Editing them here might build within XSDK, but it might
+break in its original context. Hence, don't edit these files within XSDK. Edit
+them within a workflow that uses the Makefile in the top-level quad folder.
diff --git a/quad/xsdk_workspace/modular_quad_pid/src/hw_impl_zybo.h b/quad/xsdk_workspace/modular_quad_pid/src/hw_impl_zybo.h
index 04b408c04dff83391f02e46e1884d6206be60a37..077869a2b05161679ed5d19dd157b886b36e2d52 100644
--- a/quad/xsdk_workspace/modular_quad_pid/src/hw_impl_zybo.h
+++ b/quad/xsdk_workspace/modular_quad_pid/src/hw_impl_zybo.h
@@ -1,7 +1,7 @@
 #ifndef HW_IMPL_ZYBO
 #define HW_IMPL_ZYBO
 
-#include "../application/hw_iface.h"
+#include "hw_iface.h"
 
 #include <sleep.h>
 #include <stdlib.h>
diff --git a/quad/xsdk_workspace/modular_quad_pid/src/main.c b/quad/xsdk_workspace/modular_quad_pid/src/main.c
index fac5b292519db353db2de0059becb4d392f4f02c..2d50f0b4a7b2313e893f90d63a66f150b6369ef4 100644
--- a/quad/xsdk_workspace/modular_quad_pid/src/main.c
+++ b/quad/xsdk_workspace/modular_quad_pid/src/main.c
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include "hw_impl_zybo.h"
 #include "quad_app.h"
+#include "type_def.h"
 
 int setup_hardware(hardware_t *hardware) {
   hardware->i2c = create_zybo_i2c();
@@ -10,6 +11,7 @@ int setup_hardware(hardware_t *hardware) {
   hardware->global_timer = create_zybo_global_timer();
   hardware->axi_timer = create_zybo_axi_timer();
   hardware->mio7_led = create_zybo_mio7_led();
+  return 0;
 }
 
 int main()