moved things to places that make more sense
diff --git a/aos/common/common.gyp b/aos/common/common.gyp
index d6bb27a..702a21f 100644
--- a/aos/common/common.gyp
+++ b/aos/common/common.gyp
@@ -180,8 +180,8 @@
         'control_loop_queues',
         '<(AOS)/common/logging/logging.gyp:queue_logging',
         '<(AOS)/common/util/util.gyp:log_interval',
-        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:sensor_generation',
-        '<(DEPTH)/frc971/queues/queues.gyp:output_check',
+        '<(AOS)/common/controls/controls.gyp:sensor_generation',
+        '<(AOS)/common/controls/controls.gyp:output_check',
       ],
       'export_dependent_settings': [
         '<(AOS)/common/messages/messages.gyp:robot_state',
@@ -191,8 +191,8 @@
         'control_loop_queues',
         '<(AOS)/common/logging/logging.gyp:queue_logging',
         '<(AOS)/common/util/util.gyp:log_interval',
-        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:sensor_generation',
-        '<(DEPTH)/frc971/queues/queues.gyp:output_check',
+        '<(AOS)/common/controls/controls.gyp:sensor_generation',
+        '<(AOS)/common/controls/controls.gyp:output_check',
       ],
     },
     {
diff --git a/aos/common/controls/control_loop-tmpl.h b/aos/common/controls/control_loop-tmpl.h
index 404425a..ba26c68 100644
--- a/aos/common/controls/control_loop-tmpl.h
+++ b/aos/common/controls/control_loop-tmpl.h
@@ -4,12 +4,11 @@
 #include "aos/common/messages/robot_state.q.h"
 #include "aos/common/logging/queue_logging.h"
 #include "aos/common/util/phased_loop.h"
-
-#include "bbb/sensor_generation.q.h"
-#include "frc971/queues/output_check.q.h"
+#include "aos/common/controls/sensor_generation.q.h"
+#include "aos/common/controls/output_check.q.h"
 
 namespace aos {
-namespace control_loops {
+namespace controls {
 
 // TODO(aschuh): Tests.
 
@@ -51,20 +50,20 @@
     }
   }
 
-  ::bbb::sensor_generation.FetchLatest();
-  if (::bbb::sensor_generation.get() == nullptr) {
+  sensor_generation.FetchLatest();
+  if (sensor_generation.get() == nullptr) {
     LOG_INTERVAL(no_sensor_generation_);
     ZeroOutputs();
     return;
   }
   if (!has_sensor_reset_counters_ ||
-      ::bbb::sensor_generation->reader_pid != reader_pid_ ||
-      ::bbb::sensor_generation->cape_resets != cape_resets_) {
+      sensor_generation->reader_pid != reader_pid_ ||
+      sensor_generation->cape_resets != cape_resets_) {
     LOG_STRUCT(INFO, "new sensor_generation message",
-               *::bbb::sensor_generation.get());
+               *sensor_generation.get());
 
-    reader_pid_ = ::bbb::sensor_generation->reader_pid;
-    cape_resets_ = ::bbb::sensor_generation->cape_resets;
+    reader_pid_ = sensor_generation->reader_pid;
+    cape_resets_ = sensor_generation->cape_resets;
     has_sensor_reset_counters_ = true;
     reset_ = true;
   }
@@ -121,13 +120,14 @@
     }
   }
 
-  ::frc971::output_check_received.FetchLatest();
+  ::aos::controls::output_check_received.FetchLatest();
   // True if we're enabled but the motors aren't working.
   // The 100ms is the result of disabling the robot while it's putting out a lot
   // of power and looking at the time delay between the last PWM pulse and the
   // battery voltage coming back up.
-  const bool motors_off = !::frc971::output_check_received.get() ||
-                          !::frc971::output_check_received.IsNewerThanMS(100);
+  const bool motors_off =
+      !::aos::controls::output_check_received.get() ||
+      !::aos::controls::output_check_received.IsNewerThanMS(100);
   motors_off_log_.Print();
   if (motors_off) {
     if (!::aos::robot_state.get() || ::aos::robot_state->enabled) {
@@ -172,5 +172,5 @@
   }
 }
 
-}  // namespace control_loops
+}  // namespace controls
 }  // namespace aos
diff --git a/aos/common/controls/control_loop.cc b/aos/common/controls/control_loop.cc
index 11d7a47..72201bf 100644
--- a/aos/common/controls/control_loop.cc
+++ b/aos/common/controls/control_loop.cc
@@ -1,7 +1,7 @@
 #include "aos/common/controls/control_loop.h"
 
 namespace aos {
-namespace control_loops {
+namespace controls {
 
 time::Time NextLoopTime(time::Time start) {
   return (start / static_cast<int32_t>(kLoopFrequency.ToNSec())) *
@@ -9,5 +9,5 @@
       kLoopFrequency;
 }
 
-}  // namespace control_loops
+}  // namespace controls
 }  // namespace aos
diff --git a/aos/common/controls/control_loop.h b/aos/common/controls/control_loop.h
index a79f1e6..76c06e7 100644
--- a/aos/common/controls/control_loop.h
+++ b/aos/common/controls/control_loop.h
@@ -9,7 +9,7 @@
 #include "aos/common/util/log_interval.h"
 
 namespace aos {
-namespace control_loops {
+namespace controls {
 
 // Interface to describe runnable jobs.
 class Runnable {
@@ -179,7 +179,7 @@
       SimpleLogInterval(kStaleLogInterval, WARNING, "motors disabled");
 };
 
-}  // namespace control_loops
+}  // namespace controls
 }  // namespace aos
 
 #include "aos/common/controls/control_loop-tmpl.h"  // IWYU pragma: export
diff --git a/aos/common/controls/controls.gyp b/aos/common/controls/controls.gyp
index 0551fe3..1f5e76f 100644
--- a/aos/common/controls/controls.gyp
+++ b/aos/common/controls/controls.gyp
@@ -15,5 +15,27 @@
         '<(EXTERNALS):libcdd',
       ],
     },
+    {
+      'target_name': 'sensor_generation',
+      'type': 'static_library',
+      'sources': [
+        'sensor_generation.q',
+      ],
+      'variables': {
+        'header_path': 'aos/common/controls',
+      },
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
+    {
+      'target_name': 'output_check',
+      'type': 'static_library',
+      'sources': [
+        'output_check.q',
+      ],
+      'variables': {
+        'header_path': 'aos/common/controls',
+      },
+      'includes': ['../../../aos/build/queues.gypi'],
+    },
   ],
 }
diff --git a/frc971/queues/output_check.q b/aos/common/controls/output_check.q
similarity index 69%
rename from frc971/queues/output_check.q
rename to aos/common/controls/output_check.q
index 11b3497..76f5cd7 100644
--- a/frc971/queues/output_check.q
+++ b/aos/common/controls/output_check.q
@@ -1,4 +1,4 @@
-package frc971;
+package aos.controls;
 
 message OutputCheck {
 	// The 1-255 sent to the FPGA.
@@ -11,4 +11,6 @@
 // The sent timestamp of the message is when the value was sent.
 queue OutputCheck output_check_sent;
 
+// Each message here represents a value that was received by the sensor.
+// The sent timestamp of the message is when it was received.
 queue OutputCheck output_check_received;
diff --git a/bbb_cape/src/bbb/sensor_generation.q b/aos/common/controls/sensor_generation.q
similarity index 95%
rename from bbb_cape/src/bbb/sensor_generation.q
rename to aos/common/controls/sensor_generation.q
index a121999..50e17e3 100644
--- a/bbb_cape/src/bbb/sensor_generation.q
+++ b/aos/common/controls/sensor_generation.q
@@ -1,4 +1,4 @@
-package bbb;
+package aos.controls;
 
 // Each different set of values here represents a different set of sensor
 // values (ie different encoder zeros etc).
diff --git a/bbb_cape/src/bbb/bbb.gyp b/bbb_cape/src/bbb/bbb.gyp
index 5f5b590..e154cef 100644
--- a/bbb_cape/src/bbb/bbb.gyp
+++ b/bbb_cape/src/bbb/bbb.gyp
@@ -100,17 +100,6 @@
       ],
     },
     {
-      'target_name': 'sensor_generation',
-      'type': 'static_library',
-      'sources': [
-        'sensor_generation.q',
-      ],
-      'variables': {
-        'header_path': 'bbb',
-      },
-      'includes': ['../../../aos/build/queues.gypi'],
-    },
-    {
       'target_name': 'packet_finder',
       'type': 'static_library',
       'sources': [
@@ -183,7 +172,7 @@
         '<(AOS)/common/common.gyp:time',
         'hex_byte_reader',
         'crc',
-        'sensor_generation',
+        '<(AOS)/common/controls/controls.gyp:sensor_generation',
         '<(AOS)/linux_code/linux_code.gyp:configuration',
         '<(AOS)/common/util/util.gyp:log_interval',
       ],
diff --git a/bbb_cape/src/bbb/sensor_reader.cc b/bbb_cape/src/bbb/sensor_reader.cc
index c6d6521..b65df89 100644
--- a/bbb_cape/src/bbb/sensor_reader.cc
+++ b/bbb_cape/src/bbb/sensor_reader.cc
@@ -6,8 +6,8 @@
 #include <stdint.h>
 
 #include "aos/linux_code/configuration.h"
+#include "aos/common/controls/sensor_generation.q.h"
 
-#include "bbb/sensor_generation.q.h"
 #include "bbb/crc.h"
 #include "bbb/hex_byte_reader.h"
 
@@ -21,8 +21,8 @@
     size_t i = 0;
     uint8_t buffer[1024];
     while (i < kSkipBytes) {
-      ssize_t read =
-          reader.ReadBytes(buffer, ::std::min<size_t>(sizeof(buffer), kSkipBytes - i));
+      ssize_t read = reader.ReadBytes(
+          buffer, ::std::min<size_t>(sizeof(buffer), kSkipBytes - i));
       if (read < 0) {
         LOG(FATAL, "error skipping bytes before actual data\n");
       }
@@ -40,8 +40,9 @@
       manager_(),
       packet_finder_(manager_.uart(), DATA_STRUCT_SEND_SIZE - 4),
       expected_checksum_(ReadChecksum(hex_filename_)) {
-  static_assert(sizeof(SensorGeneration::reader_pid) >= sizeof(pid_t),
-                "pid_t is really big?");
+  static_assert(
+      sizeof(::aos::controls::SensorGeneration::reader_pid) >= sizeof(pid_t),
+      "pid_t is really big?");
   ResetHappened();
 }
 
@@ -93,7 +94,7 @@
 }
 
 void SensorReader::ResetHappened() {
-  sensor_generation.MakeWithBuilder().reader_pid(getpid())
+  ::aos::controls::sensor_generation.MakeWithBuilder().reader_pid(getpid())
       .cape_resets(cape_resets_++).Send();
   last_received_time_ = ::aos::time::Time::Now();
   last_cape_timestamp_ = 0;
diff --git a/frc971/control_loops/claw/claw.cc b/frc971/control_loops/claw/claw.cc
index ded45bf..c38fd23 100644
--- a/frc971/control_loops/claw/claw.cc
+++ b/frc971/control_loops/claw/claw.cc
@@ -342,7 +342,7 @@
 }
 
 ClawMotor::ClawMotor(control_loops::ClawGroup *my_claw)
-    : aos::control_loops::ControlLoop<control_loops::ClawGroup, true, true,
+    : aos::controls::ControlLoop<control_loops::ClawGroup, true, true,
                                       false>(my_claw),
       has_top_claw_goal_(false),
       top_claw_goal_(0.0),
diff --git a/frc971/control_loops/claw/claw.h b/frc971/control_loops/claw/claw.h
index 35bbf0f..13d911e 100644
--- a/frc971/control_loops/claw/claw.h
+++ b/frc971/control_loops/claw/claw.h
@@ -184,7 +184,7 @@
       const constants::Values::Claws::Claw &claw_values);
 };
 
-class ClawMotor : public aos::control_loops::ControlLoop<
+class ClawMotor : public aos::controls::ControlLoop<
     control_loops::ClawGroup, true, true, false> {
  public:
   explicit ClawMotor(control_loops::ClawGroup *my_claw =
diff --git a/frc971/control_loops/claw/claw_lib_test.cc b/frc971/control_loops/claw/claw_lib_test.cc
index 61813bc..a385b93 100644
--- a/frc971/control_loops/claw/claw_lib_test.cc
+++ b/frc971/control_loops/claw/claw_lib_test.cc
@@ -279,8 +279,8 @@
     // test.
     ::aos::robot_state.Clear();
     SendDSPacket(true);
-    ::bbb::sensor_generation.Clear();
-    ::bbb::sensor_generation.MakeWithBuilder()
+    ::aos::controls::sensor_generation.Clear();
+    ::aos::controls::sensor_generation.MakeWithBuilder()
         .reader_pid(254)
         .cape_resets(5)
         .Send();
@@ -310,7 +310,7 @@
 
   virtual ~ClawTest() {
     ::aos::robot_state.Clear();
-    ::bbb::sensor_generation.Clear();
+    ::aos::controls::sensor_generation.Clear();
     ::aos::time::Time::DisableMockTime();
   }
 };
diff --git a/frc971/control_loops/drivetrain/drivetrain.h b/frc971/control_loops/drivetrain/drivetrain.h
index 0130828..cba0e9a 100644
--- a/frc971/control_loops/drivetrain/drivetrain.h
+++ b/frc971/control_loops/drivetrain/drivetrain.h
@@ -13,13 +13,13 @@
 namespace control_loops {
 
 class DrivetrainLoop
-    : public aos::control_loops::ControlLoop<control_loops::Drivetrain, true, false> {
+    : public aos::controls::ControlLoop<control_loops::Drivetrain, true, false> {
  public:
   // Constructs a control loop which can take a Drivetrain or defaults to the
   // drivetrain at frc971::control_loops::drivetrain
   explicit DrivetrainLoop(
       control_loops::Drivetrain *my_drivetrain = &control_loops::drivetrain)
-      : aos::control_loops::ControlLoop<control_loops::Drivetrain, true, false>(
+      : aos::controls::ControlLoop<control_loops::Drivetrain, true, false>(
           my_drivetrain) {
     ::aos::controls::HPolytope<0>::Init();
   }
diff --git a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
index a2567e4..2d510f6 100644
--- a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
+++ b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
@@ -129,8 +129,8 @@
     // Flush the robot state queue so we can use clean shared memory for this
     // test, also for the gyro.
     ::aos::robot_state.Clear();
-    ::bbb::sensor_generation.Clear();
-    ::bbb::sensor_generation.MakeWithBuilder()
+    ::aos::controls::sensor_generation.Clear();
+    ::aos::controls::sensor_generation.MakeWithBuilder()
         .reader_pid(254)
         .cape_resets(5)
         .Send();
@@ -159,7 +159,7 @@
   virtual ~DrivetrainTest() {
     ::aos::robot_state.Clear();
     ::frc971::sensors::gyro_reading.Clear();
-    ::bbb::sensor_generation.Clear();
+    ::aos::controls::sensor_generation.Clear();
   }
 };
 
diff --git a/frc971/control_loops/shooter/shooter.cc b/frc971/control_loops/shooter/shooter.cc
index aabfca5..d8240db 100755
--- a/frc971/control_loops/shooter/shooter.cc
+++ b/frc971/control_loops/shooter/shooter.cc
@@ -104,7 +104,7 @@
 }
 
 ShooterMotor::ShooterMotor(control_loops::ShooterGroup *my_shooter)
-    : aos::control_loops::ControlLoop<control_loops::ShooterGroup>(my_shooter),
+    : aos::controls::ControlLoop<control_loops::ShooterGroup>(my_shooter),
       shooter_(MakeShooterLoop()),
       state_(STATE_INITIALIZE),
       loading_problem_end_time_(0, 0),
@@ -320,7 +320,7 @@
         latch_piston_ = true;
       }
       if (output == nullptr) {
-        load_timeout_ += ::aos::control_loops::kLoopFrequency;
+        load_timeout_ += ::aos::controls::kLoopFrequency;
       }
       // Go to 0, which should be the latch position, or trigger a hall effect
       // on the way.  If we don't see edges where we are supposed to, the
diff --git a/frc971/control_loops/shooter/shooter.h b/frc971/control_loops/shooter/shooter.h
index a909d40..1352c49 100755
--- a/frc971/control_loops/shooter/shooter.h
+++ b/frc971/control_loops/shooter/shooter.h
@@ -115,7 +115,7 @@
 const Time kPrepareFireEndTime = Time::InMS(40);
 
 class ShooterMotor
-    : public aos::control_loops::ControlLoop<control_loops::ShooterGroup> {
+    : public aos::controls::ControlLoop<control_loops::ShooterGroup> {
  public:
   explicit ShooterMotor(control_loops::ShooterGroup *my_shooter =
                             &control_loops::shooter_queue_group);
diff --git a/frc971/control_loops/shooter/shooter_lib_test.cc b/frc971/control_loops/shooter/shooter_lib_test.cc
index 669e147..641885f 100755
--- a/frc971/control_loops/shooter/shooter_lib_test.cc
+++ b/frc971/control_loops/shooter/shooter_lib_test.cc
@@ -315,8 +315,8 @@
     // test.
     ::aos::robot_state.Clear();
     SendDSPacket(true);
-    ::bbb::sensor_generation.Clear();
-    ::bbb::sensor_generation.MakeWithBuilder()
+    ::aos::controls::sensor_generation.Clear();
+    ::aos::controls::sensor_generation.MakeWithBuilder()
         .reader_pid(254)
         .cape_resets(5)
         .Send();
@@ -341,7 +341,7 @@
 
   virtual ~ShooterTest() {
     ::aos::robot_state.Clear();
-    ::bbb::sensor_generation.Clear();
+    ::aos::controls::sensor_generation.Clear();
     ::aos::time::Time::DisableMockTime();
   }
 };
diff --git a/frc971/input/input.gyp b/frc971/input/input.gyp
index b7204d4..43ebd67 100644
--- a/frc971/input/input.gyp
+++ b/frc971/input/input.gyp
@@ -43,7 +43,7 @@
         '<(AOS)/common/logging/logging.gyp:queue_logging',
         '<(DEPTH)/frc971/control_loops/claw/claw.gyp:claw_loop',
         '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
-        '<(DEPTH)/frc971/queues/queues.gyp:output_check',
+        '<(AOS)/common/controls/controls.gyp:output_check',
       ],
     },
   ],
diff --git a/frc971/input/sensor_receiver.cc b/frc971/input/sensor_receiver.cc
index 3c16b39..a4f4f29 100644
--- a/frc971/input/sensor_receiver.cc
+++ b/frc971/input/sensor_receiver.cc
@@ -5,6 +5,7 @@
 #include "aos/common/util/wrapping_counter.h"
 #include "aos/common/time.h"
 #include "aos/common/logging/queue_logging.h"
+#include "aos/common/controls/output_check.q.h"
 
 #include "bbb/sensor_reader.h"
 
@@ -14,7 +15,6 @@
 #include "frc971/queues/to_log.q.h"
 #include "frc971/control_loops/shooter/shooter.q.h"
 #include "frc971/control_loops/claw/claw.q.h"
-#include "frc971/queues/output_check.q.h"
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
@@ -182,7 +182,7 @@
   }
 
   if (data->main.output_check_pulse_length != 0) {
-    auto message = ::frc971::output_check_received.MakeMessage();
+    auto message = ::aos::controls::output_check_received.MakeMessage();
     // TODO(brians): Fix this math to match what the cRIO actually does.
     // It's close but not quite right.
     message->pulse_length =
diff --git a/frc971/output/motor_writer.cc b/frc971/output/motor_writer.cc
index fa3fe33..a81896f 100644
--- a/frc971/output/motor_writer.cc
+++ b/frc971/output/motor_writer.cc
@@ -8,11 +8,11 @@
 #include "aos/common/util/log_interval.h"
 #include "aos/common/time.h"
 #include "aos/common/logging/queue_logging.h"
+#include "aos/common/controls/output_check.q.h"
 
 #include "frc971/control_loops/drivetrain/drivetrain.q.h"
 #include "frc971/control_loops/claw/claw.q.h"
 #include "frc971/control_loops/shooter/shooter.q.h"
-#include "frc971/queues/output_check.q.h"
 
 using ::aos::util::SimpleLogInterval;
 
@@ -95,7 +95,7 @@
     }
 
     {
-      auto message = ::frc971::output_check_sent.MakeMessage();
+      auto message = ::aos::controls::output_check_sent.MakeMessage();
       ++output_check_;
       if (output_check_ == 0) output_check_ = 1;
       SetRawPWMOutput(10, output_check_);
diff --git a/frc971/output/output.gyp b/frc971/output/output.gyp
index de41943..d94e598 100644
--- a/frc971/output/output.gyp
+++ b/frc971/output/output.gyp
@@ -53,7 +53,7 @@
         '<(AOS)/common/logging/logging.gyp:queue_logging',
         '<(DEPTH)/frc971/control_loops/claw/claw.gyp:claw_loop',
         '<(DEPTH)/frc971/control_loops/shooter/shooter.gyp:shooter_loop',
-        '<(DEPTH)/frc971/queues/queues.gyp:output_check',
+        '<(AOS)/common/controls/controls.gyp:output_check',
       ],
     },
   ],
diff --git a/frc971/queues/queues.gyp b/frc971/queues/queues.gyp
index d71be25..8af1f10 100644
--- a/frc971/queues/queues.gyp
+++ b/frc971/queues/queues.gyp
@@ -21,16 +21,5 @@
       ],
       'includes': ['../../aos/build/queues.gypi'],
     },
-    {
-      'target_name': 'output_check',
-      'type': 'static_library',
-      'sources': [
-        'output_check.q',
-      ],
-      'variables': {
-        'header_path': 'frc971/queues',
-      },
-      'includes': ['../../aos/build/queues.gypi'],
-    },
   ],
 }