diff --git a/y2018/wpilib_interface.cc b/y2018/wpilib_interface.cc
index 4ca6ef7..64f2ccf 100644
--- a/y2018/wpilib_interface.cc
+++ b/y2018/wpilib_interface.cc
@@ -104,7 +104,7 @@
 }
 
 double proximal_pot_translate(double voltage) {
-  return voltage * Values::kProximalPotRatio() *
+  return -voltage * Values::kProximalPotRatio() *
          (3.0 /*turns*/ / 5.0 /*volts*/) * (2 * M_PI /*radians*/);
 }
 
@@ -127,8 +127,9 @@
 // Returns value from 0.0 to 1.0, with 0.0 being close to low gear so it can be
 // passed drectly into the drivetrain position queue.
 double drivetrain_shifter_pot_translate(double voltage) {
-  return voltage / (Values::kDrivetrainShifterPotMaxVoltage() -
-                    Values::kDrivetrainShifterPotMinVoltage());
+  return (voltage - Values::kDrivetrainShifterPotMinVoltage()) /
+         (Values::kDrivetrainShifterPotMaxVoltage() -
+          Values::kDrivetrainShifterPotMinVoltage());
 }
 
 constexpr double kMaxFastEncoderPulsesPerSecond =
@@ -402,18 +403,18 @@
 
     {
       auto drivetrain_message = drivetrain_queue.position.MakeMessage();
-      drivetrain_message->right_encoder =
-          drivetrain_translate(drivetrain_right_encoder_->GetRaw());
-      drivetrain_message->right_speed =
-          drivetrain_velocity_translate(drivetrain_right_encoder_->GetPeriod());
+      drivetrain_message->left_encoder =
+          drivetrain_translate(drivetrain_left_encoder_->GetRaw());
+      drivetrain_message->left_speed =
+          drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod());
       drivetrain_message->left_shifter_position =
           drivetrain_shifter_pot_translate(
               left_drivetrain_shifter_->GetVoltage());
 
-      drivetrain_message->left_encoder =
-          -drivetrain_translate(drivetrain_left_encoder_->GetRaw());
-      drivetrain_message->left_speed =
-          drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod());
+      drivetrain_message->right_encoder =
+          -drivetrain_translate(drivetrain_right_encoder_->GetRaw());
+      drivetrain_message->right_speed =
+          -drivetrain_velocity_translate(drivetrain_right_encoder_->GetPeriod());
       drivetrain_message->right_shifter_position =
           drivetrain_shifter_pot_translate(
               right_drivetrain_shifter_->GetVoltage());
@@ -429,12 +430,12 @@
       CopyPosition(proximal_encoder_, &superstructure_message->arm.proximal,
                    Values::kProximalEncoderCountsPerRevolution(),
                    Values::kProximalEncoderRatio(), proximal_pot_translate,
-                   false, values.proximal.potentiometer_offset);
+                   true, values.arm_proximal.potentiometer_offset);
 
       CopyPosition(distal_encoder_, &superstructure_message->arm.distal,
                    Values::kDistalEncoderCountsPerRevolution(),
-                   Values::kDistalEncoderRatio(), distal_pot_translate, false,
-                   values.distal.potentiometer_offset);
+                   Values::kDistalEncoderRatio(), distal_pot_translate, true,
+                   values.arm_distal.potentiometer_offset);
 
       CopyPosition(left_intake_encoder_,
                    &superstructure_message->intake.left.motor_position,
@@ -446,15 +447,17 @@
                    &superstructure_message->intake.right.motor_position,
                    Values::kIntakeMotorEncoderCountsPerRevolution(),
                    Values::kIntakeMotorEncoderRatio(), intake_pot_translate,
-                   false, values.right_intake.potentiometer_offset);
+                   true, values.right_intake.potentiometer_offset);
 
       superstructure_message->intake.left.spring_angle =
-          intake_spring_translate(left_intake_spring_angle_->GetVoltage());
+          intake_spring_translate(left_intake_spring_angle_->GetVoltage()) +
+          values.left_intake.spring_offset;
       superstructure_message->intake.left.beam_break =
           left_intake_cube_detector_->Get();
 
       superstructure_message->intake.right.spring_angle =
-          intake_spring_translate(right_intake_spring_angle_->GetVoltage());
+          -intake_spring_translate(right_intake_spring_angle_->GetVoltage()) +
+          values.right_intake.spring_offset;
       superstructure_message->intake.right.beam_break =
           right_intake_cube_detector_->Get();
 
@@ -660,8 +663,8 @@
   virtual void Write() override {
     auto &queue = ::frc971::control_loops::drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    drivetrain_left_victor_->SetSpeed(-queue->left_voltage / 12.0);
-    drivetrain_right_victor_->SetSpeed(queue->right_voltage / 12.0);
+    drivetrain_left_victor_->SetSpeed(queue->left_voltage / 12.0);
+    drivetrain_right_victor_->SetSpeed(-queue->right_voltage / 12.0);
   }
 
   virtual void Stop() override {
@@ -708,7 +711,7 @@
     LOG_STRUCT(DEBUG, "will output", *queue);
 
     left_intake_elastic_victor_->SetSpeed(
-        ::aos::Clip(queue->intake.left.voltage_elastic, -kMaxBringupPower,
+        ::aos::Clip(-queue->intake.left.voltage_elastic, -kMaxBringupPower,
                     kMaxBringupPower) /
         12.0);
 
@@ -718,7 +721,7 @@
         12.0);
 
     left_intake_rollers_victor_->SetSpeed(
-        ::aos::Clip(queue->intake.right.voltage_rollers, -kMaxBringupPower,
+        ::aos::Clip(-queue->intake.right.voltage_rollers, -kMaxBringupPower,
                     kMaxBringupPower) /
         12.0);
 
@@ -727,7 +730,7 @@
                     kMaxBringupPower) /
         12.0);
 
-    proximal_victor_->SetSpeed(::aos::Clip(queue->voltage_proximal,
+    proximal_victor_->SetSpeed(::aos::Clip(-queue->voltage_proximal,
                                            -kMaxBringupPower,
                                            kMaxBringupPower) /
                                12.0);
@@ -774,35 +777,41 @@
 
     // TODO(Sabina): Update port numbers(Sensors and Victors)
     reader.set_drivetrain_left_encoder(make_encoder(0));
+    reader.set_left_drivetrain_shifter_potentiometer(
+        make_unique<AnalogInput>(6));
     reader.set_drivetrain_right_encoder(make_encoder(1));
+    reader.set_right_drivetrain_shifter_potentiometer(
+        make_unique<AnalogInput>(7));
 
-    reader.set_proximal_encoder(make_encoder(2));
+    reader.set_proximal_encoder(make_encoder(4));
     reader.set_proximal_absolute_pwm(make_unique<DigitalInput>(2));
     reader.set_proximal_potentiometer(make_unique<AnalogInput>(2));
 
-    reader.set_distal_encoder(make_encoder(3));
+    reader.set_distal_encoder(make_encoder(2));
     reader.set_distal_absolute_pwm(make_unique<DigitalInput>(3));
     reader.set_distal_potentiometer(make_unique<AnalogInput>(3));
 
-    reader.set_right_intake_encoder(make_encoder(4));
-    reader.set_right_intake_absolute_pwm(make_unique<DigitalInput>(4));
-    reader.set_right_intake_potentiometer(make_unique<AnalogInput>(4));
-    reader.set_right_intake_cube_detector(make_unique<DigitalInput>(6));
+    reader.set_right_intake_encoder(make_encoder(5));
+    reader.set_right_intake_absolute_pwm(make_unique<DigitalInput>(7));
+    reader.set_right_intake_potentiometer(make_unique<AnalogInput>(1));
+    reader.set_right_intake_spring_angle(make_unique<AnalogInput>(5));
+    reader.set_right_intake_cube_detector(make_unique<DigitalInput>(1));
 
-    reader.set_left_intake_encoder(make_encoder(5));
-    reader.set_left_intake_absolute_pwm(make_unique<DigitalInput>(5));
-    reader.set_left_intake_potentiometer(make_unique<AnalogInput>(5));
-    reader.set_left_intake_cube_detector(make_unique<DigitalInput>(7));
+    reader.set_left_intake_encoder(make_encoder(3));
+    reader.set_left_intake_absolute_pwm(make_unique<DigitalInput>(4));
+    reader.set_left_intake_potentiometer(make_unique<AnalogInput>(0));
+    reader.set_left_intake_spring_angle(make_unique<AnalogInput>(4));
+    reader.set_left_intake_cube_detector(make_unique<DigitalInput>(0));
 
     reader.set_autonomous_mode(0, make_unique<DigitalInput>(9));
     reader.set_autonomous_mode(1, make_unique<DigitalInput>(8));
 
-    reader.set_pwm_trigger(make_unique<DigitalInput>(0));
+    reader.set_pwm_trigger(make_unique<DigitalInput>(25));
 
     reader.set_dma(make_unique<DMA>());
     ::std::thread reader_thread(::std::ref(reader));
 
-    auto imu_trigger = make_unique<DigitalInput>(3);
+    auto imu_trigger = make_unique<DigitalInput>(5);
     ::frc971::wpilib::ADIS16448 imu(SPI::Port::kOnboardCS1, imu_trigger.get());
     imu.SetDummySPI(SPI::Port::kOnboardCS2);
     auto imu_reset = make_unique<DigitalOutput>(6);
@@ -815,24 +824,26 @@
 
     DrivetrainWriter drivetrain_writer;
     drivetrain_writer.set_drivetrain_left_victor(
-        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(7)));
+        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(2)));
     drivetrain_writer.set_drivetrain_right_victor(
         ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(3)));
     ::std::thread drivetrain_writer_thread(::std::ref(drivetrain_writer));
 
     SuperstructureWriter superstructure_writer;
     superstructure_writer.set_left_intake_elastic_victor(
-        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(1)));
-    superstructure_writer.set_right_intake_elastic_victor(
         ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(4)));
-    superstructure_writer.set_right_intake_rollers_victor(
-        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(6)));
     superstructure_writer.set_left_intake_rollers_victor(
         ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(5)));
+    superstructure_writer.set_right_intake_elastic_victor(
+        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(7)));
+    superstructure_writer.set_right_intake_rollers_victor(
+        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(6)));
     superstructure_writer.set_proximal_victor(
-        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(9)));
+        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(0)));
     superstructure_writer.set_distal_victor(
-        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(8)));
+        ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(1)));
+
+    // Hanger: victor 8
 
     ::std::thread superstructure_writer_thread(
         ::std::ref(superstructure_writer));
