diff --git a/quad/Makefile b/quad/Makefile
index f27a39d37141e31878c324788ef9c141db241be5..002f34a72fe3e8db7f63456bb0ba22bb9f9f931e 100644
--- a/quad/Makefile
+++ b/quad/Makefile
@@ -40,6 +40,7 @@ test: all
 	$(MAKE) -C src/quad_app test
 	ruby scripts/tests/test_safety_checks.rb
 	ruby scripts/tests/test_unix_uart.rb
+	ruby scripts/tests/run_virtual_test_flight.rb
 
 clean:
 	rm -rf $(INCDIR) $(LIBDIR) $(OUTDIR) $(EXEDIR)
diff --git a/quad/scripts/tests/run_virtual_test_flight.rb b/quad/scripts/tests/run_virtual_test_flight.rb
index 9bc3afa362eb0fcbe4e99d0c6c130c6da5a1fe6a..9893fd2f46e7aa7fb9541510346739a4682bda6d 100644
--- a/quad/scripts/tests/run_virtual_test_flight.rb
+++ b/quad/scripts/tests/run_virtual_test_flight.rb
@@ -5,40 +5,9 @@
 # A simple virtual test flight (take off, hover, and set back down)
 #
 
-THROTTLE_MIN = 110200
-THROTTLE_MAX = 191900
-THROTTLE_MID = (THROTTLE_MAX + THROTTLE_MIN)/2
-THROTTLE_3_4 = (THROTTLE_MAX + THROTTLE_MID)/2
-THROTTLE_QUAR = (THROTTLE_MID + THROTTLE_MIN)/2
-THROTTLE_EIGHTH = (THROTTLE_QUAR + THROTTLE_MIN)/2
-THROTTLE_16 = (THROTTLE_EIGHTH + THROTTLE_MIN)/2
-MOTOR_MIN = 100000
-MOTOR_MAX = 200000
-GEAR_ON = 170800
-GEAR_OFF = 118300
-GRAVITY = 4096
-
-MOTOR1 = "virt-quad-fifos/pwm-output-motor1"
-MOTOR2 = "virt-quad-fifos/pwm-output-motor2"
-MOTOR3 = "virt-quad-fifos/pwm-output-motor3"
-MOTOR4 = "virt-quad-fifos/pwm-output-motor4"
-
-UART_TX = "virt-quad-fifos/uart-tx"
-
-GEAR = "virt-quad-fifos/pwm-input-gear"
-THROTTLE = "virt-quad-fifos/pwm-input-throttle"
-
-LED = "virt-quad-fifos/mio7-led"
-
-I2C_MPU_ACCEL_X = "virt-quad-fifos/i2c-mpu-accel-x"
-I2C_MPU_ACCEL_Y = "virt-quad-fifos/i2c-mpu-accel-y"
-I2C_MPU_ACCEL_Z = "virt-quad-fifos/i2c-mpu-accel-z"
-
-require 'test/unit/assertions'
-require 'thread'
-include Test::Unit::Assertions
-
 script_dir = File.expand_path(File.dirname(__FILE__))
+require script_dir + "/testing_library"
+
 bin_dir = script_dir + "/../../bin/"
 Dir.chdir(bin_dir)
 
@@ -52,7 +21,7 @@ sleep 1
 ##################
 
 begin
-  puts("Starting flight")
+  puts("Starting flight...")
 
   # Set gravity
   File.write(I2C_MPU_ACCEL_Z, -1 * GRAVITY)
@@ -96,8 +65,9 @@ begin
   
   # fifo.close()
 
-  # puts msg
+# puts msg
 
+  puts("Flight ended successfully.");
 ensure
 
   Process.kill(9, quad)
diff --git a/quad/scripts/tests/test_safety_checks.rb b/quad/scripts/tests/test_safety_checks.rb
index f13efe4a07fdb1a83a2955e74d672628643a09d9..d24671fcd5e435081ce33dfc7318dc05a470d0b1 100644
--- a/quad/scripts/tests/test_safety_checks.rb
+++ b/quad/scripts/tests/test_safety_checks.rb
@@ -4,93 +4,25 @@
 #
 # Startup the virtual quad and make sure it doesn't allow combinations of things
 # that could hurt people.
-THROTTLE_MIN = 110200
-THROTTLE_MAX = 191900
-THROTTLE_MID = (THROTTLE_MAX + THROTTLE_MIN)/2
-THROTTLE_3_4 = (THROTTLE_MAX + THROTTLE_MID)/2
-THROTTLE_QUAR = (THROTTLE_MID + THROTTLE_MIN)/2
-THROTTLE_EIGHTH = (THROTTLE_QUAR + THROTTLE_MIN)/2
-THROTTLE_16 = (THROTTLE_EIGHTH + THROTTLE_MIN)/2
-MOTOR_MIN = 100000
-MOTOR_MAX = 200000
-GEAR_ON = 170800
-GEAR_OFF = 118300
-GRAVITY = 4096
-
-MOTOR1 = "virt-quad-fifos/pwm-output-motor1"
-MOTOR2 = "virt-quad-fifos/pwm-output-motor2"
-MOTOR3 = "virt-quad-fifos/pwm-output-motor3"
-MOTOR4 = "virt-quad-fifos/pwm-output-motor4"
-
-GEAR = "virt-quad-fifos/pwm-input-gear"
-THROTTLE = "virt-quad-fifos/pwm-input-throttle"
-
-LED = "virt-quad-fifos/mio7-led"
-
-I2C_MPU_ACCEL_X = "virt-quad-fifos/i2c-mpu-accel-x"
-I2C_MPU_ACCEL_Y = "virt-quad-fifos/i2c-mpu-accel-y"
-I2C_MPU_ACCEL_Z = "virt-quad-fifos/i2c-mpu-accel-z"
-
-require 'test/unit/assertions'
-require 'timeout'
-require 'thread'
-include Test::Unit::Assertions
-
-$fifos = Hash.new
-
-def read_fifo_num(f)
-  if not $fifos.key?(f)
-    $fifos[f] = File.open(f)
-  end
-  $fifos[f].read().chomp.split("\n").last.to_i
-end
-
-# Utility functions
-def check_motors_are_off
-  motor1 = read_fifo_num(MOTOR1)
-  motor2 = read_fifo_num(MOTOR2)
-  motor3 = read_fifo_num(MOTOR3)
-  motor4 = read_fifo_num(MOTOR4)
-  assert_operator motor1, :<=, THROTTLE_MIN
-  assert_operator motor2, :<=, THROTTLE_MIN
-  assert_operator motor3, :<=, THROTTLE_MIN
-  assert_operator motor4, :<=, THROTTLE_MIN
-end
-
-def get_motor_averages
-  motors = [[], [], [], []]
-  for i in 0..100
-    motors[0].push(read_fifo_num(MOTOR1))
-    motors[1].push(read_fifo_num(MOTOR2))
-    motors[2].push(read_fifo_num(MOTOR3))
-    motors[3].push(read_fifo_num(MOTOR4))
-    sleep 0.010
-  end
-  average = []
-  average[0] = motors[0].inject(:+).to_f / motors[0].size
-  average[1] = motors[1].inject(:+).to_f / motors[1].size
-  average[2] = motors[2].inject(:+).to_f / motors[2].size
-  average[3] = motors[3].inject(:+).to_f / motors[3].size
-  average
-end
-
-def check_led(is_on)
-  led = read_fifo_num(LED)
-  assert_equal(led, is_on)
-end
+
+script_dir = File.expand_path(File.dirname(__FILE__))
+require script_dir + "/testing_library"
+
+bin_dir = script_dir + "/../../bin/"
+Dir.chdir(bin_dir)
+
 
 Timeout::timeout(30) {
 
   puts("Setting up...")
 
-  script_dir = File.expand_path(File.dirname(__FILE__))
-  bin_dir = script_dir + "/../../bin/"
-  Dir.chdir(bin_dir)
 
   sleep 1
 
   # Start virtual quad
-  quad_pid = Process.spawn("./virt-quad", :rlimit_as => 536870912) # 512 MiB RAM
+  quad_pid = Process.spawn("./virt-quad",
+                           { :rlimit_as => 536870912, # 512 MiB total RAM
+                             :rlimit_stack => 1048576}) # 1 MiB stack
 
   sleep 5
 
diff --git a/quad/scripts/tests/test_unix_uart.rb b/quad/scripts/tests/test_unix_uart.rb
index f8f4054e87f146ef3574f047dd7efe0c1e760bc7..d3164238fd55c5b0783ade10c46714483f42edf1 100644
--- a/quad/scripts/tests/test_unix_uart.rb
+++ b/quad/scripts/tests/test_unix_uart.rb
@@ -1,35 +1,27 @@
 #!/usr/bin/env ruby
 
-
 # UART test
 #
 # This test is pretty simple, just a UART smoke test, using
 # the debug callback on the quad
 
-GEAR_ON = 170800
-GEAR_OFF = 118300
+script_dir = File.expand_path(File.dirname(__FILE__))
+require script_dir + "/testing_library"
 
-GEAR = "virt-quad-fifos/pwm-input-gear"
-UART_RX = "virt-quad-fifos/uart-rx"
-UART_TX = "virt-quad-fifos/uart-tx"
+bin_dir = script_dir + "/../../bin/"
+Dir.chdir(bin_dir)
 
-require 'test/unit/assertions'
-require 'thread'
-require 'timeout'
-include Test::Unit::Assertions
 
 Timeout::timeout(30) {
 
   puts("Setting up...")
 
-  script_dir = File.expand_path(File.dirname(__FILE__))
-  bin_dir = script_dir + "/../../bin/"
-  Dir.chdir(bin_dir)
-
   sleep 1
 
   # Start virtual quad
-  quad_pid = Process.spawn("./virt-quad", :rlimit_as => 536870912) # 512 MiB RAM
+  quad_pid = Process.spawn("./virt-quad",
+                           { :rlimit_as => 536870912, # 512 MiB total RAM
+                             :rlimit_stack => 1048576}) # 1 MiB stack
 
   sleep 5
 
diff --git a/quad/scripts/tests/testing_library.rb b/quad/scripts/tests/testing_library.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a7c4c1ed8f5d86f3c914416eb99aae2986759895
--- /dev/null
+++ b/quad/scripts/tests/testing_library.rb
@@ -0,0 +1,77 @@
+THROTTLE_MIN = 110200
+THROTTLE_MAX = 191900
+THROTTLE_MID = (THROTTLE_MAX + THROTTLE_MIN)/2
+THROTTLE_3_4 = (THROTTLE_MAX + THROTTLE_MID)/2
+THROTTLE_QUAR = (THROTTLE_MID + THROTTLE_MIN)/2
+THROTTLE_EIGHTH = (THROTTLE_QUAR + THROTTLE_MIN)/2
+THROTTLE_16 = (THROTTLE_EIGHTH + THROTTLE_MIN)/2
+MOTOR_MIN = 100000
+MOTOR_MAX = 200000
+GEAR_ON = 170800
+GEAR_OFF = 118300
+GRAVITY = 4096
+
+MOTOR1 = "virt-quad-fifos/pwm-output-motor1"
+MOTOR2 = "virt-quad-fifos/pwm-output-motor2"
+MOTOR3 = "virt-quad-fifos/pwm-output-motor3"
+MOTOR4 = "virt-quad-fifos/pwm-output-motor4"
+
+GEAR = "virt-quad-fifos/pwm-input-gear"
+THROTTLE = "virt-quad-fifos/pwm-input-throttle"
+
+LED = "virt-quad-fifos/mio7-led"
+
+I2C_MPU_ACCEL_X = "virt-quad-fifos/i2c-mpu-accel-x"
+I2C_MPU_ACCEL_Y = "virt-quad-fifos/i2c-mpu-accel-y"
+I2C_MPU_ACCEL_Z = "virt-quad-fifos/i2c-mpu-accel-z"
+
+UART_RX = "virt-quad-fifos/uart-rx"
+UART_TX = "virt-quad-fifos/uart-tx"
+
+require 'test/unit/assertions'
+require 'timeout'
+require 'thread'
+include Test::Unit::Assertions
+
+$fifos = Hash.new
+
+def read_fifo_num(f)
+  if not $fifos.key?(f)
+    $fifos[f] = File.open(f)
+  end
+  $fifos[f].read().chomp.split("\n").last.to_i
+end
+
+# Utility functions
+def check_motors_are_off
+  motor1 = read_fifo_num(MOTOR1)
+  motor2 = read_fifo_num(MOTOR2)
+  motor3 = read_fifo_num(MOTOR3)
+  motor4 = read_fifo_num(MOTOR4)
+  assert_operator motor1, :<=, THROTTLE_MIN
+  assert_operator motor2, :<=, THROTTLE_MIN
+  assert_operator motor3, :<=, THROTTLE_MIN
+  assert_operator motor4, :<=, THROTTLE_MIN
+end
+
+def get_motor_averages
+  motors = [[], [], [], []]
+  for i in 0..100
+    motors[0].push(read_fifo_num(MOTOR1))
+    motors[1].push(read_fifo_num(MOTOR2))
+    motors[2].push(read_fifo_num(MOTOR3))
+    motors[3].push(read_fifo_num(MOTOR4))
+    sleep 0.010
+  end
+  average = []
+  average[0] = motors[0].inject(:+).to_f / motors[0].size
+  average[1] = motors[1].inject(:+).to_f / motors[1].size
+  average[2] = motors[2].inject(:+).to_f / motors[2].size
+  average[3] = motors[3].inject(:+).to_f / motors[3].size
+  average
+end
+
+def check_led(is_on)
+  led = read_fifo_num(LED)
+  assert_equal(led, is_on)
+end