diff --git a/frc971/control_loops/drivetrain/BUILD b/frc971/control_loops/drivetrain/BUILD
new file mode 100644
index 0000000..369de78
--- /dev/null
+++ b/frc971/control_loops/drivetrain/BUILD
@@ -0,0 +1,121 @@
+package(default_visibility = ['//visibility:public'])
+
+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',
+  ],
+)
+
+cc_library(
+  name = 'drivetrain_config',
+  hdrs = [
+    'drivetrain_config.h',
+  ],
+  deps = [
+    '//frc971/control_loops:state_feedback_loop',
+    '//frc971:shifter_hall_effect',
+  ],
+)
+
+cc_library(
+  name = 'ssdrivetrain',
+  srcs = [
+    'ssdrivetrain.cc',
+  ],
+  hdrs = [
+    'ssdrivetrain.h',
+  ],
+  deps = [
+    ':drivetrain_queue',
+    ':drivetrain_config',
+    '//aos/common/controls:polytope',
+    '//aos/common:math',
+    '//aos/common/messages:robot_state',
+    '//frc971/control_loops:state_feedback_loop',
+    '//frc971/control_loops:coerce_goal',
+    '//frc971:shifter_hall_effect',
+    '//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',
+    ':drivetrain_config',
+    '//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',
+    '//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',
+    ':drivetrain_config',
+    '//aos/common/controls:control_loop_test',
+    '//frc971/control_loops:state_feedback_loop',
+    '//frc971/queues:gyro',
+    '//aos/common:queues',
+    '//y2014:constants',
+    '//y2014/control_loops/drivetrain:polydrivetrain_plants',
+  ],
+)
diff --git a/frc971/control_loops/drivetrain/drivetrain.cc b/frc971/control_loops/drivetrain/drivetrain.cc
new file mode 100644
index 0000000..ca395cb
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain.cc
@@ -0,0 +1,146 @@
+#include "frc971/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 "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/polydrivetrain.h"
+#include "frc971/control_loops/drivetrain/ssdrivetrain.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+#include "frc971/queues/gyro.q.h"
+#include "frc971/shifter_hall_effect.h"
+
+using frc971::sensors::gyro_reading;
+
+namespace frc971 {
+namespace control_loops {
+namespace drivetrain {
+
+DrivetrainLoop::DrivetrainLoop(
+    const DrivetrainConfig &dt_config,
+    ::frc971::control_loops::DrivetrainQueue *my_drivetrain)
+    : aos::controls::ControlLoop<::frc971::control_loops::DrivetrainQueue>(
+          my_drivetrain),
+      dt_config_(dt_config),
+      kf_(dt_config_.make_kf_drivetrain_loop()) {
+  ::aos::controls::HPolytope<0>::Init();
+}
+
+void DrivetrainLoop::RunIteration(
+    const ::frc971::control_loops::DrivetrainQueue::Goal *goal,
+    const ::frc971::control_loops::DrivetrainQueue::Position *position,
+    ::frc971::control_loops::DrivetrainQueue::Output *output,
+    ::frc971::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_ += dt_config_.dt *
+                              (kf_.X_hat(3, 0) - kf_.X_hat(1, 0)) /
+                              (dt_config_.robot_radius * 2.0);
+  }
+
+  bool control_loop_driving = false;
+  if (goal) {
+    double wheel = goal->steering;
+    double throttle = goal->throttle;
+    bool quickturn = goal->quickturn;
+    bool highgear = goal->highgear;
+
+    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);
+    dt_openloop_.SetGoal(wheel, throttle, quickturn, highgear);
+  }
+
+  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 frc971
diff --git a/frc971/control_loops/drivetrain/drivetrain.h b/frc971/control_loops/drivetrain/drivetrain.h
new file mode 100644
index 0000000..22a6c32
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain.h
@@ -0,0 +1,58 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
+#define FRC971_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 "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/polydrivetrain.h"
+#include "frc971/control_loops/drivetrain/ssdrivetrain.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+#include "aos/common/util/log_interval.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace drivetrain {
+
+class DrivetrainLoop : public aos::controls::ControlLoop<
+                           ::frc971::control_loops::DrivetrainQueue> {
+ public:
+  // Constructs a control loop which can take a Drivetrain or defaults to the
+  // drivetrain at frc971::control_loops::drivetrain
+  explicit DrivetrainLoop(const DrivetrainConfig &dt_config,
+      ::frc971::control_loops::DrivetrainQueue *my_drivetrain =
+          &::frc971::control_loops::drivetrain_queue);
+
+ protected:
+  // Executes one cycle of the control loop.
+  virtual void RunIteration(
+      const ::frc971::control_loops::DrivetrainQueue::Goal *goal,
+      const ::frc971::control_loops::DrivetrainQueue::Position *position,
+      ::frc971::control_loops::DrivetrainQueue::Output *output,
+      ::frc971::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;
+
+  const DrivetrainConfig dt_config_;
+
+  PolyDrivetrain dt_openloop_{dt_config_};
+  DrivetrainMotorsSS dt_closedloop_{dt_config_};
+  StateFeedbackLoop<7, 2, 3> kf_;
+
+  double last_left_voltage_ = 0;
+  double last_right_voltage_ = 0;
+
+  double integrated_kf_heading_ = 0;
+};
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
diff --git a/frc971/control_loops/drivetrain/drivetrain.q b/frc971/control_loops/drivetrain/drivetrain.q
new file mode 100644
index 0000000..b4a71ec
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain.q
@@ -0,0 +1,126 @@
+package frc971.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/frc971/control_loops/drivetrain/drivetrain_config.h b/frc971/control_loops/drivetrain/drivetrain_config.h
new file mode 100644
index 0000000..07fbe93
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_config.h
@@ -0,0 +1,54 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_CONSTANTS_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_CONSTANTS_H_
+
+#include <functional>
+
+#include "frc971/shifter_hall_effect.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace drivetrain {
+
+enum class ShifterType : int32_t {
+  HALL_EFFECT_SHIFTER = 0,  // Detect when inbetween gears.
+  SIMPLE_SHIFTER = 1,  // Switch gears without speedmatch logic.
+};
+
+struct DrivetrainConfig {
+  // Shifting method we are using.
+  ShifterType shifter_type;
+
+  // Polydrivetrain functions returning various controller loops with plants.
+  ::std::function<StateFeedbackLoop<4, 2, 2>()> make_drivetrain_loop;
+  ::std::function<StateFeedbackLoop<2, 2, 2>()> make_v_drivetrain_loop;
+  ::std::function<StateFeedbackLoop<7, 2, 3>()> make_kf_drivetrain_loop;
+
+  double dt;  // Control loop time step.
+  double stall_torque;  // Stall torque in N m.
+  double stall_current;  // Stall current in amps.
+  double free_speed_rpm;  // Free speed in rpm.
+  double free_current;  // Free current in amps.
+  double j;  // CIM moment of inertia in kg m^2.
+  double mass;  // Mass of the robot.
+  double robot_radius;  // Robot radius, in meters.
+  double wheel_radius;  // Wheel radius, in meters.
+  double r;  // Motor resistance.
+  double v;  // Motor velocity constant.
+  double t;  // Torque constant.
+
+  double turn_width;  // Robot turn width, in meters.
+  // Gear ratios, from encoder shaft to transmission output.
+  double high_gear_ratio;
+  double low_gear_ratio;
+
+  // Hall effect constants. Unused if not applicable to shifter type.
+  constants::ShifterHallEffect left_drive;
+  constants::ShifterHallEffect right_drive;
+};
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_CONSTANTS_H_
diff --git a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
new file mode 100644
index 0000000..9db00b5
--- /dev/null
+++ b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
@@ -0,0 +1,332 @@
+#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/constants.h"
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.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 "y2014/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
+#include "y2014/control_loops/drivetrain/kalman_drivetrain_motor_plant.h"
+#include "frc971/queues/gyro.q.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace drivetrain {
+namespace testing {
+
+using ::y2014::control_loops::drivetrain::MakeDrivetrainPlant;
+
+// TODO(Comran): Make one that doesn't depend on the actual values for a
+// specific robot.
+const 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,
+
+    ::y2014::control_loops::drivetrain::kDt,
+    ::y2014::control_loops::drivetrain::kStallTorque,
+    ::y2014::control_loops::drivetrain::kStallCurrent,
+    ::y2014::control_loops::drivetrain::kFreeSpeedRPM,
+    ::y2014::control_loops::drivetrain::kFreeCurrent,
+    ::y2014::control_loops::drivetrain::kJ,
+    ::y2014::control_loops::drivetrain::kMass,
+    ::y2014::control_loops::drivetrain::kRobotRadius,
+    ::y2014::control_loops::drivetrain::kWheelRadius,
+    ::y2014::control_loops::drivetrain::kR,
+    ::y2014::control_loops::drivetrain::kV,
+    ::y2014::control_loops::drivetrain::kT,
+
+    ::y2014::constants::GetValuesForTeam(971).turn_width,
+    ::y2014::constants::GetValuesForTeam(971).high_gear_ratio,
+    ::y2014::constants::GetValuesForTeam(971).low_gear_ratio,
+    ::y2014::constants::GetValuesForTeam(971).left_drive,
+    ::y2014::constants::GetValuesForTeam(971).right_drive
+};
+
+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_(".frc971.control_loops.drivetrain",
+                       0x8a8dde77, ".frc971.control_loops.drivetrain.goal",
+                       ".frc971.control_loops.drivetrain.position",
+                       ".frc971.control_loops.drivetrain.output",
+                       ".frc971.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<::frc971::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:
+  ::frc971::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.
+  ::frc971::control_loops::DrivetrainQueue my_drivetrain_queue_;
+
+  // Create a loop and simulation plant.
+  DrivetrainLoop drivetrain_motor_;
+  DrivetrainSimulation drivetrain_motor_plant_;
+
+  DrivetrainTest() : my_drivetrain_queue_(".frc971.control_loops.drivetrain",
+                               0x8a8dde77,
+                               ".frc971.control_loops.drivetrain.goal",
+                               ".frc971.control_loops.drivetrain.position",
+                               ".frc971.control_loops.drivetrain.output",
+                               ".frc971.control_loops.drivetrain.status"),
+                drivetrain_motor_(kDrivetrainConfig, &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 frc971
diff --git a/frc971/control_loops/drivetrain/polydrivetrain.cc b/frc971/control_loops/drivetrain/polydrivetrain.cc
new file mode 100644
index 0000000..dd9354e
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain.cc
@@ -0,0 +1,373 @@
+#include "frc971/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 "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace drivetrain {
+
+using ::frc971::control_loops::GearLogging;
+using ::frc971::control_loops::CIMLogging;
+using ::frc971::control_loops::CoerceGoal;
+
+PolyDrivetrain::PolyDrivetrain(const DrivetrainConfig &dt_config)
+    : kf_(dt_config.make_kf_drivetrain_loop()),
+      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>(dt_config.make_v_drivetrain_loop())),
+      ttrust_(1.1),
+      wheel_(0.0),
+      throttle_(0.0),
+      quickturn_(false),
+      stale_count_(0),
+      position_time_delta_(dt_config.dt),
+      left_gear_(LOW),
+      right_gear_(LOW),
+      counter_(0),
+      dt_config_(dt_config) {
+  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 / dt_config_.high_gear_ratio / dt_config_.wheel_radius;
+  } else {
+    return velocity / dt_config_.low_gear_ratio / dt_config_.wheel_radius;
+  }
+}
+
+PolyDrivetrain::Gear PolyDrivetrain::UpdateSingleGear(Gear requested_gear,
+                                                      Gear current_gear) {
+  const Gear shift_up =
+      (dt_config_.shifter_type == ShifterType::HALL_EFFECT_SHIFTER)
+          ? SHIFTING_UP
+          : HIGH;
+  const Gear shift_down =
+      (dt_config_.shifter_type == ShifterType::HALL_EFFECT_SHIFTER)
+          ? SHIFTING_DOWN
+          : LOW;
+  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;
+
+  if (dt_config_.shifter_type == ShifterType::SIMPLE_SHIFTER) {
+    // Force the right controller for simple shifters since we assume that
+    // gear switching is instantaneous.
+    if (highgear) {
+      loop_->set_controller_index(3);
+    } else {
+      loop_->set_controller_index(0);
+    }
+  }
+
+  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 ::frc971::control_loops::DrivetrainQueue::Position *position) {
+  if (position == NULL) {
+    ++stale_count_;
+  } else {
+    last_position_ = position_;
+    position_ = *position;
+    position_time_delta_ = (stale_count_ + 1) * dt_config_.dt;
+    stale_count_ = 0;
+  }
+
+  if (dt_config_.shifter_type == ShifterType::HALL_EFFECT_SHIFTER && position) {
+    GearLogging gear_logging;
+    // Switch to the correct controller.
+    const double left_middle_shifter_position =
+        (dt_config_.left_drive.clear_high + dt_config_.left_drive.clear_low) /
+        2.0;
+    const double right_middle_shifter_position =
+        (dt_config_.right_drive.clear_high + dt_config_.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 > dt_config_.left_drive.clear_high &&
+        left_gear_ == SHIFTING_UP) {
+      left_gear_ = HIGH;
+    }
+    if (position->left_shifter_position < dt_config_.left_drive.clear_low &&
+        left_gear_ == SHIFTING_DOWN) {
+      left_gear_ = LOW;
+    }
+    if (position->right_shifter_position > dt_config_.right_drive.clear_high &&
+        right_gear_ == SHIFTING_UP) {
+      right_gear_ = HIGH;
+    }
+    if (position->right_shifter_position < dt_config_.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);
+
+  // TODO(austin): Observer for the current velocity instead of difference
+  // calculations.
+  ++counter_;
+
+  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 {
+    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(dt_config_.left_drive, position_.left_shifter_position,
+                   current_left_velocity);
+    const double right_motor_speed =
+        MotorSpeed(dt_config_.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);
+    }
+
+    // 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 / dt_config_.v)(0, 0) + (IsInGear(left_gear_) ? 0 : wiggle),
+        -12.0, 12.0);
+    loop_->mutable_U(1, 0) = ::aos::Clip(
+        (R_right / dt_config_.v)(0, 0) + (IsInGear(right_gear_) ? 0 : wiggle),
+        -12.0, 12.0);
+    loop_->mutable_U() *= 12.0 / ::aos::robot_state->voltage_battery;
+  }
+}
+
+void PolyDrivetrain::SendMotors(
+    ::frc971::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;
+  }
+}
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace frc971
diff --git a/frc971/control_loops/drivetrain/polydrivetrain.h b/frc971/control_loops/drivetrain/polydrivetrain.h
new file mode 100644
index 0000000..1ba7eee
--- /dev/null
+++ b/frc971/control_loops/drivetrain/polydrivetrain.h
@@ -0,0 +1,75 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_H_
+
+#include "aos/common/controls/polytope.h"
+
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace drivetrain {
+
+class PolyDrivetrain {
+ public:
+  enum Gear { HIGH, LOW, SHIFTING_UP, SHIFTING_DOWN };
+
+  PolyDrivetrain(const DrivetrainConfig &dt_config);
+
+  int controller_index() const { return loop_->controller_index(); }
+
+  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.
+  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.
+  Gear UpdateSingleGear(Gear requested_gear, Gear current_gear);
+
+  void SetGoal(double wheel, double throttle, bool quickturn, bool highgear);
+
+  void SetPosition(
+      const ::frc971::control_loops::DrivetrainQueue::Position *position);
+
+  double FilterVelocity(double throttle);
+
+  double MaxVelocity();
+
+  void Update();
+
+  void SendMotors(::frc971::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_;
+  ::frc971::control_loops::DrivetrainQueue::Position last_position_;
+  ::frc971::control_loops::DrivetrainQueue::Position position_;
+  int counter_;
+  DrivetrainConfig dt_config_;
+};
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_POLYDRIVETRAIN_H_
diff --git a/frc971/control_loops/drivetrain/replay_drivetrain.cc b/frc971/control_loops/drivetrain/replay_drivetrain.cc
new file mode 100644
index 0000000..c535607
--- /dev/null
+++ b/frc971/control_loops/drivetrain/replay_drivetrain.cc
@@ -0,0 +1,36 @@
+#include "aos/common/controls/replay_control_loop.h"
+#include "aos/linux_code/init.h"
+
+#include "frc971/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<
+        ::frc971::control_loops::DrivetrainQueue>
+        replayer(&::frc971::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();
+  ::frc971::control_loops::drivetrain_queue.goal.Clear();
+  ::frc971::control_loops::drivetrain_queue.status.Clear();
+  ::frc971::control_loops::drivetrain_queue.position.Clear();
+  ::frc971::control_loops::drivetrain_queue.output.Clear();
+
+  ::aos::Cleanup();
+}
diff --git a/frc971/control_loops/drivetrain/ssdrivetrain.cc b/frc971/control_loops/drivetrain/ssdrivetrain.cc
new file mode 100644
index 0000000..049b576
--- /dev/null
+++ b/frc971/control_loops/drivetrain/ssdrivetrain.cc
@@ -0,0 +1,188 @@
+#include "frc971/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 "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+
+namespace frc971 {
+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(const DrivetrainConfig &dt_config)
+    : loop_(
+          new LimitedDrivetrainLoop(dt_config.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),
+      dt_config_(dt_config) {
+  // 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 * dt_config_.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(
+    ::frc971::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 frc971
diff --git a/frc971/control_loops/drivetrain/ssdrivetrain.h b/frc971/control_loops/drivetrain/ssdrivetrain.h
new file mode 100644
index 0000000..1ed3eb7
--- /dev/null
+++ b/frc971/control_loops/drivetrain/ssdrivetrain.h
@@ -0,0 +1,87 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_
+#define FRC971_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 "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+
+namespace frc971 {
+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(const DrivetrainConfig &dt_config);
+
+  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(
+      ::frc971::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_;
+
+  const DrivetrainConfig dt_config_;
+};
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_
