diff --git a/frc971/zeroing/zeroing.cc b/frc971/zeroing/zeroing.cc
index 70fa866..171a1d1 100644
--- a/frc971/zeroing/zeroing.cc
+++ b/frc971/zeroing/zeroing.cc
@@ -2,11 +2,21 @@
 
 #include <cmath>
 #include <vector>
+#include <algorithm>
 
 #include "frc971/zeroing/wrap.h"
 
+
 namespace frc971 {
 namespace zeroing {
+namespace {
+
+bool compare_encoder(const PotAndAbsolutePosition &left,
+                     const PotAndAbsolutePosition &right) {
+  return left.encoder < right.encoder;
+}
+
+}  // namespace
 
 void PopulateEstimatorState(
     const zeroing::PotAndIndexPulseZeroingEstimator &estimator,
@@ -152,6 +162,7 @@
   zeroed_ = false;
   relative_to_absolute_offset_samples_.clear();
   offset_samples_.clear();
+  buffered_samples_.clear();
 }
 
 // So, this needs to be a multistep process.  We need to first estimate the
@@ -166,82 +177,126 @@
 // would be to wrap the encoder, subtract the two of them, and then average the
 // result.  That will struggle when they are off by PI.  Instead, we need to
 // wrap the number to +- PI from the current averaged offset.
+//
+// To guard against the robot moving while updating estimates, buffer a number
+// of samples and check that the buffered samples are not different than the
+// zeroing threshold. At any point that the samples differ too much, do not
+// update estimates based on those samples.
 void PotAndAbsEncoderZeroingEstimator::UpdateEstimate(
     const PotAndAbsolutePosition &info) {
-  // TODO(austin): Only add this sample if the robot is stopped.
-
-  // Compute the sum of all the offset samples.
-  double relative_to_absolute_offset_sum = 0.0;
-  for (size_t i = 0; i < relative_to_absolute_offset_samples_.size(); ++i) {
-    relative_to_absolute_offset_sum += relative_to_absolute_offset_samples_[i];
-  }
-
-  // Compute the average offset between the absolute encoder and relative
-  // encoder.  If we have 0 samples, assume it is 0.
-  double average_relative_to_absolute_offset =
-      relative_to_absolute_offset_samples_.size() == 0
-          ? 0.0
-          : relative_to_absolute_offset_sum /
-                relative_to_absolute_offset_samples_.size();
-
-  // Now, compute the nearest absolute encoder value to the offset relative
-  // encoder position.
-  const double adjusted_absolute_encoder =
-      Wrap(info.encoder + average_relative_to_absolute_offset,
-           info.absolute_encoder - constants_.measured_absolute_position,
-           constants_.one_revolution_distance);
-
-  const double relative_to_absolute_offset =
-      adjusted_absolute_encoder - info.encoder;
-
-  // Add the sample and update the average with the new reading.
-  const size_t relative_to_absolute_offset_samples_size =
-      relative_to_absolute_offset_samples_.size();
-  if (relative_to_absolute_offset_samples_size <
-      constants_.average_filter_size) {
-    average_relative_to_absolute_offset =
-        (average_relative_to_absolute_offset *
-             relative_to_absolute_offset_samples_size +
-         relative_to_absolute_offset) /
-        (relative_to_absolute_offset_samples_size + 1);
-
-    relative_to_absolute_offset_samples_.push_back(relative_to_absolute_offset);
+  bool moving = true;
+  if (buffered_samples_.size() < constants_.moving_buffer_size) {
+    // Not enough samples to start determining if the robot is moving or not,
+    // don't use the samples yet.
+    buffered_samples_.push_back(info);
   } else {
-    average_relative_to_absolute_offset -=
-        relative_to_absolute_offset_samples_[samples_idx_] /
-        relative_to_absolute_offset_samples_size;
-    relative_to_absolute_offset_samples_[samples_idx_] =
-        relative_to_absolute_offset;
-    average_relative_to_absolute_offset +=
-        relative_to_absolute_offset / relative_to_absolute_offset_samples_size;
+    // Have enough samples to start determining if the robot is moving or not.
+    buffered_samples_[buffered_samples_idx_] = info;
+    auto max_value =
+        ::std::max_element(buffered_samples_.begin(), buffered_samples_.end(),
+                           compare_encoder)
+            ->encoder;
+    auto min_value =
+        ::std::min_element(buffered_samples_.begin(), buffered_samples_.end(),
+                           compare_encoder)
+            ->encoder;
+    if (::std::abs(max_value - min_value) < constants_.zeroing_threshold) {
+      // Robot isn't moving, use middle sample to determine offsets.
+      moving = false;
+    }
+  }
+  buffered_samples_idx_ =
+      (buffered_samples_idx_ + 1) % constants_.moving_buffer_size;
+
+  if (!moving) {
+    // The robot is not moving, use the middle sample to determine offsets.
+    const int middle_index =
+        (buffered_samples_idx_ + (constants_.moving_buffer_size - 1) / 2) %
+        constants_.moving_buffer_size;
+
+    // Compute the sum of all the offset samples.
+    double relative_to_absolute_offset_sum = 0.0;
+    for (size_t i = 0; i < relative_to_absolute_offset_samples_.size(); ++i) {
+      relative_to_absolute_offset_sum +=
+          relative_to_absolute_offset_samples_[i];
+    }
+
+    // Compute the average offset between the absolute encoder and relative
+    // encoder.  If we have 0 samples, assume it is 0.
+    double average_relative_to_absolute_offset =
+        relative_to_absolute_offset_samples_.size() == 0
+            ? 0.0
+            : relative_to_absolute_offset_sum /
+                  relative_to_absolute_offset_samples_.size();
+
+    // Now, compute the nearest absolute encoder value to the offset relative
+    // encoder position.
+    const double adjusted_absolute_encoder =
+        Wrap(buffered_samples_[middle_index].encoder +
+                 average_relative_to_absolute_offset,
+             buffered_samples_[middle_index].absolute_encoder -
+                 constants_.measured_absolute_position,
+             constants_.one_revolution_distance);
+
+    const double relative_to_absolute_offset =
+        adjusted_absolute_encoder - buffered_samples_[middle_index].encoder;
+
+    // Add the sample and update the average with the new reading.
+    const size_t relative_to_absolute_offset_samples_size =
+        relative_to_absolute_offset_samples_.size();
+    if (relative_to_absolute_offset_samples_size <
+        constants_.average_filter_size) {
+      average_relative_to_absolute_offset =
+          (average_relative_to_absolute_offset *
+               relative_to_absolute_offset_samples_size +
+           relative_to_absolute_offset) /
+          (relative_to_absolute_offset_samples_size + 1);
+
+      relative_to_absolute_offset_samples_.push_back(
+          relative_to_absolute_offset);
+    } else {
+      average_relative_to_absolute_offset -=
+          relative_to_absolute_offset_samples_[samples_idx_] /
+          relative_to_absolute_offset_samples_size;
+      relative_to_absolute_offset_samples_[samples_idx_] =
+          relative_to_absolute_offset;
+      average_relative_to_absolute_offset +=
+          relative_to_absolute_offset /
+          relative_to_absolute_offset_samples_size;
+    }
+
+    // Now compute the offset between the pot and relative encoder.
+    if (offset_samples_.size() < constants_.average_filter_size) {
+      offset_samples_.push_back(buffered_samples_[middle_index].pot -
+                                buffered_samples_[middle_index].encoder);
+    } else {
+      offset_samples_[samples_idx_] = buffered_samples_[middle_index].pot -
+                                      buffered_samples_[middle_index].encoder;
+    }
+
+    // Drop the oldest sample when we run this function the next time around.
+    samples_idx_ = (samples_idx_ + 1) % constants_.average_filter_size;
+
+    double pot_relative_encoder_offset_sum = 0.0;
+    for (size_t i = 0; i < offset_samples_.size(); ++i) {
+      pot_relative_encoder_offset_sum += offset_samples_[i];
+    }
+    pot_relative_encoder_offset_ =
+        pot_relative_encoder_offset_sum / offset_samples_.size();
+
+    offset_ = Wrap(buffered_samples_[middle_index].encoder +
+                       pot_relative_encoder_offset_,
+                   average_relative_to_absolute_offset +
+                       buffered_samples_[middle_index].encoder,
+                   constants_.one_revolution_distance) -
+              buffered_samples_[middle_index].encoder;
+    if (offset_ready()) {
+      zeroed_ = true;
+    }
   }
 
-  // Now compute the offset between the pot and relative encoder.
-  if (offset_samples_.size() < constants_.average_filter_size) {
-    offset_samples_.push_back(info.pot - info.encoder);
-  } else {
-    offset_samples_[samples_idx_] = info.pot - info.encoder;
-  }
-
-  // Drop the oldest sample when we run this function the next time around.
-  samples_idx_ = (samples_idx_ + 1) % constants_.average_filter_size;
-
-  double pot_relative_encoder_offset_sum = 0.0;
-  for (size_t i = 0; i < offset_samples_.size(); ++i) {
-    pot_relative_encoder_offset_sum += offset_samples_[i];
-  }
-  const double pot_relative_encoder_offset =
-      pot_relative_encoder_offset_sum / offset_samples_.size();
-
-  offset_ = Wrap(info.encoder + pot_relative_encoder_offset,
-                 average_relative_to_absolute_offset + info.encoder,
-                 constants_.one_revolution_distance) -
-            info.encoder;
-  if (offset_ready()) {
-    zeroed_ = true;
-  }
-
-  filtered_position_ = pot_relative_encoder_offset + info.encoder;
+  // Update the position.
+  filtered_position_ = pot_relative_encoder_offset_ + info.encoder;
   position_ = offset_ + info.encoder;
 }
 
diff --git a/frc971/zeroing/zeroing.h b/frc971/zeroing/zeroing.h
index 4d36ca9..8c730db 100644
--- a/frc971/zeroing/zeroing.h
+++ b/frc971/zeroing/zeroing.h
@@ -173,8 +173,15 @@
   ::std::vector<double> relative_to_absolute_offset_samples_;
   // Offset between the Pot and Relative encoder position.
   ::std::vector<double> offset_samples_;
+  // Last moving_buffer_size position samples to be used to determine if the
+  // robot is moving.
+  ::std::vector<PotAndAbsolutePosition> buffered_samples_;
+  // Pointer to front of the buffered samples.
+  int buffered_samples_idx_ = 0;
+  // Estimated offset between the pot and relative encoder.
+  double pot_relative_encoder_offset_ = 0;
   // Estimated start position of the mechanism
-  double offset_;
+  double offset_ = 0;
   // The next position in 'relative_to_absolute_offset_samples_' and
   // 'encoder_samples_' to be used to store the next sample.
   int samples_idx_;
diff --git a/frc971/zeroing/zeroing_test.cc b/frc971/zeroing/zeroing_test.cc
index 87debdd..420ca61 100644
--- a/frc971/zeroing/zeroing_test.cc
+++ b/frc971/zeroing/zeroing_test.cc
@@ -22,6 +22,7 @@
 static const size_t kSampleSize = 30;
 static const double kAcceptableUnzeroedError = 0.2;
 static const double kIndexErrorFraction = 0.3;
+static const size_t kMovingBufferSize = 3;
 
 class ZeroingTest : public ::testing::Test {
  protected:
@@ -319,15 +320,16 @@
   const double start_pos = 2.1;
   double measured_absolute_position = 0.3 * index_diff;
 
-  PotAndAbsoluteEncoderZeroingConstants constants{
-      kSampleSize, index_diff, measured_absolute_position, 0.1};
+  PotAndAbsoluteEncoderZeroingConstants constants{kSampleSize, index_diff,
+                                                  measured_absolute_position,
+                                                  0.1, kMovingBufferSize};
 
   sim.Initialize(start_pos, index_diff / 3.0, 0.0,
                  constants.measured_absolute_position);
 
   PotAndAbsEncoderZeroingEstimator estimator(constants);
 
-  for (size_t i = 0; i < kSampleSize - 1; ++i) {
+  for (size_t i = 0; i < kSampleSize + kMovingBufferSize - 1; ++i) {
     MoveTo(&sim, &estimator, start_pos);
     ASSERT_FALSE(estimator.zeroed());
   }
@@ -345,15 +347,16 @@
   const double start_pos = 10 * index_diff;
   double measured_absolute_position = 0.3 * index_diff;
 
-  PotAndAbsoluteEncoderZeroingConstants constants{
-      kSampleSize, index_diff, measured_absolute_position, 0.1};
+  PotAndAbsoluteEncoderZeroingConstants constants{kSampleSize, index_diff,
+                                                  measured_absolute_position,
+                                                  0.1, kMovingBufferSize};
 
   sim.Initialize(start_pos, index_diff / 3.0, 0.0,
                  constants.measured_absolute_position);
 
   PotAndAbsEncoderZeroingEstimator estimator(constants);
 
-  for (size_t i = 0; i < kSampleSize - 1; ++i) {
+  for (size_t i = 0; i < kSampleSize + kMovingBufferSize - 1; ++i) {
     MoveTo(&sim, &estimator, start_pos + i * index_diff);
     ASSERT_FALSE(estimator.zeroed());
   }
