diff --git a/frc971/autonomous/auto.cc b/frc971/autonomous/auto.cc
index 3549f07..31d6dab 100644
--- a/frc971/autonomous/auto.cc
+++ b/frc971/autonomous/auto.cc
@@ -121,9 +121,9 @@
 void PositionClawForShot() {
   // Turn the claw on, keep it straight up until the ball has been grabbed.
   if (!control_loops::claw_queue_group.goal.MakeWithBuilder()
-           .bottom_angle(0.9)
-           .separation_angle(0.1)
-           .intake(3.0)
+           .bottom_angle(0.85)
+           .separation_angle(0.10)
+           .intake(4.0)
            .centering(1.0)
            .Send()) {
     LOG(WARNING, "sending claw goal failed\n");
@@ -131,6 +131,7 @@
 }
 
 void SetShotPower(double power) {
+  LOG(INFO, "Setting shot power to %f\n", power);
   if (!control_loops::shooter_queue_group.goal.MakeWithBuilder()
            .shot_power(power)
            .shot_requested(false)
@@ -159,13 +160,15 @@
 }
 
 ::std::unique_ptr<TypedAction< ::frc971::actions::DrivetrainActionQueueGroup>>
-SetDriveGoal(double distance, double maximum_velocity = 1.5) {
+SetDriveGoal(double distance, double maximum_velocity = 1.7) {
+  LOG(INFO, "Driving to %f\n", distance);
   auto drivetrain_action = actions::MakeDrivetrainAction();
   drivetrain_action->GetGoal()->left_initial_position = left_initial_position;
   drivetrain_action->GetGoal()->right_initial_position = right_initial_position;
   drivetrain_action->GetGoal()->y_offset = distance;
   drivetrain_action->GetGoal()->maximum_velocity = maximum_velocity;
   drivetrain_action->Start();
+  // Uncomment to make relative again.
   left_initial_position += distance;
   right_initial_position += distance;
   return ::std::move(drivetrain_action);
@@ -184,7 +187,39 @@
 
 }
 
+void WaitUntilClawDone() {
+  while (true) {
+    // Poll the running bit and auto done bits.
+    ::aos::time::PhasedLoop10MS(5000);
+    control_loops::claw_queue_group.status.FetchLatest();
+    control_loops::claw_queue_group.goal.FetchLatest();
+    if (ShouldExitAuto()) {
+      return;
+    }
+    if (control_loops::claw_queue_group.status.get() == nullptr ||
+        control_loops::claw_queue_group.goal.get() == nullptr) {
+      continue;
+    }
+    bool ans =
+        control_loops::claw_queue_group.status->zeroed &&
+        (::std::abs(control_loops::claw_queue_group.status->bottom_velocity) <
+         1.0) &&
+        (::std::abs(control_loops::claw_queue_group.status->bottom -
+                    control_loops::claw_queue_group.goal->bottom_angle) <
+         0.10) &&
+        (::std::abs(control_loops::claw_queue_group.status->separation -
+                    control_loops::claw_queue_group.goal->separation_angle) <
+         0.4);
+    if (ans) {
+      return;
+    }
+  }
+}
+
 void HandleAuto() {
+  // The front of the robot is 1.854 meters from the wall
+  const double kShootDistance = 3.15;
+  const double kPickupDistance = 0.5;
   LOG(INFO, "Handling auto mode\n");
   ResetDrivetrain();
 
@@ -192,21 +227,26 @@
   InitializeEncoders();
 
   // Turn the claw on, keep it straight up until the ball has been grabbed.
+  LOG(INFO, "Claw going up\n");
   PositionClawVertically(12.0, 4.0);
-  SetShotPower(100.0);
+  SetShotPower(115.0);
 
   // Wait for the ball to enter the claw.
-  time::SleepFor(time::Time::InSeconds(0.5));
+  time::SleepFor(time::Time::InSeconds(0.25));
   if (ShouldExitAuto()) return;
-  PositionClawForShot();
+  LOG(INFO, "Readying claw for shot\n");
 
   {
     if (ShouldExitAuto()) return;
     // Drive to the goal.
-    auto drivetrain_action = SetDriveGoal(3.0);
+    auto drivetrain_action = SetDriveGoal(-kShootDistance);
+    time::SleepFor(time::Time::InSeconds(0.75));
+    PositionClawForShot();
+    LOG(INFO, "Waiting until drivetrain is finished\n");
     WaitUntilDoneOrCanceled(drivetrain_action.get());
     if (ShouldExitAuto()) return;
   }
+  LOG(INFO, "Shooting\n");
 
   // Shoot.
   Shoot();
@@ -215,22 +255,31 @@
   {
     if (ShouldExitAuto()) return;
     // Intake the new ball.
+    LOG(INFO, "Claw ready for intake\n");
     PositionClawBackIntake();
-    auto drivetrain_action = SetDriveGoal(-0.3);
+    auto drivetrain_action = SetDriveGoal(kShootDistance + kPickupDistance);
+    LOG(INFO, "Waiting until drivetrain is finished\n");
     WaitUntilDoneOrCanceled(drivetrain_action.get());
     if (ShouldExitAuto()) return;
+    LOG(INFO, "Wait for the claw.\n");
+    WaitUntilClawDone();
+    if (ShouldExitAuto()) return;
   }
 
   // Drive back.
   {
-    auto drivetrain_action = SetDriveGoal(3.0);
-    time::SleepFor(time::Time::InSeconds(0.5));
+    LOG(INFO, "Driving back\n");
+    auto drivetrain_action = SetDriveGoal(-(kShootDistance + kPickupDistance));
+    time::SleepFor(time::Time::InSeconds(0.3));
     if (ShouldExitAuto()) return;
     PositionClawForShot();
+    LOG(INFO, "Waiting until drivetrain is finished\n");
     WaitUntilDoneOrCanceled(drivetrain_action.get());
+    WaitUntilClawDone();
     if (ShouldExitAuto()) return;
   }
 
+  LOG(INFO, "Shooting\n");
   // Shoot
   Shoot();
   if (ShouldExitAuto()) return;
diff --git a/frc971/autonomous/auto_main.cc b/frc971/autonomous/auto_main.cc
index e8914c6..36494bc 100644
--- a/frc971/autonomous/auto_main.cc
+++ b/frc971/autonomous/auto_main.cc
@@ -12,6 +12,7 @@
 int main(int /*argc*/, char * /*argv*/[]) {
   ::aos::Init();
 
+  LOG(INFO, "Auto main started\n");
   ::frc971::autonomous::autonomous.FetchLatest();
   while (!::frc971::autonomous::autonomous.get()) {
     ::frc971::autonomous::autonomous.FetchNextBlocking();
@@ -24,9 +25,13 @@
       LOG(INFO, "Got another auto packet\n");
     }
     LOG(INFO, "Starting auto mode\n");
+    ::aos::time::Time start_time = ::aos::time::Time::Now();
     ::frc971::autonomous::HandleAuto();
 
-    LOG(INFO, "Auto mode exited, waiting for it to finish.\n");
+    
+    ::aos::time::Time elapsed_time = ::aos::time::Time::Now() - start_time;
+    LOG(INFO, "Auto mode exited in %f, waiting for it to finish.\n",
+        elapsed_time.ToSeconds());
     while (::frc971::autonomous::autonomous->run_auto) {
       ::frc971::autonomous::autonomous.FetchNextBlocking();
       LOG(INFO, "Got another auto packet\n");
