diff --git a/y2014/control_loops/drivetrain/BUILD b/y2014/control_loops/drivetrain/BUILD
index 54d6581..9d7edb6 100644
--- a/y2014/control_loops/drivetrain/BUILD
+++ b/y2014/control_loops/drivetrain/BUILD
@@ -2,29 +2,6 @@
 
 load('/aos/build/queues', 'queue_library')
 
-cc_binary(
-  name = 'replay_drivetrain',
-  srcs = [
-    'replay_drivetrain.cc',
-  ],
-  deps = [
-    ':drivetrain_queue',
-    '//aos/common/controls:replay_control_loop',
-    '//aos/linux_code:init',
-    '//frc971/queues:gyro',
-  ],
-)
-
-queue_library(
-  name = 'drivetrain_queue',
-  srcs = [
-    'drivetrain.q',
-  ],
-  deps = [
-    '//aos/common/controls:control_loop_queues',
-  ],
-)
-
 genrule(
   name = 'genrule_drivetrain',
   visibility = ['//visibility:private'],
@@ -73,83 +50,17 @@
 )
 
 cc_library(
-  name = 'ssdrivetrain',
+  name = 'drivetrain_base',
   srcs = [
-    'ssdrivetrain.cc',
+    'drivetrain_base.cc',
   ],
   hdrs = [
-    'ssdrivetrain.h',
+    'drivetrain_base.h',
   ],
   deps = [
-    ':drivetrain_queue',
+    ':polydrivetrain_plants',
     '//y2014:constants',
-    '//aos/common/controls:polytope',
-    '//aos/common:math',
-    '//aos/common/messages:robot_state',
-    '//frc971/control_loops:state_feedback_loop',
-    '//frc971/control_loops:coerce_goal',
-    '//aos/common/util:log_interval',
-    '//aos/common/logging:queue_logging',
-    '//aos/common/logging:matrix_logging',
-  ],
-)
-
-cc_library(
-  name = 'polydrivetrain',
-  srcs = [
-    'polydrivetrain.cc',
-  ],
-  hdrs = [
-    'polydrivetrain.h',
-  ],
-  deps = [
-    ':drivetrain_queue',
-    '//y2014:constants',
-    '//aos/common/controls:polytope',
-    '//aos/common:math',
-    '//aos/common/messages:robot_state',
-    '//frc971/control_loops:state_feedback_loop',
-    '//frc971/control_loops:coerce_goal',
-    '//aos/common/util:log_interval',
-    '//aos/common/logging:queue_logging',
-    '//aos/common/logging:matrix_logging',
-  ],
-)
-
-cc_library(
-  name = 'drivetrain_lib',
-  srcs = [
-    'drivetrain.cc',
-  ],
-  hdrs = [
-    'drivetrain.h',
-  ],
-  deps = [
-    ':drivetrain_queue',
-    ':polydrivetrain',
-    ':ssdrivetrain',
-    '//aos/common/controls:control_loop',
-    '//y2014:constants',
-    '//frc971/queues:gyro',
-    '//aos/common/util:log_interval',
-    '//aos/common/logging:queue_logging',
-    '//aos/common/logging:matrix_logging',
-  ],
-)
-
-cc_test(
-  name = 'drivetrain_lib_test',
-  srcs = [
-    'drivetrain_lib_test.cc',
-  ],
-  deps = [
-    '//aos/testing:googletest',
-    ':drivetrain_queue',
-    ':drivetrain_lib',
-    '//aos/common/controls:control_loop_test',
-    '//frc971/control_loops:state_feedback_loop',
-    '//frc971/queues:gyro',
-    '//aos/common:queues',
+    '//frc971/control_loops/drivetrain:drivetrain_config',
   ],
 )
 
@@ -159,8 +70,8 @@
     'drivetrain_main.cc',
   ],
   deps = [
+    ':drivetrain_base',
     '//aos/linux_code:init',
-    ':drivetrain_lib',
-    ':drivetrain_queue',
+    '//frc971/control_loops/drivetrain:drivetrain_lib',
   ],
 )
diff --git a/y2014/control_loops/drivetrain/drivetrain.cc b/y2014/control_loops/drivetrain/drivetrain.cc
deleted file mode 100644
index 5717f36..0000000
--- a/y2014/control_loops/drivetrain/drivetrain.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-#include "y2014/control_loops/drivetrain/drivetrain.h"
-
-#include <stdio.h>
-#include <sched.h>
-#include <cmath>
-#include <memory>
-#include "Eigen/Dense"
-
-#include "aos/common/logging/logging.h"
-#include "aos/common/logging/queue_logging.h"
-#include "aos/common/logging/matrix_logging.h"
-
-#include "y2014/constants.h"
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-#include "y2014/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
-#include "y2014/control_loops/drivetrain/kalman_drivetrain_motor_plant.h"
-#include "y2014/control_loops/drivetrain/polydrivetrain.h"
-#include "y2014/control_loops/drivetrain/ssdrivetrain.h"
-#include "frc971/queues/gyro.q.h"
-#include "frc971/shifter_hall_effect.h"
-
-// A consistent way to mark code that goes away without shifters. It's still
-// here because we will have shifters again in the future.
-#define HAVE_SHIFTERS 1
-
-using frc971::sensors::gyro_reading;
-
-namespace y2014 {
-namespace control_loops {
-namespace drivetrain {
-
-DrivetrainLoop::DrivetrainLoop(
-    ::y2014::control_loops::DrivetrainQueue *my_drivetrain)
-    : aos::controls::ControlLoop<::y2014::control_loops::DrivetrainQueue>(
-          my_drivetrain),
-      kf_(::y2014::control_loops::drivetrain::MakeKFDrivetrainLoop()),
-      dt_openloop_(&kf_) {
-  ::aos::controls::HPolytope<0>::Init();
-}
-
-void DrivetrainLoop::RunIteration(
-    const ::y2014::control_loops::DrivetrainQueue::Goal *goal,
-    const ::y2014::control_loops::DrivetrainQueue::Position *position,
-    ::y2014::control_loops::DrivetrainQueue::Output *output,
-    ::y2014::control_loops::DrivetrainQueue::Status *status) {
-  bool bad_pos = false;
-  if (position == nullptr) {
-    LOG_INTERVAL(no_position_);
-    bad_pos = true;
-  }
-  no_position_.Print();
-
-  kf_.set_controller_index(dt_openloop_.controller_index());
-
-  {
-    Eigen::Matrix<double, 3, 1> Y;
-    Y << position->left_encoder, position->right_encoder, last_gyro_rate_;
-    kf_.Correct(Y);
-    integrated_kf_heading_ +=
-        kDt * (kf_.X_hat(3, 0) - kf_.X_hat(1, 0)) / (kRobotRadius * 2.0);
-  }
-
-  bool control_loop_driving = false;
-  if (goal) {
-    double wheel = goal->steering;
-    double throttle = goal->throttle;
-    bool quickturn = goal->quickturn;
-#if HAVE_SHIFTERS
-    bool highgear = goal->highgear;
-#endif
-
-    control_loop_driving = goal->control_loop_driving;
-    double left_goal = goal->left_goal;
-    double right_goal = goal->right_goal;
-
-    dt_closedloop_.SetGoal(left_goal, goal->left_velocity_goal, right_goal,
-                           goal->right_velocity_goal);
-#if HAVE_SHIFTERS
-    dt_openloop_.SetGoal(wheel, throttle, quickturn, highgear);
-#else
-    dt_openloop_.SetGoal(wheel, throttle, quickturn, false);
-#endif
-  }
-
-  if (!bad_pos) {
-    const double left_encoder = position->left_encoder;
-    const double right_encoder = position->right_encoder;
-    if (gyro_reading.FetchLatest()) {
-      LOG_STRUCT(DEBUG, "using", *gyro_reading.get());
-      dt_closedloop_.SetPosition(left_encoder, right_encoder,
-                                 gyro_reading->angle);
-      last_gyro_heading_ = gyro_reading->angle;
-      last_gyro_rate_ = gyro_reading->velocity;
-    } else {
-      dt_closedloop_.SetRawPosition(left_encoder, right_encoder);
-    }
-  }
-  dt_openloop_.SetPosition(position);
-  dt_openloop_.Update();
-
-  if (control_loop_driving) {
-    dt_closedloop_.Update(output == NULL, true);
-    dt_closedloop_.SendMotors(output);
-  } else {
-    dt_openloop_.SendMotors(output);
-    if (output) {
-      dt_closedloop_.SetExternalMotors(output->left_voltage,
-                                       output->right_voltage);
-    }
-    dt_closedloop_.Update(output == NULL, false);
-  }
-
-  // set the output status of the control loop state
-  if (status) {
-    status->robot_speed = dt_closedloop_.GetEstimatedRobotSpeed();
-    status->filtered_left_position = dt_closedloop_.GetEstimatedLeftEncoder();
-    status->filtered_right_position = dt_closedloop_.GetEstimatedRightEncoder();
-
-    status->filtered_left_velocity = dt_closedloop_.loop().X_hat(1, 0);
-    status->filtered_right_velocity = dt_closedloop_.loop().X_hat(3, 0);
-    status->output_was_capped = dt_closedloop_.OutputWasCapped();
-    status->uncapped_left_voltage = dt_closedloop_.loop().U_uncapped(0, 0);
-    status->uncapped_right_voltage = dt_closedloop_.loop().U_uncapped(1, 0);
-  }
-
-
-  double left_voltage = 0.0;
-  double right_voltage = 0.0;
-  if (output) {
-    left_voltage = output->left_voltage;
-    right_voltage = output->right_voltage;
-  }
-
-  const double scalar = ::aos::robot_state->voltage_battery / 12.0;
-
-  left_voltage *= scalar;
-  right_voltage *= scalar;
-
-  // To validate, look at the following:
-
-  // Observed - dx/dt velocity for left, right.
-
-  // Angular velocity error compared to the gyro
-  // Gyro heading vs left-right
-  // Voltage error.
-
-  Eigen::Matrix<double, 2, 1> U;
-  U << last_left_voltage_, last_right_voltage_;
-  last_left_voltage_ = left_voltage;
-  last_right_voltage_ = right_voltage;
-
-  kf_.UpdateObserver(U);
-}
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2014
diff --git a/y2014/control_loops/drivetrain/drivetrain.h b/y2014/control_loops/drivetrain/drivetrain.h
deleted file mode 100644
index 489b4ca..0000000
--- a/y2014/control_loops/drivetrain/drivetrain.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef Y2014_CONTROL_LOOPS_DRIVETRAIN_H_
-#define Y2014_CONTROL_LOOPS_DRIVETRAIN_H_
-
-#include "Eigen/Dense"
-
-#include "aos/common/controls/polytope.h"
-#include "aos/common/controls/control_loop.h"
-#include "aos/common/controls/polytope.h"
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-#include "y2014/control_loops/drivetrain/polydrivetrain.h"
-#include "y2014/control_loops/drivetrain/ssdrivetrain.h"
-#include "aos/common/util/log_interval.h"
-
-namespace y2014 {
-namespace control_loops {
-namespace drivetrain {
-
-class DrivetrainLoop : public aos::controls::ControlLoop<
-                           ::y2014::control_loops::DrivetrainQueue> {
- public:
-  // Constructs a control loop which can take a Drivetrain or defaults to the
-  // drivetrain at y2014::control_loops::drivetrain
-  explicit DrivetrainLoop(
-      ::y2014::control_loops::DrivetrainQueue *my_drivetrain =
-          &::y2014::control_loops::drivetrain_queue);
-
- protected:
-  // Executes one cycle of the control loop.
-  virtual void RunIteration(
-      const ::y2014::control_loops::DrivetrainQueue::Goal *goal,
-      const ::y2014::control_loops::DrivetrainQueue::Position *position,
-      ::y2014::control_loops::DrivetrainQueue::Output *output,
-      ::y2014::control_loops::DrivetrainQueue::Status *status);
-
-  typedef ::aos::util::SimpleLogInterval SimpleLogInterval;
-  SimpleLogInterval no_position_ = SimpleLogInterval(
-      ::aos::time::Time::InSeconds(0.25), WARNING, "no position");
-  double last_gyro_heading_ = 0.0;
-  double last_gyro_rate_ = 0.0;
-
-  StateFeedbackLoop<7, 2, 3> kf_;
-  PolyDrivetrain dt_openloop_;
-  DrivetrainMotorsSS dt_closedloop_;
-
-  double last_left_voltage_ = 0;
-  double last_right_voltage_ = 0;
-
-  double integrated_kf_heading_ = 0;
-};
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2014
-
-#endif  // Y2014_CONTROL_LOOPS_DRIVETRAIN_H_
diff --git a/y2014/control_loops/drivetrain/drivetrain.q b/y2014/control_loops/drivetrain/drivetrain.q
deleted file mode 100644
index 96bd817..0000000
--- a/y2014/control_loops/drivetrain/drivetrain.q
+++ /dev/null
@@ -1,126 +0,0 @@
-package y2014.control_loops;
-
-import "aos/common/controls/control_loops.q";
-
-// For logging information about what the code is doing with the shifters.
-struct GearLogging {
-  // Which controller is being used.
-  int8_t controller_index;
-  // Whether the left loop is the high-gear one.
-  bool left_loop_high;
-  // Whether the right loop is the high-gear one.
-  bool right_loop_high;
-  // The state of the left shifter.
-  int8_t left_state;
-  // The state of the right shifter.
-  int8_t right_state;
-};
-
-// For logging information about the state of the shifters.
-struct CIMLogging {
-  // Whether the code thinks the left side is currently in gear.
-  bool left_in_gear;
-  // Whether the code thinks the right side is currently in gear.
-  bool right_in_gear;
-  // The velocity in rad/s (positive forward) the code thinks the left motor
-  // is currently spinning at.
-  double left_motor_speed;
-  // The velocity in rad/s (positive forward) the code thinks the right motor
-  // is currently spinning at.
-  double right_motor_speed;
-  // The velocity estimate for the left side of the robot in m/s (positive
-  // forward) used for shifting.
-  double left_velocity;
-  // The velocity estimate for the right side of the robot in m/s (positive
-  // forward) used for shifting.
-  double right_velocity;
-};
-
-queue_group DrivetrainQueue {
-  implements aos.control_loops.ControlLoop;
-
-  message Goal {
-    // Position of the steering wheel (positive = turning left when going
-    // forwards).
-    double steering;
-    // Position of the throttle (positive forwards).
-    double throttle;
-    // True to shift into high, false to shift into low.
-    bool highgear;
-    // True to activate quickturn.
-    bool quickturn;
-    // True to have the closed-loop controller take over.
-    bool control_loop_driving;
-    // Position goal for the left side in meters when the closed-loop controller
-    // is active.
-    double left_goal;
-    // Velocity goal for the left side in m/s when the closed-loop controller
-    // is active.
-    double left_velocity_goal;
-    // Position goal for the right side in meters when the closed-loop
-    // controller is active.
-    double right_goal;
-    // Velocity goal for the right side in m/s when the closed-loop controller
-    // is active.
-    double right_velocity_goal;
-  };
-
-  message Position {
-    // Relative position of the left side in meters.
-    double left_encoder;
-    // Relative position of the right side in meters.
-    double right_encoder;
-    // The speed in m/s of the left side from the most recent encoder pulse,
-    // or 0 if there was no edge within the last 5ms.
-    double left_speed;
-    // The speed in m/s of the right side from the most recent encoder pulse,
-    // or 0 if there was no edge within the last 5ms.
-    double right_speed;
-    // Position of the left shifter (smaller = towards low gear).
-    double left_shifter_position;
-    // Position of the right shifter (smaller = towards low gear).
-    double right_shifter_position;
-    double low_left_hall;
-    double high_left_hall;
-    double low_right_hall;
-    double high_right_hall;
-  };
-
-  message Output {
-    // Voltage to send to the left motor(s).
-    double left_voltage;
-    // Voltage to send to the right motor(s).
-    double right_voltage;
-    // True to set the left shifter piston for high gear.
-    bool left_high;
-    // True to set the right shifter piston for high gear.
-    bool right_high;
-  };
-
-  message Status {
-    // Estimated speed of the center of the robot in m/s (positive forwards).
-    double robot_speed;
-    // Estimated relative position of the left side in meters.
-    double filtered_left_position;
-    // Estimated relative position of the right side in meters.
-    double filtered_right_position;
-    // Estimated velocity of the left side in m/s.
-    double filtered_left_velocity;
-    // Estimated velocity of the left side in m/s.
-    double filtered_right_velocity;
-
-    // The voltage we wanted to send to the left side last cycle.
-    double uncapped_left_voltage;
-    // The voltage we wanted to send to the right side last cycle.
-    double uncapped_right_voltage;
-    // True if the output voltage was capped last cycle.
-    bool output_was_capped;
-  };
-
-  queue Goal goal;
-  queue Position position;
-  queue Output output;
-  queue Status status;
-};
-
-queue_group DrivetrainQueue drivetrain_queue;
diff --git a/y2014/control_loops/drivetrain/drivetrain_base.cc b/y2014/control_loops/drivetrain/drivetrain_base.cc
new file mode 100644
index 0000000..b4ef447
--- /dev/null
+++ b/y2014/control_loops/drivetrain/drivetrain_base.cc
@@ -0,0 +1,36 @@
+#include "y2014/control_loops/drivetrain/drivetrain_base.h"
+
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+
+#include "y2014/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
+#include "y2014/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
+#include "y2014/control_loops/drivetrain/kalman_drivetrain_motor_plant.h"
+#include "y2014/constants.h"
+
+using ::frc971::control_loops::drivetrain::DrivetrainConfig;
+
+namespace y2014 {
+namespace control_loops {
+
+const DrivetrainConfig &GetDrivetrainConfig() {
+  static DrivetrainConfig kDrivetrainConfig{
+      ::frc971::control_loops::drivetrain::ShifterType::HALL_EFFECT_SHIFTER,
+
+      ::y2014::control_loops::drivetrain::MakeDrivetrainLoop,
+      ::y2014::control_loops::drivetrain::MakeVelocityDrivetrainLoop,
+      ::y2014::control_loops::drivetrain::MakeKFDrivetrainLoop,
+
+      drivetrain::kDt, drivetrain::kStallTorque, drivetrain::kStallCurrent,
+      drivetrain::kFreeSpeedRPM, drivetrain::kFreeCurrent, drivetrain::kJ,
+      drivetrain::kMass, drivetrain::kRobotRadius, drivetrain::kWheelRadius,
+      drivetrain::kR, drivetrain::kV, drivetrain::kT,
+
+      constants::GetValues().turn_width, constants::GetValues().high_gear_ratio,
+      constants::GetValues().low_gear_ratio,
+      constants::GetValues().left_drive, constants::GetValues().right_drive};
+
+  return kDrivetrainConfig;
+};
+
+}  // namespace control_loops
+}  // namespace y2014
diff --git a/y2014/control_loops/drivetrain/drivetrain_base.h b/y2014/control_loops/drivetrain/drivetrain_base.h
new file mode 100644
index 0000000..3a9d70e
--- /dev/null
+++ b/y2014/control_loops/drivetrain/drivetrain_base.h
@@ -0,0 +1,16 @@
+#ifndef Y2014_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
+#define Y2014_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
+
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+
+using ::frc971::control_loops::drivetrain::DrivetrainConfig;
+
+namespace y2014 {
+namespace control_loops {
+
+const DrivetrainConfig &GetDrivetrainConfig();
+
+}  // namespace control_loops
+}  // namespace y2014
+
+#endif  // Y2014_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
diff --git a/y2014/control_loops/drivetrain/drivetrain_lib_test.cc b/y2014/control_loops/drivetrain/drivetrain_lib_test.cc
deleted file mode 100644
index adfc519..0000000
--- a/y2014/control_loops/drivetrain/drivetrain_lib_test.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-#include <unistd.h>
-
-#include <memory>
-
-#include "gtest/gtest.h"
-#include "aos/common/network/team_number.h"
-#include "aos/common/controls/polytope.h"
-#include "aos/common/controls/control_loop_test.h"
-
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-#include "y2014/control_loops/drivetrain/drivetrain.h"
-#include "frc971/control_loops/state_feedback_loop.h"
-#include "frc971/control_loops/coerce_goal.h"
-#include "y2014/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
-#include "frc971/queues/gyro.q.h"
-
-
-namespace y2014 {
-namespace control_loops {
-namespace drivetrain {
-namespace testing {
-
-using ::y2014::control_loops::drivetrain::MakeDrivetrainPlant;
-
-class Environment : public ::testing::Environment {
- public:
-  virtual ~Environment() {}
-  // how to set up the environment.
-  virtual void SetUp() {
-    aos::controls::HPolytope<0>::Init();
-  }
-};
-::testing::Environment* const holder_env =
-  ::testing::AddGlobalTestEnvironment(new Environment);
-
-class TeamNumberEnvironment : public ::testing::Environment {
- public:
-  // Override this to define how to set up the environment.
-  virtual void SetUp() { aos::network::OverrideTeamNumber(971); }
-};
-
-::testing::Environment* const team_number_env =
-    ::testing::AddGlobalTestEnvironment(new TeamNumberEnvironment);
-
-// Class which simulates the drivetrain and sends out queue messages containing
-// the position.
-class DrivetrainSimulation {
- public:
-  // Constructs a motor simulation.
-  // TODO(aschuh) Do we want to test the clutch one too?
-  DrivetrainSimulation()
-      : drivetrain_plant_(
-            new StateFeedbackPlant<4, 2, 2>(MakeDrivetrainPlant())),
-        my_drivetrain_queue_(".y2014.control_loops.drivetrain",
-                       0x8a8dde77, ".y2014.control_loops.drivetrain.goal",
-                       ".y2014.control_loops.drivetrain.position",
-                       ".y2014.control_loops.drivetrain.output",
-                       ".y2014.control_loops.drivetrain.status") {
-    Reinitialize();
-  }
-
-  // Resets the plant.
-  void Reinitialize() {
-    drivetrain_plant_->mutable_X(0, 0) = 0.0;
-    drivetrain_plant_->mutable_X(1, 0) = 0.0;
-    drivetrain_plant_->mutable_Y() =
-        drivetrain_plant_->C() * drivetrain_plant_->X();
-    last_left_position_ = drivetrain_plant_->Y(0, 0);
-    last_right_position_ = drivetrain_plant_->Y(1, 0);
-  }
-
-  // Returns the position of the drivetrain.
-  double GetLeftPosition() const { return drivetrain_plant_->Y(0, 0); }
-  double GetRightPosition() const { return drivetrain_plant_->Y(1, 0); }
-
-  // Sends out the position queue messages.
-  void SendPositionMessage() {
-    const double left_encoder = GetLeftPosition();
-    const double right_encoder = GetRightPosition();
-
-    ::aos::ScopedMessagePtr<::y2014::control_loops::DrivetrainQueue::Position>
-        position = my_drivetrain_queue_.position.MakeMessage();
-    position->left_encoder = left_encoder;
-    position->right_encoder = right_encoder;
-    position.Send();
-  }
-
-  // Simulates the drivetrain moving for one timestep.
-  void Simulate() {
-    last_left_position_ = drivetrain_plant_->Y(0, 0);
-    last_right_position_ = drivetrain_plant_->Y(1, 0);
-    EXPECT_TRUE(my_drivetrain_queue_.output.FetchLatest());
-    drivetrain_plant_->mutable_U() << my_drivetrain_queue_.output->left_voltage,
-        my_drivetrain_queue_.output->right_voltage;
-    drivetrain_plant_->Update();
-  }
-
-  ::std::unique_ptr<StateFeedbackPlant<4, 2, 2>> drivetrain_plant_;
- private:
-  ::y2014::control_loops::DrivetrainQueue my_drivetrain_queue_;
-  double last_left_position_;
-  double last_right_position_;
-};
-
-class DrivetrainTest : public ::aos::testing::ControlLoopTest {
- protected:
-  // Create a new instance of the test queue so that it invalidates the queue
-  // that it points to.  Otherwise, we will have a pointer to shared memory that
-  // is no longer valid.
-  ::y2014::control_loops::DrivetrainQueue my_drivetrain_queue_;
-
-  // Create a loop and simulation plant.
-  DrivetrainLoop drivetrain_motor_;
-  DrivetrainSimulation drivetrain_motor_plant_;
-
-  DrivetrainTest() : my_drivetrain_queue_(".y2014.control_loops.drivetrain",
-                               0x8a8dde77,
-                               ".y2014.control_loops.drivetrain.goal",
-                               ".y2014.control_loops.drivetrain.position",
-                               ".y2014.control_loops.drivetrain.output",
-                               ".y2014.control_loops.drivetrain.status"),
-                drivetrain_motor_(&my_drivetrain_queue_),
-                drivetrain_motor_plant_() {
-    ::frc971::sensors::gyro_reading.Clear();
-  }
-
-  void VerifyNearGoal() {
-    my_drivetrain_queue_.goal.FetchLatest();
-    my_drivetrain_queue_.position.FetchLatest();
-    EXPECT_NEAR(my_drivetrain_queue_.goal->left_goal,
-                drivetrain_motor_plant_.GetLeftPosition(),
-                1e-2);
-    EXPECT_NEAR(my_drivetrain_queue_.goal->right_goal,
-                drivetrain_motor_plant_.GetRightPosition(),
-                1e-2);
-  }
-
-  virtual ~DrivetrainTest() {
-    ::frc971::sensors::gyro_reading.Clear();
-  }
-};
-
-// Tests that the drivetrain converges on a goal.
-TEST_F(DrivetrainTest, ConvergesCorrectly) {
-  my_drivetrain_queue_.goal.MakeWithBuilder().control_loop_driving(true)
-      .left_goal(-1.0)
-      .right_goal(1.0).Send();
-  for (int i = 0; i < 200; ++i) {
-    drivetrain_motor_plant_.SendPositionMessage();
-    drivetrain_motor_.Iterate();
-    drivetrain_motor_plant_.Simulate();
-    SimulateTimestep(true);
-  }
-  VerifyNearGoal();
-}
-
-// Tests that it survives disabling.
-TEST_F(DrivetrainTest, SurvivesDisabling) {
-  my_drivetrain_queue_.goal.MakeWithBuilder().control_loop_driving(true)
-      .left_goal(-1.0)
-      .right_goal(1.0).Send();
-  for (int i = 0; i < 500; ++i) {
-    drivetrain_motor_plant_.SendPositionMessage();
-    drivetrain_motor_.Iterate();
-    drivetrain_motor_plant_.Simulate();
-    if (i > 20 && i < 200) {
-      SimulateTimestep(false);
-    } else {
-      SimulateTimestep(true);
-    }
-  }
-  VerifyNearGoal();
-}
-
-// Tests that never having a goal doesn't break.
-TEST_F(DrivetrainTest, NoGoalStart) {
-  for (int i = 0; i < 20; ++i) {
-    drivetrain_motor_plant_.SendPositionMessage();
-    drivetrain_motor_.Iterate();
-    drivetrain_motor_plant_.Simulate();
-  }
-}
-
-// Tests that never having a goal, but having driver's station messages, doesn't
-// break.
-TEST_F(DrivetrainTest, NoGoalWithRobotState) {
-  for (int i = 0; i < 20; ++i) {
-    drivetrain_motor_plant_.SendPositionMessage();
-    drivetrain_motor_.Iterate();
-    drivetrain_motor_plant_.Simulate();
-    SimulateTimestep(true);
-  }
-}
-
-::aos::controls::HPolytope<2> MakeBox(double x1_min, double x1_max,
-                                      double x2_min, double x2_max) {
-  Eigen::Matrix<double, 4, 2> box_H;
-  box_H << /*[[*/ 1.0, 0.0 /*]*/,
-            /*[*/-1.0, 0.0 /*]*/,
-            /*[*/ 0.0, 1.0 /*]*/,
-            /*[*/ 0.0,-1.0 /*]]*/;
-  Eigen::Matrix<double, 4, 1> box_k;
-  box_k << /*[[*/ x1_max /*]*/,
-            /*[*/-x1_min /*]*/,
-            /*[*/ x2_max /*]*/,
-            /*[*/-x2_min /*]]*/;
-  ::aos::controls::HPolytope<2> t_poly(box_H, box_k);
-  return t_poly;
-}
-
-class CoerceGoalTest : public ::testing::Test {
- public:
-  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
-};
-
-// WHOOOHH!
-TEST_F(CoerceGoalTest, Inside) {
-  ::aos::controls::HPolytope<2> box = MakeBox(1, 2, 1, 2);
-
-  Eigen::Matrix<double, 1, 2> K;
-  K << /*[[*/ 1, -1 /*]]*/;
-
-  Eigen::Matrix<double, 2, 1> R;
-  R << /*[[*/ 1.5, 1.5 /*]]*/;
-
-  Eigen::Matrix<double, 2, 1> output =
-      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
-
-  EXPECT_EQ(R(0, 0), output(0, 0));
-  EXPECT_EQ(R(1, 0), output(1, 0));
-}
-
-TEST_F(CoerceGoalTest, Outside_Inside_Intersect) {
-  ::aos::controls::HPolytope<2> box = MakeBox(1, 2, 1, 2);
-
-  Eigen::Matrix<double, 1, 2> K;
-  K << 1, -1;
-
-  Eigen::Matrix<double, 2, 1> R;
-  R << 5, 5;
-
-  Eigen::Matrix<double, 2, 1> output =
-      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
-
-  EXPECT_EQ(2.0, output(0, 0));
-  EXPECT_EQ(2.0, output(1, 0));
-}
-
-TEST_F(CoerceGoalTest, Outside_Inside_no_Intersect) {
-  ::aos::controls::HPolytope<2> box = MakeBox(3, 4, 1, 2);
-
-  Eigen::Matrix<double, 1, 2> K;
-  K << 1, -1;
-
-  Eigen::Matrix<double, 2, 1> R;
-  R << 5, 5;
-
-  Eigen::Matrix<double, 2, 1> output =
-      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
-
-  EXPECT_EQ(3.0, output(0, 0));
-  EXPECT_EQ(2.0, output(1, 0));
-}
-
-TEST_F(CoerceGoalTest, Middle_Of_Edge) {
-  ::aos::controls::HPolytope<2> box = MakeBox(0, 4, 1, 2);
-
-  Eigen::Matrix<double, 1, 2> K;
-  K << -1, 1;
-
-  Eigen::Matrix<double, 2, 1> R;
-  R << 5, 5;
-
-  Eigen::Matrix<double, 2, 1> output =
-      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
-
-  EXPECT_EQ(2.0, output(0, 0));
-  EXPECT_EQ(2.0, output(1, 0));
-}
-
-TEST_F(CoerceGoalTest, PerpendicularLine) {
-  ::aos::controls::HPolytope<2> box = MakeBox(1, 2, 1, 2);
-
-  Eigen::Matrix<double, 1, 2> K;
-  K << 1, 1;
-
-  Eigen::Matrix<double, 2, 1> R;
-  R << 5, 5;
-
-  Eigen::Matrix<double, 2, 1> output =
-      ::frc971::control_loops::CoerceGoal(box, K, 0, R);
-
-  EXPECT_EQ(1.0, output(0, 0));
-  EXPECT_EQ(1.0, output(1, 0));
-}
-
-}  // namespace testing
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2014
diff --git a/y2014/control_loops/drivetrain/drivetrain_main.cc b/y2014/control_loops/drivetrain/drivetrain_main.cc
index cc71c69..52dafcc 100644
--- a/y2014/control_loops/drivetrain/drivetrain_main.cc
+++ b/y2014/control_loops/drivetrain/drivetrain_main.cc
@@ -1,10 +1,14 @@
-#include "y2014/control_loops/drivetrain/drivetrain.h"
-
 #include "aos/linux_code/init.h"
 
+#include "y2014/control_loops/drivetrain/drivetrain_base.h"
+#include "frc971/control_loops/drivetrain/drivetrain.h"
+
+using ::frc971::control_loops::drivetrain::DrivetrainLoop;
+
 int main() {
   ::aos::Init();
-  ::y2014::control_loops::drivetrain::DrivetrainLoop drivetrain;
+  DrivetrainLoop drivetrain =
+      DrivetrainLoop(::y2014::control_loops::GetDrivetrainConfig());
   drivetrain.Run();
   ::aos::Cleanup();
   return 0;
diff --git a/y2014/control_loops/drivetrain/polydrivetrain.cc b/y2014/control_loops/drivetrain/polydrivetrain.cc
deleted file mode 100644
index 014a1ae..0000000
--- a/y2014/control_loops/drivetrain/polydrivetrain.cc
+++ /dev/null
@@ -1,370 +0,0 @@
-#include "y2014/control_loops/drivetrain/polydrivetrain.h"
-
-#include "aos/common/logging/logging.h"
-#include "aos/common/controls/polytope.h"
-#include "aos/common/commonmath.h"
-#include "aos/common/logging/queue_logging.h"
-#include "aos/common/logging/matrix_logging.h"
-
-#include "aos/common/messages/robot_state.q.h"
-#include "frc971/control_loops/state_feedback_loop.h"
-#include "frc971/control_loops/coerce_goal.h"
-#include "y2014/constants.h"
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-#include "y2014/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
-
-#define HAVE_SHIFTERS 1
-
-namespace y2014 {
-namespace control_loops {
-namespace drivetrain {
-
-using ::y2014::control_loops::GearLogging;
-using ::y2014::control_loops::CIMLogging;
-using ::frc971::control_loops::CoerceGoal;
-
-PolyDrivetrain::PolyDrivetrain(StateFeedbackLoop<7, 2, 3> *kf)
-    : kf_(kf),
-      U_Poly_((Eigen::Matrix<double, 4, 2>() << /*[[*/ 1, 0 /*]*/,
-               /*[*/ -1, 0 /*]*/,
-               /*[*/ 0, 1 /*]*/,
-               /*[*/ 0, -1 /*]]*/).finished(),
-              (Eigen::Matrix<double, 4, 1>() << /*[[*/ 12 /*]*/,
-               /*[*/ 12 /*]*/,
-               /*[*/ 12 /*]*/,
-               /*[*/ 12 /*]]*/).finished()),
-      loop_(new StateFeedbackLoop<2, 2, 2>(
-          constants::GetValues().make_v_drivetrain_loop())),
-      ttrust_(1.1),
-      wheel_(0.0),
-      throttle_(0.0),
-      quickturn_(false),
-      stale_count_(0),
-      position_time_delta_(kDt),
-      left_gear_(LOW),
-      right_gear_(LOW),
-      counter_(0) {
-  last_position_.Zero();
-  position_.Zero();
-}
-
-double PolyDrivetrain::MotorSpeed(
-    const constants::ShifterHallEffect &hall_effect, double shifter_position,
-    double velocity) {
-  const double avg_hall_effect =
-      (hall_effect.clear_high + hall_effect.clear_low) / 2.0;
-
-  if (shifter_position > avg_hall_effect) {
-    return velocity / constants::GetValues().high_gear_ratio / kWheelRadius;
-  } else {
-    return velocity / constants::GetValues().low_gear_ratio / kWheelRadius;
-  }
-}
-
-PolyDrivetrain::Gear PolyDrivetrain::UpdateSingleGear(
-    Gear requested_gear, Gear current_gear) {
-  const Gear shift_up =
-      constants::GetValues().clutch_transmission ? HIGH : SHIFTING_UP;
-  const Gear shift_down =
-      constants::GetValues().clutch_transmission ? LOW : SHIFTING_DOWN;
-
-  if (current_gear != requested_gear) {
-    if (IsInGear(current_gear)) {
-      if (requested_gear == HIGH) {
-        if (current_gear != HIGH) {
-          current_gear = shift_up;
-        }
-      } else {
-        if (current_gear != LOW) {
-          current_gear = shift_down;
-        }
-      }
-    } else {
-      if (requested_gear == HIGH && current_gear == SHIFTING_DOWN) {
-        current_gear = SHIFTING_UP;
-      } else if (requested_gear == LOW && current_gear == SHIFTING_UP) {
-        current_gear = SHIFTING_DOWN;
-      }
-    }
-  }
-  return current_gear;
-}
-
-void PolyDrivetrain::UpdateGears(Gear requested_gear) {
-  left_gear_ = UpdateSingleGear(requested_gear, left_gear_);
-  right_gear_ = UpdateSingleGear(requested_gear, right_gear_);
-}
-
-void PolyDrivetrain::SetGoal(double wheel, double throttle, bool quickturn,
-                             bool highgear) {
-  const double kWheelNonLinearity = 0.3;
-  // Apply a sin function that's scaled to make it feel better.
-  const double angular_range = M_PI_2 * kWheelNonLinearity;
-
-  wheel_ = sin(angular_range * wheel) / sin(angular_range);
-  wheel_ = sin(angular_range * wheel_) / sin(angular_range);
-  quickturn_ = quickturn;
-
-  static const double kThrottleDeadband = 0.05;
-  if (::std::abs(throttle) < kThrottleDeadband) {
-    throttle_ = 0;
-  } else {
-    throttle_ = copysign(
-        (::std::abs(throttle) - kThrottleDeadband) / (1.0 - kThrottleDeadband),
-        throttle);
-  }
-
-  UpdateGears(highgear ? HIGH : LOW);
-}
-
-void PolyDrivetrain::SetPosition(
-    const ::y2014::control_loops::DrivetrainQueue::Position *position) {
-  if (position == NULL) {
-    ++stale_count_;
-  } else {
-    last_position_ = position_;
-    position_ = *position;
-    position_time_delta_ = (stale_count_ + 1) * kDt;
-    stale_count_ = 0;
-  }
-
-  if (position) {
-    const auto &values = constants::GetValues();
-    GearLogging gear_logging;
-    // Switch to the correct controller.
-    const double left_middle_shifter_position =
-        (values.left_drive.clear_high + values.left_drive.clear_low) / 2.0;
-    const double right_middle_shifter_position =
-        (values.right_drive.clear_high + values.right_drive.clear_low) / 2.0;
-
-    if (position->left_shifter_position < left_middle_shifter_position ||
-        left_gear_ == LOW) {
-      if (position->right_shifter_position < right_middle_shifter_position ||
-          right_gear_ == LOW) {
-        gear_logging.left_loop_high = false;
-        gear_logging.right_loop_high = false;
-        loop_->set_controller_index(gear_logging.controller_index = 0);
-      } else {
-        gear_logging.left_loop_high = false;
-        gear_logging.right_loop_high = true;
-        loop_->set_controller_index(gear_logging.controller_index = 1);
-      }
-    } else {
-      if (position->right_shifter_position < right_middle_shifter_position ||
-          right_gear_ == LOW) {
-        gear_logging.left_loop_high = true;
-        gear_logging.right_loop_high = false;
-        loop_->set_controller_index(gear_logging.controller_index = 2);
-      } else {
-        gear_logging.left_loop_high = true;
-        gear_logging.right_loop_high = true;
-        loop_->set_controller_index(gear_logging.controller_index = 3);
-      }
-    }
-
-    if (position->left_shifter_position > values.left_drive.clear_high &&
-        left_gear_ == SHIFTING_UP) {
-      left_gear_ = HIGH;
-    }
-    if (position->left_shifter_position < values.left_drive.clear_low &&
-        left_gear_ == SHIFTING_DOWN) {
-      left_gear_ = LOW;
-    }
-    if (position->right_shifter_position > values.right_drive.clear_high &&
-        right_gear_ == SHIFTING_UP) {
-      right_gear_ = HIGH;
-    }
-    if (position->right_shifter_position < values.right_drive.clear_low &&
-        right_gear_ == SHIFTING_DOWN) {
-      right_gear_ = LOW;
-    }
-
-    gear_logging.left_state = left_gear_;
-    gear_logging.right_state = right_gear_;
-    LOG_STRUCT(DEBUG, "state", gear_logging);
-  }
-}
-
-double PolyDrivetrain::FilterVelocity(double throttle) {
-  const Eigen::Matrix<double, 2, 2> FF =
-      loop_->B().inverse() *
-      (Eigen::Matrix<double, 2, 2>::Identity() - loop_->A());
-
-  constexpr int kHighGearController = 3;
-  const Eigen::Matrix<double, 2, 2> FF_high =
-      loop_->controller(kHighGearController).plant.B().inverse() *
-      (Eigen::Matrix<double, 2, 2>::Identity() -
-       loop_->controller(kHighGearController).plant.A());
-
-  ::Eigen::Matrix<double, 1, 2> FF_sum = FF.colwise().sum();
-  int min_FF_sum_index;
-  const double min_FF_sum = FF_sum.minCoeff(&min_FF_sum_index);
-  const double min_K_sum = loop_->K().col(min_FF_sum_index).sum();
-  const double high_min_FF_sum = FF_high.col(0).sum();
-
-  const double adjusted_ff_voltage =
-      ::aos::Clip(throttle * 12.0 * min_FF_sum / high_min_FF_sum, -12.0, 12.0);
-  return (adjusted_ff_voltage +
-          ttrust_ * min_K_sum * (loop_->X_hat(0, 0) + loop_->X_hat(1, 0)) /
-              2.0) /
-         (ttrust_ * min_K_sum + min_FF_sum);
-}
-
-double PolyDrivetrain::MaxVelocity() {
-  const Eigen::Matrix<double, 2, 2> FF =
-      loop_->B().inverse() *
-      (Eigen::Matrix<double, 2, 2>::Identity() - loop_->A());
-
-  constexpr int kHighGearController = 3;
-  const Eigen::Matrix<double, 2, 2> FF_high =
-      loop_->controller(kHighGearController).plant.B().inverse() *
-      (Eigen::Matrix<double, 2, 2>::Identity() -
-       loop_->controller(kHighGearController).plant.A());
-
-  ::Eigen::Matrix<double, 1, 2> FF_sum = FF.colwise().sum();
-  int min_FF_sum_index;
-  const double min_FF_sum = FF_sum.minCoeff(&min_FF_sum_index);
-  // const double min_K_sum = loop_->K().col(min_FF_sum_index).sum();
-  const double high_min_FF_sum = FF_high.col(0).sum();
-
-  const double adjusted_ff_voltage =
-      ::aos::Clip(12.0 * min_FF_sum / high_min_FF_sum, -12.0, 12.0);
-  return adjusted_ff_voltage / min_FF_sum;
-}
-
-void PolyDrivetrain::Update() {
-  loop_->mutable_X_hat()(0, 0) = kf_->X_hat()(1, 0);
-  loop_->mutable_X_hat()(1, 0) = kf_->X_hat()(3, 0);
-
-  const auto &values = constants::GetValues();
-  // TODO(austin): Observer for the current velocity instead of difference
-  // calculations.
-  ++counter_;
-  const double current_left_velocity =
-      (position_.left_encoder - last_position_.left_encoder) /
-      position_time_delta_;
-  const double current_right_velocity =
-      (position_.right_encoder - last_position_.right_encoder) /
-      position_time_delta_;
-  const double left_motor_speed =
-      MotorSpeed(values.left_drive, position_.left_shifter_position,
-                 current_left_velocity);
-  const double right_motor_speed =
-      MotorSpeed(values.right_drive, position_.right_shifter_position,
-                 current_right_velocity);
-
-  {
-    CIMLogging logging;
-
-    // Reset the CIM model to the current conditions to be ready for when we
-    // shift.
-    if (IsInGear(left_gear_)) {
-      logging.left_in_gear = true;
-    } else {
-      logging.left_in_gear = false;
-    }
-    logging.left_motor_speed = left_motor_speed;
-    logging.left_velocity = current_left_velocity;
-    if (IsInGear(right_gear_)) {
-      logging.right_in_gear = true;
-    } else {
-      logging.right_in_gear = false;
-    }
-    logging.right_motor_speed = right_motor_speed;
-    logging.right_velocity = current_right_velocity;
-
-    LOG_STRUCT(DEBUG, "currently", logging);
-  }
-
-  if (IsInGear(left_gear_) && IsInGear(right_gear_)) {
-    // FF * X = U (steady state)
-    const Eigen::Matrix<double, 2, 2> FF =
-        loop_->B().inverse() *
-        (Eigen::Matrix<double, 2, 2>::Identity() - loop_->A());
-
-    // Invert the plant to figure out how the velocity filter would have to
-    // work
-    // out in order to filter out the forwards negative inertia.
-    // This math assumes that the left and right power and velocity are
-    // equals,
-    // and that the plant is the same on the left and right.
-    const double fvel = FilterVelocity(throttle_);
-
-    const double sign_svel = wheel_ * ((fvel > 0.0) ? 1.0 : -1.0);
-    double steering_velocity;
-    if (quickturn_) {
-      steering_velocity = wheel_ * MaxVelocity();
-    } else {
-      steering_velocity = ::std::abs(fvel) * wheel_;
-    }
-    const double left_velocity = fvel - steering_velocity;
-    const double right_velocity = fvel + steering_velocity;
-
-    // Integrate velocity to get the position.
-    // This position is used to get integral control.
-    loop_->mutable_R() << left_velocity, right_velocity;
-
-    if (!quickturn_) {
-      // K * R = w
-      Eigen::Matrix<double, 1, 2> equality_k;
-      equality_k << 1 + sign_svel, -(1 - sign_svel);
-      const double equality_w = 0.0;
-
-      // Construct a constraint on R by manipulating the constraint on U
-      ::aos::controls::HPolytope<2> R_poly = ::aos::controls::HPolytope<2>(
-          U_Poly_.H() * (loop_->K() + FF),
-          U_Poly_.k() + U_Poly_.H() * loop_->K() * loop_->X_hat());
-
-      // Limit R back inside the box.
-      loop_->mutable_R() =
-          CoerceGoal(R_poly, equality_k, equality_w, loop_->R());
-    }
-
-    const Eigen::Matrix<double, 2, 1> FF_volts = FF * loop_->R();
-    const Eigen::Matrix<double, 2, 1> U_ideal =
-        loop_->K() * (loop_->R() - loop_->X_hat()) + FF_volts;
-
-    for (int i = 0; i < 2; i++) {
-      loop_->mutable_U()[i] = ::aos::Clip(U_ideal[i], -12, 12);
-    }
-  } else {
-    // Any motor is not in gear.  Speed match.
-    ::Eigen::Matrix<double, 1, 1> R_left;
-    ::Eigen::Matrix<double, 1, 1> R_right;
-    R_left(0, 0) = left_motor_speed;
-    R_right(0, 0) = right_motor_speed;
-
-    const double wiggle =
-        (static_cast<double>((counter_ % 20) / 10) - 0.5) * 5.0;
-
-    loop_->mutable_U(0, 0) = ::aos::Clip(
-        (R_left / Kv)(0, 0) + (IsInGear(left_gear_) ? 0 : wiggle), -12.0, 12.0);
-    loop_->mutable_U(1, 0) =
-        ::aos::Clip((R_right / Kv)(0, 0) + (IsInGear(right_gear_) ? 0 : wiggle),
-                    -12.0, 12.0);
-    loop_->mutable_U() *= 12.0 / ::aos::robot_state->voltage_battery;
-  }
-}
-
-void PolyDrivetrain::SendMotors(
-    ::y2014::control_loops::DrivetrainQueue::Output *output) {
-  if (output != NULL) {
-    output->left_voltage = loop_->U(0, 0);
-    output->right_voltage = loop_->U(1, 0);
-    output->left_high = left_gear_ == HIGH || left_gear_ == SHIFTING_UP;
-    output->right_high = right_gear_ == HIGH || right_gear_ == SHIFTING_UP;
-  }
-}
-
-constexpr double PolyDrivetrain::kStallTorque;
-constexpr double PolyDrivetrain::kStallCurrent;
-constexpr double PolyDrivetrain::kFreeSpeed;
-constexpr double PolyDrivetrain::kFreeCurrent;
-constexpr double PolyDrivetrain::kWheelRadius;
-constexpr double PolyDrivetrain::kR;
-constexpr double PolyDrivetrain::Kv;
-constexpr double PolyDrivetrain::Kt;
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2014
diff --git a/y2014/control_loops/drivetrain/polydrivetrain.h b/y2014/control_loops/drivetrain/polydrivetrain.h
deleted file mode 100644
index 5cd7fff..0000000
--- a/y2014/control_loops/drivetrain/polydrivetrain.h
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef Y2014_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_H_
-#define Y2014_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_H_
-
-#include "aos/common/controls/polytope.h"
-
-#include "y2014/constants.h"
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-#include "frc971/control_loops/state_feedback_loop.h"
-#include "y2014/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
-
-namespace y2014 {
-namespace control_loops {
-namespace drivetrain {
-
-class PolyDrivetrain {
- public:
-  enum Gear { HIGH, LOW, SHIFTING_UP, SHIFTING_DOWN };
-  // Stall Torque in N m
-  static constexpr double kStallTorque = drivetrain::kStallTorque;
-  // Stall Current in Amps
-  static constexpr double kStallCurrent = drivetrain::kStallCurrent;
-  // Free Speed in RPM. Used number from last year.
-  static constexpr double kFreeSpeed = drivetrain::kFreeSpeedRPM;
-  // Free Current in Amps
-  static constexpr double kFreeCurrent = drivetrain::kFreeCurrent;
-  static constexpr double kWheelRadius = drivetrain::kWheelRadius;
-  // Resistance of the motor, divided by the number of motors per side.
-  static constexpr double kR = drivetrain::kR;
-  // Motor velocity constant
-  static constexpr double Kv = drivetrain::kV;
-
-  // Torque constant
-  static constexpr double Kt = drivetrain::kT;
-
-  PolyDrivetrain(StateFeedbackLoop<7, 2, 3> *kf);
-
-  int controller_index() const { return loop_->controller_index(); }
-
-  static bool IsInGear(Gear gear) { return gear == LOW || gear == HIGH; }
-
-  // Computes the speed of the motor given the hall effect position and the
-  // speed of the robot.
-  static double MotorSpeed(const constants::ShifterHallEffect &hall_effect,
-                           double shifter_position, double velocity);
-
-  // Computes the states of the shifters for the left and right drivetrain sides
-  // given a requested state.
-  void UpdateGears(Gear requested_gear);
-
-  // Computes the next state of a shifter given the current state and the
-  // requested state.
-  static Gear UpdateSingleGear(Gear requested_gear, Gear current_gear);
-
-  void SetGoal(double wheel, double throttle, bool quickturn, bool highgear);
-
-  void SetPosition(
-      const ::y2014::control_loops::DrivetrainQueue::Position *position);
-
-  double FilterVelocity(double throttle);
-
-  double MaxVelocity();
-
-  void Update();
-
-  void SendMotors(::y2014::control_loops::DrivetrainQueue::Output *output);
-
- private:
-  StateFeedbackLoop<7, 2, 3> *kf_;
-  const ::aos::controls::HPolytope<2> U_Poly_;
-
-  ::std::unique_ptr<StateFeedbackLoop<2, 2, 2>> loop_;
-
-  const double ttrust_;
-  double wheel_;
-  double throttle_;
-  bool quickturn_;
-  int stale_count_;
-  double position_time_delta_;
-  Gear left_gear_;
-  Gear right_gear_;
-  ::y2014::control_loops::DrivetrainQueue::Position last_position_;
-  ::y2014::control_loops::DrivetrainQueue::Position position_;
-  int counter_;
-};
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2014
-
-#endif  // Y2014_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_H_
diff --git a/y2014/control_loops/drivetrain/replay_drivetrain.cc b/y2014/control_loops/drivetrain/replay_drivetrain.cc
deleted file mode 100644
index b0ac33f..0000000
--- a/y2014/control_loops/drivetrain/replay_drivetrain.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "aos/common/controls/replay_control_loop.h"
-#include "aos/linux_code/init.h"
-
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-#include "frc971/queues/gyro.q.h"
-
-// Reads one or more log files and sends out all the queue messages (in the
-// correct order and at the correct time) to feed a "live" drivetrain process.
-
-int main(int argc, char **argv) {
-  if (argc <= 1) {
-    fprintf(stderr, "Need at least one file to replay!\n");
-    return EXIT_FAILURE;
-  }
-
-  ::aos::InitNRT();
-
-  {
-    ::aos::controls::ControlLoopReplayer<
-        ::y2014::control_loops::DrivetrainQueue>
-        replayer(&::y2014::control_loops::drivetrain_queue, "drivetrain");
-
-    replayer.AddDirectQueueSender("wpilib_interface.Gyro", "sending",
-                                  ::frc971::sensors::gyro_reading);
-    for (int i = 1; i < argc; ++i) {
-      replayer.ProcessFile(argv[i]);
-    }
-  }
-  ::frc971::sensors::gyro_reading.Clear();
-  ::y2014::control_loops::drivetrain_queue.goal.Clear();
-  ::y2014::control_loops::drivetrain_queue.status.Clear();
-  ::y2014::control_loops::drivetrain_queue.position.Clear();
-  ::y2014::control_loops::drivetrain_queue.output.Clear();
-
-  ::aos::Cleanup();
-}
diff --git a/y2014/control_loops/drivetrain/ssdrivetrain.cc b/y2014/control_loops/drivetrain/ssdrivetrain.cc
deleted file mode 100644
index 45ab4eb..0000000
--- a/y2014/control_loops/drivetrain/ssdrivetrain.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-#include "y2014/control_loops/drivetrain/ssdrivetrain.h"
-
-#include "aos/common/controls/polytope.h"
-#include "aos/common/commonmath.h"
-#include "aos/common/logging/matrix_logging.h"
-
-#include "frc971/control_loops/state_feedback_loop.h"
-#include "frc971/control_loops/coerce_goal.h"
-#include "y2014/constants.h"
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-
-namespace y2014 {
-namespace control_loops {
-namespace drivetrain {
-
-using ::frc971::control_loops::DoCoerceGoal;
-
-DrivetrainMotorsSS::LimitedDrivetrainLoop::LimitedDrivetrainLoop(
-    StateFeedbackLoop<4, 2, 2> &&loop)
-    : StateFeedbackLoop<4, 2, 2>(::std::move(loop)),
-      U_Poly_((Eigen::Matrix<double, 4, 2>() << 1, 0, -1, 0, 0, 1, 0, -1)
-                  .finished(),
-              (Eigen::Matrix<double, 4, 1>() << 12.0, 12.0, 12.0, 12.0)
-                  .finished()) {
-  ::aos::controls::HPolytope<0>::Init();
-  T << 1, -1, 1, 1;
-  T_inverse = T.inverse();
-}
-
-void DrivetrainMotorsSS::LimitedDrivetrainLoop::CapU() {
-  const Eigen::Matrix<double, 4, 1> error = R() - X_hat();
-
-  if (::std::abs(U(0, 0)) > 12.0 || ::std::abs(U(1, 0)) > 12.0) {
-    mutable_U() =
-        U() * 12.0 / ::std::max(::std::abs(U(0, 0)), ::std::abs(U(1, 0)));
-    LOG_MATRIX(DEBUG, "U is now", U());
-    // TODO(Austin): Figure out why the polytope stuff wasn't working and
-    // remove this hack.
-    output_was_capped_ = true;
-    return;
-
-    LOG_MATRIX(DEBUG, "U at start", U());
-    LOG_MATRIX(DEBUG, "R at start", R());
-    LOG_MATRIX(DEBUG, "Xhat at start", X_hat());
-
-    Eigen::Matrix<double, 2, 2> position_K;
-    position_K << K(0, 0), K(0, 2), K(1, 0), K(1, 2);
-    Eigen::Matrix<double, 2, 2> velocity_K;
-    velocity_K << K(0, 1), K(0, 3), K(1, 1), K(1, 3);
-
-    Eigen::Matrix<double, 2, 1> position_error;
-    position_error << error(0, 0), error(2, 0);
-    const auto drive_error = T_inverse * position_error;
-    Eigen::Matrix<double, 2, 1> velocity_error;
-    velocity_error << error(1, 0), error(3, 0);
-    LOG_MATRIX(DEBUG, "error", error);
-
-    const auto &poly = U_Poly_;
-    const Eigen::Matrix<double, 4, 2> pos_poly_H = poly.H() * position_K * T;
-    const Eigen::Matrix<double, 4, 1> pos_poly_k =
-        poly.k() - poly.H() * velocity_K * velocity_error;
-    const ::aos::controls::HPolytope<2> pos_poly(pos_poly_H, pos_poly_k);
-
-    Eigen::Matrix<double, 2, 1> adjusted_pos_error;
-    {
-      const auto &P = drive_error;
-
-      Eigen::Matrix<double, 1, 2> L45;
-      L45 << ::aos::sign(P(1, 0)), -::aos::sign(P(0, 0));
-      const double w45 = 0;
-
-      Eigen::Matrix<double, 1, 2> LH;
-      if (::std::abs(P(0, 0)) > ::std::abs(P(1, 0))) {
-        LH << 0, 1;
-      } else {
-        LH << 1, 0;
-      }
-      const double wh = LH.dot(P);
-
-      Eigen::Matrix<double, 2, 2> standard;
-      standard << L45, LH;
-      Eigen::Matrix<double, 2, 1> W;
-      W << w45, wh;
-      const Eigen::Matrix<double, 2, 1> intersection = standard.inverse() * W;
-
-      bool is_inside_h;
-      const auto adjusted_pos_error_h =
-          DoCoerceGoal(pos_poly, LH, wh, drive_error, &is_inside_h);
-      const auto adjusted_pos_error_45 =
-          DoCoerceGoal(pos_poly, L45, w45, intersection, nullptr);
-      if (pos_poly.IsInside(intersection)) {
-        adjusted_pos_error = adjusted_pos_error_h;
-      } else {
-        if (is_inside_h) {
-          if (adjusted_pos_error_h.norm() > adjusted_pos_error_45.norm() ||
-              adjusted_pos_error_45.norm() > intersection.norm()) {
-            adjusted_pos_error = adjusted_pos_error_h;
-          } else {
-            adjusted_pos_error = adjusted_pos_error_45;
-          }
-        } else {
-          adjusted_pos_error = adjusted_pos_error_45;
-        }
-      }
-    }
-
-    LOG_MATRIX(DEBUG, "adjusted_pos_error", adjusted_pos_error);
-    mutable_U() =
-        velocity_K * velocity_error + position_K * T * adjusted_pos_error;
-    LOG_MATRIX(DEBUG, "U is now", U());
-  } else {
-    output_was_capped_ = false;
-  }
-}
-
-DrivetrainMotorsSS::DrivetrainMotorsSS()
-    : loop_(new LimitedDrivetrainLoop(
-          constants::GetValues().make_drivetrain_loop())),
-      filtered_offset_(0.0),
-      gyro_(0.0),
-      left_goal_(0.0),
-      right_goal_(0.0),
-      raw_left_(0.0),
-      raw_right_(0.0) {
-  // High gear on both.
-  loop_->set_controller_index(3);
-}
-
-void DrivetrainMotorsSS::SetGoal(double left, double left_velocity,
-                                 double right, double right_velocity) {
-  left_goal_ = left;
-  right_goal_ = right;
-  loop_->mutable_R() << left, left_velocity, right, right_velocity;
-}
-void DrivetrainMotorsSS::SetRawPosition(double left, double right) {
-  raw_right_ = right;
-  raw_left_ = left;
-  Eigen::Matrix<double, 2, 1> Y;
-  Y << left + filtered_offset_, right - filtered_offset_;
-  loop_->Correct(Y);
-}
-void DrivetrainMotorsSS::SetPosition(double left, double right, double gyro) {
-  // Decay the offset quickly because this gyro is great.
-  const double offset =
-      (right - left - gyro * constants::GetValues().turn_width) / 2.0;
-  filtered_offset_ = 0.25 * offset + 0.75 * filtered_offset_;
-  gyro_ = gyro;
-  SetRawPosition(left, right);
-}
-
-void DrivetrainMotorsSS::SetExternalMotors(double left_voltage,
-                                           double right_voltage) {
-  loop_->mutable_U() << left_voltage, right_voltage;
-}
-
-void DrivetrainMotorsSS::Update(bool stop_motors, bool enable_control_loop) {
-  if (enable_control_loop) {
-    loop_->Update(stop_motors);
-  } else {
-    if (stop_motors) {
-      loop_->mutable_U().setZero();
-      loop_->mutable_U_uncapped().setZero();
-    }
-    loop_->UpdateObserver(loop_->U());
-  }
-  ::Eigen::Matrix<double, 4, 1> E = loop_->R() - loop_->X_hat();
-  LOG_MATRIX(DEBUG, "E", E);
-}
-
-double DrivetrainMotorsSS::GetEstimatedRobotSpeed() const {
-  // lets just call the average of left and right velocities close enough
-  return (loop_->X_hat(1, 0) + loop_->X_hat(3, 0)) / 2;
-}
-
-void DrivetrainMotorsSS::SendMotors(
-    ::y2014::control_loops::DrivetrainQueue::Output *output) const {
-  if (output) {
-    output->left_voltage = loop_->U(0, 0);
-    output->right_voltage = loop_->U(1, 0);
-    output->left_high = true;
-    output->right_high = true;
-  }
-}
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2014
diff --git a/y2014/control_loops/drivetrain/ssdrivetrain.h b/y2014/control_loops/drivetrain/ssdrivetrain.h
deleted file mode 100644
index 1964ac5..0000000
--- a/y2014/control_loops/drivetrain/ssdrivetrain.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef Y2014_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_
-#define Y2014_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_
-
-#include "aos/common/controls/polytope.h"
-#include "aos/common/commonmath.h"
-#include "aos/common/logging/matrix_logging.h"
-
-#include "frc971/control_loops/state_feedback_loop.h"
-#include "frc971/control_loops/coerce_goal.h"
-#include "y2014/constants.h"
-#include "y2014/control_loops/drivetrain/drivetrain.q.h"
-
-namespace y2014 {
-namespace control_loops {
-namespace drivetrain {
-
-class DrivetrainMotorsSS {
- public:
-  class LimitedDrivetrainLoop : public StateFeedbackLoop<4, 2, 2> {
-   public:
-    LimitedDrivetrainLoop(StateFeedbackLoop<4, 2, 2> &&loop);
-
-    bool output_was_capped() const {
-      return output_was_capped_;
-    }
-
-   private:
-    void CapU() override;
-
-    const ::aos::controls::HPolytope<2> U_Poly_;
-    Eigen::Matrix<double, 2, 2> T, T_inverse;
-    bool output_was_capped_ = false;;
-  };
-
-  DrivetrainMotorsSS();
-
-  void SetGoal(double left, double left_velocity, double right,
-               double right_velocity);
-
-  void SetRawPosition(double left, double right);
-
-  void SetPosition(double left, double right, double gyro);
-
-  void SetExternalMotors(double left_voltage, double right_voltage);
-
-  void Update(bool stop_motors, bool enable_control_loop);
-
-  double GetEstimatedRobotSpeed() const;
-
-  double GetEstimatedLeftEncoder() const {
-    return loop_->X_hat(0, 0);
-  }
-
-  double left_velocity() const { return loop_->X_hat(1, 0); }
-  double right_velocity() const { return loop_->X_hat(3, 0); }
-
-  double GetEstimatedRightEncoder() const {
-    return loop_->X_hat(2, 0);
-  }
-
-  bool OutputWasCapped() const {
-    return loop_->output_was_capped();
-  }
-
-  void SendMotors(
-      ::y2014::control_loops::DrivetrainQueue::Output *output) const;
-
-  const LimitedDrivetrainLoop &loop() const { return *loop_; }
-
- private:
-  ::std::unique_ptr<LimitedDrivetrainLoop> loop_;
-
-  double filtered_offset_;
-  double gyro_;
-  double left_goal_;
-  double right_goal_;
-  double raw_left_;
-  double raw_right_;
-};
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2014
-
-#endif  // Y2014_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_
