diff --git a/groundStation/src/backend/callbacks.c b/groundStation/src/backend/callbacks.c
new file mode 100644
index 0000000000000000000000000000000000000000..a47d521f24cb456858c7de567274caee82951023
--- /dev/null
+++ b/groundStation/src/backend/callbacks.c
@@ -0,0 +1,378 @@
+#include "commands.h"
+
+/* New stuff - this is nice and clean */
+
+/* Override any callbacks here */
+
+
+/****** LEGACY CODE BE VERY AFRAID ********/
+
+// TAKE THESE OUT WHEN IMPLEMENTING ON THE QUAD SIDE
+float getFloat(unsigned char* str, int pos) {
+	union {
+		float f;
+		int i;
+	} x;
+	x.i = ((str[pos+3] << 24) | (str[pos+2] << 16) | (str[pos+1] << 8) | (str[pos]));
+	return x.f;
+}
+
+int getInt(unsigned char* str, int pos) {
+	int i = ((str[pos+3] << 24) | (str[pos+2] << 16) | (str[pos+1] << 8) | (str[pos]));
+	return i;
+}
+//------------------------------------------------
+
+int cb_debug(unsigned char *packet, int dataLen, modular_structs_t *structs)
+{
+	printf("function for debug\n");
+	return 0;
+}
+
+int cb_update(unsigned char *packet, int dataLen,	modular_structs_t *structs)
+{
+	unsigned char update[28];
+	memcpy(update, ((float *)packet), 28);
+
+	int packetId = getInt(update, 0);
+	float y_pos = getFloat(update, 4);
+	float x_pos = getFloat(update, 8);
+	float alt_pos = getFloat(update, 12);
+	float roll = getFloat(update, 16);
+	float pitch = getFloat(update, 20);
+	float yaw = getFloat(update, 24);
+
+	structs->log_struct.currentQuadPosition.packetId = packetId;
+	structs->log_struct.currentQuadPosition.y_pos = y_pos;
+	structs->log_struct.currentQuadPosition.x_pos = x_pos;
+	structs->log_struct.currentQuadPosition.alt_pos = alt_pos;
+	structs->log_struct.currentQuadPosition.roll = roll;
+	structs->log_struct.currentQuadPosition.pitch = pitch;
+	structs->log_struct.currentQuadPosition.yaw = yaw;
+
+	printf("QUAD: VRPN Packet:");
+	printf("Packet ID: %d\n", packetId);
+	printf("Y Position: %f\n", y_pos);
+	printf("X Position: %f\n", x_pos);
+	printf("Altitude Position: %f\n", alt_pos);
+	printf("Roll: %f\n", roll);
+	printf("Pitch: %f\n", pitch);
+	printf("Yaw: %f\n", yaw);
+
+	printf("function for update\n");
+	return 0;
+}
+
+// Why is this here?
+// This should be on the ground station side
+int logdata(unsigned char *packet, int dataLen, modular_structs_t *structs)
+{
+	printf("Logging: %s\n", packet);
+	return 0;
+}
+
+int response(unsigned char *packet, int dataLen, modular_structs_t *structs)
+{
+	printf("This is the response: %s\n", packet);
+
+	return 0;
+}
+
+// ------------------------------------------------------------------
+
+int setyaw(unsigned char *packet, int dataLen, modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+
+	printf("%f\n", value);
+
+	structs->setpoint_struct.desiredQuadPosition.yaw = value;
+
+	printf("function for setyaw: %f\n", structs->setpoint_struct.desiredQuadPosition.yaw);
+
+	return 0;
+}
+
+int setyawp(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.yaw_angle_pid.Kp = value;
+
+	printf("function for setyawp: %f\n", structs->parameter_struct.yaw_angle_pid.Kp);
+
+	return 0;
+}
+
+int setyawd(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.yaw_angle_pid.Kd = value;
+
+	printf("function for setyawd: %f\n", structs->parameter_struct.yaw_angle_pid.Kd);
+
+	return 0;
+}
+
+int setroll(unsigned char *packet, int dataLen,	 modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->setpoint_struct.desiredQuadPosition.roll = value;
+
+	printf("function for setroll: %f\n", structs->setpoint_struct.desiredQuadPosition.roll);
+
+	return 0;
+}
+
+int setrollp(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.local_y_pid.Kp = value;
+
+	printf("function for setrollp: %f\n", structs->parameter_struct.local_y_pid.Kp);
+
+	return 0;
+}
+
+int setrolld(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.local_y_pid.Kd = value;
+
+	printf("function for setrolld: %f\n", structs->parameter_struct.local_y_pid.Kd);
+
+	return 0;
+}
+
+int setpitch(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->setpoint_struct.desiredQuadPosition.pitch = value;
+
+	printf("function for setpitch: %f\n", structs->setpoint_struct.desiredQuadPosition.pitch);
+
+	return 0;
+}
+
+int setpitchp(unsigned char *packet, int dataLen,	modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.local_x_pid.Kp = value;
+
+	printf("function for setpitchp: %f\n", structs->parameter_struct.local_x_pid.Kp);
+
+	return 0;
+}
+
+int setpitchd(unsigned char *packet, int dataLen,	modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.local_x_pid.Kd = value;
+
+	printf("function for setpitchd: %f\n", structs->parameter_struct.local_x_pid.Kd);
+
+	return 0;
+}
+
+// ------------------------------------------------------------
+// These should be renamed to altitude!
+int setthrottle(unsigned char *packet, int dataLen,	 modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->setpoint_struct.desiredQuadPosition.alt_pos = value;
+
+	printf("function for setthrottle: %f\n", structs->setpoint_struct.desiredQuadPosition.alt_pos);
+
+	return 0;
+}
+
+int setthrottlep(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.alt_pid.Kp = value;
+
+	printf("function for setthrottlep: %f\n", structs->parameter_struct.alt_pid.Kp);
+
+	return 0;
+}
+
+int setthrottlei(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.alt_pid.Ki = value;
+
+	printf("function for setthrottlei: %f\n", structs->parameter_struct.alt_pid.Ki);
+
+	return 0;
+}
+
+int setthrottled(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	float value;
+
+	memcpy(&value, ((float *)packet), dataLen);
+	structs->parameter_struct.alt_pid.Kd = value;
+
+	printf("function for setthrottled: %f\n", structs->parameter_struct.alt_pid.Kd);
+
+	return 0;
+}
+int getyaw(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getyawp(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getyawd(unsigned char *packet, int dataLen, modular_structs_t *structs) {
+	return 0;
+}
+int getroll(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getrollp(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getrolld(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getpitch(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getpitchp(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getpitchd(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getthrottle(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getthrottlep(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getthrottlei(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int getthrottled(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+
+// These should be renamed to altitude!
+// ------------------------------------------------------------
+
+
+
+
+int getgyro(unsigned char *packet, int dataLen,	 modular_structs_t *structs)
+{
+	printf("function for getgyro\n");
+	return 0;
+}
+
+int getpitchangle(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	printf("function for getpitchangle\n");
+	return 0;
+}
+
+int getrollangle(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	printf("function for getrollangle\n");
+	return 0;
+}
+
+
+int getaccel(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	printf("function for getaccel\n");
+	return 0;
+}
+
+
+int respgyro(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	printf("function for respgyro\n");
+	return 0;
+}
+
+int resppitchangle(unsigned char *packet, int dataLen,	modular_structs_t *structs)
+{
+	printf("function for resppitchangle\n");
+	return 0;
+}
+
+int resprollangle(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	printf("function for resprollangle\n");
+	return 0;
+}
+
+
+int respaccel(unsigned char *packet, int dataLen,  modular_structs_t *structs)
+{
+	printf("function for respaccel\n");
+	return 0;
+}
+
+int respyaw(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int respyawp(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int respyawd(unsigned char *packet, int dataLen, modular_structs_t *structs) {
+	return 0;
+}
+int resproll(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int resprollp(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int resprolld(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int resppitch(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int resppitchp(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int resppitchd(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int respthrottle(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int respthrottlep(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int respthrottlei(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
+int respthrottled(unsigned char *packet, int dataLen, modular_structs_t *structs){
+	return 0;
+}
diff --git a/groundStation/src/backend/callbacks.h b/groundStation/src/backend/callbacks.h
new file mode 100644
index 0000000000000000000000000000000000000000..57d6fbbbbab784744714340ddc943ee3a91dccf2
--- /dev/null
+++ b/groundStation/src/backend/callbacks.h
@@ -0,0 +1,11 @@
+#ifndef __callbacks_h
+#define __callbacks_h
+
+/* Grab some stupid stuff from legacy code */
+#include "type_def.h"
+
+/* Make commands.c happy */
+typedef void (command_cb)(unsigned char *command, 
+		int dataLen, modular_structs_t *structs);
+
+#endif
diff --git a/groundStation/src/backend/cb_default.h b/groundStation/src/backend/cb_default.h
new file mode 100644
index 0000000000000000000000000000000000000000..2deeb4756b3d708ed617209330fab36f5d1c208b
--- /dev/null
+++ b/groundStation/src/backend/cb_default.h
@@ -0,0 +1,10 @@
+#include "commands.h"
+
+/* The cb_default used on the groundStation. This file MUST NOT BE INCLUDED
+ * by anything except for commands.c */
+
+/* cb_default used by portable commands.c */
+int cb_default(unsigned char * command, int dataLen, modular_structs_t *structs)
+{
+	    return 0;
+}
diff --git a/groundStation/src/backend/commands.c b/groundStation/src/backend/commands.c
index a97197b8106334e13b2e652ab93c1228f868ce0b..34dcf9aee7d4850cb0c8a5c8c7b969c1c6cbbf90 100644
--- a/groundStation/src/backend/commands.c
+++ b/groundStation/src/backend/commands.c
@@ -1,28 +1,54 @@
 #include "commands.h"
 
-// TAKE THESE OUT WHEN IMPLEMENTING ON THE QUAD SIDE
-float getFloat(unsigned char* str, int pos) {
-	union {
-		float f;
-		int i;
-	} x;
-	x.i = ((str[pos+3] << 24) | (str[pos+2] << 16) | (str[pos+1] << 8) | (str[pos]));
-	return x.f;
-}
-
-int getInt(unsigned char* str, int pos) {
-	int i = ((str[pos+3] << 24) | (str[pos+2] << 16) | (str[pos+1] << 8) | (str[pos]));
-	return i;
-}
-//------------------------------------------------
-
-struct MessageType MessageTypes[MAX_TYPE] = 
+/* This file defines the commands structure.
+ * This is the canonical reference for all commands
+ * used. This file can be used - unchanged - on both the quad side
+ * and on the ground station side. The commands.h file is also entirely
+ * portable and may be used unchanged.
+ *
+ * This file (commands.c) and the matching header (commands.h)
+ * are fully portable (quad + groundStation).
+ * 
+ * To use this file, three non-portable files must also exist:
+ *  - callbacks.h. Typedef for command_cb
+ *  - cb_default.h. Implementation of cb_default.
+ *  - callbacks.c file. Contains implemented callbacks.
+ *
+ * There are two mandatory things that must be implemented in
+ * other files for this to work: First, in callbacks.h, create a typedef
+ * for command_cb. See the callbacks.h of the ground station for an
+ * example.
+ *
+ * Second, in cb_default.h, implement the function
+ * cb_default. This function should do nothing; it will be the 
+ * default action for an unimplemented callback. Note that because
+ * the function is implemented in the .h file, cb_default.h MUST NOT
+ * be included in any other file!
+ *
+ * To implement callbacks, simply define them in callbacks.c.
+ *
+ */
+
+/* List of callbacks. DO NOT MODIFY THESE IN THIS FILE - 
+ * Simply implement a function with the same name
+ * in a different file (callbacks.c) and these will
+ * be overridden.
+ */
+
+/* Grab the default callback configuration */
+#include "cb_default.h"
+
+command_cb cb_debug __attribute__((weak, alias("cb_default")));
+command_cb cb_setyawp __attribute__((weak, alias("cb_default")));
+
+/* Command structure */
+struct MessageType MessageTypes[MAX_TYPE] =
 {
 	// DEBUG
 	{
 		// Message Type ID
 		0x00,
-		
+
 		// Debug Subtypes
 		{
 			// NONE subtype
@@ -34,16 +60,16 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				stringType,
 				// Function pointer
-				&debug
+				&cb_debug
 			}
 		}
 	},
-	
+
 	// CALIBRATION
 	{
 		// Message Type ID
 		0x01,
-		
+
 		// Calibration Subtypes (PID coefficients)
 		{
 			// yaw p constant subtype
@@ -345,57 +371,57 @@ struct MessageType MessageTypes[MAX_TYPE] =
 			}
 		}
 	},
-	
+
 	// REQUEST
 	{
 		// Message Type ID
 		0x02,
-		
+
 		// Request Subtypes
 		{
 			// accelerometer subtype
 			{
-				// ID 
+				// ID
 				0x00,
 				// Command text
 				"getaccel",
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getaccel
+				NULL
 			},
 			// gyroscope subtype
 			{
-				// ID 
+				// ID
 				0x01,
 				// Command text
 				"getgyro",
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getgyro
+				NULL
 			},
 			// pitch angle subtype
 			{
-				// ID 
+				// ID
 				0x02,
 				// Command text
 				"getpitchangle",
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getpitchangle
+				NULL
 			},
 			// roll angle subtype
 			{
-				// ID 
+				// ID
 				0x03,
 				// Command text
 				"getrollangle",
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getrollangle
+				NULL
 			},
 			// get yaw setpoint subtype
 			{
@@ -406,7 +432,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&setyaw
+				NULL
 			},
 			// get yaw p constant subtype
 			{
@@ -417,7 +443,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getyawp
+				NULL
 			},
 			// get yaw d constant subtype
 			{
@@ -428,7 +454,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getyawd
+				NULL
 			},
 			// get roll setpoint subtype
 			{
@@ -439,7 +465,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getroll
+				NULL
 			},
 			// get roll p constant subtype
 			{
@@ -450,7 +476,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getrollp
+				NULL
 			},
 			// getroll d constant subtype
 			{
@@ -461,7 +487,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getrolld
+				NULL
 			},
 			// get pitch setpoint subtype
 			{
@@ -472,7 +498,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getpitch
+				NULL
 			},
 			// get pitch p constant subtype
 			{
@@ -483,7 +509,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getpitchp
+				NULL
 			},
 			// get pitch d constant subtype
 			{
@@ -494,7 +520,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getpitchd
+				NULL
 			},
 			// get throttle setpoint subtype
 			{
@@ -505,7 +531,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getthrottle
+				NULL
 			},
 			// get throttle p constant subtype
 			{
@@ -516,7 +542,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getthrottlep
+				NULL
 			},
 			// get throttle i constant subtype
 			{
@@ -527,7 +553,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getthrottlei
+				NULL
 			},
 			// get throttle d constant subtype
 			{
@@ -538,16 +564,16 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&getthrottled
+				NULL
 			}
 		}
 	},
-	
+
 	// RESPONSE
 	{
 		// Message Type ID
 		0x03,
-		
+
 		// Response Subtypes
 		{
 			// accelerometer subtype
@@ -559,7 +585,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respaccel
+				NULL
 			},
 			// gyroscope subtype
 			{
@@ -570,29 +596,29 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respgyro
+				NULL
 			},
 			// pitch angle subtype
 			{
-				// ID 
+				// ID
 				0x02,
 				// Command text
 				"resppitchangle",
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resppitchangle
+				NULL
 			},
 			// roll angle subtype
 			{
-				// ID 
+				// ID
 				0x03,
 				// Command text
 				"resprollangle",
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resprollangle
+				NULL
 			},
 			// resp yaw setpoint subtype
 			{
@@ -603,7 +629,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&setyaw
+				NULL
 			},
 			// resp yaw p constant subtype
 			{
@@ -614,7 +640,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respyawp
+				NULL
 			},
 			// resp yaw d constant subtype
 			{
@@ -625,7 +651,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respyawd
+				NULL
 			},
 			// resp roll setpoint subtype
 			{
@@ -636,7 +662,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resproll
+				NULL
 			},
 			// resp roll p constant subtype
 			{
@@ -647,7 +673,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resprollp
+				NULL
 			},
 			// resproll d constant subtype
 			{
@@ -658,7 +684,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resprolld
+				NULL
 			},
 			// resp pitch setpoint subtype
 			{
@@ -669,7 +695,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resppitch
+				NULL
 			},
 			// resp pitch p constant subtype
 			{
@@ -680,7 +706,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resppitchp
+				NULL
 			},
 			// resp pitch d constant subtype
 			{
@@ -691,7 +717,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&resppitchd
+				NULL
 			},
 			// resp throttle setpoint subtype
 			{
@@ -702,7 +728,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respthrottle
+				NULL
 			},
 			// resp throttle p constant subtype
 			{
@@ -713,7 +739,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respthrottlep
+				NULL
 			},
 			// resp throttle i constant subtype
 			{
@@ -724,7 +750,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respthrottlei
+				NULL
 			},
 			// resp throttle d constant subtype
 			{
@@ -735,37 +761,37 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				floatType,
 				// Function pointer
-				&respthrottled
+				NULL
 			}
 		}
 	},
-	
+
 	// UPDATE
 	{
 		// Message Type ID
 		0x04,
-		
+
 		// Update Subtypes
 		{
 			// NONE subtype
 			{
-				// ID 
+				// ID
 				0x00,
 				// Command text
 				"update",
 				// Type of the command data
 				stringType,
 				// Function pointer
-				&update
+				NULL
 			}
 		}
 	},
-	
+
 	// LOG
 	{
 		// Message Type ID
 		0x05,
-		
+
 		// Log Subtypes
 		{
 			// NONE subtype
@@ -777,7 +803,7 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				stringType,
 				// Function pointer
-				&logdata
+				NULL
 			},
 			// Response subtype
 			{
@@ -788,363 +814,9 @@ struct MessageType MessageTypes[MAX_TYPE] =
 				// Type of the command data
 				stringType,
 				// Function pointer
-				&response
+				NULL
 			}
 		}
 	},
-	
-};
-
-int debug(unsigned char *packet, int dataLen, modular_structs_t *structs)
-{
-	printf("function for debug\n");
-	return 0;
-}
 
-int update(unsigned char *packet, int dataLen,	modular_structs_t *structs)
-{
-	unsigned char update[28];
-	memcpy(update, ((float *)packet), 28);
-	
-	int packetId = getInt(update, 0);
-	float y_pos = getFloat(update, 4);
-	float x_pos = getFloat(update, 8);
-	float alt_pos = getFloat(update, 12);
-	float roll = getFloat(update, 16);
-	float pitch = getFloat(update, 20);
-	float yaw = getFloat(update, 24);
-
-	structs->log_struct.currentQuadPosition.packetId = packetId;
-	structs->log_struct.currentQuadPosition.y_pos = y_pos;
-	structs->log_struct.currentQuadPosition.x_pos = x_pos;
-	structs->log_struct.currentQuadPosition.alt_pos = alt_pos;
-	structs->log_struct.currentQuadPosition.roll = roll;
-	structs->log_struct.currentQuadPosition.pitch = pitch;
-	structs->log_struct.currentQuadPosition.yaw = yaw;
-	
-	printf("QUAD: VRPN Packet:");
-	printf("Packet ID: %d\n", packetId);
-	printf("Y Position: %f\n", y_pos);
-	printf("X Position: %f\n", x_pos);
-	printf("Altitude Position: %f\n", alt_pos);
-	printf("Roll: %f\n", roll);
-	printf("Pitch: %f\n", pitch);
-	printf("Yaw: %f\n", yaw);
-	
-	printf("function for update\n");
-	return 0;
-}
-
-// Why is this here?
-// This should be on the ground station side
-int logdata(unsigned char *packet, int dataLen, modular_structs_t *structs)
-{
-	printf("Logging: %s\n", packet);
-	return 0;
-}
-
-int response(unsigned char *packet, int dataLen, modular_structs_t *structs)
-{
-	printf("This is the response: %s\n", packet);
-	
-	return 0;
-}
-
-// ------------------------------------------------------------------
-
-int setyaw(unsigned char *packet, int dataLen, modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	
-	printf("%f\n", value);
-	
-	structs->setpoint_struct.desiredQuadPosition.yaw = value;
-
-	printf("function for setyaw: %f\n", structs->setpoint_struct.desiredQuadPosition.yaw);
-	
-	return 0;
-}
-
-int setyawp(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.yaw_angle_pid.Kp = value;
-	
-	printf("function for setyawp: %f\n", structs->parameter_struct.yaw_angle_pid.Kp);
-	
-	return 0;
-}
-
-int setyawd(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.yaw_angle_pid.Kd = value;
-	
-	printf("function for setyawd: %f\n", structs->parameter_struct.yaw_angle_pid.Kd);
-	
-	return 0;
-}
-
-int setroll(unsigned char *packet, int dataLen,	 modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->setpoint_struct.desiredQuadPosition.roll = value;
-	
-	printf("function for setroll: %f\n", structs->setpoint_struct.desiredQuadPosition.roll);
-	
-	return 0;
-}
-
-int setrollp(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.local_y_pid.Kp = value;
-	
-	printf("function for setrollp: %f\n", structs->parameter_struct.local_y_pid.Kp);
-	
-	return 0;
-}
-
-int setrolld(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.local_y_pid.Kd = value;
-	
-	printf("function for setrolld: %f\n", structs->parameter_struct.local_y_pid.Kd);
-	
-	return 0;
-}
-
-int setpitch(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->setpoint_struct.desiredQuadPosition.pitch = value;
-	
-	printf("function for setpitch: %f\n", structs->setpoint_struct.desiredQuadPosition.pitch);
-	
-	return 0;
-}
-
-int setpitchp(unsigned char *packet, int dataLen,	modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.local_x_pid.Kp = value;
-	
-	printf("function for setpitchp: %f\n", structs->parameter_struct.local_x_pid.Kp);
-	
-	return 0;
-}
-
-int setpitchd(unsigned char *packet, int dataLen,	modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.local_x_pid.Kd = value;
-	
-	printf("function for setpitchd: %f\n", structs->parameter_struct.local_x_pid.Kd);
-	
-	return 0;
-}
-
-// ------------------------------------------------------------
-// These should be renamed to altitude!
-int setthrottle(unsigned char *packet, int dataLen,	 modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->setpoint_struct.desiredQuadPosition.alt_pos = value;
-	
-	printf("function for setthrottle: %f\n", structs->setpoint_struct.desiredQuadPosition.alt_pos);
-	
-	return 0;
-}
-
-int setthrottlep(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.alt_pid.Kp = value;
-	
-	printf("function for setthrottlep: %f\n", structs->parameter_struct.alt_pid.Kp);
-	
-	return 0;
-}
-
-int setthrottlei(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.alt_pid.Ki = value;
-	
-	printf("function for setthrottlei: %f\n", structs->parameter_struct.alt_pid.Ki);
-	
-	return 0;
-}
-
-int setthrottled(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	float value;
-	
-	memcpy(&value, ((float *)packet), dataLen);
-	structs->parameter_struct.alt_pid.Kd = value;
-	
-	printf("function for setthrottled: %f\n", structs->parameter_struct.alt_pid.Kd);
-	
-	return 0;
-}
-int getyaw(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getyawp(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getyawd(unsigned char *packet, int dataLen, modular_structs_t *structs) {
-	return 0;
-}
-int getroll(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getrollp(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getrolld(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getpitch(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getpitchp(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getpitchd(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getthrottle(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getthrottlep(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getthrottlei(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int getthrottled(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-
-// These should be renamed to altitude!
-// ------------------------------------------------------------
-
-
-
-
-int getgyro(unsigned char *packet, int dataLen,	 modular_structs_t *structs)
-{
-	printf("function for getgyro\n");
-	return 0;
-}
-
-int getpitchangle(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	printf("function for getpitchangle\n");
-	return 0;
-}
-
-int getrollangle(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	printf("function for getrollangle\n");
-	return 0;
-}
-
-
-int getaccel(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	printf("function for getaccel\n");
-	return 0;
-}
-
-
-int respgyro(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	printf("function for respgyro\n");
-	return 0;
-}
-
-int resppitchangle(unsigned char *packet, int dataLen,	modular_structs_t *structs)
-{
-	printf("function for resppitchangle\n");
-	return 0;
-}
-
-int resprollangle(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	printf("function for resprollangle\n");
-	return 0;
-}
-
-
-int respaccel(unsigned char *packet, int dataLen,  modular_structs_t *structs)
-{
-	printf("function for respaccel\n");
-	return 0;
-}
-
-int respyaw(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int respyawp(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int respyawd(unsigned char *packet, int dataLen, modular_structs_t *structs) {
-	return 0;
-}
-int resproll(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int resprollp(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int resprolld(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int resppitch(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int resppitchp(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int resppitchd(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int respthrottle(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int respthrottlep(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int respthrottlei(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
-int respthrottled(unsigned char *packet, int dataLen, modular_structs_t *structs){
-	return 0;
-}
+};
diff --git a/groundStation/src/backend/commands.h b/groundStation/src/backend/commands.h
index b9c9956ea0150c81291f93d3a3c665d07be67295..9e57ae11a5b9ddf114114e22894e147c6667fb44 100644
--- a/groundStation/src/backend/commands.h
+++ b/groundStation/src/backend/commands.h
@@ -4,8 +4,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include "type_def.h"
 
+#include "callbacks.h"
 
 // ----------------------
 // Helper stuff
@@ -31,7 +31,7 @@ struct MessageSubtype{
 	char ID;
 	char cmdText[100];
 	char cmdDataType;
-	int (*functionPtr)(unsigned char *command, int dataLen, modular_structs_t *structs);
+	command_cb * functionPtr;
 };
 
 // MESSAGE TYPES
@@ -40,66 +40,12 @@ struct MessageType{
 	struct MessageSubtype subtypes[MAX_SUBTYPE];
 };
 
-int debug(unsigned char *c, int dataLen, modular_structs_t *structs);
-int update(unsigned char *c, int dataLen, modular_structs_t *structs);
-int logdata(unsigned char *c, int dataLen, modular_structs_t *structs);
-int response(unsigned char *packet, int dataLen, modular_structs_t *structs);
-int setyaw(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setyawp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setyawd(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setroll(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setrollp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setrolld(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setpitch(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setpitchp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setpitchd(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setthrottle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setthrottlep(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setthrottlei(unsigned char *c, int dataLen, modular_structs_t *structs);
-int setthrottled(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getyaw(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getyawp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getyawd(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getroll(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getrollp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getrolld(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getpitch(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getpitchp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getpitchd(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getthrottle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getthrottlep(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getthrottlei(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getthrottled(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getaccel(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getgyro(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getpitchangle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int getrollangle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respaccel(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respgyro(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resppitchangle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resprollangle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respyaw(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respyawp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respyawd(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resproll(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resprollp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resprolld(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resppitch(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resppitchp(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resppitchd(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respthrottle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respthrottlep(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respthrottlei(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respthrottled(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respaccel(unsigned char *c, int dataLen, modular_structs_t *structs);
-int respgyro(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resppitchangle(unsigned char *c, int dataLen, modular_structs_t *structs);
-int resprollangle(unsigned char *c, int dataLen, modular_structs_t *structs);
+/* Defined in commands.c */
+extern struct MessageType MessageTypes[MAX_TYPE];
 
+/* Legacy functions - no idea what uses these. Please do not delete. */
 float getFloat(unsigned char* str, int pos);
 int getInt(unsigned char* str, int pos);
+/* end legacy crap */
 
-// TODO add in string to be read from the command line when sending a subtype of message
-extern struct MessageType MessageTypes[MAX_TYPE];
-
-#endif
\ No newline at end of file
+#endif