diff --git a/wpilibc/src/main/native/cpp/ADIS16448_IMU.cpp b/wpilibc/src/main/native/cpp/ADIS16448_IMU.cpp
index 7048720..14fd37f 100644
--- a/wpilibc/src/main/native/cpp/ADIS16448_IMU.cpp
+++ b/wpilibc/src/main/native/cpp/ADIS16448_IMU.cpp
@@ -26,7 +26,7 @@
 #include <string>
 
 #include <hal/HAL.h>
-#include <networktables/NTSendableBuilder.h>
+#include <wpi/sendable/SendableBuilder.h>
 #include <wpi/sendable/SendableRegistry.h>
 
 #include "frc/Errors.h"
@@ -285,7 +285,7 @@
   m_spi->SetAutoTransmitData({{GLOB_CMD}}, 27);
   // Configure auto stall time
   m_spi->ConfigureAutoStall(HAL_SPI_kMXP, 100, 1000, 255);
-  // Kick off DMA SPI (Note: Device configration impossible after SPI DMA is
+  // Kick off DMA SPI (Note: Device configuration impossible after SPI DMA is
   // activated)
   m_spi->StartAutoTrigger(*m_auto_interrupt, true, false);
   // Check to see if the acquire thread is running. If not, kick one off.
@@ -882,7 +882,7 @@
  * This function pushes the most recent angle estimates for all axes to the
  *driver station.
  **/
-void ADIS16448_IMU::InitSendable(nt::NTSendableBuilder& builder) {
+void ADIS16448_IMU::InitSendable(wpi::SendableBuilder& builder) {
   builder.SetSmartDashboardType("ADIS16448 IMU");
   builder.AddDoubleProperty(
       "Yaw Angle", [=, this] { return GetAngle().value(); }, nullptr);
diff --git a/wpilibc/src/main/native/cpp/ADIS16470_IMU.cpp b/wpilibc/src/main/native/cpp/ADIS16470_IMU.cpp
index e1cd986..05dac78 100644
--- a/wpilibc/src/main/native/cpp/ADIS16470_IMU.cpp
+++ b/wpilibc/src/main/native/cpp/ADIS16470_IMU.cpp
@@ -23,7 +23,7 @@
 #include <string>
 
 #include <hal/HAL.h>
-#include <networktables/NTSendableBuilder.h>
+#include <wpi/sendable/SendableBuilder.h>
 #include <wpi/sendable/SendableRegistry.h>
 
 #include "frc/Errors.h"
@@ -279,7 +279,7 @@
   }
   // Configure auto stall time
   m_spi->ConfigureAutoStall(HAL_SPI_kOnboardCS0, 5, 1000, 1);
-  // Kick off DMA SPI (Note: Device configration impossible after SPI DMA is
+  // Kick off DMA SPI (Note: Device configuration impossible after SPI DMA is
   // activated) DR High = Data good (data capture should be triggered on the
   // rising edge)
   m_spi->StartAutoTrigger(*m_auto_interrupt, true, false);
@@ -816,7 +816,7 @@
  * This function pushes the most recent angle estimates for all axes to the
  *driver station.
  **/
-void ADIS16470_IMU::InitSendable(nt::NTSendableBuilder& builder) {
+void ADIS16470_IMU::InitSendable(wpi::SendableBuilder& builder) {
   builder.SetSmartDashboardType("ADIS16470 IMU");
   builder.AddDoubleProperty(
       "Yaw Angle", [=, this] { return GetAngle().value(); }, nullptr);
diff --git a/wpilibc/src/main/native/cpp/ADXL362.cpp b/wpilibc/src/main/native/cpp/ADXL362.cpp
index fa0a8a3..425815e 100644
--- a/wpilibc/src/main/native/cpp/ADXL362.cpp
+++ b/wpilibc/src/main/native/cpp/ADXL362.cpp
@@ -93,7 +93,6 @@
       m_gsPerLSB = 0.002;
       break;
     case kRange_8G:
-    case kRange_16G:  // 16G not supported; treat as 8G
       m_gsPerLSB = 0.004;
       break;
   }
diff --git a/wpilibc/src/main/native/cpp/ADXRS450_Gyro.cpp b/wpilibc/src/main/native/cpp/ADXRS450_Gyro.cpp
index 4d4b22d..c134b5c 100644
--- a/wpilibc/src/main/native/cpp/ADXRS450_Gyro.cpp
+++ b/wpilibc/src/main/native/cpp/ADXRS450_Gyro.cpp
@@ -69,7 +69,7 @@
   return m_connected;
 }
 
-static bool CalcParity(int v) {
+static bool CalcParity(uint32_t v) {
   bool parity = false;
   while (v != 0) {
     parity = !parity;
@@ -87,7 +87,7 @@
 }
 
 uint16_t ADXRS450_Gyro::ReadRegister(int reg) {
-  int cmd = 0x80000000 | static_cast<int>(reg) << 17;
+  uint32_t cmd = 0x80000000 | static_cast<int>(reg) << 17;
   if (!CalcParity(cmd)) {
     cmd |= 1u;
   }
@@ -140,6 +140,10 @@
   m_spi.ResetAccumulator();
 }
 
+Rotation2d ADXRS450_Gyro::GetRotation2d() const {
+  return units::degree_t{-GetAngle()};
+}
+
 int ADXRS450_Gyro::GetPort() const {
   return m_port;
 }
diff --git a/wpilibc/src/main/native/cpp/AddressableLED.cpp b/wpilibc/src/main/native/cpp/AddressableLED.cpp
index 538dc10..0baae3c 100644
--- a/wpilibc/src/main/native/cpp/AddressableLED.cpp
+++ b/wpilibc/src/main/native/cpp/AddressableLED.cpp
@@ -65,14 +65,14 @@
   FRC_CheckErrorStatus(status, "Port {}", m_port);
 }
 
-void AddressableLED::SetBitTiming(units::nanosecond_t lowTime0,
-                                  units::nanosecond_t highTime0,
-                                  units::nanosecond_t lowTime1,
-                                  units::nanosecond_t highTime1) {
+void AddressableLED::SetBitTiming(units::nanosecond_t highTime0,
+                                  units::nanosecond_t lowTime0,
+                                  units::nanosecond_t highTime1,
+                                  units::nanosecond_t lowTime1) {
   int32_t status = 0;
   HAL_SetAddressableLEDBitTiming(
-      m_handle, lowTime0.to<int32_t>(), highTime0.to<int32_t>(),
-      lowTime1.to<int32_t>(), highTime1.to<int32_t>(), &status);
+      m_handle, highTime0.to<int32_t>(), lowTime0.to<int32_t>(),
+      highTime1.to<int32_t>(), lowTime1.to<int32_t>(), &status);
   FRC_CheckErrorStatus(status, "Port {}", m_port);
 }
 
diff --git a/wpilibc/src/main/native/cpp/AnalogGyro.cpp b/wpilibc/src/main/native/cpp/AnalogGyro.cpp
index cab9f94..df6d33f 100644
--- a/wpilibc/src/main/native/cpp/AnalogGyro.cpp
+++ b/wpilibc/src/main/native/cpp/AnalogGyro.cpp
@@ -133,6 +133,10 @@
   FRC_CheckErrorStatus(status, "Channel {}", m_analog->GetChannel());
 }
 
+Rotation2d AnalogGyro::GetRotation2d() const {
+  return units::degree_t{-GetAngle()};
+}
+
 std::shared_ptr<AnalogInput> AnalogGyro::GetAnalogInput() const {
   return m_analog;
 }
diff --git a/wpilibc/src/main/native/cpp/BuiltInAccelerometer.cpp b/wpilibc/src/main/native/cpp/BuiltInAccelerometer.cpp
index 4284e89..857643b 100644
--- a/wpilibc/src/main/native/cpp/BuiltInAccelerometer.cpp
+++ b/wpilibc/src/main/native/cpp/BuiltInAccelerometer.cpp
@@ -22,11 +22,6 @@
 }
 
 void BuiltInAccelerometer::SetRange(Range range) {
-  if (range == kRange_16G) {
-    throw FRC_MakeError(err::ParameterOutOfRange,
-                        "16G range not supported (use k2G, k4G, or k8G)");
-  }
-
   HAL_SetAccelerometerActive(false);
   HAL_SetAccelerometerRange(static_cast<HAL_AccelerometerRange>(range));
   HAL_SetAccelerometerActive(true);
diff --git a/wpilibc/src/main/native/cpp/CAN.cpp b/wpilibc/src/main/native/cpp/CAN.cpp
index fc4a821..aa0370f 100644
--- a/wpilibc/src/main/native/cpp/CAN.cpp
+++ b/wpilibc/src/main/native/cpp/CAN.cpp
@@ -131,3 +131,7 @@
     return true;
   }
 }
+
+uint64_t CAN::GetTimestampBaseTime() {
+  return HAL_GetCANPacketBaseTime();
+}
diff --git a/wpilibc/src/main/native/cpp/Compressor.cpp b/wpilibc/src/main/native/cpp/Compressor.cpp
index 2479ffc..1f6c906 100644
--- a/wpilibc/src/main/native/cpp/Compressor.cpp
+++ b/wpilibc/src/main/native/cpp/Compressor.cpp
@@ -34,10 +34,6 @@
   }
 }
 
-bool Compressor::Enabled() const {
-  return IsEnabled();
-}
-
 bool Compressor::IsEnabled() const {
   return m_module->GetCompressor();
 }
diff --git a/wpilibc/src/main/native/cpp/Counter.cpp b/wpilibc/src/main/native/cpp/Counter.cpp
index 2e9c916..c33b69b 100644
--- a/wpilibc/src/main/native/cpp/Counter.cpp
+++ b/wpilibc/src/main/native/cpp/Counter.cpp
@@ -260,6 +260,18 @@
   return m_index;
 }
 
+void Counter::SetDistancePerPulse(double distancePerPulse) {
+  m_distancePerPulse = distancePerPulse;
+}
+
+double Counter::GetDistance() const {
+  return Get() * m_distancePerPulse;
+}
+
+double Counter::GetRate() const {
+  return m_distancePerPulse / GetPeriod().value();
+}
+
 int Counter::Get() const {
   int32_t status = 0;
   int value = HAL_GetCounter(m_counter, &status);
diff --git a/wpilibc/src/main/native/cpp/DataLogManager.cpp b/wpilibc/src/main/native/cpp/DataLogManager.cpp
index b92faa3..afe9330 100644
--- a/wpilibc/src/main/native/cpp/DataLogManager.cpp
+++ b/wpilibc/src/main/native/cpp/DataLogManager.cpp
@@ -4,6 +4,8 @@
 
 #include "frc/DataLogManager.h"
 
+#include <frc/Errors.h>
+
 #include <algorithm>
 #include <ctime>
 #include <random>
@@ -19,6 +21,8 @@
 
 #include "frc/DriverStation.h"
 #include "frc/Filesystem.h"
+#include "frc/RobotBase.h"
+#include "frc/RobotController.h"
 
 using namespace frc;
 
@@ -26,6 +30,7 @@
 
 struct Thread final : public wpi::SafeThread {
   Thread(std::string_view dir, std::string_view filename, double period);
+  ~Thread() override;
 
   void Main() final;
 
@@ -66,8 +71,13 @@
       (s.permissions() & fs::perms::others_write) != fs::perms::none) {
     return std::string{usbDir};
   }
+  if (RobotBase::GetRuntimeType() == kRoboRIO) {
+    FRC_ReportError(warn::Warning,
+                    "DataLogManager: Logging to RoboRIO 1 internal storage is "
+                    "not recommended! Plug in a FAT32 formatted flash drive!");
+  }
 #endif
-  return frc::filesystem::GetOperatingDirectory();
+  return filesystem::GetOperatingDirectory();
 }
 
 static std::string MakeLogFilename(std::string_view filenameOverride) {
@@ -94,15 +104,25 @@
   StartNTLog();
 }
 
+Thread::~Thread() {
+  StopNTLog();
+}
+
 void Thread::Main() {
   // based on free disk space, scan for "old" FRC_*.wpilog files and remove
   {
-    uintmax_t freeSpace = fs::space(m_logDir).free;
+    std::error_code ec;
+    uintmax_t freeSpace;
+    auto freeSpaceInfo = fs::space(m_logDir, ec);
+    if (!ec) {
+      freeSpace = freeSpaceInfo.available;
+    } else {
+      freeSpace = UINTMAX_MAX;
+    }
     if (freeSpace < kFreeSpaceThreshold) {
       // Delete oldest FRC_*.wpilog files (ignore FRC_TBD_*.wpilog as we just
       // created one)
       std::vector<fs::directory_entry> entries;
-      std::error_code ec;
       for (auto&& entry : fs::directory_iterator{m_logDir, ec}) {
         auto stem = entry.path().stem().string();
         if (wpi::starts_with(stem, "FRC_") &&
@@ -124,6 +144,8 @@
         }
         auto size = entry.file_size();
         if (fs::remove(entry.path(), ec)) {
+          FRC_ReportError(warn::Warning, "DataLogManager: Deleted {}",
+                          entry.path().string());
           freeSpace += size;
           if (freeSpace >= kFreeSpaceThreshold) {
             break;
@@ -133,6 +155,13 @@
                      entry.path().string());
         }
       }
+    } else if (freeSpace < 2 * kFreeSpaceThreshold) {
+      FRC_ReportError(
+          warn::Warning,
+          "DataLogManager: Log storage device has {} MB of free space "
+          "remaining! Logs will get deleted below {} MB of free space. "
+          "Consider deleting logs off the storage device.",
+          freeSpace / 1000000, kFreeSpaceThreshold / 1000000);
     }
   }
 
@@ -182,11 +211,9 @@
         dsAttachCount = 0;
       }
       if (dsAttachCount > 50) {  // 1 second
-        std::time_t now = std::time(nullptr);
-        auto tm = std::gmtime(&now);
-        if (tm->tm_year > 100) {
-          // assume local clock is now synchronized to DS, so rename based on
-          // local time
+        if (RobotController::IsSystemTimeValid()) {
+          std::time_t now = std::time(nullptr);
+          auto tm = std::gmtime(&now);
           m_log.SetFilename(fmt::format("FRC_{:%Y%m%d_%H%M%S}.wpilog", *tm));
           dsRenamed = true;
         } else {
@@ -202,7 +229,7 @@
       } else {
         fmsAttachCount = 0;
       }
-      if (fmsAttachCount > 100) {  // 2 seconds
+      if (fmsAttachCount > 250) {  // 5 seconds
         // match info comes through TCP, so we need to double-check we've
         // actually received it
         auto matchType = DriverStation::GetMatchType();
@@ -238,7 +265,9 @@
     ++sysTimeCount;
     if (sysTimeCount >= 250) {
       sysTimeCount = 0;
-      sysTimeEntry.Append(wpi::GetSystemTime(), wpi::Now());
+      if (RobotController::IsSystemTimeValid()) {
+        sysTimeEntry.Append(wpi::GetSystemTime(), wpi::Now());
+      }
     }
   }
   DriverStation::RemoveRefreshedDataEventHandle(newDataEvent.GetHandle());
@@ -285,6 +314,9 @@
                              std::string_view filename = "",
                              double period = 0.25) {
   static Instance instance(dir, filename, period);
+  if (!instance.owner) {
+    instance.owner.Start(MakeLogDir(dir), filename, period);
+  }
   return instance;
 }
 
@@ -293,6 +325,12 @@
   GetInstance(dir, filename, period);
 }
 
+void DataLogManager::Stop() {
+  auto& inst = GetInstance();
+  inst.owner.GetThread()->m_log.Stop();
+  inst.owner.Stop();
+}
+
 void DataLogManager::Log(std::string_view message) {
   GetInstance().owner.GetThread()->m_messageLog.Append(message);
   fmt::print("{}\n", message);
diff --git a/wpilibc/src/main/native/cpp/DriverStation.cpp b/wpilibc/src/main/native/cpp/DriverStation.cpp
index aead343..8f80427 100644
--- a/wpilibc/src/main/native/cpp/DriverStation.cpp
+++ b/wpilibc/src/main/native/cpp/DriverStation.cpp
@@ -484,6 +484,12 @@
   return controlWord.test;
 }
 
+bool DriverStation::IsTestEnabled() {
+  HAL_ControlWord controlWord;
+  HAL_GetControlWord(&controlWord);
+  return controlWord.test && controlWord.enabled;
+}
+
 bool DriverStation::IsDSAttached() {
   HAL_ControlWord controlWord;
   HAL_GetControlWord(&controlWord);
@@ -527,7 +533,7 @@
   return info.replayNumber;
 }
 
-DriverStation::Alliance DriverStation::GetAlliance() {
+std::optional<DriverStation::Alliance> DriverStation::GetAlliance() {
   int32_t status = 0;
   auto allianceStationID = HAL_GetAllianceStation(&status);
   switch (allianceStationID) {
@@ -540,11 +546,11 @@
     case HAL_AllianceStationID_kBlue3:
       return kBlue;
     default:
-      return kInvalid;
+      return {};
   }
 }
 
-int DriverStation::GetLocation() {
+std::optional<int> DriverStation::GetLocation() {
   int32_t status = 0;
   auto allianceStationID = HAL_GetAllianceStation(&status);
   switch (allianceStationID) {
@@ -558,13 +564,27 @@
     case HAL_AllianceStationID_kBlue3:
       return 3;
     default:
-      return 0;
+      return {};
   }
 }
 
-double DriverStation::GetMatchTime() {
+bool DriverStation::WaitForDsConnection(units::second_t timeout) {
+  wpi::Event event{true, false};
+  HAL_ProvideNewDataEventHandle(event.GetHandle());
+  bool result = false;
+  if (timeout == 0_s) {
+    result = wpi::WaitForObject(event.GetHandle());
+  } else {
+    result = wpi::WaitForObject(event.GetHandle(), timeout.value(), nullptr);
+  }
+
+  HAL_RemoveNewDataEventHandle(event.GetHandle());
+  return result;
+}
+
+units::second_t DriverStation::GetMatchTime() {
   int32_t status = 0;
-  return HAL_GetMatchTime(&status);
+  return units::second_t{HAL_GetMatchTime(&status)};
 }
 
 double DriverStation::GetBatteryVoltage() {
diff --git a/wpilibc/src/main/native/cpp/DutyCycleEncoder.cpp b/wpilibc/src/main/native/cpp/DutyCycleEncoder.cpp
index b1c943e..f2ac77f 100644
--- a/wpilibc/src/main/native/cpp/DutyCycleEncoder.cpp
+++ b/wpilibc/src/main/native/cpp/DutyCycleEncoder.cpp
@@ -164,7 +164,10 @@
   if (m_counter) {
     m_counter->Reset();
   }
-  m_positionOffset = m_dutyCycle->GetOutput();
+  if (m_simPosition) {
+    m_simPosition.Set(0);
+  }
+  m_positionOffset = GetAbsolutePosition();
 }
 
 bool DutyCycleEncoder::IsConnected() const {
diff --git a/wpilibc/src/main/native/cpp/Filesystem.cpp b/wpilibc/src/main/native/cpp/Filesystem.cpp
index d497779..7947d75 100644
--- a/wpilibc/src/main/native/cpp/Filesystem.cpp
+++ b/wpilibc/src/main/native/cpp/Filesystem.cpp
@@ -13,7 +13,7 @@
 }
 
 std::string frc::filesystem::GetOperatingDirectory() {
-  if constexpr (RobotBase::IsReal()) {
+  if constexpr (!RobotBase::IsSimulation()) {
     return "/home/lvuser";
   } else {
     return frc::filesystem::GetLaunchDirectory();
@@ -21,7 +21,7 @@
 }
 
 std::string frc::filesystem::GetDeployDirectory() {
-  if constexpr (RobotBase::IsReal()) {
+  if constexpr (!RobotBase::IsSimulation()) {
     return "/home/lvuser/deploy";
   } else {
     return (fs::current_path() / "src" / "main" / "deploy").string();
diff --git a/wpilibc/src/main/native/cpp/IterativeRobotBase.cpp b/wpilibc/src/main/native/cpp/IterativeRobotBase.cpp
index 0bccb0b..ee941b6 100644
--- a/wpilibc/src/main/native/cpp/IterativeRobotBase.cpp
+++ b/wpilibc/src/main/native/cpp/IterativeRobotBase.cpp
@@ -24,6 +24,8 @@
 
 void IterativeRobotBase::RobotInit() {}
 
+void IterativeRobotBase::DriverStationConnected() {}
+
 void IterativeRobotBase::SimulationInit() {}
 
 void IterativeRobotBase::DisabledInit() {}
@@ -95,7 +97,7 @@
 }
 
 void IterativeRobotBase::EnableLiveWindowInTest(bool testLW) {
-  if (IsTest()) {
+  if (IsTestEnabled()) {
     throw FRC_MakeError(err::IncompatibleMode,
                         "Can't configure test mode while in test mode!");
   }
@@ -127,6 +129,11 @@
     mode = Mode::kTest;
   }
 
+  if (!m_calledDsConnected && word.IsDSAttached()) {
+    m_calledDsConnected = true;
+    DriverStationConnected();
+  }
+
   // If mode changed, call mode exit and entry functions
   if (m_lastMode != mode) {
     // Call last mode's exit function
diff --git a/wpilibc/src/main/native/cpp/Joystick.cpp b/wpilibc/src/main/native/cpp/Joystick.cpp
index 0eff226..8a378c5 100644
--- a/wpilibc/src/main/native/cpp/Joystick.cpp
+++ b/wpilibc/src/main/native/cpp/Joystick.cpp
@@ -8,6 +8,9 @@
 #include <numbers>
 
 #include <hal/FRCUsageReporting.h>
+#include <units/dimensionless.h>
+#include <units/math.h>
+#include <wpi/deprecated.h>
 
 #include "frc/event/BooleanEvent.h"
 
@@ -124,5 +127,12 @@
 }
 
 double Joystick::GetDirectionDegrees() const {
+  WPI_IGNORE_DEPRECATED
   return (180 / std::numbers::pi) * GetDirectionRadians();
+  WPI_UNIGNORE_DEPRECATED
+}
+
+units::radian_t Joystick::GetDirection() const {
+  return units::math::atan2(units::dimensionless::scalar_t{GetX()},
+                            units::dimensionless::scalar_t{-GetY()});
 }
diff --git a/wpilibc/src/main/native/cpp/Notifier.cpp b/wpilibc/src/main/native/cpp/Notifier.cpp
index d837752..147beb4 100644
--- a/wpilibc/src/main/native/cpp/Notifier.cpp
+++ b/wpilibc/src/main/native/cpp/Notifier.cpp
@@ -17,11 +17,11 @@
 
 using namespace frc;
 
-Notifier::Notifier(std::function<void()> handler) {
-  if (!handler) {
-    throw FRC_MakeError(err::NullParameter, "handler");
+Notifier::Notifier(std::function<void()> callback) {
+  if (!callback) {
+    throw FRC_MakeError(err::NullParameter, "callback");
   }
-  m_handler = handler;
+  m_callback = callback;
   int32_t status = 0;
   m_notifier = HAL_InitializeNotifier(&status);
   FRC_CheckErrorStatus(status, "InitializeNotifier");
@@ -38,32 +38,32 @@
         break;
       }
 
-      std::function<void()> handler;
+      std::function<void()> callback;
       {
         std::scoped_lock lock(m_processMutex);
-        handler = m_handler;
+        callback = m_callback;
         if (m_periodic) {
           m_expirationTime += m_period;
           UpdateAlarm();
         } else {
-          // need to update the alarm to cause it to wait again
+          // Need to update the alarm to cause it to wait again
           UpdateAlarm(UINT64_MAX);
         }
       }
 
-      // call callback
-      if (handler) {
-        handler();
+      // Call callback
+      if (callback) {
+        callback();
       }
     }
   });
 }
 
-Notifier::Notifier(int priority, std::function<void()> handler) {
-  if (!handler) {
-    throw FRC_MakeError(err::NullParameter, "handler");
+Notifier::Notifier(int priority, std::function<void()> callback) {
+  if (!callback) {
+    throw FRC_MakeError(err::NullParameter, "callback");
   }
-  m_handler = handler;
+  m_callback = callback;
   int32_t status = 0;
   m_notifier = HAL_InitializeNotifier(&status);
   FRC_CheckErrorStatus(status, "InitializeNotifier");
@@ -81,10 +81,10 @@
         break;
       }
 
-      std::function<void()> handler;
+      std::function<void()> callback;
       {
         std::scoped_lock lock(m_processMutex);
-        handler = m_handler;
+        callback = m_callback;
         if (m_periodic) {
           m_expirationTime += m_period;
           UpdateAlarm();
@@ -95,9 +95,9 @@
       }
 
       // call callback
-      if (handler) {
+      if (callback) {
         try {
-          handler();
+          callback();
         } catch (const frc::RuntimeError& e) {
           e.Report();
           FRC_ReportError(
@@ -123,7 +123,7 @@
   HAL_StopNotifier(handle, &status);
   FRC_ReportError(status, "StopNotifier");
 
-  // Join the thread to ensure the handler has exited.
+  // Join the thread to ensure the callback has exited.
   if (m_thread.joinable()) {
     m_thread.join();
   }
@@ -134,7 +134,7 @@
 Notifier::Notifier(Notifier&& rhs)
     : m_thread(std::move(rhs.m_thread)),
       m_notifier(rhs.m_notifier.load()),
-      m_handler(std::move(rhs.m_handler)),
+      m_callback(std::move(rhs.m_callback)),
       m_expirationTime(std::move(rhs.m_expirationTime)),
       m_period(std::move(rhs.m_period)),
       m_periodic(std::move(rhs.m_periodic)) {
@@ -145,7 +145,7 @@
   m_thread = std::move(rhs.m_thread);
   m_notifier = rhs.m_notifier.load();
   rhs.m_notifier = HAL_kInvalidHandle;
-  m_handler = std::move(rhs.m_handler);
+  m_callback = std::move(rhs.m_callback);
   m_expirationTime = std::move(rhs.m_expirationTime);
   m_period = std::move(rhs.m_period);
   m_periodic = std::move(rhs.m_periodic);
@@ -161,9 +161,14 @@
   HAL_SetNotifierName(m_notifier, buf.data(), &status);
 }
 
-void Notifier::SetHandler(std::function<void()> handler) {
+void Notifier::SetHandler(std::function<void()> callback) {
   std::scoped_lock lock(m_processMutex);
-  m_handler = handler;
+  m_callback = callback;
+}
+
+void Notifier::SetCallback(std::function<void()> callback) {
+  std::scoped_lock lock(m_processMutex);
+  m_callback = callback;
 }
 
 void Notifier::StartSingle(units::second_t delay) {
diff --git a/wpilibc/src/main/native/cpp/PS4Controller.cpp b/wpilibc/src/main/native/cpp/PS4Controller.cpp
index e59e18c..5ac3420 100644
--- a/wpilibc/src/main/native/cpp/PS4Controller.cpp
+++ b/wpilibc/src/main/native/cpp/PS4Controller.cpp
@@ -11,7 +11,8 @@
 using namespace frc;
 
 PS4Controller::PS4Controller(int port) : GenericHID(port) {
-  HAL_Report(HALUsageReporting::kResourceType_PS4Controller, port + 1);
+  // re-enable when PS4Controller is added to Usage Reporting
+  // HAL_Report(HALUsageReporting::kResourceType_PS4Controller, port + 1);
 }
 
 double PS4Controller::GetLeftX() const {
diff --git a/wpilibc/src/main/native/cpp/PS5Controller.cpp b/wpilibc/src/main/native/cpp/PS5Controller.cpp
new file mode 100644
index 0000000..95685d6
--- /dev/null
+++ b/wpilibc/src/main/native/cpp/PS5Controller.cpp
@@ -0,0 +1,263 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include "frc/PS5Controller.h"
+
+#include <hal/FRCUsageReporting.h>
+
+#include "frc/event/BooleanEvent.h"
+
+using namespace frc;
+
+PS5Controller::PS5Controller(int port) : GenericHID(port) {
+  // HAL_Report(HALUsageReporting::kResourceType_PS5Controller, port + 1);
+}
+
+double PS5Controller::GetLeftX() const {
+  return GetRawAxis(Axis::kLeftX);
+}
+
+double PS5Controller::GetRightX() const {
+  return GetRawAxis(Axis::kRightX);
+}
+
+double PS5Controller::GetLeftY() const {
+  return GetRawAxis(Axis::kLeftY);
+}
+
+double PS5Controller::GetRightY() const {
+  return GetRawAxis(Axis::kRightY);
+}
+
+double PS5Controller::GetL2Axis() const {
+  return GetRawAxis(Axis::kL2);
+}
+
+double PS5Controller::GetR2Axis() const {
+  return GetRawAxis(Axis::kR2);
+}
+
+bool PS5Controller::GetSquareButton() const {
+  return GetRawButton(Button::kSquare);
+}
+
+bool PS5Controller::GetSquareButtonPressed() {
+  return GetRawButtonPressed(Button::kSquare);
+}
+
+bool PS5Controller::GetSquareButtonReleased() {
+  return GetRawButtonReleased(Button::kSquare);
+}
+
+BooleanEvent PS5Controller::Square(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetSquareButton(); });
+}
+
+bool PS5Controller::GetCrossButton() const {
+  return GetRawButton(Button::kCross);
+}
+
+bool PS5Controller::GetCrossButtonPressed() {
+  return GetRawButtonPressed(Button::kCross);
+}
+
+bool PS5Controller::GetCrossButtonReleased() {
+  return GetRawButtonReleased(Button::kCross);
+}
+
+BooleanEvent PS5Controller::Cross(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetCrossButton(); });
+}
+
+bool PS5Controller::GetCircleButton() const {
+  return GetRawButton(Button::kCircle);
+}
+
+bool PS5Controller::GetCircleButtonPressed() {
+  return GetRawButtonPressed(Button::kCircle);
+}
+
+bool PS5Controller::GetCircleButtonReleased() {
+  return GetRawButtonReleased(Button::kCircle);
+}
+
+BooleanEvent PS5Controller::Circle(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetCircleButton(); });
+}
+
+bool PS5Controller::GetTriangleButton() const {
+  return GetRawButton(Button::kTriangle);
+}
+
+bool PS5Controller::GetTriangleButtonPressed() {
+  return GetRawButtonPressed(Button::kTriangle);
+}
+
+bool PS5Controller::GetTriangleButtonReleased() {
+  return GetRawButtonReleased(Button::kTriangle);
+}
+
+BooleanEvent PS5Controller::Triangle(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetTriangleButton(); });
+}
+
+bool PS5Controller::GetL1Button() const {
+  return GetRawButton(Button::kL1);
+}
+
+bool PS5Controller::GetL1ButtonPressed() {
+  return GetRawButtonPressed(Button::kL1);
+}
+
+bool PS5Controller::GetL1ButtonReleased() {
+  return GetRawButtonReleased(Button::kL1);
+}
+
+BooleanEvent PS5Controller::L1(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetL1Button(); });
+}
+
+bool PS5Controller::GetR1Button() const {
+  return GetRawButton(Button::kR1);
+}
+
+bool PS5Controller::GetR1ButtonPressed() {
+  return GetRawButtonPressed(Button::kR1);
+}
+
+bool PS5Controller::GetR1ButtonReleased() {
+  return GetRawButtonReleased(Button::kR1);
+}
+
+BooleanEvent PS5Controller::R1(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetR1Button(); });
+}
+
+bool PS5Controller::GetL2Button() const {
+  return GetRawButton(Button::kL2);
+}
+
+bool PS5Controller::GetL2ButtonPressed() {
+  return GetRawButtonPressed(Button::kL2);
+}
+
+bool PS5Controller::GetL2ButtonReleased() {
+  return GetRawButtonReleased(Button::kL2);
+}
+
+BooleanEvent PS5Controller::L2(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetL2Button(); });
+}
+
+bool PS5Controller::GetR2Button() const {
+  return GetRawButton(Button::kR2);
+}
+
+bool PS5Controller::GetR2ButtonPressed() {
+  return GetRawButtonPressed(Button::kR2);
+}
+
+bool PS5Controller::GetR2ButtonReleased() {
+  return GetRawButtonReleased(Button::kR2);
+}
+
+BooleanEvent PS5Controller::R2(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetR2Button(); });
+}
+
+bool PS5Controller::GetCreateButton() const {
+  return GetRawButton(Button::kCreate);
+}
+
+bool PS5Controller::GetCreateButtonPressed() {
+  return GetRawButtonPressed(Button::kCreate);
+}
+
+bool PS5Controller::GetCreateButtonReleased() {
+  return GetRawButtonReleased(Button::kCreate);
+}
+
+BooleanEvent PS5Controller::Create(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetCreateButton(); });
+}
+
+bool PS5Controller::GetOptionsButton() const {
+  return GetRawButton(Button::kOptions);
+}
+
+bool PS5Controller::GetOptionsButtonPressed() {
+  return GetRawButtonPressed(Button::kOptions);
+}
+
+bool PS5Controller::GetOptionsButtonReleased() {
+  return GetRawButtonReleased(Button::kOptions);
+}
+
+BooleanEvent PS5Controller::Options(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetOptionsButton(); });
+}
+
+bool PS5Controller::GetL3Button() const {
+  return GetRawButton(Button::kL3);
+}
+
+bool PS5Controller::GetL3ButtonPressed() {
+  return GetRawButtonPressed(Button::kL3);
+}
+
+bool PS5Controller::GetL3ButtonReleased() {
+  return GetRawButtonReleased(Button::kL3);
+}
+
+BooleanEvent PS5Controller::L3(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetL3Button(); });
+}
+
+bool PS5Controller::GetR3Button() const {
+  return GetRawButton(Button::kR3);
+}
+
+bool PS5Controller::GetR3ButtonPressed() {
+  return GetRawButtonPressed(Button::kR3);
+}
+
+bool PS5Controller::GetR3ButtonReleased() {
+  return GetRawButtonReleased(Button::kR3);
+}
+
+BooleanEvent PS5Controller::R3(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetR3Button(); });
+}
+
+bool PS5Controller::GetPSButton() const {
+  return GetRawButton(Button::kPS);
+}
+
+bool PS5Controller::GetPSButtonPressed() {
+  return GetRawButtonPressed(Button::kPS);
+}
+
+bool PS5Controller::GetPSButtonReleased() {
+  return GetRawButtonReleased(Button::kPS);
+}
+
+BooleanEvent PS5Controller::PS(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetPSButton(); });
+}
+
+bool PS5Controller::GetTouchpad() const {
+  return GetRawButton(Button::kTouchpad);
+}
+
+bool PS5Controller::GetTouchpadPressed() {
+  return GetRawButtonPressed(Button::kTouchpad);
+}
+
+bool PS5Controller::GetTouchpadReleased() {
+  return GetRawButtonReleased(Button::kTouchpad);
+}
+
+BooleanEvent PS5Controller::Touchpad(EventLoop* loop) const {
+  return BooleanEvent(loop, [this]() { return this->GetTouchpad(); });
+}
diff --git a/wpilibc/src/main/native/cpp/PWM.cpp b/wpilibc/src/main/native/cpp/PWM.cpp
index 5c5e6f5..6a4c0f5 100644
--- a/wpilibc/src/main/native/cpp/PWM.cpp
+++ b/wpilibc/src/main/native/cpp/PWM.cpp
@@ -54,18 +54,18 @@
   FRC_ReportError(status, "Channel {}", m_channel);
 }
 
-void PWM::SetRaw(uint16_t value) {
+void PWM::SetPulseTime(units::microsecond_t time) {
   int32_t status = 0;
-  HAL_SetPWMRaw(m_handle, value, &status);
+  HAL_SetPWMPulseTimeMicroseconds(m_handle, time.value(), &status);
   FRC_CheckErrorStatus(status, "Channel {}", m_channel);
 }
 
-uint16_t PWM::GetRaw() const {
+units::microsecond_t PWM::GetPulseTime() const {
   int32_t status = 0;
-  uint16_t value = HAL_GetPWMRaw(m_handle, &status);
+  double value = HAL_GetPWMPulseTimeMicroseconds(m_handle, &status);
   FRC_CheckErrorStatus(status, "Channel {}", m_channel);
 
-  return value;
+  return units::microsecond_t{value};
 }
 
 void PWM::SetPosition(double pos) {
@@ -135,27 +135,37 @@
   FRC_CheckErrorStatus(status, "Channel {}", m_channel);
 }
 
-void PWM::SetBounds(double max, double deadbandMax, double center,
-                    double deadbandMin, double min) {
+void PWM::SetBounds(units::microsecond_t max, units::microsecond_t deadbandMax,
+                    units::microsecond_t center,
+                    units::microsecond_t deadbandMin,
+                    units::microsecond_t min) {
   int32_t status = 0;
-  HAL_SetPWMConfig(m_handle, max, deadbandMax, center, deadbandMin, min,
-                   &status);
+  HAL_SetPWMConfigMicroseconds(m_handle, max.value(), deadbandMax.value(),
+                               center.value(), deadbandMin.value(), min.value(),
+                               &status);
   FRC_CheckErrorStatus(status, "Channel {}", m_channel);
 }
 
-void PWM::SetRawBounds(int max, int deadbandMax, int center, int deadbandMin,
-                       int min) {
+void PWM::GetBounds(units::microsecond_t* max,
+                    units::microsecond_t* deadbandMax,
+                    units::microsecond_t* center,
+                    units::microsecond_t* deadbandMin,
+                    units::microsecond_t* min) {
   int32_t status = 0;
-  HAL_SetPWMConfigRaw(m_handle, max, deadbandMax, center, deadbandMin, min,
-                      &status);
+  int32_t rawMax, rawDeadbandMax, rawCenter, rawDeadbandMin, rawMin;
+  HAL_GetPWMConfigMicroseconds(m_handle, &rawMax, &rawDeadbandMax, &rawCenter,
+                               &rawDeadbandMin, &rawMin, &status);
+  *max = units::microsecond_t{static_cast<double>(rawMax)};
+  *deadbandMax = units::microsecond_t{static_cast<double>(rawDeadbandMax)};
+  *center = units::microsecond_t{static_cast<double>(rawCenter)};
+  *deadbandMin = units::microsecond_t{static_cast<double>(rawDeadbandMin)};
+  *min = units::microsecond_t{static_cast<double>(rawMin)};
   FRC_CheckErrorStatus(status, "Channel {}", m_channel);
 }
 
-void PWM::GetRawBounds(int* max, int* deadbandMax, int* center,
-                       int* deadbandMin, int* min) {
+void PWM::SetAlwaysHighMode() {
   int32_t status = 0;
-  HAL_GetPWMConfigRaw(m_handle, max, deadbandMax, center, deadbandMin, min,
-                      &status);
+  HAL_SetPWMAlwaysHighMode(m_handle, &status);
   FRC_CheckErrorStatus(status, "Channel {}", m_channel);
 }
 
@@ -168,6 +178,12 @@
   builder.SetActuator(true);
   builder.SetSafeState([=, this] { SetDisabled(); });
   builder.AddDoubleProperty(
-      "Value", [=, this] { return GetRaw(); },
-      [=, this](double value) { SetRaw(value); });
+      "Value", [=, this] { return GetPulseTime().value(); },
+      [=, this](double value) { SetPulseTime(units::millisecond_t{value}); });
+  builder.AddDoubleProperty(
+      "Speed", [=, this] { return GetSpeed(); },
+      [=, this](double value) { SetSpeed(value); });
+  builder.AddDoubleProperty(
+      "Position", [=, this] { return GetPosition(); },
+      [=, this](double value) { SetPosition(value); });
 }
diff --git a/wpilibc/src/main/native/cpp/PneumaticHub.cpp b/wpilibc/src/main/native/cpp/PneumaticHub.cpp
index ec008cf..bcbbd55 100644
--- a/wpilibc/src/main/native/cpp/PneumaticHub.cpp
+++ b/wpilibc/src/main/native/cpp/PneumaticHub.cpp
@@ -17,7 +17,6 @@
 #include "frc/RobotBase.h"
 #include "frc/SensorUtil.h"
 #include "frc/Solenoid.h"
-#include "frc/fmt/Units.h"
 
 using namespace frc;
 
@@ -161,9 +160,14 @@
                         "maxPressure must be between 0 and 120 PSI, got {}",
                         maxPressure);
   }
-  int32_t status = 0;
+
+  // Send the voltage as it would be if the 5V rail was at exactly 5V.
+  // The firmware will compensate for the real 5V rail voltage, which
+  // can fluctuate somewhat over time.
   units::volt_t minAnalogVoltage = PSIToVolts(minPressure, 5_V);
   units::volt_t maxAnalogVoltage = PSIToVolts(maxPressure, 5_V);
+
+  int32_t status = 0;
   HAL_SetREVPHClosedLoopControlAnalog(m_handle, minAnalogVoltage.value(),
                                       maxAnalogVoltage.value(), &status);
   FRC_ReportError(status, "Module {}", m_module);
@@ -186,9 +190,14 @@
                         "maxPressure must be between 0 and 120 PSI, got {}",
                         maxPressure);
   }
-  int32_t status = 0;
+
+  // Send the voltage as it would be if the 5V rail was at exactly 5V.
+  // The firmware will compensate for the real 5V rail voltage, which
+  // can fluctuate somewhat over time.
   units::volt_t minAnalogVoltage = PSIToVolts(minPressure, 5_V);
   units::volt_t maxAnalogVoltage = PSIToVolts(maxPressure, 5_V);
+
+  int32_t status = 0;
   HAL_SetREVPHClosedLoopControlHybrid(m_handle, minAnalogVoltage.value(),
                                       maxAnalogVoltage.value(), &status);
   FRC_ReportError(status, "Module {}", m_module);
diff --git a/wpilibc/src/main/native/cpp/RobotController.cpp b/wpilibc/src/main/native/cpp/RobotController.cpp
index da6e364..8b2b496 100644
--- a/wpilibc/src/main/native/cpp/RobotController.cpp
+++ b/wpilibc/src/main/native/cpp/RobotController.cpp
@@ -41,6 +41,10 @@
   return std::string(comments, len);
 }
 
+int32_t RobotController::GetTeamNumber() {
+  return HAL_GetTeamNumber();
+}
+
 uint64_t RobotController::GetFPGATime() {
   int32_t status = 0;
   uint64_t time = HAL_GetFPGATime(&status);
@@ -76,6 +80,20 @@
   return retVal;
 }
 
+bool RobotController::GetRSLState() {
+  int32_t status = 0;
+  bool retVal = HAL_GetRSLState(&status);
+  FRC_CheckErrorStatus(status, "GetRSLState");
+  return retVal;
+}
+
+bool RobotController::IsSystemTimeValid() {
+  int32_t status = 0;
+  bool retVal = HAL_GetSystemTimeValid(&status);
+  FRC_CheckErrorStatus(status, "IsSystemTimeValid");
+  return retVal;
+}
+
 double RobotController::GetInputVoltage() {
   int32_t status = 0;
   double retVal = HAL_GetVinVoltage(&status);
@@ -104,6 +122,12 @@
   return retVal;
 }
 
+void RobotController::SetEnabled3V3(bool enabled) {
+  int32_t status = 0;
+  HAL_SetUserRailEnabled3V3(enabled, &status);
+  FRC_CheckErrorStatus(status, "SetEnabled3V3");
+}
+
 bool RobotController::GetEnabled3V3() {
   int32_t status = 0;
   bool retVal = HAL_GetUserActive3V3(&status);
@@ -132,6 +156,12 @@
   return retVal;
 }
 
+void RobotController::SetEnabled5V(bool enabled) {
+  int32_t status = 0;
+  HAL_SetUserRailEnabled5V(enabled, &status);
+  FRC_CheckErrorStatus(status, "SetEnabled5V");
+}
+
 bool RobotController::GetEnabled5V() {
   int32_t status = 0;
   bool retVal = HAL_GetUserActive5V(&status);
@@ -160,6 +190,12 @@
   return retVal;
 }
 
+void RobotController::SetEnabled6V(bool enabled) {
+  int32_t status = 0;
+  HAL_SetUserRailEnabled6V(enabled, &status);
+  FRC_CheckErrorStatus(status, "SetEnabled6V");
+}
+
 bool RobotController::GetEnabled6V() {
   int32_t status = 0;
   bool retVal = HAL_GetUserActive6V(&status);
@@ -187,6 +223,13 @@
   FRC_CheckErrorStatus(status, "SetBrownoutVoltage");
 }
 
+units::celsius_t RobotController::GetCPUTemp() {
+  int32_t status = 0;
+  double retVal = HAL_GetCPUTemp(&status);
+  FRC_CheckErrorStatus(status, "GetCPUTemp");
+  return units::celsius_t{retVal};
+}
+
 CANStatus RobotController::GetCANStatus() {
   int32_t status = 0;
   float percentBusUtilization = 0;
diff --git a/wpilibc/src/main/native/cpp/SPI.cpp b/wpilibc/src/main/native/cpp/SPI.cpp
index 29cd006..26e26b7 100644
--- a/wpilibc/src/main/native/cpp/SPI.cpp
+++ b/wpilibc/src/main/native/cpp/SPI.cpp
@@ -177,44 +177,6 @@
   HAL_SetSPISpeed(m_port, hz);
 }
 
-void SPI::SetMSBFirst() {
-  FRC_ReportError(1, "SetMSBFirst not supported by roboRIO {}",
-                  static_cast<int>(m_port));
-}
-
-void SPI::SetLSBFirst() {
-  FRC_ReportError(1, "SetLSBFirst not supported by roboRIO {}",
-                  static_cast<int>(m_port));
-}
-
-void SPI::SetSampleDataOnLeadingEdge() {
-  int mode = m_mode;
-  mode &= 2;
-  m_mode = static_cast<HAL_SPIMode>(mode);
-  HAL_SetSPIMode(m_port, m_mode);
-}
-
-void SPI::SetSampleDataOnTrailingEdge() {
-  int mode = m_mode;
-  mode |= 2;
-  m_mode = static_cast<HAL_SPIMode>(mode);
-  HAL_SetSPIMode(m_port, m_mode);
-}
-
-void SPI::SetClockActiveLow() {
-  int mode = m_mode;
-  mode |= 1;
-  m_mode = static_cast<HAL_SPIMode>(mode);
-  HAL_SetSPIMode(m_port, m_mode);
-}
-
-void SPI::SetClockActiveHigh() {
-  int mode = m_mode;
-  mode &= 1;
-  m_mode = static_cast<HAL_SPIMode>(mode);
-  HAL_SetSPIMode(m_port, m_mode);
-}
-
 void SPI::SetMode(Mode mode) {
   m_mode = static_cast<HAL_SPIMode>(mode & 0x3);
   HAL_SetSPIMode(m_port, m_mode);
diff --git a/wpilibc/src/main/native/cpp/Servo.cpp b/wpilibc/src/main/native/cpp/Servo.cpp
index 4a292b9..79f7f54 100644
--- a/wpilibc/src/main/native/cpp/Servo.cpp
+++ b/wpilibc/src/main/native/cpp/Servo.cpp
@@ -13,12 +13,12 @@
 constexpr double Servo::kMaxServoAngle;
 constexpr double Servo::kMinServoAngle;
 
-constexpr double Servo::kDefaultMaxServoPWM;
-constexpr double Servo::kDefaultMinServoPWM;
+constexpr units::millisecond_t Servo::kDefaultMaxServoPWM;
+constexpr units::millisecond_t Servo::kDefaultMinServoPWM;
 
 Servo::Servo(int channel) : PWM(channel) {
   // Set minimum and maximum PWM values supported by the servo
-  SetBounds(kDefaultMaxServoPWM, 0.0, 0.0, 0.0, kDefaultMinServoPWM);
+  SetBounds(kDefaultMaxServoPWM, 0.0_ms, 0.0_ms, 0.0_ms, kDefaultMinServoPWM);
 
   // Assign defaults for period multiplier for the servo PWM control signal
   SetPeriodMultiplier(kPeriodMultiplier_4X);
@@ -32,7 +32,7 @@
 }
 
 void Servo::SetOffline() {
-  SetRaw(0);
+  SetDisabled();
 }
 
 double Servo::Get() const {
diff --git a/wpilibc/src/main/native/cpp/Timer.cpp b/wpilibc/src/main/native/cpp/Timer.cpp
index 3863de4..dfad620 100644
--- a/wpilibc/src/main/native/cpp/Timer.cpp
+++ b/wpilibc/src/main/native/cpp/Timer.cpp
@@ -54,6 +54,14 @@
   }
 }
 
+void Timer::Restart() {
+  if (m_running) {
+    Stop();
+  }
+  Reset();
+  Start();
+}
+
 void Timer::Stop() {
   if (m_running) {
     m_accumulatedTime = Get();
@@ -82,5 +90,5 @@
 }
 
 units::second_t Timer::GetMatchTime() {
-  return units::second_t{frc::DriverStation::GetMatchTime()};
+  return frc::DriverStation::GetMatchTime();
 }
diff --git a/wpilibc/src/main/native/cpp/TimesliceRobot.cpp b/wpilibc/src/main/native/cpp/TimesliceRobot.cpp
index d212c10..b817aa9 100644
--- a/wpilibc/src/main/native/cpp/TimesliceRobot.cpp
+++ b/wpilibc/src/main/native/cpp/TimesliceRobot.cpp
@@ -5,7 +5,6 @@
 #include "frc/TimesliceRobot.h"
 
 #include "frc/Errors.h"
-#include "frc/fmt/Units.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/main/native/cpp/Ultrasonic.cpp b/wpilibc/src/main/native/cpp/Ultrasonic.cpp
index a034fc3..ec4c9c3 100644
--- a/wpilibc/src/main/native/cpp/Ultrasonic.cpp
+++ b/wpilibc/src/main/native/cpp/Ultrasonic.cpp
@@ -85,10 +85,7 @@
 }
 
 void Ultrasonic::Ping() {
-  if (m_automaticEnabled) {
-    throw FRC_MakeError(err::IncompatibleMode,
-                        "cannot call Ping() in automatic mode");
-  }
+  SetAutomaticMode(false);  // turn off automatic round-robin if pinging
 
   // Reset the counter to zero (invalid data now)
   m_counter.Reset();
@@ -138,7 +135,7 @@
 units::meter_t Ultrasonic::GetRange() const {
   if (IsRangeValid()) {
     if (m_simRange) {
-      return units::meter_t{m_simRange.Get()};
+      return units::inch_t{m_simRange.Get()};
     }
     return m_counter.GetPeriod() * kSpeedOfSound / 2.0;
   } else {
diff --git a/wpilibc/src/main/native/cpp/event/BooleanEvent.cpp b/wpilibc/src/main/native/cpp/event/BooleanEvent.cpp
index 5b8ce63..fd9c831 100644
--- a/wpilibc/src/main/native/cpp/event/BooleanEvent.cpp
+++ b/wpilibc/src/main/native/cpp/event/BooleanEvent.cpp
@@ -7,56 +7,61 @@
 using namespace frc;
 
 BooleanEvent::BooleanEvent(EventLoop* loop, std::function<bool()> condition)
-    : m_loop(loop), m_condition(std::move(condition)) {}
+    : m_loop(loop), m_condition(std::move(condition)) {
+  m_state = std::make_shared<bool>(m_condition());
+  m_loop->Bind(
+      // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
+      [condition = m_condition, state = m_state] { *state = condition(); });
+}
 
 BooleanEvent::operator std::function<bool()>() {
-  return m_condition;
+  return [state = m_state] { return *state; };
 }
 
 bool BooleanEvent::GetAsBoolean() const {
-  return m_condition();
+  return *m_state;
 }
 
 void BooleanEvent::IfHigh(std::function<void()> action) {
-  m_loop->Bind([condition = m_condition, action = std::move(action)] {
-    if (condition()) {
+  m_loop->Bind([state = m_state, action = std::move(action)] {
+    if (*state) {
       action();
     }
   });
 }
 
 BooleanEvent BooleanEvent::operator!() {
-  return BooleanEvent(this->m_loop, [lhs = m_condition] { return !lhs(); });
+  return BooleanEvent(this->m_loop, [state = m_state] { return !*state; });
 }
 
 BooleanEvent BooleanEvent::operator&&(std::function<bool()> rhs) {
   return BooleanEvent(this->m_loop,
-                      [lhs = m_condition, rhs] { return lhs() && rhs(); });
+                      [state = m_state, rhs] { return *state && rhs(); });
 }
 
 BooleanEvent BooleanEvent::operator||(std::function<bool()> rhs) {
   return BooleanEvent(this->m_loop,
-                      [lhs = m_condition, rhs] { return lhs() || rhs(); });
+                      [state = m_state, rhs] { return *state || rhs(); });
 }
 
 BooleanEvent BooleanEvent::Rising() {
-  return BooleanEvent(
-      this->m_loop, [lhs = m_condition, m_previous = m_condition()]() mutable {
-        bool present = lhs();
-        bool past = m_previous;
-        m_previous = present;
-        return !past && present;
-      });
+  return BooleanEvent(this->m_loop,
+                      [state = m_state, m_previous = *m_state]() mutable {
+                        bool present = *state;
+                        bool past = m_previous;
+                        m_previous = present;
+                        return !past && present;
+                      });
 }
 
 BooleanEvent BooleanEvent::Falling() {
-  return BooleanEvent(
-      this->m_loop, [lhs = m_condition, m_previous = m_condition()]() mutable {
-        bool present = lhs();
-        bool past = m_previous;
-        m_previous = present;
-        return past && !present;
-      });
+  return BooleanEvent(this->m_loop,
+                      [state = m_state, m_previous = *m_state]() mutable {
+                        bool present = *state;
+                        bool past = m_previous;
+                        m_previous = present;
+                        return past && !present;
+                      });
 }
 
 BooleanEvent BooleanEvent::Debounce(units::second_t debounceTime,
@@ -64,5 +69,5 @@
   return BooleanEvent(
       this->m_loop,
       [debouncer = frc::Debouncer(debounceTime, type),
-       lhs = m_condition]() mutable { return debouncer.Calculate(lhs()); });
+       state = m_state]() mutable { return debouncer.Calculate(*state); });
 }
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/DMC60.cpp b/wpilibc/src/main/native/cpp/motorcontrol/DMC60.cpp
index 81fa868..ec13698 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/DMC60.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/DMC60.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 DMC60::DMC60(int channel) : PWMMotorController("DMC60", channel) {
-  m_pwm.SetBounds(2.004, 1.52, 1.50, 1.48, 0.997);
+  m_pwm.SetBounds(2.004_ms, 1.52_ms, 1.50_ms, 1.48_ms, 0.997_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/Jaguar.cpp b/wpilibc/src/main/native/cpp/motorcontrol/Jaguar.cpp
index c68ae0c..a152566 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/Jaguar.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/Jaguar.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 Jaguar::Jaguar(int channel) : PWMMotorController("Jaguar", channel) {
-  m_pwm.SetBounds(2.31, 1.55, 1.507, 1.454, 0.697);
+  m_pwm.SetBounds(2.31_ms, 1.55_ms, 1.507_ms, 1.454_ms, 0.697_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/NidecBrushless.cpp b/wpilibc/src/main/native/cpp/motorcontrol/NidecBrushless.cpp
index 01c70d0..f25aa91 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/NidecBrushless.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/NidecBrushless.cpp
@@ -30,7 +30,7 @@
   if (!m_disabled) {
     m_speed = speed;
     m_dio.UpdateDutyCycle(0.5 + 0.5 * (m_isInverted ? -speed : speed));
-    m_pwm.SetRaw(0xffff);
+    m_pwm.SetAlwaysHighMode();
   }
   Feed();
 }
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/PWMSparkMax.cpp b/wpilibc/src/main/native/cpp/motorcontrol/PWMSparkMax.cpp
index 608d452..56c3a45 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/PWMSparkMax.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/PWMSparkMax.cpp
@@ -10,7 +10,7 @@
 
 PWMSparkMax::PWMSparkMax(int channel)
     : PWMMotorController("PWMSparkMax", channel) {
-  m_pwm.SetBounds(2.003, 1.55, 1.50, 1.46, 0.999);
+  m_pwm.SetBounds(2.003_ms, 1.55_ms, 1.50_ms, 1.46_ms, 0.999_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonFX.cpp b/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonFX.cpp
index 2c6982b..51327b0 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonFX.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonFX.cpp
@@ -10,7 +10,7 @@
 
 PWMTalonFX::PWMTalonFX(int channel)
     : PWMMotorController("PWMTalonFX", channel) {
-  m_pwm.SetBounds(2.004, 1.52, 1.50, 1.48, 0.997);
+  m_pwm.SetBounds(2.004_ms, 1.52_ms, 1.50_ms, 1.48_ms, 0.997_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonSRX.cpp b/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonSRX.cpp
index b253412..ee579ed 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonSRX.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/PWMTalonSRX.cpp
@@ -10,7 +10,7 @@
 
 PWMTalonSRX::PWMTalonSRX(int channel)
     : PWMMotorController("PWMTalonSRX", channel) {
-  m_pwm.SetBounds(2.004, 1.52, 1.50, 1.48, 0.997);
+  m_pwm.SetBounds(2.004_ms, 1.52_ms, 1.50_ms, 1.48_ms, 0.997_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/PWMVenom.cpp b/wpilibc/src/main/native/cpp/motorcontrol/PWMVenom.cpp
index e558028..24041c8 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/PWMVenom.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/PWMVenom.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 PWMVenom::PWMVenom(int channel) : PWMMotorController("PWMVenom", channel) {
-  m_pwm.SetBounds(2.004, 1.52, 1.50, 1.48, 0.997);
+  m_pwm.SetBounds(2.004_ms, 1.52_ms, 1.50_ms, 1.48_ms, 0.997_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/PWMVictorSPX.cpp b/wpilibc/src/main/native/cpp/motorcontrol/PWMVictorSPX.cpp
index 10ce992..4aeb399 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/PWMVictorSPX.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/PWMVictorSPX.cpp
@@ -10,7 +10,7 @@
 
 PWMVictorSPX::PWMVictorSPX(int channel)
     : PWMMotorController("PWMVictorSPX", channel) {
-  m_pwm.SetBounds(2.004, 1.52, 1.50, 1.48, 0.997);
+  m_pwm.SetBounds(2.004_ms, 1.52_ms, 1.50_ms, 1.48_ms, 0.997_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/SD540.cpp b/wpilibc/src/main/native/cpp/motorcontrol/SD540.cpp
index 3d5738f..7b6b838 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/SD540.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/SD540.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 SD540::SD540(int channel) : PWMMotorController("SD540", channel) {
-  m_pwm.SetBounds(2.05, 1.55, 1.50, 1.44, 0.94);
+  m_pwm.SetBounds(2.05_ms, 1.55_ms, 1.50_ms, 1.44_ms, 0.94_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/Spark.cpp b/wpilibc/src/main/native/cpp/motorcontrol/Spark.cpp
index 45394df..05ecb89 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/Spark.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/Spark.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 Spark::Spark(int channel) : PWMMotorController("Spark", channel) {
-  m_pwm.SetBounds(2.003, 1.55, 1.50, 1.46, 0.999);
+  m_pwm.SetBounds(2.003_ms, 1.55_ms, 1.50_ms, 1.46_ms, 0.999_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/Talon.cpp b/wpilibc/src/main/native/cpp/motorcontrol/Talon.cpp
index f4b3b69..4994baf 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/Talon.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/Talon.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 Talon::Talon(int channel) : PWMMotorController("Talon", channel) {
-  m_pwm.SetBounds(2.037, 1.539, 1.513, 1.487, 0.989);
+  m_pwm.SetBounds(2.037_ms, 1.539_ms, 1.513_ms, 1.487_ms, 0.989_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/Victor.cpp b/wpilibc/src/main/native/cpp/motorcontrol/Victor.cpp
index 3ad29f7..a05900f 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/Victor.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/Victor.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 Victor::Victor(int channel) : PWMMotorController("Victor", channel) {
-  m_pwm.SetBounds(2.027, 1.525, 1.507, 1.49, 1.026);
+  m_pwm.SetBounds(2.027_ms, 1.525_ms, 1.507_ms, 1.49_ms, 1.026_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_2X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/VictorSP.cpp b/wpilibc/src/main/native/cpp/motorcontrol/VictorSP.cpp
index 6dc888e..27419fb 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/VictorSP.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/VictorSP.cpp
@@ -9,7 +9,7 @@
 using namespace frc;
 
 VictorSP::VictorSP(int channel) : PWMMotorController("VictorSP", channel) {
-  m_pwm.SetBounds(2.004, 1.52, 1.50, 1.48, 0.997);
+  m_pwm.SetBounds(2.004_ms, 1.52_ms, 1.50_ms, 1.48_ms, 0.997_ms);
   m_pwm.SetPeriodMultiplier(PWM::kPeriodMultiplier_1X);
   m_pwm.SetSpeed(0.0);
   m_pwm.SetZeroLatch();
diff --git a/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp b/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp
index a315b90..a19cc6a 100644
--- a/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp
+++ b/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp
@@ -20,12 +20,16 @@
   bool tabsChanged = false;
   std::shared_ptr<nt::NetworkTable> rootTable;
   std::shared_ptr<nt::NetworkTable> rootMetaTable;
+  nt::StringPublisher selectedTabPub;
 };
 
 ShuffleboardInstance::ShuffleboardInstance(nt::NetworkTableInstance ntInstance)
     : m_impl(new Impl) {
   m_impl->rootTable = ntInstance.GetTable(Shuffleboard::kBaseTableName);
   m_impl->rootMetaTable = m_impl->rootTable->GetSubTable(".metadata");
+  m_impl->selectedTabPub =
+      m_impl->rootMetaTable->GetStringTopic("Selected")
+          .Publish(nt::PubSubOptions{.keepDuplicates = true});
   HAL_Report(HALUsageReporting::kResourceType_Shuffleboard, 0);
 }
 
@@ -75,9 +79,9 @@
 }
 
 void ShuffleboardInstance::SelectTab(int index) {
-  m_impl->rootMetaTable->GetEntry("Selected").SetDouble(index);
+  m_impl->selectedTabPub.Set(std::to_string(index));
 }
 
 void ShuffleboardInstance::SelectTab(std::string_view title) {
-  m_impl->rootMetaTable->GetEntry("Selected").SetString(title);
+  m_impl->selectedTabPub.Set(title);
 }
diff --git a/wpilibc/src/main/native/cpp/simulation/DCMotorSim.cpp b/wpilibc/src/main/native/cpp/simulation/DCMotorSim.cpp
index bda2020..c0448ea 100644
--- a/wpilibc/src/main/native/cpp/simulation/DCMotorSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/DCMotorSim.cpp
@@ -24,6 +24,11 @@
     : DCMotorSim(LinearSystemId::DCMotorSystem(gearbox, moi, gearing), gearbox,
                  gearing, measurementStdDevs) {}
 
+void DCMotorSim::SetState(units::radian_t angularPosition,
+                          units::radians_per_second_t angularVelocity) {
+  SetState(Vectord<2>{angularPosition, angularVelocity});
+}
+
 units::radian_t DCMotorSim::GetAngularPosition() const {
   return units::radian_t{GetOutput(0)};
 }
diff --git a/wpilibc/src/main/native/cpp/simulation/DifferentialDrivetrainSim.cpp b/wpilibc/src/main/native/cpp/simulation/DifferentialDrivetrainSim.cpp
index b6c95dc..8c27cdf 100644
--- a/wpilibc/src/main/native/cpp/simulation/DifferentialDrivetrainSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/DifferentialDrivetrainSim.cpp
@@ -41,7 +41,8 @@
               driveMotor, mass, wheelRadius, trackWidth / 2.0, J, gearing),
           trackWidth, driveMotor, gearing, wheelRadius, measurementStdDevs) {}
 
-Vectord<2> DifferentialDrivetrainSim::ClampInput(const Vectord<2>& u) {
+Eigen::Vector2d DifferentialDrivetrainSim::ClampInput(
+    const Eigen::Vector2d& u) {
   return frc::DesaturateInputVector<2>(u,
                                        frc::RobotController::GetInputVoltage());
 }
@@ -128,7 +129,7 @@
 }
 
 Vectord<7> DifferentialDrivetrainSim::Dynamics(const Vectord<7>& x,
-                                               const Vectord<2>& u) {
+                                               const Eigen::Vector2d& u) {
   // Because G² can be factored out of A, we can divide by the old ratio
   // squared and multiply by the new ratio squared to get a new drivetrain
   // model.
diff --git a/wpilibc/src/main/native/cpp/simulation/DutyCycleEncoderSim.cpp b/wpilibc/src/main/native/cpp/simulation/DutyCycleEncoderSim.cpp
index cb83ccb..3df775d 100644
--- a/wpilibc/src/main/native/cpp/simulation/DutyCycleEncoderSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/DutyCycleEncoderSim.cpp
@@ -9,17 +9,49 @@
 
 using namespace frc::sim;
 
-DutyCycleEncoderSim::DutyCycleEncoderSim(const frc::DutyCycleEncoder& encoder) {
-  frc::sim::SimDeviceSim deviceSim{"DutyCycle:DutyCycleEncoder",
-                                   encoder.GetSourceChannel()};
+DutyCycleEncoderSim::DutyCycleEncoderSim(const frc::DutyCycleEncoder& encoder)
+    : DutyCycleEncoderSim{encoder.GetSourceChannel()} {}
+
+DutyCycleEncoderSim::DutyCycleEncoderSim(int channel) {
+  frc::sim::SimDeviceSim deviceSim{"DutyCycle:DutyCycleEncoder", channel};
   m_simPosition = deviceSim.GetDouble("position");
   m_simDistancePerRotation = deviceSim.GetDouble("distance_per_rot");
+  m_simAbsolutePosition = deviceSim.GetDouble("absPosition");
+  m_simIsConnected = deviceSim.GetBoolean("connected");
+}
+
+double DutyCycleEncoderSim::Get() {
+  return m_simPosition.Get();
 }
 
 void DutyCycleEncoderSim::Set(units::turn_t turns) {
   m_simPosition.Set(turns.value());
 }
 
+double DutyCycleEncoderSim::GetDistance() {
+  return m_simPosition.Get() * m_simDistancePerRotation.Get();
+}
+
 void DutyCycleEncoderSim::SetDistance(double distance) {
   m_simPosition.Set(distance / m_simDistancePerRotation.Get());
 }
+
+double DutyCycleEncoderSim::GetAbsolutePosition() {
+  return m_simAbsolutePosition.Get();
+}
+
+void DutyCycleEncoderSim::SetAbsolutePosition(double position) {
+  m_simAbsolutePosition.Set(position);
+}
+
+double DutyCycleEncoderSim::GetDistancePerRotation() {
+  return m_simDistancePerRotation.Get();
+}
+
+bool DutyCycleEncoderSim::IsConnected() {
+  return m_simIsConnected.Get();
+}
+
+void DutyCycleEncoderSim::SetConnected(bool isConnected) {
+  m_simIsConnected.Set(isConnected);
+}
diff --git a/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp b/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp
index 529fb1a..0281730 100644
--- a/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp
@@ -13,39 +13,54 @@
 using namespace frc::sim;
 
 ElevatorSim::ElevatorSim(const LinearSystem<2, 1, 1>& plant,
-                         const DCMotor& gearbox, double gearing,
-                         units::meter_t drumRadius, units::meter_t minHeight,
+                         const DCMotor& gearbox, units::meter_t minHeight,
                          units::meter_t maxHeight, bool simulateGravity,
+                         units::meter_t startingHeight,
                          const std::array<double, 1>& measurementStdDevs)
     : LinearSystemSim(plant, measurementStdDevs),
       m_gearbox(gearbox),
-      m_drumRadius(drumRadius),
       m_minHeight(minHeight),
       m_maxHeight(maxHeight),
-      m_gearing(gearing),
-      m_simulateGravity(simulateGravity) {}
+      m_simulateGravity(simulateGravity) {
+  SetState(startingHeight, 0_mps);
+}
 
 ElevatorSim::ElevatorSim(const DCMotor& gearbox, double gearing,
                          units::kilogram_t carriageMass,
                          units::meter_t drumRadius, units::meter_t minHeight,
                          units::meter_t maxHeight, bool simulateGravity,
+                         units::meter_t startingHeight,
                          const std::array<double, 1>& measurementStdDevs)
-    : LinearSystemSim(LinearSystemId::ElevatorSystem(gearbox, carriageMass,
-                                                     drumRadius, gearing),
-                      measurementStdDevs),
-      m_gearbox(gearbox),
-      m_drumRadius(drumRadius),
-      m_minHeight(minHeight),
-      m_maxHeight(maxHeight),
-      m_gearing(gearing),
-      m_simulateGravity(simulateGravity) {}
+    : ElevatorSim(LinearSystemId::ElevatorSystem(gearbox, carriageMass,
+                                                 drumRadius, gearing),
+                  gearbox, minHeight, maxHeight, simulateGravity,
+                  startingHeight, measurementStdDevs) {}
+
+template <typename Distance>
+  requires std::same_as<units::meter, Distance> ||
+           std::same_as<units::radian, Distance>
+ElevatorSim::ElevatorSim(decltype(1_V / Velocity_t<Distance>(1)) kV,
+                         decltype(1_V / Acceleration_t<Distance>(1)) kA,
+                         const DCMotor& gearbox, units::meter_t minHeight,
+                         units::meter_t maxHeight, bool simulateGravity,
+                         units::meter_t startingHeight,
+                         const std::array<double, 1>& measurementStdDevs)
+    : ElevatorSim(LinearSystemId::IdentifyPositionSystem(kV, kA), gearbox,
+                  minHeight, maxHeight, simulateGravity, startingHeight,
+                  measurementStdDevs) {}
+
+void ElevatorSim::SetState(units::meter_t position,
+                           units::meters_per_second_t velocity) {
+  SetState(
+      Vectord<2>{std::clamp(position, m_minHeight, m_maxHeight), velocity});
+}
 
 bool ElevatorSim::WouldHitLowerLimit(units::meter_t elevatorHeight) const {
-  return elevatorHeight < m_minHeight;
+  return elevatorHeight <= m_minHeight;
 }
 
 bool ElevatorSim::WouldHitUpperLimit(units::meter_t elevatorHeight) const {
-  return elevatorHeight > m_maxHeight;
+  return elevatorHeight >= m_maxHeight;
 }
 
 bool ElevatorSim::HasHitLowerLimit() const {
@@ -69,10 +84,12 @@
   // Reductions are greater than 1, so a reduction of 10:1 would mean the motor
   // is spinning 10x faster than the output.
 
-  // v = r w, so w = v / r
+  double kA = 1.0 / m_plant.B(1, 0);
+  using Kv_t = units::unit_t<units::compound_unit<
+      units::volt, units::inverse<units::meters_per_second>>>;
+  Kv_t Kv = Kv_t{kA * m_plant.A(1, 1)};
   units::meters_per_second_t velocity{m_x(1)};
-  units::radians_per_second_t motorVelocity =
-      velocity / m_drumRadius * m_gearing * 1_rad;
+  units::radians_per_second_t motorVelocity = velocity * Kv * m_gearbox.Kv;
 
   // Perform calculation and return.
   return m_gearbox.Current(motorVelocity, units::volt_t{m_u(0)}) *
diff --git a/wpilibc/src/main/native/cpp/simulation/EncoderSim.cpp b/wpilibc/src/main/native/cpp/simulation/EncoderSim.cpp
index 146328d..9709b4c 100644
--- a/wpilibc/src/main/native/cpp/simulation/EncoderSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/EncoderSim.cpp
@@ -191,7 +191,7 @@
   HALSIM_SetEncoderDistance(m_index, distance);
 }
 
-double EncoderSim::GetDistance() {
+double EncoderSim::GetDistance() const {
   return HALSIM_GetEncoderDistance(m_index);
 }
 
@@ -199,6 +199,6 @@
   HALSIM_SetEncoderRate(m_index, rate);
 }
 
-double EncoderSim::GetRate() {
+double EncoderSim::GetRate() const {
   return HALSIM_GetEncoderRate(m_index);
 }
diff --git a/wpilibc/src/main/native/cpp/simulation/FlywheelSim.cpp b/wpilibc/src/main/native/cpp/simulation/FlywheelSim.cpp
index 95dcb9e..f4b9a81 100644
--- a/wpilibc/src/main/native/cpp/simulation/FlywheelSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/FlywheelSim.cpp
@@ -24,6 +24,10 @@
     : FlywheelSim(LinearSystemId::FlywheelSystem(gearbox, moi, gearing),
                   gearbox, gearing, measurementStdDevs) {}
 
+void FlywheelSim::SetState(units::radians_per_second_t velocity) {
+  LinearSystemSim::SetState(Vectord<1>{velocity.value()});
+}
+
 units::radians_per_second_t FlywheelSim::GetAngularVelocity() const {
   return units::radians_per_second_t{GetOutput(0)};
 }
diff --git a/wpilibc/src/main/native/cpp/simulation/PS5ControllerSim.cpp b/wpilibc/src/main/native/cpp/simulation/PS5ControllerSim.cpp
new file mode 100644
index 0000000..e20105c
--- /dev/null
+++ b/wpilibc/src/main/native/cpp/simulation/PS5ControllerSim.cpp
@@ -0,0 +1,103 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include "frc/simulation/PS5ControllerSim.h"
+
+#include "frc/PS5Controller.h"
+
+using namespace frc;
+using namespace frc::sim;
+
+PS5ControllerSim::PS5ControllerSim(const PS5Controller& joystick)
+    : GenericHIDSim{joystick} {
+  SetAxisCount(6);
+  SetButtonCount(14);
+  SetPOVCount(1);
+}
+
+PS5ControllerSim::PS5ControllerSim(int port) : GenericHIDSim{port} {
+  SetAxisCount(6);
+  SetButtonCount(14);
+  SetPOVCount(1);
+}
+
+void PS5ControllerSim::SetLeftX(double value) {
+  SetRawAxis(PS5Controller::Axis::kLeftX, value);
+}
+
+void PS5ControllerSim::SetRightX(double value) {
+  SetRawAxis(PS5Controller::Axis::kRightX, value);
+}
+
+void PS5ControllerSim::SetLeftY(double value) {
+  SetRawAxis(PS5Controller::Axis::kLeftY, value);
+}
+
+void PS5ControllerSim::SetRightY(double value) {
+  SetRawAxis(PS5Controller::Axis::kRightY, value);
+}
+
+void PS5ControllerSim::SetL2Axis(double value) {
+  SetRawAxis(PS5Controller::Axis::kL2, value);
+}
+
+void PS5ControllerSim::SetR2Axis(double value) {
+  SetRawAxis(PS5Controller::Axis::kR2, value);
+}
+
+void PS5ControllerSim::SetSquareButton(bool value) {
+  SetRawButton(PS5Controller::Button::kSquare, value);
+}
+
+void PS5ControllerSim::SetCrossButton(bool value) {
+  SetRawButton(PS5Controller::Button::kCross, value);
+}
+
+void PS5ControllerSim::SetCircleButton(bool value) {
+  SetRawButton(PS5Controller::Button::kCircle, value);
+}
+
+void PS5ControllerSim::SetTriangleButton(bool value) {
+  SetRawButton(PS5Controller::Button::kTriangle, value);
+}
+
+void PS5ControllerSim::SetL1Button(bool value) {
+  SetRawButton(PS5Controller::Button::kL1, value);
+}
+
+void PS5ControllerSim::SetR1Button(bool value) {
+  SetRawButton(PS5Controller::Button::kR1, value);
+}
+
+void PS5ControllerSim::SetL2Button(bool value) {
+  SetRawButton(PS5Controller::Button::kL2, value);
+}
+
+void PS5ControllerSim::SetR2Button(bool value) {
+  SetRawButton(PS5Controller::Button::kR2, value);
+}
+
+void PS5ControllerSim::SetCreateButton(bool value) {
+  SetRawButton(PS5Controller::Button::kCreate, value);
+}
+
+void PS5ControllerSim::SetOptionsButton(bool value) {
+  SetRawButton(PS5Controller::Button::kOptions, value);
+}
+
+void PS5ControllerSim::SetL3Button(bool value) {
+  SetRawButton(PS5Controller::Button::kL3, value);
+}
+
+void PS5ControllerSim::SetR3Button(bool value) {
+  SetRawButton(PS5Controller::Button::kR3, value);
+}
+
+void PS5ControllerSim::SetPSButton(bool value) {
+  SetRawButton(PS5Controller::Button::kPS, value);
+}
+
+void PS5ControllerSim::SetTouchpad(bool value) {
+  SetRawButton(PS5Controller::Button::kTouchpad, value);
+}
diff --git a/wpilibc/src/main/native/cpp/simulation/PWMSim.cpp b/wpilibc/src/main/native/cpp/simulation/PWMSim.cpp
index 3fafa8e..9332c78 100644
--- a/wpilibc/src/main/native/cpp/simulation/PWMSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/PWMSim.cpp
@@ -39,21 +39,21 @@
   HALSIM_SetPWMInitialized(m_index, initialized);
 }
 
-std::unique_ptr<CallbackStore> PWMSim::RegisterRawValueCallback(
+std::unique_ptr<CallbackStore> PWMSim::RegisterPulseMicrosecondCallback(
     NotifyCallback callback, bool initialNotify) {
   auto store = std::make_unique<CallbackStore>(
-      m_index, -1, callback, &HALSIM_CancelPWMRawValueCallback);
-  store->SetUid(HALSIM_RegisterPWMRawValueCallback(m_index, &CallbackStoreThunk,
-                                                   store.get(), initialNotify));
+      m_index, -1, callback, &HALSIM_CancelPWMPulseMicrosecondCallback);
+  store->SetUid(HALSIM_RegisterPWMPulseMicrosecondCallback(
+      m_index, &CallbackStoreThunk, store.get(), initialNotify));
   return store;
 }
 
-int PWMSim::GetRawValue() const {
-  return HALSIM_GetPWMRawValue(m_index);
+int32_t PWMSim::GetPulseMicrosecond() const {
+  return HALSIM_GetPWMPulseMicrosecond(m_index);
 }
 
-void PWMSim::SetRawValue(int rawValue) {
-  HALSIM_SetPWMRawValue(m_index, rawValue);
+void PWMSim::SetPulseMicrosecond(int32_t microsecondPulseTime) {
+  HALSIM_SetPWMPulseMicrosecond(m_index, microsecondPulseTime);
 }
 
 std::unique_ptr<CallbackStore> PWMSim::RegisterSpeedCallback(
diff --git a/wpilibc/src/main/native/cpp/simulation/RoboRioSim.cpp b/wpilibc/src/main/native/cpp/simulation/RoboRioSim.cpp
index 6d0f809..90d9651 100644
--- a/wpilibc/src/main/native/cpp/simulation/RoboRioSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/RoboRioSim.cpp
@@ -284,6 +284,40 @@
   HALSIM_SetRoboRioBrownoutVoltage(vInVoltage.value());
 }
 
+std::unique_ptr<CallbackStore> RoboRioSim::RegisterCPUTempCallback(
+    NotifyCallback callback, bool initialNotify) {
+  auto store = std::make_unique<CallbackStore>(
+      -1, callback, &HALSIM_CancelRoboRioCPUTempCallback);
+  store->SetUid(HALSIM_RegisterRoboRioCPUTempCallback(
+      &CallbackStoreThunk, store.get(), initialNotify));
+  return store;
+}
+
+units::celsius_t RoboRioSim::GetCPUTemp() {
+  return units::celsius_t{HALSIM_GetRoboRioCPUTemp()};
+}
+
+void RoboRioSim::SetCPUTemp(units::celsius_t cpuTemp) {
+  HALSIM_SetRoboRioCPUTemp(cpuTemp.value());
+}
+
+std::unique_ptr<CallbackStore> RoboRioSim::RegisterTeamNumberCallback(
+    NotifyCallback callback, bool initialNotify) {
+  auto store = std::make_unique<CallbackStore>(
+      -1, callback, &HALSIM_CancelRoboRioTeamNumberCallback);
+  store->SetUid(HALSIM_RegisterRoboRioTeamNumberCallback(
+      &CallbackStoreThunk, store.get(), initialNotify));
+  return store;
+}
+
+int32_t RoboRioSim::GetTeamNumber() {
+  return HALSIM_GetRoboRioTeamNumber();
+}
+
+void RoboRioSim::SetTeamNumber(int32_t teamNumber) {
+  HALSIM_SetRoboRioTeamNumber(teamNumber);
+}
+
 std::string RoboRioSim::GetSerialNumber() {
   char serialNum[9];
   size_t len = HALSIM_GetRoboRioSerialNumber(serialNum, sizeof(serialNum));
diff --git a/wpilibc/src/main/native/cpp/simulation/SimDeviceSim.cpp b/wpilibc/src/main/native/cpp/simulation/SimDeviceSim.cpp
index 34fd1e3..70e43e7 100644
--- a/wpilibc/src/main/native/cpp/simulation/SimDeviceSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/SimDeviceSim.cpp
@@ -27,6 +27,12 @@
       fmt::format("{}[{},{}]", name, index, channel).c_str());
 }
 
+SimDeviceSim::SimDeviceSim(HAL_SimDeviceHandle handle) : m_handle(handle) {}
+
+std::string SimDeviceSim::GetName() const {
+  return std::string(HALSIM_GetSimDeviceName(m_handle));
+}
+
 hal::SimValue SimDeviceSim::GetValue(const char* name) const {
   return HALSIM_GetSimValueHandle(m_handle, name);
 }
diff --git a/wpilibc/src/main/native/cpp/simulation/SingleJointedArmSim.cpp b/wpilibc/src/main/native/cpp/simulation/SingleJointedArmSim.cpp
index 88e45c6..d9969ca 100644
--- a/wpilibc/src/main/native/cpp/simulation/SingleJointedArmSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/SingleJointedArmSim.cpp
@@ -18,26 +18,34 @@
 SingleJointedArmSim::SingleJointedArmSim(
     const LinearSystem<2, 1, 1>& system, const DCMotor& gearbox, double gearing,
     units::meter_t armLength, units::radian_t minAngle,
-    units::radian_t maxAngle, units::kilogram_t armMass, bool simulateGravity,
+    units::radian_t maxAngle, bool simulateGravity,
+    units::radian_t startingAngle,
     const std::array<double, 1>& measurementStdDevs)
     : LinearSystemSim<2, 1, 1>(system, measurementStdDevs),
-      m_r(armLength),
+      m_armLen(armLength),
       m_minAngle(minAngle),
       m_maxAngle(maxAngle),
-      m_armMass(armMass),
       m_gearbox(gearbox),
       m_gearing(gearing),
-      m_simulateGravity(simulateGravity) {}
+      m_simulateGravity(simulateGravity) {
+  SetState(startingAngle, 0_rad_per_s);
+}
 
 SingleJointedArmSim::SingleJointedArmSim(
     const DCMotor& gearbox, double gearing, units::kilogram_square_meter_t moi,
     units::meter_t armLength, units::radian_t minAngle,
-    units::radian_t maxAngle, units::kilogram_t armMass, bool simulateGravity,
+    units::radian_t maxAngle, bool simulateGravity,
+    units::radian_t startingAngle,
     const std::array<double, 1>& measurementStdDevs)
     : SingleJointedArmSim(
           LinearSystemId::SingleJointedArmSystem(gearbox, moi, gearing),
-          gearbox, gearing, armLength, minAngle, maxAngle, armMass,
-          simulateGravity, measurementStdDevs) {}
+          gearbox, gearing, armLength, minAngle, maxAngle, simulateGravity,
+          startingAngle, measurementStdDevs) {}
+
+void SingleJointedArmSim::SetState(units::radian_t angle,
+                                   units::radians_per_second_t velocity) {
+  SetState(Vectord<2>{std::clamp(angle, m_minAngle, m_maxAngle), velocity});
+}
 
 bool SingleJointedArmSim::WouldHitLowerLimit(units::radian_t armAngle) const {
   return armAngle <= m_minAngle;
@@ -78,24 +86,37 @@
 Vectord<2> SingleJointedArmSim::UpdateX(const Vectord<2>& currentXhat,
                                         const Vectord<1>& u,
                                         units::second_t dt) {
-  // Horizontal case:
-  // Torque = F * r = I * alpha
-  // alpha = F * r / I
-  // Since F = mg,
-  // alpha = m * g * r / I
-  // Finally, multiply RHS by cos(theta) to account for the arm angle
-  // This acceleration is added to the linear system dynamics x-dot = Ax + Bu
-  // We therefore find that f(x, u) = Ax + Bu + [[0] [m * g * r / I *
-  // std::cos(theta)]]
+  // The torque on the arm is given by τ = F⋅r, where F is the force applied by
+  // gravity and r the distance from pivot to center of mass. Recall from
+  // dynamics that the sum of torques for a rigid body is τ = J⋅α, were τ is
+  // torque on the arm, J is the mass-moment of inertia about the pivot axis,
+  // and α is the angular acceleration in rad/s². Rearranging yields: α = F⋅r/J
+  //
+  // We substitute in F = m⋅g⋅cos(θ), where θ is the angle from horizontal:
+  //
+  //   α = (m⋅g⋅cos(θ))⋅r/J
+  //
+  // Multiply RHS by cos(θ) to account for the arm angle. Further, we know the
+  // arm mass-moment of inertia J of our arm is given by J=1/3 mL², modeled as a
+  // rod rotating about it's end, where L is the overall rod length. The mass
+  // distribution is assumed to be uniform. Substitute r=L/2 to find:
+  //
+  //   α = (m⋅g⋅cos(θ))⋅r/(1/3 mL²)
+  //   α = (m⋅g⋅cos(θ))⋅(L/2)/(1/3 mL²)
+  //   α = 3/2⋅g⋅cos(θ)/L
+  //
+  // This acceleration is next added to the linear system dynamics ẋ=Ax+Bu
+  //
+  //   f(x, u) = Ax + Bu + [0  α]ᵀ
+  //   f(x, u) = Ax + Bu + [0  3/2⋅g⋅cos(θ)/L]ᵀ
 
   Vectord<2> updatedXhat = RKDP(
       [&](const auto& x, const auto& u) -> Vectord<2> {
         Vectord<2> xdot = m_plant.A() * x + m_plant.B() * u;
 
         if (m_simulateGravity) {
-          xdot += Vectord<2>{0.0, (m_armMass * m_r * -9.8 * 3.0 /
-                                   (m_armMass * m_r * m_r) * std::cos(x(0)))
-                                      .value()};
+          xdot += Vectord<2>{
+              0.0, (3.0 / 2.0 * -9.8 / m_armLen * std::cos(x(0))).value()};
         }
         return xdot;
       },
diff --git a/wpilibc/src/main/native/cpp/simulation/UltrasonicSim.cpp b/wpilibc/src/main/native/cpp/simulation/UltrasonicSim.cpp
index d2d1687..30a5650 100644
--- a/wpilibc/src/main/native/cpp/simulation/UltrasonicSim.cpp
+++ b/wpilibc/src/main/native/cpp/simulation/UltrasonicSim.cpp
@@ -9,8 +9,11 @@
 
 using namespace frc::sim;
 
-UltrasonicSim::UltrasonicSim(const frc::Ultrasonic& ultrasonic) {
-  frc::sim::SimDeviceSim deviceSim{"Ultrasonic", ultrasonic.GetEchoChannel()};
+UltrasonicSim::UltrasonicSim(const frc::Ultrasonic& ultrasonic)
+    : UltrasonicSim(0, ultrasonic.GetEchoChannel()) {}
+
+UltrasonicSim::UltrasonicSim(int ping, int echo) {
+  frc::sim::SimDeviceSim deviceSim{"Ultrasonic", echo};
   m_simRangeValid = deviceSim.GetBoolean("Range Valid");
   m_simRange = deviceSim.GetDouble("Range (in)");
 }
@@ -19,6 +22,6 @@
   m_simRangeValid.Set(isValid);
 }
 
-void UltrasonicSim::SetRange(units::meter_t range) {
+void UltrasonicSim::SetRange(units::inch_t range) {
   m_simRange.Set(range.value());
 }
diff --git a/wpilibc/src/main/native/cpp/smartdashboard/Mechanism2d.cpp b/wpilibc/src/main/native/cpp/smartdashboard/Mechanism2d.cpp
index 355cbc6..1bee916 100644
--- a/wpilibc/src/main/native/cpp/smartdashboard/Mechanism2d.cpp
+++ b/wpilibc/src/main/native/cpp/smartdashboard/Mechanism2d.cpp
@@ -4,7 +4,6 @@
 
 #include "frc/smartdashboard/Mechanism2d.h"
 
-#include <cstdio>
 #include <string_view>
 
 #include <networktables/NTSendableBuilder.h>
diff --git a/wpilibc/src/main/native/cpp/smartdashboard/MechanismLigament2d.cpp b/wpilibc/src/main/native/cpp/smartdashboard/MechanismLigament2d.cpp
index a43aa16..75ec44e 100644
--- a/wpilibc/src/main/native/cpp/smartdashboard/MechanismLigament2d.cpp
+++ b/wpilibc/src/main/native/cpp/smartdashboard/MechanismLigament2d.cpp
@@ -4,7 +4,7 @@
 
 #include "frc/smartdashboard/MechanismLigament2d.h"
 
-#include <cstdio>
+#include <wpi/StringExtras.h>
 
 using namespace frc;
 
@@ -36,8 +36,10 @@
 
 void MechanismLigament2d::SetColor(const Color8Bit& color) {
   std::scoped_lock lock(m_mutex);
-  std::snprintf(m_color, sizeof(m_color), "#%02X%02X%02X", color.red,
-                color.green, color.blue);
+
+  wpi::format_to_n_c_str(m_color, sizeof(m_color), "#{:02X}{:02X}{:02X}",
+                         color.red, color.green, color.blue);
+
   if (m_colorEntry) {
     m_colorEntry.Set(m_color);
   }
diff --git a/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp b/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp
index 79b0e6e..c063850 100644
--- a/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp
+++ b/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp
@@ -141,6 +141,14 @@
   m_properties.emplace_back(std::move(prop));
 }
 
+template <typename Topic, typename Value>
+void SendableBuilderImpl::PublishConstImpl(Topic topic, Value value) {
+  auto prop = std::make_unique<PropertyImpl<Topic>>();
+  prop->pub = topic.Publish();
+  prop->pub.Set(value);
+  m_properties.emplace_back(std::move(prop));
+}
+
 void SendableBuilderImpl::AddBooleanProperty(std::string_view key,
                                              std::function<bool()> getter,
                                              std::function<void(bool)> setter) {
@@ -148,6 +156,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstBoolean(std::string_view key,
+                                              bool value) {
+  PublishConstImpl(m_table->GetBooleanTopic(key), value);
+}
+
 void SendableBuilderImpl::AddIntegerProperty(
     std::string_view key, std::function<int64_t()> getter,
     std::function<void(int64_t)> setter) {
@@ -155,6 +168,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstInteger(std::string_view key,
+                                              int64_t value) {
+  PublishConstImpl(m_table->GetIntegerTopic(key), value);
+}
+
 void SendableBuilderImpl::AddFloatProperty(std::string_view key,
                                            std::function<float()> getter,
                                            std::function<void(float)> setter) {
@@ -162,6 +180,10 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstFloat(std::string_view key, float value) {
+  PublishConstImpl(m_table->GetFloatTopic(key), value);
+}
+
 void SendableBuilderImpl::AddDoubleProperty(
     std::string_view key, std::function<double()> getter,
     std::function<void(double)> setter) {
@@ -169,6 +191,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstDouble(std::string_view key,
+                                             double value) {
+  PublishConstImpl(m_table->GetDoubleTopic(key), value);
+}
+
 void SendableBuilderImpl::AddStringProperty(
     std::string_view key, std::function<std::string()> getter,
     std::function<void(std::string_view)> setter) {
@@ -176,6 +203,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstString(std::string_view key,
+                                             std::string_view value) {
+  PublishConstImpl(m_table->GetStringTopic(key), value);
+}
+
 void SendableBuilderImpl::AddBooleanArrayProperty(
     std::string_view key, std::function<std::vector<int>()> getter,
     std::function<void(std::span<const int>)> setter) {
@@ -183,6 +215,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstBooleanArray(std::string_view key,
+                                                   std::span<const int> value) {
+  PublishConstImpl(m_table->GetBooleanArrayTopic(key), value);
+}
+
 void SendableBuilderImpl::AddIntegerArrayProperty(
     std::string_view key, std::function<std::vector<int64_t>()> getter,
     std::function<void(std::span<const int64_t>)> setter) {
@@ -190,6 +227,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstIntegerArray(
+    std::string_view key, std::span<const int64_t> value) {
+  PublishConstImpl(m_table->GetIntegerArrayTopic(key), value);
+}
+
 void SendableBuilderImpl::AddFloatArrayProperty(
     std::string_view key, std::function<std::vector<float>()> getter,
     std::function<void(std::span<const float>)> setter) {
@@ -197,6 +239,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstFloatArray(std::string_view key,
+                                                 std::span<const float> value) {
+  PublishConstImpl(m_table->GetFloatArrayTopic(key), value);
+}
+
 void SendableBuilderImpl::AddDoubleArrayProperty(
     std::string_view key, std::function<std::vector<double>()> getter,
     std::function<void(std::span<const double>)> setter) {
@@ -204,6 +251,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstDoubleArray(
+    std::string_view key, std::span<const double> value) {
+  PublishConstImpl(m_table->GetDoubleArrayTopic(key), value);
+}
+
 void SendableBuilderImpl::AddStringArrayProperty(
     std::string_view key, std::function<std::vector<std::string>()> getter,
     std::function<void(std::span<const std::string>)> setter) {
@@ -211,6 +263,11 @@
                   std::move(setter));
 }
 
+void SendableBuilderImpl::PublishConstStringArray(
+    std::string_view key, std::span<const std::string> value) {
+  PublishConstImpl(m_table->GetStringArrayTopic(key), value);
+}
+
 void SendableBuilderImpl::AddRawProperty(
     std::string_view key, std::string_view typeString,
     std::function<std::vector<uint8_t>()> getter,
@@ -235,6 +292,16 @@
   m_properties.emplace_back(std::move(prop));
 }
 
+void SendableBuilderImpl::PublishConstRaw(std::string_view key,
+                                          std::string_view typeString,
+                                          std::span<const uint8_t> value) {
+  auto topic = m_table->GetRawTopic(key);
+  auto prop = std::make_unique<PropertyImpl<nt::RawTopic>>();
+  prop->pub = topic.Publish(typeString);
+  prop->pub.Set(value);
+  m_properties.emplace_back(std::move(prop));
+}
+
 template <typename T, size_t Size, typename Topic, typename Getter,
           typename Setter>
 void SendableBuilderImpl::AddSmallPropertyImpl(Topic topic, Getter getter,
diff --git a/wpilibc/src/main/native/cpp/smartdashboard/SendableChooserBase.cpp b/wpilibc/src/main/native/cpp/smartdashboard/SendableChooserBase.cpp
index 9fa5b69..f19d9e4 100644
--- a/wpilibc/src/main/native/cpp/smartdashboard/SendableChooserBase.cpp
+++ b/wpilibc/src/main/native/cpp/smartdashboard/SendableChooserBase.cpp
@@ -19,8 +19,6 @@
       m_defaultChoice(std::move(oth.m_defaultChoice)),
       m_selected(std::move(oth.m_selected)),
       m_haveSelected(std::move(oth.m_haveSelected)),
-      m_instancePubs(std::move(oth.m_instancePubs)),
-      m_activePubs(std::move(oth.m_activePubs)),
       m_instance(std::move(oth.m_instance)) {}
 
 SendableChooserBase& SendableChooserBase::operator=(SendableChooserBase&& oth) {
@@ -29,8 +27,6 @@
   m_defaultChoice = std::move(oth.m_defaultChoice);
   m_selected = std::move(oth.m_selected);
   m_haveSelected = std::move(oth.m_haveSelected);
-  m_instancePubs = std::move(oth.m_instancePubs);
-  m_activePubs = std::move(oth.m_activePubs);
   m_instance = std::move(oth.m_instance);
   return *this;
 }
diff --git a/wpilibc/src/main/native/cppcs/RobotBase.cpp b/wpilibc/src/main/native/cppcs/RobotBase.cpp
index 535d20d..c3616b9 100644
--- a/wpilibc/src/main/native/cppcs/RobotBase.cpp
+++ b/wpilibc/src/main/native/cppcs/RobotBase.cpp
@@ -15,6 +15,7 @@
 #include <hal/FRCUsageReporting.h>
 #include <hal/HALBase.h>
 #include <networktables/NetworkTableInstance.h>
+#include <wpi/timestamp.h>
 #include <wpimath/MathShared.h>
 
 #include "WPILibVersion.h"
@@ -41,6 +42,7 @@
     std::puts("FATAL ERROR: HAL could not be initialized");
     return -1;
   }
+  DriverStation::RefreshData();
   HAL_Report(HALUsageReporting::kResourceType_Language,
              HALUsageReporting::kLanguage_CPlusPlus, 0, GetWPILibVersion());
 
@@ -137,6 +139,10 @@
         break;
     }
   }
+
+  units::second_t GetTimestamp() override {
+    return units::second_t{wpi::Now() * 1.0e-6};
+  }
 };
 }  // namespace
 
@@ -204,6 +210,10 @@
   return DriverStation::IsTest();
 }
 
+bool RobotBase::IsTestEnabled() const {
+  return DriverStation::IsTestEnabled();
+}
+
 std::thread::id RobotBase::GetThreadId() {
   return m_threadId;
 }
@@ -219,13 +229,13 @@
   SetupMathShared();
 
   auto inst = nt::NetworkTableInstance::GetDefault();
-  // subscribe to "" to force persistent values to progagate to local
+  // subscribe to "" to force persistent values to propagate to local
   nt::SubscribeMultiple(inst.GetHandle(), {{std::string_view{}}});
-#ifdef __FRC_ROBORIO__
-  inst.StartServer("/home/lvuser/networktables.json");
-#else
-  inst.StartServer();
-#endif
+  if constexpr (!IsSimulation()) {
+    inst.StartServer("/home/lvuser/networktables.json");
+  } else {
+    inst.StartServer();
+  }
 
   // wait for the NT server to actually start
   int count = 0;
@@ -241,7 +251,7 @@
 
   SmartDashboard::init();
 
-  if (IsReal()) {
+  if constexpr (!IsSimulation()) {
     std::FILE* file = nullptr;
     file = std::fopen("/tmp/frc_versions/FRC_Lib_Version.ini", "w");
 
diff --git a/wpilibc/src/main/native/include/frc/ADIS16448_IMU.h b/wpilibc/src/main/native/include/frc/ADIS16448_IMU.h
index 60d57a9..3f4a1c2 100644
--- a/wpilibc/src/main/native/include/frc/ADIS16448_IMU.h
+++ b/wpilibc/src/main/native/include/frc/ADIS16448_IMU.h
@@ -20,7 +20,6 @@
 #include <thread>
 
 #include <hal/SimDevice.h>
-#include <networktables/NTSendable.h>
 #include <units/acceleration.h>
 #include <units/angle.h>
 #include <units/angular_velocity.h>
@@ -29,6 +28,7 @@
 #include <units/temperature.h>
 #include <wpi/condition_variable.h>
 #include <wpi/mutex.h>
+#include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
 #include "frc/DigitalInput.h"
@@ -53,7 +53,7 @@
  * the RoboRIO MXP port.
  */
 
-class ADIS16448_IMU : public nt::NTSendable,
+class ADIS16448_IMU : public wpi::Sendable,
                       public wpi::SendableHelper<ADIS16448_IMU> {
  public:
   /* ADIS16448 Calibration Time Enum Class */
@@ -216,7 +216,7 @@
    */
   int GetPort() const;
 
-  void InitSendable(nt::NTSendableBuilder& builder) override;
+  void InitSendable(wpi::SendableBuilder& builder) override;
 
  private:
   /** @brief ADIS16448 Register Map Declaration */
diff --git a/wpilibc/src/main/native/include/frc/ADIS16470_IMU.h b/wpilibc/src/main/native/include/frc/ADIS16470_IMU.h
index 4619819..e3b521c 100644
--- a/wpilibc/src/main/native/include/frc/ADIS16470_IMU.h
+++ b/wpilibc/src/main/native/include/frc/ADIS16470_IMU.h
@@ -20,12 +20,12 @@
 #include <thread>
 
 #include <hal/SimDevice.h>
-#include <networktables/NTSendable.h>
 #include <units/acceleration.h>
 #include <units/angle.h>
 #include <units/angular_velocity.h>
 #include <wpi/condition_variable.h>
 #include <wpi/mutex.h>
+#include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
 #include "frc/DigitalInput.h"
@@ -50,7 +50,7 @@
  * available on the RoboRIO.
  */
 
-class ADIS16470_IMU : public nt::NTSendable,
+class ADIS16470_IMU : public wpi::Sendable,
                       public wpi::SendableHelper<ADIS16470_IMU> {
  public:
   /* ADIS16470 Calibration Time Enum Class */
@@ -172,7 +172,7 @@
    */
   int GetPort() const;
 
-  void InitSendable(nt::NTSendableBuilder& builder) override;
+  void InitSendable(wpi::SendableBuilder& builder) override;
 
  private:
   /* ADIS16470 Register Map Declaration */
diff --git a/wpilibc/src/main/native/include/frc/ADXL345_I2C.h b/wpilibc/src/main/native/include/frc/ADXL345_I2C.h
index 6b6b76c..2fe0da4 100644
--- a/wpilibc/src/main/native/include/frc/ADXL345_I2C.h
+++ b/wpilibc/src/main/native/include/frc/ADXL345_I2C.h
@@ -9,7 +9,6 @@
 #include <wpi/sendable/SendableHelper.h>
 
 #include "frc/I2C.h"
-#include "frc/interfaces/Accelerometer.h"
 
 namespace frc {
 
@@ -24,10 +23,11 @@
  * href="https://docs.wpilib.org/en/stable/docs/yearly-overview/known-issues.html#onboard-i2c-causing-system-lockups">
  * WPILib Known Issues</a> page for details.
  */
-class ADXL345_I2C : public Accelerometer,
-                    public nt::NTSendable,
+class ADXL345_I2C : public nt::NTSendable,
                     public wpi::SendableHelper<ADXL345_I2C> {
  public:
+  enum Range { kRange_2G = 0, kRange_4G = 1, kRange_8G = 2, kRange_16G = 3 };
+
   enum Axes { kAxis_X = 0x00, kAxis_Y = 0x02, kAxis_Z = 0x04 };
 
   struct AllAxes {
@@ -53,11 +53,34 @@
   I2C::Port GetI2CPort() const;
   int GetI2CDeviceAddress() const;
 
-  // Accelerometer interface
-  void SetRange(Range range) final;
-  double GetX() override;
-  double GetY() override;
-  double GetZ() override;
+  /**
+   * Set the measuring range of the accelerometer.
+   *
+   * @param range The maximum acceleration, positive or negative, that the
+   *     accelerometer will measure.
+   */
+  void SetRange(Range range);
+
+  /**
+   * Returns the acceleration along the X axis in g-forces.
+   *
+   * @return The acceleration along the X axis in g-forces.
+   */
+  double GetX();
+
+  /**
+   * Returns the acceleration along the Y axis in g-forces.
+   *
+   * @return The acceleration along the Y axis in g-forces.
+   */
+  double GetY();
+
+  /**
+   * Returns the acceleration along the Z axis in g-forces.
+   *
+   * @return The acceleration along the Z axis in g-forces.
+   */
+  double GetZ();
 
   /**
    * Get the acceleration of one axis in Gs.
diff --git a/wpilibc/src/main/native/include/frc/ADXL345_SPI.h b/wpilibc/src/main/native/include/frc/ADXL345_SPI.h
index 18d48a3..3f2d8ae 100644
--- a/wpilibc/src/main/native/include/frc/ADXL345_SPI.h
+++ b/wpilibc/src/main/native/include/frc/ADXL345_SPI.h
@@ -9,7 +9,6 @@
 #include <wpi/sendable/SendableHelper.h>
 
 #include "frc/SPI.h"
-#include "frc/interfaces/Accelerometer.h"
 
 namespace frc {
 
@@ -19,10 +18,11 @@
  * This class allows access to an Analog Devices ADXL345 3-axis accelerometer
  * via SPI. This class assumes the sensor is wired in 4-wire SPI mode.
  */
-class ADXL345_SPI : public Accelerometer,
-                    public nt::NTSendable,
+class ADXL345_SPI : public nt::NTSendable,
                     public wpi::SendableHelper<ADXL345_SPI> {
  public:
+  enum Range { kRange_2G = 0, kRange_4G = 1, kRange_8G = 2, kRange_16G = 3 };
+
   enum Axes { kAxis_X = 0x00, kAxis_Y = 0x02, kAxis_Z = 0x04 };
 
   struct AllAxes {
@@ -46,11 +46,34 @@
 
   SPI::Port GetSpiPort() const;
 
-  // Accelerometer interface
-  void SetRange(Range range) final;
-  double GetX() override;
-  double GetY() override;
-  double GetZ() override;
+  /**
+   * Set the measuring range of the accelerometer.
+   *
+   * @param range The maximum acceleration, positive or negative, that the
+   *     accelerometer will measure.
+   */
+  void SetRange(Range range);
+
+  /**
+   * Returns the acceleration along the X axis in g-forces.
+   *
+   * @return The acceleration along the X axis in g-forces.
+   */
+  double GetX();
+
+  /**
+   * Returns the acceleration along the Y axis in g-forces.
+   *
+   * @return The acceleration along the Y axis in g-forces.
+   */
+  double GetY();
+
+  /**
+   * Returns the acceleration along the Z axis in g-forces.
+   *
+   * @return The acceleration along the Z axis in g-forces.
+   */
+  double GetZ();
 
   /**
    * Get the acceleration of one axis in Gs.
diff --git a/wpilibc/src/main/native/include/frc/ADXL362.h b/wpilibc/src/main/native/include/frc/ADXL362.h
index 451b5fb..ddf6ebe 100644
--- a/wpilibc/src/main/native/include/frc/ADXL362.h
+++ b/wpilibc/src/main/native/include/frc/ADXL362.h
@@ -9,7 +9,6 @@
 #include <wpi/sendable/SendableHelper.h>
 
 #include "frc/SPI.h"
-#include "frc/interfaces/Accelerometer.h"
 
 namespace frc {
 
@@ -18,10 +17,10 @@
  *
  * This class allows access to an Analog Devices ADXL362 3-axis accelerometer.
  */
-class ADXL362 : public Accelerometer,
-                public nt::NTSendable,
-                public wpi::SendableHelper<ADXL362> {
+class ADXL362 : public nt::NTSendable, public wpi::SendableHelper<ADXL362> {
  public:
+  enum Range { kRange_2G = 0, kRange_4G = 1, kRange_8G = 2 };
+
   enum Axes { kAxis_X = 0x00, kAxis_Y = 0x02, kAxis_Z = 0x04 };
   struct AllAxes {
     double XAxis;
@@ -52,11 +51,34 @@
 
   SPI::Port GetSpiPort() const;
 
-  // Accelerometer interface
-  void SetRange(Range range) final;
-  double GetX() override;
-  double GetY() override;
-  double GetZ() override;
+  /**
+   * Set the measuring range of the accelerometer.
+   *
+   * @param range The maximum acceleration, positive or negative, that the
+   *     accelerometer will measure.
+   */
+  void SetRange(Range range);
+
+  /**
+   * Returns the acceleration along the X axis in g-forces.
+   *
+   * @return The acceleration along the X axis in g-forces.
+   */
+  double GetX();
+
+  /**
+   * Returns the acceleration along the Y axis in g-forces.
+   *
+   * @return The acceleration along the Y axis in g-forces.
+   */
+  double GetY();
+
+  /**
+   * Returns the acceleration along the Z axis in g-forces.
+   *
+   * @return The acceleration along the Z axis in g-forces.
+   */
+  double GetZ();
 
   /**
    * Get the acceleration of one axis in Gs.
diff --git a/wpilibc/src/main/native/include/frc/ADXRS450_Gyro.h b/wpilibc/src/main/native/include/frc/ADXRS450_Gyro.h
index 55414d4..d923e13 100644
--- a/wpilibc/src/main/native/include/frc/ADXRS450_Gyro.h
+++ b/wpilibc/src/main/native/include/frc/ADXRS450_Gyro.h
@@ -11,7 +11,7 @@
 #include <wpi/sendable/SendableHelper.h>
 
 #include "frc/SPI.h"
-#include "frc/interfaces/Gyro.h"
+#include "frc/geometry/Rotation2d.h"
 
 namespace frc {
 
@@ -28,8 +28,7 @@
  * This class is for the digital ADXRS450 gyro sensor that connects via SPI.
  * Only one instance of an ADXRS %Gyro is supported.
  */
-class ADXRS450_Gyro : public Gyro,
-                      public wpi::Sendable,
+class ADXRS450_Gyro : public wpi::Sendable,
                       public wpi::SendableHelper<ADXRS450_Gyro> {
  public:
   /**
@@ -61,7 +60,7 @@
    *
    * @return the current heading of the robot in degrees.
    */
-  double GetAngle() const override;
+  double GetAngle() const;
 
   /**
    * Return the rate of rotation of the gyro
@@ -70,7 +69,7 @@
    *
    * @return the current rate in degrees per second
    */
-  double GetRate() const override;
+  double GetRate() const;
 
   /**
    * Reset the gyro.
@@ -79,11 +78,9 @@
    * significant drift in the gyro and it needs to be recalibrated after it has
    * been running.
    */
-  void Reset() override;
+  void Reset();
 
   /**
-   * Initialize the gyro.
-   *
    * Calibrate the gyro by running for a number of samples and computing the
    * center value. Then use the center value as the Accumulator center value for
    * subsequent measurements.
@@ -93,7 +90,22 @@
    * robot is first turned on while it's sitting at rest before the competition
    * starts.
    */
-  void Calibrate() final;
+  void Calibrate();
+
+  /**
+   * Return the heading of the robot as a Rotation2d.
+   *
+   * The angle is continuous, that is it will continue from 360 to 361 degrees.
+   * This allows algorithms that wouldn't want to see a discontinuity in the
+   * gyro output as it sweeps past from 360 to 0 on the second time around.
+   *
+   * The angle is expected to increase as the gyro turns counterclockwise when
+   * looked at from the top. It needs to follow the NWU axis convention.
+   *
+   * @return the current heading of the robot as a Rotation2d. This heading is
+   *         based on integration of the returned rate from the gyro.
+   */
+  Rotation2d GetRotation2d() const;
 
   /**
    * Get the SPI port number.
diff --git a/wpilibc/src/main/native/include/frc/AddressableLED.h b/wpilibc/src/main/native/include/frc/AddressableLED.h
index e6adfca..198eb67 100644
--- a/wpilibc/src/main/native/include/frc/AddressableLED.h
+++ b/wpilibc/src/main/native/include/frc/AddressableLED.h
@@ -17,7 +17,10 @@
 namespace frc {
 
 /**
- * A class for driving addressable LEDs, such as WS2812s and NeoPixels.
+ * A class for driving addressable LEDs, such as WS2812Bs and NeoPixels.
+ *
+ * By default, the timing supports WS2812B LEDs, but is configurable using
+ * SetBitTiming()
  *
  * <p>Only 1 LED driver is currently supported by the roboRIO.
  */
@@ -122,25 +125,25 @@
   /**
    * Sets the bit timing.
    *
-   * <p>By default, the driver is set up to drive WS2812s, so nothing needs to
+   * <p>By default, the driver is set up to drive WS2812Bs, so nothing needs to
    * be set for those.
    *
-   * @param lowTime0 low time for 0 bit
-   * @param highTime0 high time for 0 bit
-   * @param lowTime1 low time for 1 bit
-   * @param highTime1 high time for 1 bit
+   * @param highTime0 high time for 0 bit (default 400ns)
+   * @param lowTime0 low time for 0 bit (default 900ns)
+   * @param highTime1 high time for 1 bit (default 900ns)
+   * @param lowTime1 low time for 1 bit (default 600ns)
    */
-  void SetBitTiming(units::nanosecond_t lowTime0, units::nanosecond_t highTime0,
-                    units::nanosecond_t lowTime1,
-                    units::nanosecond_t highTime1);
+  void SetBitTiming(units::nanosecond_t highTime0, units::nanosecond_t lowTime0,
+                    units::nanosecond_t highTime1,
+                    units::nanosecond_t lowTime1);
 
   /**
    * Sets the sync time.
    *
    * <p>The sync time is the time to hold output so LEDs enable. Default set for
-   * WS2812.
+   * WS2812B.
    *
-   * @param syncTime the sync time
+   * @param syncTime the sync time (default 280us)
    */
   void SetSyncTime(units::microsecond_t syncTime);
 
diff --git a/wpilibc/src/main/native/include/frc/AnalogGyro.h b/wpilibc/src/main/native/include/frc/AnalogGyro.h
index 6565c93..0c472fb 100644
--- a/wpilibc/src/main/native/include/frc/AnalogGyro.h
+++ b/wpilibc/src/main/native/include/frc/AnalogGyro.h
@@ -10,7 +10,7 @@
 #include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
-#include "frc/interfaces/Gyro.h"
+#include "frc/geometry/Rotation2d.h"
 
 namespace frc {
 
@@ -29,8 +29,7 @@
  *
  * This class is for gyro sensors that connect to an analog input.
  */
-class AnalogGyro : public Gyro,
-                   public wpi::Sendable,
+class AnalogGyro : public wpi::Sendable,
                    public wpi::SendableHelper<AnalogGyro> {
  public:
   static constexpr int kOversampleBits = 10;
@@ -118,7 +117,7 @@
    * @return The current heading of the robot in degrees. This heading is based
    *         on integration of the returned rate from the gyro.
    */
-  double GetAngle() const override;
+  double GetAngle() const;
 
   /**
    * Return the rate of rotation of the gyro
@@ -127,7 +126,7 @@
    *
    * @return the current rate in degrees per second
    */
-  double GetRate() const override;
+  double GetRate() const;
 
   /**
    * Return the gyro center value. If run after calibration,
@@ -174,7 +173,7 @@
    * significant drift in the gyro and it needs to be recalibrated after it has
    * been running.
    */
-  void Reset() final;
+  void Reset();
 
   /**
    * Initialize the gyro.
@@ -183,7 +182,32 @@
    */
   void InitGyro();
 
-  void Calibrate() final;
+  /**
+   * Calibrate the gyro by running for a number of samples and computing the
+   * center value. Then use the center value as the Accumulator center value for
+   * subsequent measurements.
+   *
+   * It's important to make sure that the robot is not moving while the
+   * centering calculations are in progress, this is typically done when the
+   * robot is first turned on while it's sitting at rest before the competition
+   * starts.
+   */
+  void Calibrate();
+
+  /**
+   * Return the heading of the robot as a Rotation2d.
+   *
+   * The angle is continuous, that is it will continue from 360 to 361 degrees.
+   * This allows algorithms that wouldn't want to see a discontinuity in the
+   * gyro output as it sweeps past from 360 to 0 on the second time around.
+   *
+   * The angle is expected to increase as the gyro turns counterclockwise when
+   * looked at from the top. It needs to follow the NWU axis convention.
+   *
+   * @return the current heading of the robot as a Rotation2d. This heading is
+   *         based on integration of the returned rate from the gyro.
+   */
+  Rotation2d GetRotation2d() const;
 
   /**
    * Gets the analog input for the gyro.
diff --git a/wpilibc/src/main/native/include/frc/AnalogTriggerOutput.h b/wpilibc/src/main/native/include/frc/AnalogTriggerOutput.h
index 6f52cab..88bd6c3 100644
--- a/wpilibc/src/main/native/include/frc/AnalogTriggerOutput.h
+++ b/wpilibc/src/main/native/include/frc/AnalogTriggerOutput.h
@@ -30,7 +30,7 @@
  * range defined by the limits.
  *
  * The RisingPulse and FallingPulse outputs detect an instantaneous transition
- * from above the upper limit to below the lower limit, and vise versa. These
+ * from above the upper limit to below the lower limit, and vice versa. These
  * pulses represent a rollover condition of a sensor and can be routed to an up
  * / down counter or to interrupts. Because the outputs generate a pulse, they
  * cannot be read directly. To help ensure that a rollover condition is not
diff --git a/wpilibc/src/main/native/include/frc/BuiltInAccelerometer.h b/wpilibc/src/main/native/include/frc/BuiltInAccelerometer.h
index 0e5bee6..a8f0adc 100644
--- a/wpilibc/src/main/native/include/frc/BuiltInAccelerometer.h
+++ b/wpilibc/src/main/native/include/frc/BuiltInAccelerometer.h
@@ -7,8 +7,6 @@
 #include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
-#include "frc/interfaces/Accelerometer.h"
-
 namespace frc {
 
 /**
@@ -16,10 +14,11 @@
  *
  * This class allows access to the roboRIO's internal accelerometer.
  */
-class BuiltInAccelerometer : public Accelerometer,
-                             public wpi::Sendable,
+class BuiltInAccelerometer : public wpi::Sendable,
                              public wpi::SendableHelper<BuiltInAccelerometer> {
  public:
+  enum Range { kRange_2G = 0, kRange_4G = 1, kRange_8G = 2 };
+
   /**
    * Constructor.
    *
@@ -30,30 +29,28 @@
   BuiltInAccelerometer(BuiltInAccelerometer&&) = default;
   BuiltInAccelerometer& operator=(BuiltInAccelerometer&&) = default;
 
-  // Accelerometer interface
   /**
    * Set the measuring range of the accelerometer.
    *
    * @param range The maximum acceleration, positive or negative, that the
-   *              accelerometer will measure. Not all accelerometers support all
-   *              ranges.
+   *     accelerometer will measure.
    */
-  void SetRange(Range range) final;
+  void SetRange(Range range);
 
   /**
    * @return The acceleration of the roboRIO along the X axis in g-forces
    */
-  double GetX() override;
+  double GetX();
 
   /**
    * @return The acceleration of the roboRIO along the Y axis in g-forces
    */
-  double GetY() override;
+  double GetY();
 
   /**
    * @return The acceleration of the roboRIO along the Z axis in g-forces
    */
-  double GetZ() override;
+  double GetZ();
 
   void InitSendable(wpi::SendableBuilder& builder) override;
 };
diff --git a/wpilibc/src/main/native/include/frc/CAN.h b/wpilibc/src/main/native/include/frc/CAN.h
index 4c9b9bd..dc04988 100644
--- a/wpilibc/src/main/native/include/frc/CAN.h
+++ b/wpilibc/src/main/native/include/frc/CAN.h
@@ -10,8 +10,11 @@
 
 namespace frc {
 struct CANData {
+  /** Contents of the CAN packet. */
   uint8_t data[8];
+  /** Length of packet in bytes. */
   int32_t length;
+  /** CAN frame timestamp in milliseconds. */
   uint64_t timestamp;
 };
 
@@ -158,6 +161,15 @@
    */
   bool ReadPacketTimeout(int apiId, int timeoutMs, CANData* data);
 
+  /**
+   * Reads the current value of the millisecond-resolution timer that CANData
+   * timestamps are based on
+   *
+   * @return Current value of timer used as a base time for CANData timestamps
+   * in milliseconds
+   */
+  static uint64_t GetTimestampBaseTime();
+
   static constexpr HAL_CANManufacturer kTeamManufacturer = HAL_CAN_Man_kTeamUse;
   static constexpr HAL_CANDeviceType kTeamDeviceType =
       HAL_CAN_Dev_kMiscellaneous;
diff --git a/wpilibc/src/main/native/include/frc/Compressor.h b/wpilibc/src/main/native/include/frc/Compressor.h
index 1329a3b..ed1b3b9 100644
--- a/wpilibc/src/main/native/include/frc/Compressor.h
+++ b/wpilibc/src/main/native/include/frc/Compressor.h
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include <hal/Types.h>
-#include <wpi/deprecated.h>
 #include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
@@ -59,19 +58,6 @@
   Compressor& operator=(Compressor&&) = default;
 
   /**
-   * Check if compressor output is active.
-   * To (re)enable the compressor use EnableDigital() or EnableAnalog(...).
-   *
-   * @return true if the compressor is on.
-   * @deprecated To avoid confusion in thinking this (re)enables the compressor
-   * use IsEnabled().
-   */
-  WPI_DEPRECATED(
-      "To avoid confusion in thinking this (re)enables the compressor use "
-      "IsEnabled()")
-  bool Enabled() const;
-
-  /**
    * Returns whether the compressor is active or not.
    *
    * @return true if the compressor is on - otherwise false.
diff --git a/wpilibc/src/main/native/include/frc/Counter.h b/wpilibc/src/main/native/include/frc/Counter.h
index d501b7e..71eebca 100644
--- a/wpilibc/src/main/native/include/frc/Counter.h
+++ b/wpilibc/src/main/native/include/frc/Counter.h
@@ -343,6 +343,34 @@
 
   int GetFPGAIndex() const;
 
+  /**
+   * Set the distance per pulse for this counter. This sets the multiplier used
+   * to determine the distance driven based on the count value from the encoder.
+   * Set this value based on the Pulses per Revolution and factor in any gearing
+   * reductions. This distance can be in any units you like, linear or angular.
+   *
+   * @param distancePerPulse The scale factor that will be used to convert
+   * pulses to useful units.
+   */
+  void SetDistancePerPulse(double distancePerPulse);
+
+  /**
+   * Read the current scaled counter value. Read the value at this instant,
+   * scaled by the distance per pulse (defaults to 1).
+   *
+   * @return The distance since the last reset
+   */
+  double GetDistance() const;
+
+  /**
+   * Get the current rate of the Counter. Read the current rate of the counter
+   * accounting for the distance per pulse value. The default value for distance
+   * per pulse (1) yields units of pulses per second.
+   *
+   * @return The rate in units/sec
+   */
+  double GetRate() const;
+
   // CounterBase interface
   /**
    * Read the current counter value.
@@ -434,6 +462,7 @@
 
  private:
   int m_index = 0;  // The index of this counter.
+  double m_distancePerPulse = 1;
 
   friend class DigitalGlitchFilter;
 };
diff --git a/wpilibc/src/main/native/include/frc/DataLogManager.h b/wpilibc/src/main/native/include/frc/DataLogManager.h
index fa7abba..336af4a 100644
--- a/wpilibc/src/main/native/include/frc/DataLogManager.h
+++ b/wpilibc/src/main/native/include/frc/DataLogManager.h
@@ -50,6 +50,11 @@
                     double period = 0.25);
 
   /**
+   * Stop data log manager.
+   */
+  static void Stop();
+
+  /**
    * Log a message to the "messages" entry. The message is also printed to
    * standard output (followed by a newline).
    *
diff --git a/wpilibc/src/main/native/include/frc/DoubleSolenoid.h b/wpilibc/src/main/native/include/frc/DoubleSolenoid.h
index 381e3a1..f02ba5a 100644
--- a/wpilibc/src/main/native/include/frc/DoubleSolenoid.h
+++ b/wpilibc/src/main/native/include/frc/DoubleSolenoid.h
@@ -98,7 +98,7 @@
    * If a solenoid is shorted, it is added to the DisabledList and disabled
    * until power cycle, or until faults are cleared.
    *
-   * @see ClearAllPCMStickyFaults()
+   * @see ClearAllStickyFaults()
    * @return If solenoid is disabled due to short.
    */
   bool IsFwdSolenoidDisabled() const;
@@ -109,7 +109,7 @@
    * If a solenoid is shorted, it is added to the DisabledList and disabled
    * until power cycle, or until faults are cleared.
    *
-   * @see ClearAllPCMStickyFaults()
+   * @see ClearAllStickyFaults()
    * @return If solenoid is disabled due to short.
    */
   bool IsRevSolenoidDisabled() const;
diff --git a/wpilibc/src/main/native/include/frc/DriverStation.h b/wpilibc/src/main/native/include/frc/DriverStation.h
index 4cbf6da..ea568a7 100644
--- a/wpilibc/src/main/native/include/frc/DriverStation.h
+++ b/wpilibc/src/main/native/include/frc/DriverStation.h
@@ -4,6 +4,7 @@
 
 #pragma once
 
+#include <optional>
 #include <string>
 
 #include <units/time.h>
@@ -21,7 +22,7 @@
  */
 class DriverStation final {
  public:
-  enum Alliance { kRed, kBlue, kInvalid };
+  enum Alliance { kRed, kBlue };
   enum MatchType { kNone, kPractice, kQualification, kElimination };
 
   static constexpr int kJoystickPorts = 6;
@@ -210,6 +211,14 @@
   static bool IsTest();
 
   /**
+   * Check if the DS is commanding Test mode and if it has enabled the robot.
+   *
+   * @return True if the robot is being commanded to be in Test mode and
+   * enabled.
+   */
+  static bool IsTestEnabled();
+
+  /**
    * Check if the DS is attached.
    *
    * @return True if the DS is connected to the robot
@@ -227,6 +236,9 @@
   /**
    * Returns the game specific message provided by the FMS.
    *
+   * If the FMS is not connected, it is set from the game data setting on the
+   * driver station.
+   *
    * @return A string containing the game specific message.
    */
   static std::string GetGameSpecificMessage();
@@ -262,39 +274,58 @@
   static int GetReplayNumber();
 
   /**
-   * Return the alliance that the driver station says it is on.
+   * Return the alliance that the driver station says it is on from the FMS.
+   *
+   * If the FMS is not connected, it is set from the team alliance setting on
+   * the driver station.
    *
    * This could return kRed or kBlue.
    *
    * @return The Alliance enum (kRed, kBlue or kInvalid)
    */
-  static Alliance GetAlliance();
+  static std::optional<Alliance> GetAlliance();
 
   /**
-   * Return the driver station location on the field.
+   * Return the driver station location from the FMS.
+   *
+   * If the FMS is not connected, it is set from the team alliance setting on
+   * the driver station.
    *
    * This could return 1, 2, or 3.
    *
    * @return The location of the driver station (1-3, 0 for invalid)
    */
-  static int GetLocation();
+  static std::optional<int> GetLocation();
 
   /**
-   * Return the approximate match time.
+   * Wait for a DS connection.
    *
-   * The FMS does not send an official match time to the robots, but does send
-   * an approximate match time. The value will count down the time remaining in
-   * the current period (auto or teleop).
-   *
+   * @param timeout timeout in seconds. 0 for infinite.
+   * @return true if connected, false if timeout
+   */
+  static bool WaitForDsConnection(units::second_t timeout);
+
+  /**
+   * Return the approximate match time. The FMS does not send an official match
+   * time to the robots, but does send an approximate match time. The value will
+   * count down the time remaining in the current period (auto or teleop).
    * Warning: This is not an official time (so it cannot be used to dispute ref
    * calls or guarantee that a function will trigger before the match ends).
    *
-   * The Practice Match function of the DS approximates the behavior seen on
-   * the field.
+   * <p>When connected to the real field, this number only changes in full
+   * integer increments, and always counts down.
    *
-   * @return Time remaining in current match period (auto or teleop)
+   * <p>When the DS is in practice mode, this number is a floating point number,
+   * and counts down.
+   *
+   * <p>When the DS is in teleop or autonomous mode, this number is a floating
+   * point number, and counts up.
+   *
+   * <p>Simulation matches DS behavior without an FMS connected.
+   *
+   * @return Time remaining in current match period (auto or teleop) in seconds
    */
-  static double GetMatchTime();
+  static units::second_t GetMatchTime();
 
   /**
    * Read the battery voltage.
diff --git a/wpilibc/src/main/native/include/frc/Encoder.h b/wpilibc/src/main/native/include/frc/Encoder.h
index deb36c0..7315e16 100644
--- a/wpilibc/src/main/native/include/frc/Encoder.h
+++ b/wpilibc/src/main/native/include/frc/Encoder.h
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include <hal/Types.h>
-#include <wpi/deprecated.h>
 #include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
@@ -168,7 +167,7 @@
    * @return Period in seconds of the most recent pulse.
    * @deprecated Use getRate() in favor of this method.
    */
-  WPI_DEPRECATED("Use GetRate() in favor of this method")
+  [[deprecated("Use GetRate() in favor of this method")]]
   units::second_t GetPeriod() const override;
 
   /**
@@ -186,9 +185,9 @@
    *             periods and SetMinRate() scales using value from
    *             SetDistancePerPulse().
    */
-  WPI_DEPRECATED(
+  [[deprecated(
       "Use SetMinRate() in favor of this method.  This takes unscaled periods "
-      "and SetMinRate() scales using value from SetDistancePerPulse().")
+      "and SetMinRate() scales using value from SetDistancePerPulse().")]]
   void SetMaxPeriod(units::second_t maxPeriod) override;
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/Errors.h b/wpilibc/src/main/native/include/frc/Errors.h
index 252a335..4dae6c9 100644
--- a/wpilibc/src/main/native/include/frc/Errors.h
+++ b/wpilibc/src/main/native/include/frc/Errors.h
@@ -95,15 +95,16 @@
  * @param[in]  args error message format args
  * @return runtime error object
  */
-[[nodiscard]] RuntimeError MakeErrorV(int32_t status, const char* fileName,
-                                      int lineNumber, const char* funcName,
-                                      fmt::string_view format,
-                                      fmt::format_args args);
+[[nodiscard]]
+RuntimeError MakeErrorV(int32_t status, const char* fileName, int lineNumber,
+                        const char* funcName, fmt::string_view format,
+                        fmt::format_args args);
 
 template <typename... Args>
-[[nodiscard]] inline RuntimeError MakeError(
-    int32_t status, const char* fileName, int lineNumber, const char* funcName,
-    fmt::string_view format, Args&&... args) {
+[[nodiscard]]
+inline RuntimeError MakeError(int32_t status, const char* fileName,
+                              int lineNumber, const char* funcName,
+                              fmt::string_view format, Args&&... args) {
   return MakeErrorV(status, fileName, lineNumber, funcName, format,
                     fmt::make_format_args(args...));
 }
diff --git a/wpilibc/src/main/native/include/frc/IterativeRobotBase.h b/wpilibc/src/main/native/include/frc/IterativeRobotBase.h
index 77ed197..42b0c71 100644
--- a/wpilibc/src/main/native/include/frc/IterativeRobotBase.h
+++ b/wpilibc/src/main/native/include/frc/IterativeRobotBase.h
@@ -23,6 +23,9 @@
  *
  * RobotInit() -- provide for initialization at robot power-on
  *
+ * DriverStationConnected() -- provide for initialization the first time the DS
+ * is connected
+ *
  * Init() functions -- each of the following functions is called once when the
  * appropriate mode is entered:
  *
@@ -68,6 +71,14 @@
   virtual void RobotInit();
 
   /**
+   * Code that needs to know the DS state should go here.
+   *
+   * Users should override this method for initialization that needs to occur
+   * after the DS is connected, such as needing the alliance information.
+   */
+  virtual void DriverStationConnected();
+
+  /**
    * Robot-wide simulation initialization code should go here.
    *
    * Users should override this method for default Robot-wide simulation
@@ -242,6 +253,7 @@
   Watchdog m_watchdog;
   bool m_ntFlushEnabled = true;
   bool m_lwEnabledInTest = true;
+  bool m_calledDsConnected = false;
 
   void PrintLoopOverrunMessage();
 };
diff --git a/wpilibc/src/main/native/include/frc/Joystick.h b/wpilibc/src/main/native/include/frc/Joystick.h
index fc0df35..a955718 100644
--- a/wpilibc/src/main/native/include/frc/Joystick.h
+++ b/wpilibc/src/main/native/include/frc/Joystick.h
@@ -6,6 +6,8 @@
 
 #include <array>
 
+#include <units/angle.h>
+
 #include "frc/GenericHID.h"
 
 namespace frc {
@@ -226,7 +228,9 @@
    * in radians.
    *
    * @return The direction of the vector in radians
+   * @deprecated Use GetDirection() instead.
    */
+  [[deprecated("Use GetDirection() instead.")]]
   double GetDirectionRadians() const;
 
   /**
@@ -234,9 +238,18 @@
    * in degrees.
    *
    * @return The direction of the vector in degrees
+   * @deprecated Use GetDirection() instead.
    */
+  [[deprecated("Use GetDirection() instead.")]]
   double GetDirectionDegrees() const;
 
+  /**
+   * Get the direction of the vector formed by the joystick and its origin.
+   *
+   * @return The direction of the vector.
+   */
+  units::radian_t GetDirection() const;
+
  private:
   enum Axis { kX, kY, kZ, kTwist, kThrottle, kNumAxes };
   enum Button { kTrigger = 1, kTop = 2 };
diff --git a/wpilibc/src/main/native/include/frc/Notifier.h b/wpilibc/src/main/native/include/frc/Notifier.h
index bda685c..0bd54d4 100644
--- a/wpilibc/src/main/native/include/frc/Notifier.h
+++ b/wpilibc/src/main/native/include/frc/Notifier.h
@@ -7,10 +7,10 @@
 #include <stdint.h>
 
 #include <atomic>
+#include <concepts>
 #include <functional>
 #include <string_view>
 #include <thread>
-#include <type_traits>
 #include <utility>
 
 #include <hal/Types.h>
@@ -20,7 +20,7 @@
 namespace frc {
 
 /**
- * Notifiers run a callback function on a separate thread at a specified period.
+ * Notifiers run a user-provided callback function on a separate thread.
  *
  * If StartSingle() is used, the callback will run once. If StartPeriodic() is
  * used, the callback will run repeatedly with the given period until stop() is
@@ -29,22 +29,25 @@
 class Notifier {
  public:
   /**
-   * Create a Notifier for timer event notification.
+   * Create a Notifier with the given callback.
    *
-   * @param handler The handler is called at the notification time which is set
-   *                using StartSingle or StartPeriodic.
+   * Configure when the callback runs with StartSingle() or StartPeriodic().
+   *
+   * @param callback The callback to run.
    */
-  explicit Notifier(std::function<void()> handler);
+  explicit Notifier(std::function<void()> callback);
 
-  template <
-      typename Callable, typename Arg, typename... Args,
-      typename = std::enable_if_t<std::is_invocable_v<Callable, Arg, Args...>>>
-  Notifier(Callable&& f, Arg&& arg, Args&&... args)
-      : Notifier(std::bind(std::forward<Callable>(f), std::forward<Arg>(arg),
+  template <typename Arg, typename... Args>
+  Notifier(std::invocable<Arg, Args...> auto&& callback, Arg&& arg,
+           Args&&... args)
+      : Notifier(std::bind(std::forward<decltype(callback)>(callback),
+                           std::forward<Arg>(arg),
                            std::forward<Args>(args)...)) {}
 
   /**
-   * Create a Notifier for timer event notification.
+   * Create a Notifier with the given callback.
+   *
+   * Configure when the callback runs with StartSingle() or StartPeriodic().
    *
    * This overload makes the underlying thread run with a real-time priority.
    * This is useful for reducing scheduling jitter on processes which are
@@ -53,16 +56,16 @@
    * @param priority The FIFO real-time scheduler priority ([1..99] where a
    *                 higher number represents higher priority). See "man 7
    *                 sched" for more details.
-   * @param handler  The handler is called at the notification time which is set
-   *                 using StartSingle or StartPeriodic.
+   * @param callback The callback to run.
    */
-  explicit Notifier(int priority, std::function<void()> handler);
+  explicit Notifier(int priority, std::function<void()> callback);
 
-  template <typename Callable, typename Arg, typename... Args>
-  Notifier(int priority, Callable&& f, Arg&& arg, Args&&... args)
-      : Notifier(priority,
-                 std::bind(std::forward<Callable>(f), std::forward<Arg>(arg),
-                           std::forward<Args>(args)...)) {}
+  template <typename Arg, typename... Args>
+  Notifier(int priority, std::invocable<Arg, Args...> auto&& callback,
+           Arg&& arg, Args&&... args)
+      : Notifier(priority, std::bind(std::forward<decltype(callback)>(callback),
+                                     std::forward<Arg>(arg),
+                                     std::forward<Args>(args)...)) {}
 
   /**
    * Free the resources for a timer event.
@@ -73,51 +76,54 @@
   Notifier& operator=(Notifier&& rhs);
 
   /**
-   * Sets the name of the notifier.  Used for debugging purposes only.
+   * Sets the name of the notifier. Used for debugging purposes only.
    *
    * @param name Name
    */
   void SetName(std::string_view name);
 
   /**
-   * Change the handler function.
+   * Change the callback function.
    *
-   * @param handler Handler
+   * @param callback The callback function.
+   * @deprecated Use SetCallback() instead.
    */
-  void SetHandler(std::function<void()> handler);
+  [[deprecated("Use SetCallback() instead.")]]
+  void SetHandler(std::function<void()> callback);
 
   /**
-   * Register for single event notification.
+   * Change the callback function.
    *
-   * A timer event is queued for a single event after the specified delay.
+   * @param callback The callback function.
+   */
+  void SetCallback(std::function<void()> callback);
+
+  /**
+   * Run the callback once after the given delay.
    *
-   * @param delay Amount of time to wait before the handler is called.
+   * @param delay Time to wait before the callback is called.
    */
   void StartSingle(units::second_t delay);
 
   /**
-   * Register for periodic event notification.
+   * Run the callback periodically with the given period.
    *
-   * A timer event is queued for periodic event notification. Each time the
-   * interrupt occurs, the event will be immediately requeued for the same time
-   * interval.
+   * The user-provided callback should be written so that it completes before
+   * the next time it's scheduled to run.
    *
-   * The user-provided callback should be written in a nonblocking manner so the
-   * callback can be recalled at the next periodic event notification.
-   *
-   * @param period Period to call the handler starting one period
-   *               after the call to this method.
+   * @param period Period after which to to call the callback starting one
+   *               period after the call to this method.
    */
   void StartPeriodic(units::second_t period);
 
   /**
-   * Stop timer events from occurring.
+   * Stop further callback invocations.
    *
-   * Stop any repeating timer events from occurring. This will also remove any
-   * single notification events from the queue.
+   * No further periodic callbacks will occur. Single invocations will also be
+   * cancelled if they haven't yet occurred.
    *
-   * If a timer-based call to the registered handler is in progress, this
-   * function will block until the handler call is complete.
+   * If a callback invocation is in progress, this function will block until the
+   * callback is complete.
    */
   void Stop();
 
@@ -154,22 +160,24 @@
   // The thread waiting on the HAL alarm
   std::thread m_thread;
 
-  // Held while updating process information
+  // The mutex held while updating process information
   wpi::mutex m_processMutex;
 
-  // HAL handle, atomic for proper destruction
+  // HAL handle (atomic for proper destruction)
   std::atomic<HAL_NotifierHandle> m_notifier{0};
 
-  // Address of the handler
-  std::function<void()> m_handler;
+  // The user-provided callback
+  std::function<void()> m_callback;
 
-  // The absolute expiration time
+  // The time at which the callback should be called. Has the same zero as
+  // Timer::GetFPGATimestamp().
   units::second_t m_expirationTime = 0_s;
 
-  // The relative time (either periodic or single)
+  // If periodic, stores the callback period; if single, stores the time until
+  // the callback call.
   units::second_t m_period = 0_s;
 
-  // True if this is a periodic event
+  // True if the callback is periodic
   bool m_periodic = false;
 };
 
diff --git a/wpilibc/src/main/native/include/frc/PS5Controller.h b/wpilibc/src/main/native/include/frc/PS5Controller.h
new file mode 100644
index 0000000..2a24f5e
--- /dev/null
+++ b/wpilibc/src/main/native/include/frc/PS5Controller.h
@@ -0,0 +1,529 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#pragma once
+
+#include "frc/GenericHID.h"
+
+namespace frc {
+
+/**
+ * Handle input from PS5 controllers connected to the Driver Station.
+ *
+ * <p>This class handles PS5 input that comes from the Driver Station. Each time
+ * a value is requested the most recent value is returned. There is a single
+ * class instance for each controller and the mapping of ports to hardware
+ * buttons depends on the code in the Driver Station.
+ */
+class PS5Controller : public GenericHID {
+ public:
+  /**
+   * Construct an instance of an PS5 controller.
+   *
+   * The controller index is the USB port on the Driver Station.
+   *
+   * @param port The port on the Driver Station that the controller is plugged
+   *             into (0-5).
+   */
+  explicit PS5Controller(int port);
+
+  ~PS5Controller() override = default;
+
+  PS5Controller(PS5Controller&&) = default;
+  PS5Controller& operator=(PS5Controller&&) = default;
+
+  /**
+   * Get the X axis value of left side of the controller.
+   *
+   * @return the axis value.
+   */
+  double GetLeftX() const;
+
+  /**
+   * Get the X axis value of right side of the controller.
+   *
+   * @return the axis value.
+   */
+  double GetRightX() const;
+
+  /**
+   * Get the Y axis value of left side of the controller.
+   *
+   * @return the axis value.
+   */
+  double GetLeftY() const;
+
+  /**
+   * Get the Y axis value of right side of the controller.
+   *
+   * @return the axis value.
+   */
+  double GetRightY() const;
+
+  /**
+   * Get the L2 axis value of the controller. Note that this axis is bound to
+   * the range of [0, 1] as opposed to the usual [-1, 1].
+   *
+   * @return the axis value.
+   */
+  double GetL2Axis() const;
+
+  /**
+   * Get the R2 axis value of the controller. Note that this axis is bound to
+   * the range of [0, 1] as opposed to the usual [-1, 1].
+   *
+   * @return the axis value.
+   */
+  double GetR2Axis() const;
+
+  /**
+   * Read the value of the Square button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetSquareButton() const;
+
+  /**
+   * Whether the Square button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetSquareButtonPressed();
+
+  /**
+   * Whether the Square button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetSquareButtonReleased();
+
+  /**
+   * Constructs an event instance around the square button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the square button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent Square(EventLoop* loop) const;
+
+  /**
+   * Read the value of the Cross button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetCrossButton() const;
+
+  /**
+   * Whether the Cross button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetCrossButtonPressed();
+
+  /**
+   * Whether the Cross button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetCrossButtonReleased();
+
+  /**
+   * Constructs an event instance around the cross button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the cross button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent Cross(EventLoop* loop) const;
+
+  /**
+   * Read the value of the Circle button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetCircleButton() const;
+
+  /**
+   * Whether the Circle button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetCircleButtonPressed();
+
+  /**
+   * Whether the Circle button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetCircleButtonReleased();
+
+  /**
+   * Constructs an event instance around the circle button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the circle button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent Circle(EventLoop* loop) const;
+
+  /**
+   * Read the value of the Triangle button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetTriangleButton() const;
+
+  /**
+   * Whether the Triangle button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetTriangleButtonPressed();
+
+  /**
+   * Whether the Triangle button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetTriangleButtonReleased();
+
+  /**
+   * Constructs an event instance around the triangle button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the triangle button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent Triangle(EventLoop* loop) const;
+
+  /**
+   * Read the value of the L1 button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetL1Button() const;
+
+  /**
+   * Whether the L1 button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetL1ButtonPressed();
+
+  /**
+   * Whether the L1 button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetL1ButtonReleased();
+
+  /**
+   * Constructs an event instance around the L1 button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the L1 button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent L1(EventLoop* loop) const;
+
+  /**
+   * Read the value of the R1 button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetR1Button() const;
+
+  /**
+   * Whether the R1 button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetR1ButtonPressed();
+
+  /**
+   * Whether the R1 button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetR1ButtonReleased();
+
+  /**
+   * Constructs an event instance around the R1 button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the R1 button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent R1(EventLoop* loop) const;
+
+  /**
+   * Read the value of the L2 button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetL2Button() const;
+
+  /**
+   * Whether the L2 button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetL2ButtonPressed();
+
+  /**
+   * Whether the L2 button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetL2ButtonReleased();
+
+  /**
+   * Constructs an event instance around the L2 button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the L2 button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent L2(EventLoop* loop) const;
+
+  /**
+   * Read the value of the R2 button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetR2Button() const;
+
+  /**
+   * Whether the R2 button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetR2ButtonPressed();
+
+  /**
+   * Whether the R2 button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetR2ButtonReleased();
+
+  /**
+   * Constructs an event instance around the R2 button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the R2 button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent R2(EventLoop* loop) const;
+
+  /**
+   * Read the value of the Create button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetCreateButton() const;
+
+  /**
+   * Whether the Create button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetCreateButtonPressed();
+
+  /**
+   * Whether the Create button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetCreateButtonReleased();
+
+  /**
+   * Constructs an event instance around the Create button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the Create button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent Create(EventLoop* loop) const;
+
+  /**
+   * Read the value of the Options button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetOptionsButton() const;
+
+  /**
+   * Whether the Options button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetOptionsButtonPressed();
+
+  /**
+   * Whether the Options button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetOptionsButtonReleased();
+
+  /**
+   * Constructs an event instance around the options button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the options button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent Options(EventLoop* loop) const;
+
+  /**
+   * Read the value of the L3 button (pressing the left analog stick) on the
+   * controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetL3Button() const;
+
+  /**
+   * Whether the L3 (left stick) button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetL3ButtonPressed();
+
+  /**
+   * Whether the L3 (left stick) button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetL3ButtonReleased();
+
+  /**
+   * Constructs an event instance around the L3 button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the L3 button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent L3(EventLoop* loop) const;
+
+  /**
+   * Read the value of the R3 button (pressing the right analog stick) on the
+   * controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetR3Button() const;
+
+  /**
+   * Whether the R3 (right stick) button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetR3ButtonPressed();
+
+  /**
+   * Whether the R3 (right stick) button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetR3ButtonReleased();
+
+  /**
+   * Constructs an event instance around the R3 button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the R3 button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent R3(EventLoop* loop) const;
+
+  /**
+   * Read the value of the PS button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetPSButton() const;
+
+  /**
+   * Whether the PS button was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
+   */
+  bool GetPSButtonPressed();
+
+  /**
+   * Whether the PS button was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
+   */
+  bool GetPSButtonReleased();
+
+  /**
+   * Constructs an event instance around the PS button's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the PS button's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent PS(EventLoop* loop) const;
+
+  /**
+   * Read the value of the touchpad button on the controller.
+   *
+   * @return The state of the button.
+   */
+  bool GetTouchpad() const;
+
+  /**
+   * Whether the touchpad was pressed since the last check.
+   *
+   * @return Whether the touchpad was pressed since the last check.
+   */
+  bool GetTouchpadPressed();
+
+  /**
+   * Whether the touchpad was released since the last check.
+   *
+   * @return Whether the touchpad was released since the last check.
+   */
+  bool GetTouchpadReleased();
+
+  /**
+   * Constructs an event instance around the touchpad's digital signal.
+   *
+   * @param loop the event loop instance to attach the event to.
+   * @return an event instance representing the touchpad's digital signal
+   * attached to the given loop.
+   */
+  BooleanEvent Touchpad(EventLoop* loop) const;
+
+  struct Button {
+    static constexpr int kSquare = 3;
+    static constexpr int kCross = 1;
+    static constexpr int kCircle = 2;
+    static constexpr int kTriangle = 4;
+    static constexpr int kL1 = 5;
+    static constexpr int kR1 = 6;
+    static constexpr int kL2 = 7;
+    static constexpr int kR2 = 8;
+    static constexpr int kCreate = 9;
+    static constexpr int kOptions = 10;
+    static constexpr int kL3 = 12;
+    static constexpr int kR3 = 13;
+    static constexpr int kPS = 11;
+    static constexpr int kTouchpad = 14;
+  };
+
+  struct Axis {
+    static constexpr int kLeftX = 0;
+    static constexpr int kLeftY = 1;
+    static constexpr int kRightX = 3;
+    static constexpr int kRightY = 4;
+    static constexpr int kL2 = 2;
+    static constexpr int kR2 = 5;
+  };
+};
+
+}  // namespace frc
diff --git a/wpilibc/src/main/native/include/frc/PWM.h b/wpilibc/src/main/native/include/frc/PWM.h
index e508915..0871c9c 100644
--- a/wpilibc/src/main/native/include/frc/PWM.h
+++ b/wpilibc/src/main/native/include/frc/PWM.h
@@ -7,6 +7,7 @@
 #include <stdint.h>
 
 #include <hal/Types.h>
+#include <units/time.h>
 #include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
@@ -18,18 +19,9 @@
  * Class implements the PWM generation in the FPGA.
  *
  * The values supplied as arguments for PWM outputs range from -1.0 to 1.0. They
- * are mapped to the hardware dependent values, in this case 0-2000 for the
- * FPGA. Changes are immediately sent to the FPGA, and the update occurs at the
- * next FPGA cycle (5.005ms). There is no delay.
- *
- * As of revision 0.1.10 of the FPGA, the FPGA interprets the 0-2000 values as
- * follows:
- *   - 2000 = maximum pulse width
- *   - 1999 to 1001 = linear scaling from "full forward" to "center"
- *   - 1000 = center value
- *   - 999 to 2 = linear scaling from "center" to "full reverse"
- *   - 1 = minimum pulse width (currently 0.5ms)
- *   - 0 = disabled (i.e. PWM output is held low)
+ * are mapped to the microseconds to keep the pulse high, with a range of 0
+ * (off) to 4096. Changes are immediately sent to the FPGA, and the update
+ * occurs at the next FPGA cycle (5.05ms). There is no delay.
  */
 class PWM : public wpi::Sendable, public wpi::SendableHelper<PWM> {
  public:
@@ -40,15 +32,15 @@
    */
   enum PeriodMultiplier {
     /**
-     * Don't skip pulses. PWM pulses occur every 5.005 ms
+     * Don't skip pulses. PWM pulses occur every 5.05 ms
      */
     kPeriodMultiplier_1X = 1,
     /**
-     * Skip every other pulse. PWM pulses occur every 10.010 ms
+     * Skip every other pulse. PWM pulses occur every 10.10 ms
      */
     kPeriodMultiplier_2X = 2,
     /**
-     * Skip three out of four pulses. PWM pulses occur every 20.020 ms
+     * Skip three out of four pulses. PWM pulses occur every 20.20 ms
      */
     kPeriodMultiplier_4X = 4
   };
@@ -78,30 +70,29 @@
   PWM& operator=(PWM&&) = default;
 
   /**
-   * Set the PWM value directly to the hardware.
+   * Set the PWM pulse time directly to the hardware.
    *
-   * Write a raw value to a PWM channel.
+   * Write a microsecond value to a PWM channel.
    *
-   * @param value Raw PWM value.
+   * @param time Microsecond PWM value.
    */
-  virtual void SetRaw(uint16_t value);
+  virtual void SetPulseTime(units::microsecond_t time);
 
   /**
-   * Get the PWM value directly from the hardware.
+   * Get the PWM pulse time directly from the hardware.
    *
-   * Read a raw value from a PWM channel.
+   * Read a microsecond value from a PWM channel.
    *
-   * @return Raw PWM control value.
+   * @return Microsecond PWM control value.
    */
-  virtual uint16_t GetRaw() const;
+  virtual units::microsecond_t GetPulseTime() const;
 
   /**
    * Set the PWM value based on a position.
    *
    * This is intended to be used by servos.
    *
-   * @pre SetMaxPositivePwm() called.
-   * @pre SetMinNegativePwm() called.
+   * @pre SetBounds() called.
    *
    * @param pos The position to set the servo between 0.0 and 1.0.
    */
@@ -112,8 +103,7 @@
    *
    * This is intended to be used by servos.
    *
-   * @pre SetMaxPositivePwm() called.
-   * @pre SetMinNegativePwm() called.
+   * @pre SetBounds() called.
    *
    * @return The position the servo is set to between 0.0 and 1.0.
    */
@@ -124,11 +114,7 @@
    *
    * This is intended to be used by motor controllers.
    *
-   * @pre SetMaxPositivePwm() called.
-   * @pre SetMinPositivePwm() called.
-   * @pre SetCenterPwm() called.
-   * @pre SetMaxNegativePwm() called.
-   * @pre SetMinNegativePwm() called.
+   * @pre SetBounds() called.
    *
    * @param speed The speed to set the motor controller between -1.0 and 1.0.
    */
@@ -139,17 +125,14 @@
    *
    * This is intended to be used by motor controllers.
    *
-   * @pre SetMaxPositivePwm() called.
-   * @pre SetMinPositivePwm() called.
-   * @pre SetMaxNegativePwm() called.
-   * @pre SetMinNegativePwm() called.
+   * @pre SetBounds() called.
    *
    * @return The most recently set speed between -1.0 and 1.0.
    */
   virtual double GetSpeed() const;
 
   /**
-   * Temporarily disables the PWM output. The next set call will reenable
+   * Temporarily disables the PWM output. The next set call will re-enable
    * the output.
    */
   virtual void SetDisabled();
@@ -180,46 +163,38 @@
    * The values determine the upper and lower speeds as well as the deadband
    * bracket.
    *
-   * @param max         The max PWM pulse width in ms
-   * @param deadbandMax The high end of the deadband range pulse width in ms
-   * @param center      The center (off) pulse width in ms
-   * @param deadbandMin The low end of the deadband pulse width in ms
-   * @param min         The minimum pulse width in ms
+   * @param max         The max PWM pulse width in us
+   * @param deadbandMax The high end of the deadband range pulse width in us
+   * @param center      The center (off) pulse width in us
+   * @param deadbandMin The low end of the deadband pulse width in us
+   * @param min         The minimum pulse width in us
    */
-  void SetBounds(double max, double deadbandMax, double center,
-                 double deadbandMin, double min);
-
-  /**
-   * Set the bounds on the PWM values.
-   *
-   * This sets the bounds on the PWM values for a particular each type of
-   * controller. The values determine the upper and lower speeds as well as the
-   * deadband bracket.
-   *
-   * @param max         The Minimum pwm value
-   * @param deadbandMax The high end of the deadband range
-   * @param center      The center speed (off)
-   * @param deadbandMin The low end of the deadband range
-   * @param min         The minimum pwm value
-   */
-  void SetRawBounds(int max, int deadbandMax, int center, int deadbandMin,
-                    int min);
+  void SetBounds(units::microsecond_t max, units::microsecond_t deadbandMax,
+                 units::microsecond_t center, units::microsecond_t deadbandMin,
+                 units::microsecond_t min);
 
   /**
    * Get the bounds on the PWM values.
    *
-   * This Gets the bounds on the PWM values for a particular each type of
+   * This gets the bounds on the PWM values for a particular each type of
    * controller. The values determine the upper and lower speeds as well as the
    * deadband bracket.
    *
-   * @param max         The Minimum pwm value
+   * @param max         The maximum pwm value
    * @param deadbandMax The high end of the deadband range
    * @param center      The center speed (off)
    * @param deadbandMin The low end of the deadband range
    * @param min         The minimum pwm value
    */
-  void GetRawBounds(int32_t* max, int32_t* deadbandMax, int32_t* center,
-                    int32_t* deadbandMin, int32_t* min);
+  void GetBounds(units::microsecond_t* max, units::microsecond_t* deadbandMax,
+                 units::microsecond_t* center,
+                 units::microsecond_t* deadbandMin, units::microsecond_t* min);
+
+  /**
+   * Sets the PWM output to be a continuous high signal while enabled.
+   *
+   */
+  void SetAlwaysHighMode();
 
   int GetChannel() const;
 
diff --git a/wpilibc/src/main/native/include/frc/PneumaticHub.h b/wpilibc/src/main/native/include/frc/PneumaticHub.h
index f876b7a..b69b3d5 100644
--- a/wpilibc/src/main/native/include/frc/PneumaticHub.h
+++ b/wpilibc/src/main/native/include/frc/PneumaticHub.h
@@ -46,9 +46,10 @@
    * and will turn off when the pressure reaches {@code maxPressure}.
    *
    * @param minPressure The minimum pressure. The compressor will turn on when
-   * the pressure drops below this value.
+   * the pressure drops below this value. Range 0 - 120 PSI.
    * @param maxPressure The maximum pressure. The compressor will turn off when
-   * the pressure reaches this value.
+   * the pressure reaches this value. Range 0 - 120 PSI. Must be larger then
+   * minPressure.
    */
   void EnableCompressorAnalog(
       units::pounds_per_square_inch_t minPressure,
@@ -74,10 +75,11 @@
    *
    * @param minPressure The minimum pressure. The compressor will turn on when
    * the pressure drops below this value and the pressure switch indicates that
-   * the system is not full.
+   * the system is not full.  Range 0 - 120 PSI.
    * @param maxPressure The maximum pressure. The compressor will turn off when
    * the pressure reaches this value or the pressure switch is disconnected or
-   * indicates that the system is full.
+   * indicates that the system is full. Range 0 - 120 PSI. Must be larger then
+   * minPressure.
    */
   void EnableCompressorHybrid(
       units::pounds_per_square_inch_t minPressure,
diff --git a/wpilibc/src/main/native/include/frc/PneumaticsBase.h b/wpilibc/src/main/native/include/frc/PneumaticsBase.h
index b455dc6..59f899f 100644
--- a/wpilibc/src/main/native/include/frc/PneumaticsBase.h
+++ b/wpilibc/src/main/native/include/frc/PneumaticsBase.h
@@ -117,15 +117,15 @@
   /**
    * Sets solenoids on a pneumatics module.
    *
-   * @param mask mask
-   * @param values values
+   * @param mask bitmask to set
+   * @param values solenoid values
    */
   virtual void SetSolenoids(int mask, int values) = 0;
 
   /**
    * Gets a bitmask of solenoid values.
    *
-   * @return values
+   * @return solenoid values
    */
   virtual int GetSolenoids() const = 0;
 
@@ -183,8 +183,16 @@
    */
   virtual void UnreserveSolenoids(int mask) = 0;
 
+  /**
+   * Reserve the compressor.
+   *
+   * @return true if successful; false if compressor already reserved
+   */
   virtual bool ReserveCompressor() = 0;
 
+  /**
+   * Unreserve the compressor.
+   */
   virtual void UnreserveCompressor() = 0;
 
   /**
@@ -212,9 +220,29 @@
    */
   virtual units::pounds_per_square_inch_t GetPressure(int channel) const = 0;
 
+  /**
+   * Create a solenoid object for the specified channel.
+   *
+   * @param channel solenoid channel
+   * @return Solenoid object
+   */
   virtual Solenoid MakeSolenoid(int channel) = 0;
+
+  /**
+   * Create a double solenoid object for the specified channels.
+   *
+   * @param forwardChannel solenoid channel for forward
+   * @param reverseChannel solenoid channel for reverse
+   * @return DoubleSolenoid object
+   */
   virtual DoubleSolenoid MakeDoubleSolenoid(int forwardChannel,
                                             int reverseChannel) = 0;
+
+  /**
+   * Create a compressor object.
+   *
+   * @return Compressor object
+   */
   virtual Compressor MakeCompressor() = 0;
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/PneumaticsControlModule.h b/wpilibc/src/main/native/include/frc/PneumaticsControlModule.h
index acad5a1..3dd6d3a 100644
--- a/wpilibc/src/main/native/include/frc/PneumaticsControlModule.h
+++ b/wpilibc/src/main/native/include/frc/PneumaticsControlModule.h
@@ -118,7 +118,7 @@
   /**
    * Returns whether the compressor has been disconnected since sticky faults
    * were last cleared. This fault is persistent and can be cleared by
-   * ClearAllStickyFaults()}
+   * ClearAllStickyFaults()
    *
    * @return True if the compressor has been disconnected since sticky faults
    * were last cleared, otherwise false.
@@ -126,7 +126,22 @@
    */
   bool GetCompressorNotConnectedStickyFault() const;
 
+  /**
+   * Returns whether the solenoid is currently reporting a voltage fault.
+   *
+   * @return True if solenoid is reporting a fault, otherwise false.
+   * @see GetSolenoidVoltageStickyFault()
+   */
   bool GetSolenoidVoltageFault() const;
+
+  /**
+   * Returns whether the solenoid has reported a voltage fault since sticky
+   * faults were last cleared. This fault is persistent and can be cleared by
+   * ClearAllStickyFaults()
+   *
+   * @return True if solenoid is reporting a fault, otherwise false.
+   * @see GetSolenoidVoltageFault()
+   */
   bool GetSolenoidVoltageStickyFault() const;
 
   /** Clears all sticky faults on this device. */
diff --git a/wpilibc/src/main/native/include/frc/Resource.h b/wpilibc/src/main/native/include/frc/Resource.h
index 4109cc4..6d9dfa5 100644
--- a/wpilibc/src/main/native/include/frc/Resource.h
+++ b/wpilibc/src/main/native/include/frc/Resource.h
@@ -17,7 +17,7 @@
 /**
  * The Resource class is a convenient way to track allocated resources.
  *
- * It tracks them as indicies in the range [0 .. elements - 1]. E.g. the library
+ * It tracks them as indices in the range [0 .. elements - 1]. E.g. the library
  * uses this to track hardware channel allocation.
  *
  * The Resource class does not allocate the hardware channels or other
@@ -46,7 +46,7 @@
    * Allocate storage for a new instance of Resource.
    *
    * Allocate a bool array of values that will get initialized to indicate that
-   * no resources have been allocated yet. The indicies of the resources are
+   * no resources have been allocated yet. The indices of the resources are
    * [0 .. elements - 1].
    */
   explicit Resource(uint32_t size);
diff --git a/wpilibc/src/main/native/include/frc/RobotBase.h b/wpilibc/src/main/native/include/frc/RobotBase.h
index 3ff4617..504ac81 100644
--- a/wpilibc/src/main/native/include/frc/RobotBase.h
+++ b/wpilibc/src/main/native/include/frc/RobotBase.h
@@ -115,28 +115,28 @@
 }
 
 /**
- * Implement a Robot Program framework.
+ * Implement a Robot Program framework. The RobotBase class is intended to be
+ * subclassed to create a robot program. The user must implement
+ * StartCompetition() which will be called once and is not expected to exit. The
+ * user must also implement EndCompetition(), which signals to the code in
+ * StartCompetition() that it should exit.
  *
- * The RobotBase class is intended to be subclassed by a user creating a robot
- * program. Overridden Autonomous() and OperatorControl() methods are called at
- * the appropriate time as the match proceeds. In the current implementation,
- * the Autonomous code will run to completion before the OperatorControl code
- * could start. In the future the Autonomous code might be spawned as a task,
- * then killed at the end of the Autonomous period.
+ * It is not recommended to subclass this class directly - instead subclass
+ * IterativeRobotBase or TimedRobot.
  */
 class RobotBase {
  public:
   /**
    * Determine if the Robot is currently enabled.
    *
-   * @return True if the Robot is currently enabled by the field controls.
+   * @return True if the Robot is currently enabled by the Driver Station.
    */
   bool IsEnabled() const;
 
   /**
    * Determine if the Robot is currently disabled.
    *
-   * @return True if the Robot is currently disabled by the field controls.
+   * @return True if the Robot is currently disabled by the Driver Station.
    */
   bool IsDisabled() const;
 
@@ -144,7 +144,7 @@
    * Determine if the robot is currently in Autonomous mode.
    *
    * @return True if the robot is currently operating Autonomously as determined
-   *         by the field controls.
+   *         by the Driver Station.
    */
   bool IsAutonomous() const;
 
@@ -152,7 +152,7 @@
    * Determine if the robot is currently in Autonomous mode and enabled.
    *
    * @return True if the robot us currently operating Autonomously while enabled
-   * as determined by the field controls.
+   * as determined by the Driver Station.
    */
   bool IsAutonomousEnabled() const;
 
@@ -160,7 +160,7 @@
    * Determine if the robot is currently in Operator Control mode.
    *
    * @return True if the robot is currently operating in Tele-Op mode as
-   *         determined by the field controls.
+   *         determined by the Driver Station.
    */
   bool IsTeleop() const;
 
@@ -168,25 +168,38 @@
    * Determine if the robot is current in Operator Control mode and enabled.
    *
    * @return True if the robot is currently operating in Tele-Op mode while
-   * wnabled as determined by the field-controls.
+   * enabled as determined by the Driver Station.
    */
   bool IsTeleopEnabled() const;
 
   /**
    * Determine if the robot is currently in Test mode.
    *
-   * @return True if the robot is currently running tests as determined by the
-   *         field controls.
+   * @return True if the robot is currently running in Test mode as determined
+   * by the Driver Station.
    */
   bool IsTest() const;
 
   /**
+   * Determine if the robot is current in Test mode and enabled.
+   *
+   * @return True if the robot is currently operating in Test mode while
+   * enabled as determined by the Driver Station.
+   */
+  bool IsTestEnabled() const;
+
+  /**
    * Gets the ID of the main robot thread.
    */
   static std::thread::id GetThreadId();
 
+  /**
+   * Start the main robot code. This function will be called once and should not
+   * exit until signalled by EndCompetition()
+   */
   virtual void StartCompetition() = 0;
 
+  /** Ends the main loop in StartCompetition(). */
   virtual void EndCompetition() = 0;
 
   /**
@@ -215,13 +228,17 @@
    * @return If the robot is running in simulation.
    */
   static constexpr bool IsSimulation() {
-    return !IsReal();
+#ifdef __FRC_ROBORIO__
+    return false;
+#else
+    return true;
+#endif
   }
 
   /**
    * Constructor for a generic robot program.
    *
-   * User code should be placed in the constructor that runs before the
+   * User code can be placed in the constructor that runs before the
    * Autonomous or Operator Control period starts. The constructor will run to
    * completion before Autonomous is entered.
    *
diff --git a/wpilibc/src/main/native/include/frc/RobotController.h b/wpilibc/src/main/native/include/frc/RobotController.h
index c020d34..bf65a8c 100644
--- a/wpilibc/src/main/native/include/frc/RobotController.h
+++ b/wpilibc/src/main/native/include/frc/RobotController.h
@@ -8,6 +8,7 @@
 
 #include <string>
 
+#include <units/temperature.h>
 #include <units/voltage.h>
 
 namespace frc {
@@ -63,6 +64,13 @@
   static std::string GetComments();
 
   /**
+   * Returns the team number configured for the robot controller.
+   *
+   * @return team number, or 0 if not found.
+   */
+  static int32_t GetTeamNumber();
+
+  /**
    * Read the microsecond-resolution timer on the FPGA.
    *
    * @return The current time in microseconds according to the FPGA (since FPGA
@@ -102,6 +110,19 @@
   static bool IsBrownedOut();
 
   /**
+   * Gets the current state of the Robot Signal Light (RSL)
+   * @return The current state of the RSL- true if on, false if off
+   */
+  static bool GetRSLState();
+
+  /**
+   * Gets if the system time is valid.
+   *
+   * @return True if the system time is valid, false otherwise
+   */
+  static bool IsSystemTimeValid();
+
+  /**
    * Get the input voltage to the robot controller.
    *
    * @return The controller input voltage value in Volts
@@ -130,9 +151,16 @@
   static double GetCurrent3V3();
 
   /**
-   * Get the enabled state of the 3.3V rail. The rail may be disabled due to a
-   * controller brownout, a short circuit on the rail, or controller
-   * over-voltage.
+   * Enables or disables the 3.3V rail.
+   *
+   * @param enabled whether to enable the 3.3V rail.
+   */
+  static void SetEnabled3V3(bool enabled);
+
+  /**
+   * Get the enabled state of the 3.3V rail. The rail may be disabled due to
+   * calling SetEnabled3V3(), a controller brownout, a short circuit on the
+   * rail, or controller over-voltage.
    *
    * @return The controller 3.3V rail enabled value. True for enabled.
    */
@@ -161,9 +189,16 @@
   static double GetCurrent5V();
 
   /**
-   * Get the enabled state of the 5V rail. The rail may be disabled due to a
-   * controller brownout, a short circuit on the rail, or controller
-   * over-voltage.
+   * Enables or disables the 5V rail.
+   *
+   * @param enabled whether to enable the 5V rail.
+   */
+  static void SetEnabled5V(bool enabled);
+
+  /**
+   * Get the enabled state of the 5V rail. The rail may be disabled due to
+   * calling SetEnabled5V(), a controller brownout, a short circuit on the rail,
+   * or controller over-voltage.
    *
    * @return The controller 5V rail enabled value. True for enabled.
    */
@@ -192,9 +227,16 @@
   static double GetCurrent6V();
 
   /**
-   * Get the enabled state of the 6V rail. The rail may be disabled due to a
-   * controller brownout, a short circuit on the rail, or controller
-   * over-voltage.
+   * Enables or disables the 6V rail.
+   *
+   * @param enabled whether to enable the 6V rail.
+   */
+  static void SetEnabled6V(bool enabled);
+
+  /**
+   * Get the enabled state of the 6V rail. The rail may be disabled due to
+   * calling SetEnabled6V(), a controller brownout, a short circuit on the rail,
+   * or controller over-voltage.
    *
    * @return The controller 6V rail enabled value. True for enabled.
    */
@@ -226,6 +268,13 @@
   static void SetBrownoutVoltage(units::volt_t brownoutVoltage);
 
   /**
+   * Get the current CPU temperature.
+   *
+   * @return current CPU temperature
+   */
+  static units::celsius_t GetCPUTemp();
+
+  /**
    * Get the current status of the CAN bus.
    *
    * @return The status of the CAN bus
diff --git a/wpilibc/src/main/native/include/frc/SPI.h b/wpilibc/src/main/native/include/frc/SPI.h
index 0d5b468..1158cbd 100644
--- a/wpilibc/src/main/native/include/frc/SPI.h
+++ b/wpilibc/src/main/native/include/frc/SPI.h
@@ -11,7 +11,6 @@
 
 #include <hal/SPITypes.h>
 #include <units/time.h>
-#include <wpi/deprecated.h>
 
 namespace frc {
 
@@ -28,10 +27,12 @@
  public:
   enum Port { kOnboardCS0 = 0, kOnboardCS1, kOnboardCS2, kOnboardCS3, kMXP };
   enum Mode {
-    kMode0 = HAL_SPI_kMode0,
-    kMode1 = HAL_SPI_kMode1,
-    kMode2 = HAL_SPI_kMode2,
-    kMode3 = HAL_SPI_kMode3
+    kMode0 = HAL_SPI_kMode0, /*!< Clock idle low, data sampled on rising edge */
+    kMode1 =
+        HAL_SPI_kMode1, /*!< Clock idle low, data sampled on falling edge */
+    kMode2 =
+        HAL_SPI_kMode2, /*!< Clock idle high, data sampled on falling edge */
+    kMode3 = HAL_SPI_kMode3 /*!< Clock idle high, data sampled on rising edge */
   };
 
   /**
@@ -59,60 +60,6 @@
   void SetClockRate(int hz);
 
   /**
-   * Configure the order that bits are sent and received on the wire
-   * to be most significant bit first.
-   *
-   * @deprecated Does not work, will be removed.
-   */
-  WPI_DEPRECATED("Not supported by roboRIO.")
-  void SetMSBFirst();
-
-  /**
-   * Configure the order that bits are sent and received on the wire
-   * to be least significant bit first.
-   *
-   * @deprecated Does not work, will be removed.
-   */
-  WPI_DEPRECATED("Not supported by roboRIO.")
-  void SetLSBFirst();
-
-  /**
-   * Configure that the data is stable on the leading edge and the data
-   * changes on the trailing edge.
-   *
-   * @deprecated Use SetMode() instead.
-   */
-  WPI_DEPRECATED("Use SetMode() instead")
-  void SetSampleDataOnLeadingEdge();
-
-  /**
-   * Configure that the data is stable on the trailing edge and the data
-   * changes on the leading edge.
-   *
-   * @deprecated Use SetMode() instead.
-   */
-  WPI_DEPRECATED("Use SetMode() instead")
-  void SetSampleDataOnTrailingEdge();
-
-  /**
-   * Configure the clock output line to be active low.
-   * This is sometimes called clock polarity high or clock idle high.
-   *
-   * @deprecated Use SetMode() instead.
-   */
-  WPI_DEPRECATED("Use SetMode() instead")
-  void SetClockActiveLow();
-
-  /**
-   * Configure the clock output line to be active high.
-   * This is sometimes called clock polarity low or clock idle low.
-   *
-   * @deprecated Use SetMode() instead.
-   */
-  WPI_DEPRECATED("Use SetMode() instead")
-  void SetClockActiveHigh();
-
-  /**
    * Sets the mode for the SPI device.
    *
    * <p>Mode 0 is Clock idle low, data sampled on rising edge
diff --git a/wpilibc/src/main/native/include/frc/SerialPort.h b/wpilibc/src/main/native/include/frc/SerialPort.h
index 7fff14a..dcc0a2e 100644
--- a/wpilibc/src/main/native/include/frc/SerialPort.h
+++ b/wpilibc/src/main/native/include/frc/SerialPort.h
@@ -16,7 +16,7 @@
  * Driver for the RS-232 serial port on the roboRIO.
  *
  * The current implementation uses the VISA formatted I/O mode.  This means that
- * all traffic goes through the fomatted buffers.  This allows the intermingled
+ * all traffic goes through the formatted buffers.  This allows the intermingled
  * use of Printf(), Scanf(), and the raw buffer accessors Read() and Write().
  *
  * More information can be found in the NI-VISA User Manual here:
diff --git a/wpilibc/src/main/native/include/frc/Servo.h b/wpilibc/src/main/native/include/frc/Servo.h
index 96cbfa4..9383641 100644
--- a/wpilibc/src/main/native/include/frc/Servo.h
+++ b/wpilibc/src/main/native/include/frc/Servo.h
@@ -4,6 +4,8 @@
 
 #pragma once
 
+#include <units/angle.h>
+
 #include "frc/PWM.h"
 
 namespace frc {
@@ -98,11 +100,11 @@
  private:
   double GetServoAngleRange() const;
 
-  static constexpr double kMaxServoAngle = 180.0;
+  static constexpr double kMaxServoAngle = 180.;
   static constexpr double kMinServoAngle = 0.0;
 
-  static constexpr double kDefaultMaxServoPWM = 2.4;
-  static constexpr double kDefaultMinServoPWM = 0.6;
+  static constexpr units::millisecond_t kDefaultMaxServoPWM = 2.4_ms;
+  static constexpr units::millisecond_t kDefaultMinServoPWM = 0.6_ms;
 };
 
 }  // namespace frc
diff --git a/wpilibc/src/main/native/include/frc/Solenoid.h b/wpilibc/src/main/native/include/frc/Solenoid.h
index a09ffc0..7fa4953 100644
--- a/wpilibc/src/main/native/include/frc/Solenoid.h
+++ b/wpilibc/src/main/native/include/frc/Solenoid.h
@@ -87,18 +87,22 @@
   bool IsDisabled() const;
 
   /**
-   * Set the pulse duration in the PCM. This is used in conjunction with
-   * the startPulse method to allow the PCM to control the timing of a pulse.
-   * The timing can be controlled in 0.01 second increments.
+   * Set the pulse duration in the pneumatics module. This is used in
+   * conjunction with the startPulse method to allow the pneumatics module to
+   * control the timing of a pulse.
    *
-   * @param duration The duration of the pulse, from 0.01 to 2.55 seconds.
+   * On the PCM, the timing can be controlled in 0.01 second increments, with a
+   * maximum of 2.55 seconds. On the PH, the timing can be controlled in 0.001
+   * second increments, with a maximum of 65.534 seconds.
+   *
+   * @param duration The duration of the pulse.
    *
    * @see startPulse()
    */
   void SetPulseDuration(units::second_t duration);
 
   /**
-   * %Trigger the PCM to generate a pulse of the duration set in
+   * %Trigger the pneumatics module to generate a pulse of the duration set in
    * setPulseDuration.
    *
    * @see setPulseDuration()
diff --git a/wpilibc/src/main/native/include/frc/Timer.h b/wpilibc/src/main/native/include/frc/Timer.h
index 14674ee..e163982 100644
--- a/wpilibc/src/main/native/include/frc/Timer.h
+++ b/wpilibc/src/main/native/include/frc/Timer.h
@@ -77,6 +77,14 @@
   void Start();
 
   /**
+   * Restart the timer by stopping the timer, if it is not already stopped,
+   * resetting the accumulated time, then starting the timer again. If you
+   * want an event to periodically reoccur at some time interval from the
+   * start time, consider using AdvanceIfElapsed() instead.
+   */
+  void Restart();
+
+  /**
    * Stop the timer.
    *
    * This computes the time as of now and clears the running flag, causing all
diff --git a/wpilibc/src/main/native/include/frc/XboxController.h b/wpilibc/src/main/native/include/frc/XboxController.h
index 370e46e..3caba1a 100644
--- a/wpilibc/src/main/native/include/frc/XboxController.h
+++ b/wpilibc/src/main/native/include/frc/XboxController.h
@@ -36,63 +36,87 @@
 
   /**
    * Get the X axis value of left side of the controller.
+   *
+   * @return the axis value
    */
   double GetLeftX() const;
 
   /**
    * Get the X axis value of right side of the controller.
+   *
+   * @return the axis value
    */
   double GetRightX() const;
 
   /**
    * Get the Y axis value of left side of the controller.
+   *
+   * @return the axis value
    */
   double GetLeftY() const;
 
   /**
    * Get the Y axis value of right side of the controller.
+   *
+   * @return the axis value
    */
   double GetRightY() const;
 
   /**
    * Get the left trigger (LT) axis value of the controller. Note that this axis
    * is bound to the range of [0, 1] as opposed to the usual [-1, 1].
+   *
+   * @return the axis value
    */
   double GetLeftTriggerAxis() const;
 
   /**
    * Get the right trigger (RT) axis value of the controller. Note that this
    * axis is bound to the range of [0, 1] as opposed to the usual [-1, 1].
+   *
+   * @return the axis value
    */
   double GetRightTriggerAxis() const;
 
   /**
    * Read the value of the left bumper (LB) button on the controller.
+   *
+   * @return the state of the button
    */
   bool GetLeftBumper() const;
 
   /**
    * Read the value of the right bumper (RB) button on the controller.
+   *
+   * @return the state of the button
    */
   bool GetRightBumper() const;
 
   /**
    * Whether the left bumper (LB) was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check
    */
   bool GetLeftBumperPressed();
 
   /**
    * Whether the right bumper (RB) was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check
    */
   bool GetRightBumperPressed();
 
   /**
    * Whether the left bumper (LB) was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
    */
   bool GetLeftBumperReleased();
 
   /**
    * Whether the right bumper (RB) was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
    */
   bool GetRightBumperReleased();
 
@@ -116,31 +140,43 @@
 
   /**
    * Read the value of the left stick button (LSB) on the controller.
+   *
+   * @return the state of the button
    */
   bool GetLeftStickButton() const;
 
   /**
    * Read the value of the right stick button (RSB) on the controller.
+   *
+   * @return the state of the button
    */
   bool GetRightStickButton() const;
 
   /**
    * Whether the left stick button (LSB) was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check.
    */
   bool GetLeftStickButtonPressed();
 
   /**
    * Whether the right stick button (RSB) was pressed since the last check.
+   *
+   * @return Whether the button was pressed since the last check
    */
   bool GetRightStickButtonPressed();
 
   /**
    * Whether the left stick button (LSB) was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
    */
   bool GetLeftStickButtonReleased();
 
   /**
    * Whether the right stick button (RSB) was released since the last check.
+   *
+   * @return Whether the button was released since the last check.
    */
   bool GetRightStickButtonReleased();
 
@@ -283,9 +319,9 @@
   BooleanEvent Y(EventLoop* loop) const;
 
   /**
-   * Whether the Y button was released since the last check.
+   * Read the value of the back button on the controller.
    *
-   * @return Whether the button was released since the last check.
+   * @return The state of the button.
    */
   bool GetBackButton() const;
 
@@ -359,7 +395,7 @@
    * Constructs an event instance around the axis value of the left trigger.
    * The returned trigger will be true when the axis value is greater than 0.5.
    * @param loop the event loop instance to attach the event to.
-   * @return an event instance that is true when the right trigger's axis
+   * @return an event instance that is true when the left trigger's axis
    * exceeds 0.5, attached to the given event loop
    */
   BooleanEvent LeftTrigger(EventLoop* loop) const;
diff --git a/wpilibc/src/main/native/include/frc/event/BooleanEvent.h b/wpilibc/src/main/native/include/frc/event/BooleanEvent.h
index 745a53c..7c19c90 100644
--- a/wpilibc/src/main/native/include/frc/event/BooleanEvent.h
+++ b/wpilibc/src/main/native/include/frc/event/BooleanEvent.h
@@ -40,9 +40,10 @@
   BooleanEvent(EventLoop* loop, std::function<bool()> condition);
 
   /**
-   * Check whether this event is active or not.
+   * Check whether this event is active or not as of the last loop poll.
    *
-   * @return true if active.
+   * @return true if active, false if not active. If the event was never polled,
+   * it returns the state at event construction.
    */
   bool GetAsBoolean() const;
 
@@ -69,7 +70,7 @@
                [](EventLoop* loop, std::function<bool()> condition) {
                  return T(loop, condition);
                }) {
-    return ctor(m_loop, m_condition);
+    return ctor(m_loop, [state = m_state] { return *state; });
   }
 
   /**
@@ -84,7 +85,8 @@
    * Composes this event with another event, returning a new event that is
    * active when both events are active.
    *
-   * <p>The new event will use this event's polling loop.
+   * <p>The events must use the same event loop. If the events use different
+   * event loops, the composed signal won't update until both loops are polled.
    *
    * @param rhs the event to compose with
    * @return the event that is active when both events are active
@@ -95,7 +97,8 @@
    * Composes this event with another event, returning a new event that is
    * active when either event is active.
    *
-   * <p>The new event will use this event's polling loop.
+   * <p>The events must use the same event loop. If the events use different
+   * event loops, the composed signal won't update until both loops are polled.
    *
    * @param rhs the event to compose with
    * @return the event that is active when either event is active
@@ -131,5 +134,6 @@
  private:
   EventLoop* m_loop;
   std::function<bool()> m_condition;
+  std::shared_ptr<bool> m_state;  // A programmer's worst nightmare.
 };
 }  // namespace frc
diff --git a/wpilibc/src/main/native/include/frc/event/EventLoop.h b/wpilibc/src/main/native/include/frc/event/EventLoop.h
index d18fac3..224dd3b 100644
--- a/wpilibc/src/main/native/include/frc/event/EventLoop.h
+++ b/wpilibc/src/main/native/include/frc/event/EventLoop.h
@@ -10,8 +10,8 @@
 #include <wpi/FunctionExtras.h>
 
 namespace frc {
-/** The loop polling BooleanEvent objects and executing the actions bound to
- * them. */
+/** A declarative way to bind a set of actions to a loop and execute them when
+ * the loop is polled. */
 class EventLoop {
  public:
   EventLoop();
@@ -20,7 +20,7 @@
   EventLoop& operator=(const EventLoop&) = delete;
 
   /**
-   * Bind a new action to run.
+   * Bind a new action to run when the loop is polled.
    *
    * @param action the action to run.
    */
diff --git a/wpilibc/src/main/native/include/frc/interfaces/Accelerometer.h b/wpilibc/src/main/native/include/frc/interfaces/Accelerometer.h
index c95466a..77f1d5b 100644
--- a/wpilibc/src/main/native/include/frc/interfaces/Accelerometer.h
+++ b/wpilibc/src/main/native/include/frc/interfaces/Accelerometer.h
@@ -8,8 +8,11 @@
 
 /**
  * Interface for 3-axis accelerometers.
+ *
+ * @deprecated This interface is being removed with no replacement.
  */
-class Accelerometer {
+class [[deprecated(
+    "This interface is being removed with no replacement.")]] Accelerometer {
  public:
   Accelerometer() = default;
   virtual ~Accelerometer() = default;
diff --git a/wpilibc/src/main/native/include/frc/interfaces/Gyro.h b/wpilibc/src/main/native/include/frc/interfaces/Gyro.h
index b74a3cf..51fea7d 100644
--- a/wpilibc/src/main/native/include/frc/interfaces/Gyro.h
+++ b/wpilibc/src/main/native/include/frc/interfaces/Gyro.h
@@ -12,8 +12,11 @@
 
 /**
  * Interface for yaw rate gyros.
+ *
+ * @deprecated This interface is being removed with no replacement.
  */
-class Gyro {
+class [[deprecated(
+    "This interface is being removed with no replacement.")]] Gyro {
  public:
   Gyro() = default;
   virtual ~Gyro() = default;
diff --git a/wpilibc/src/main/native/include/frc/simulation/AddressableLEDSim.h b/wpilibc/src/main/native/include/frc/simulation/AddressableLEDSim.h
index 4533086..2a5fcae 100644
--- a/wpilibc/src/main/native/include/frc/simulation/AddressableLEDSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/AddressableLEDSim.h
@@ -60,7 +60,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object storing this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -85,7 +86,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterOutputPortCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterOutputPortCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -110,8 +112,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterLengthCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterLengthCallback(NotifyCallback callback,
+                                                        bool initialNotify);
 
   /**
    * Get the length of the LED strip.
@@ -135,7 +138,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterRunningCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterRunningCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -160,7 +164,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterDataCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterDataCallback(
       ConstBufferCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/AnalogGyroSim.h b/wpilibc/src/main/native/include/frc/simulation/AnalogGyroSim.h
index faa11d7..0210818 100644
--- a/wpilibc/src/main/native/include/frc/simulation/AnalogGyroSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/AnalogGyroSim.h
@@ -40,8 +40,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterAngleCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterAngleCallback(NotifyCallback callback,
+                                                       bool initialNotify);
 
   /**
    * Get the current angle of the gyro.
@@ -64,8 +65,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterRateCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterRateCallback(NotifyCallback callback,
+                                                      bool initialNotify);
 
   /**
    * Get the rate of angle change on this gyro.
@@ -89,7 +91,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/AnalogInputSim.h b/wpilibc/src/main/native/include/frc/simulation/AnalogInputSim.h
index 03d7548..05c9898 100644
--- a/wpilibc/src/main/native/include/frc/simulation/AnalogInputSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/AnalogInputSim.h
@@ -41,7 +41,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -66,7 +67,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterAverageBitsCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterAverageBitsCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -91,7 +93,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterOversampleBitsCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterOversampleBitsCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -116,7 +119,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterVoltageCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterVoltageCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -141,9 +145,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterAccumulatorInitializedCallback(NotifyCallback callback,
-                                         bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterAccumulatorInitializedCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check if the accumulator has been initialized.
@@ -167,7 +171,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterAccumulatorValueCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterAccumulatorValueCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -192,7 +197,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterAccumulatorCountCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterAccumulatorCountCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -217,9 +223,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterAccumulatorCenterCallback(NotifyCallback callback,
-                                    bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterAccumulatorCenterCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the accumulator center.
@@ -243,9 +249,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterAccumulatorDeadbandCallback(NotifyCallback callback,
-                                      bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterAccumulatorDeadbandCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the accumulator deadband.
diff --git a/wpilibc/src/main/native/include/frc/simulation/AnalogOutputSim.h b/wpilibc/src/main/native/include/frc/simulation/AnalogOutputSim.h
index ffec03a..42eb6c1 100644
--- a/wpilibc/src/main/native/include/frc/simulation/AnalogOutputSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/AnalogOutputSim.h
@@ -40,7 +40,8 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterVoltageCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterVoltageCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -64,7 +65,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/AnalogTriggerSim.h b/wpilibc/src/main/native/include/frc/simulation/AnalogTriggerSim.h
index 04e9e9b..019a9a9 100644
--- a/wpilibc/src/main/native/include/frc/simulation/AnalogTriggerSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/AnalogTriggerSim.h
@@ -53,7 +53,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -78,9 +79,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterTriggerLowerBoundCallback(NotifyCallback callback,
-                                    bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterTriggerLowerBoundCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the lower bound.
@@ -104,9 +105,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterTriggerUpperBoundCallback(NotifyCallback callback,
-                                    bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterTriggerUpperBoundCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the upper bound.
diff --git a/wpilibc/src/main/native/include/frc/simulation/BuiltInAccelerometerSim.h b/wpilibc/src/main/native/include/frc/simulation/BuiltInAccelerometerSim.h
index 9ffcf5b..74a4f16 100644
--- a/wpilibc/src/main/native/include/frc/simulation/BuiltInAccelerometerSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/BuiltInAccelerometerSim.h
@@ -40,8 +40,9 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterActiveCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterActiveCallback(NotifyCallback callback,
+                                                        bool initialNotify);
 
   /**
    * Check whether the accelerometer is active.
@@ -64,8 +65,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterRangeCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterRangeCallback(NotifyCallback callback,
+                                                       bool initialNotify);
 
   /**
    * Check the range of this accelerometer.
@@ -88,8 +90,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterXCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterXCallback(NotifyCallback callback,
+                                                   bool initialNotify);
 
   /**
    * Measure the X axis value.
@@ -112,8 +115,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterYCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterYCallback(NotifyCallback callback,
+                                                   bool initialNotify);
 
   /**
    * Measure the Y axis value.
@@ -136,8 +140,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterZCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterZCallback(NotifyCallback callback,
+                                                   bool initialNotify);
 
   /**
    * Measure the Z axis value.
diff --git a/wpilibc/src/main/native/include/frc/simulation/CTREPCMSim.h b/wpilibc/src/main/native/include/frc/simulation/CTREPCMSim.h
index 96959ed..37113db 100644
--- a/wpilibc/src/main/native/include/frc/simulation/CTREPCMSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/CTREPCMSim.h
@@ -33,21 +33,24 @@
 
   ~CTREPCMSim() override = default;
 
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify) override;
 
   bool GetInitialized() const override;
 
   void SetInitialized(bool initialized) override;
 
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterSolenoidOutputCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterSolenoidOutputCallback(
       int channel, NotifyCallback callback, bool initialNotify) override;
 
   bool GetSolenoidOutput(int channel) const override;
 
   void SetSolenoidOutput(int channel, bool solenoidOutput) override;
 
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterCompressorOnCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterCompressorOnCallback(
       NotifyCallback callback, bool initialNotify) override;
 
   bool GetCompressorOn() const override;
@@ -62,9 +65,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterClosedLoopEnabledCallback(NotifyCallback callback,
-                                    bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterClosedLoopEnabledCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check whether the closed loop compressor control is active.
@@ -88,7 +91,8 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterPressureSwitchCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPressureSwitchCallback(
       NotifyCallback callback, bool initialNotify) override;
 
   /**
@@ -112,9 +116,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterCompressorCurrentCallback(NotifyCallback callback,
-                                    bool initialNotify) override;
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterCompressorCurrentCallback(
+      NotifyCallback callback, bool initialNotify) override;
 
   /**
    * Read the compressor current.
diff --git a/wpilibc/src/main/native/include/frc/simulation/DCMotorSim.h b/wpilibc/src/main/native/include/frc/simulation/DCMotorSim.h
index b1388bd..be3a325 100644
--- a/wpilibc/src/main/native/include/frc/simulation/DCMotorSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/DCMotorSim.h
@@ -21,7 +21,9 @@
   /**
    * Creates a simulated DC motor mechanism.
    *
-   * @param plant              The linear system representing the DC motor.
+   * @param plant              The linear system representing the DC motor. This
+   *                           system can be created with
+   *                           LinearSystemId::DCMotorSystem().
    * @param gearbox            The type of and number of motors in the DC motor
    * gearbox.
    * @param gearing            The gearing of the DC motor (numbers greater than
@@ -46,6 +48,17 @@
              units::kilogram_square_meter_t moi,
              const std::array<double, 2>& measurementStdDevs = {0.0, 0.0});
 
+  using LinearSystemSim::SetState;
+
+  /**
+   * Sets the state of the DC motor.
+   *
+   * @param angularPosition The new position
+   * @param angularVelocity The new velocity
+   */
+  void SetState(units::radian_t angularPosition,
+                units::radians_per_second_t angularVelocity);
+
   /**
    * Returns the DC motor position.
    *
diff --git a/wpilibc/src/main/native/include/frc/simulation/DIOSim.h b/wpilibc/src/main/native/include/frc/simulation/DIOSim.h
index 9bbd3fb..5264c02 100644
--- a/wpilibc/src/main/native/include/frc/simulation/DIOSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/DIOSim.h
@@ -48,7 +48,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -73,8 +74,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterValueCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterValueCallback(NotifyCallback callback,
+                                                       bool initialNotify);
 
   /**
    * Read the value of the DIO port.
@@ -97,7 +99,8 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterPulseLengthCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPulseLengthCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -122,7 +125,8 @@
    *                      initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterIsInputCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterIsInputCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -147,7 +151,8 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterFilterIndexCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterFilterIndexCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/DifferentialDrivetrainSim.h b/wpilibc/src/main/native/include/frc/simulation/DifferentialDrivetrainSim.h
index c1cc1d7..78310d7 100644
--- a/wpilibc/src/main/native/include/frc/simulation/DifferentialDrivetrainSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/DifferentialDrivetrainSim.h
@@ -19,7 +19,7 @@
 class DifferentialDrivetrainSim {
  public:
   /**
-   * Create a SimDrivetrain.
+   * Creates a simulated differential drivetrain.
    *
    * @param plant The LinearSystem representing the robot's drivetrain. This
    *              system can be created with
@@ -46,7 +46,7 @@
       const std::array<double, 7>& measurementStdDevs = {});
 
   /**
-   * Create a SimDrivetrain.
+   * Creates a simulated differential drivetrain.
    *
    * @param driveMotor  A DCMotor representing the left side of the drivetrain.
    * @param gearing     The gearing on the drive between motor and wheel, as
@@ -80,7 +80,7 @@
    * @param u The input vector.
    * @return The normalized input.
    */
-  Vectord<2> ClampInput(const Vectord<2>& u);
+  Eigen::Vector2d ClampInput(const Eigen::Vector2d& u);
 
   /**
    * Sets the applied voltage to the drivetrain. Note that positive voltage must
@@ -187,7 +187,7 @@
    */
   void SetPose(const frc::Pose2d& pose);
 
-  Vectord<7> Dynamics(const Vectord<7>& x, const Vectord<2>& u);
+  Vectord<7> Dynamics(const Vectord<7>& x, const Eigen::Vector2d& u);
 
   class State {
    public:
@@ -325,7 +325,7 @@
   double m_currentGearing;
 
   Vectord<7> m_x;
-  Vectord<2> m_u;
+  Eigen::Vector2d m_u;
   Vectord<7> m_y;
   std::array<double, 7> m_measurementStdDevs;
 };
diff --git a/wpilibc/src/main/native/include/frc/simulation/DigitalPWMSim.h b/wpilibc/src/main/native/include/frc/simulation/DigitalPWMSim.h
index 53caee7..f9b974d 100644
--- a/wpilibc/src/main/native/include/frc/simulation/DigitalPWMSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/DigitalPWMSim.h
@@ -54,7 +54,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -78,7 +79,8 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterDutyCycleCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterDutyCycleCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -102,8 +104,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterPinCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPinCallback(NotifyCallback callback,
+                                                     bool initialNotify);
 
   /**
    * Check the pin number.
diff --git a/wpilibc/src/main/native/include/frc/simulation/DriverStationSim.h b/wpilibc/src/main/native/include/frc/simulation/DriverStationSim.h
index 232c123..acc510c 100644
--- a/wpilibc/src/main/native/include/frc/simulation/DriverStationSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/DriverStationSim.h
@@ -26,7 +26,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore> RegisterEnabledCallback(
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterEnabledCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -51,8 +52,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterAutonomousCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterAutonomousCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check if the DS is in autonomous.
@@ -76,7 +78,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore> RegisterTestCallback(
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterTestCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -101,7 +104,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore> RegisterEStopCallback(
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterEStopCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -126,8 +130,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterFmsAttachedCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterFmsAttachedCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check if the FMS is connected.
@@ -151,8 +156,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterDsAttachedCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterDsAttachedCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check if the DS is attached.
@@ -176,9 +182,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterAllianceStationIdCallback(NotifyCallback callback,
-                                    bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterAllianceStationIdCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the alliance station ID (color + number).
@@ -202,7 +208,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore> RegisterMatchTimeCallback(
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterMatchTimeCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/DutyCycleEncoderSim.h b/wpilibc/src/main/native/include/frc/simulation/DutyCycleEncoderSim.h
index 19577bb..18c04f0 100644
--- a/wpilibc/src/main/native/include/frc/simulation/DutyCycleEncoderSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/DutyCycleEncoderSim.h
@@ -26,20 +26,82 @@
   explicit DutyCycleEncoderSim(const DutyCycleEncoder& encoder);
 
   /**
-   * Set the position tin turns.
+   * Constructs from a digital input channel.
+   *
+   * @param channel digital input channel
+   */
+  explicit DutyCycleEncoderSim(int channel);
+
+  /**
+   * Get the position in turns.
+   *
+   * @return The position.
+   */
+  double Get();
+
+  /**
+   * Set the position in turns.
    *
    * @param turns The position.
    */
   void Set(units::turn_t turns);
 
   /**
-   * Set the position.
+   * Get the distance.
+   *
+   * @return The distance.
+   */
+
+  double GetDistance();
+
+  /**
+   * Set the distance.
+   *
+   * @param distance The distance.
    */
   void SetDistance(double distance);
 
+  /**
+   * Get the absolute position.
+   *
+   * @return The absolute position
+   */
+  double GetAbsolutePosition();
+
+  /**
+   * Set the absolute position.
+   *
+   * @param position The absolute position
+   */
+  void SetAbsolutePosition(double position);
+
+  /**
+   * Get the distance per rotation for this encoder.
+   *
+   * @return The scale factor that will be used to convert rotation to useful
+   * units.
+   */
+  double GetDistancePerRotation();
+
+  /**
+   * Get if the encoder is connected.
+   *
+   * @return true if the encoder is connected.
+   */
+  bool IsConnected();
+
+  /**
+   * Set if the encoder is connected.
+   *
+   * @param isConnected Whether or not the sensor is connected.
+   */
+  void SetConnected(bool isConnected);
+
  private:
   hal::SimDouble m_simPosition;
   hal::SimDouble m_simDistancePerRotation;
+  hal::SimDouble m_simAbsolutePosition;
+  hal::SimBoolean m_simIsConnected;
 };
 
 }  // namespace sim
diff --git a/wpilibc/src/main/native/include/frc/simulation/DutyCycleSim.h b/wpilibc/src/main/native/include/frc/simulation/DutyCycleSim.h
index ec7b48c..f6f89eb 100644
--- a/wpilibc/src/main/native/include/frc/simulation/DutyCycleSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/DutyCycleSim.h
@@ -51,7 +51,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -75,7 +76,8 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterFrequencyCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterFrequencyCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -99,8 +101,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterOutputCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterOutputCallback(NotifyCallback callback,
+                                                        bool initialNotify);
 
   /**
    * Measure the output from this duty cycle port.
diff --git a/wpilibc/src/main/native/include/frc/simulation/ElevatorSim.h b/wpilibc/src/main/native/include/frc/simulation/ElevatorSim.h
index cf40810..3d5c433 100644
--- a/wpilibc/src/main/native/include/frc/simulation/ElevatorSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/ElevatorSim.h
@@ -19,25 +19,32 @@
  */
 class ElevatorSim : public LinearSystemSim<2, 1, 1> {
  public:
+  template <typename Distance>
+  using Velocity_t = units::unit_t<
+      units::compound_unit<Distance, units::inverse<units::seconds>>>;
+
+  template <typename Distance>
+  using Acceleration_t = units::unit_t<units::compound_unit<
+      units::compound_unit<Distance, units::inverse<units::seconds>>,
+      units::inverse<units::seconds>>>;
+
   /**
    * Constructs a simulated elevator mechanism.
    *
    * @param plant              The linear system that represents the elevator.
+   *                           This system can be created with
+   *                           LinearSystemId::ElevatorSystem().
    * @param gearbox            The type of and number of motors in your
    *                           elevator gearbox.
-   * @param gearing            The gearing of the elevator (numbers greater
-   *                           than 1 represent reductions).
-   * @param drumRadius         The radius of the drum that your cable is
-   *                           wrapped around.
    * @param minHeight          The minimum allowed height of the elevator.
    * @param maxHeight          The maximum allowed height of the elevator.
    * @param simulateGravity    Whether gravity should be simulated or not.
+   * @param startingHeight     The starting height of the elevator.
    * @param measurementStdDevs The standard deviation of the measurements.
    */
   ElevatorSim(const LinearSystem<2, 1, 1>& plant, const DCMotor& gearbox,
-              double gearing, units::meter_t drumRadius,
               units::meter_t minHeight, units::meter_t maxHeight,
-              bool simulateGravity,
+              bool simulateGravity, units::meter_t startingHeight,
               const std::array<double, 1>& measurementStdDevs = {0.0});
 
   /**
@@ -53,15 +60,48 @@
    * @param minHeight          The minimum allowed height of the elevator.
    * @param maxHeight          The maximum allowed height of the elevator.
    * @param simulateGravity    Whether gravity should be simulated or not.
+   * @param startingHeight     The starting height of the elevator.
    * @param measurementStdDevs The standard deviation of the measurements.
    */
   ElevatorSim(const DCMotor& gearbox, double gearing,
               units::kilogram_t carriageMass, units::meter_t drumRadius,
               units::meter_t minHeight, units::meter_t maxHeight,
-              bool simulateGravity,
+              bool simulateGravity, units::meter_t startingHeight,
               const std::array<double, 1>& measurementStdDevs = {0.0});
 
   /**
+   * Constructs a simulated elevator mechanism.
+   *
+   * @param kV                 The velocity gain.
+   * @param kA                 The acceleration gain.
+   * @param gearbox            The type of and number of motors in your
+   *                           elevator gearbox.
+   * @param minHeight          The minimum allowed height of the elevator.
+   * @param maxHeight          The maximum allowed height of the elevator.
+   * @param simulateGravity    Whether gravity should be simulated or not.
+   * @param startingHeight     The starting height of the elevator.
+   * @param measurementStdDevs The standard deviation of the measurements.
+   */
+  template <typename Distance>
+    requires std::same_as<units::meter, Distance> ||
+             std::same_as<units::radian, Distance>
+  ElevatorSim(decltype(1_V / Velocity_t<Distance>(1)) kV,
+              decltype(1_V / Acceleration_t<Distance>(1)) kA,
+              const DCMotor& gearbox, units::meter_t minHeight,
+              units::meter_t maxHeight, bool simulateGravity,
+              units::meter_t startingHeight,
+              const std::array<double, 1>& measurementStdDevs = {0.0});
+  using LinearSystemSim::SetState;
+
+  /**
+   * Sets the elevator's state. The new position will be limited between the
+   * minimum and maximum allowed heights.
+   * @param position The new position
+   * @param velocity The new velocity
+   */
+  void SetState(units::meter_t position, units::meters_per_second_t velocity);
+
+  /**
    * Returns whether the elevator would hit the lower limit.
    *
    * @param elevatorHeight The elevator height.
@@ -132,10 +172,8 @@
 
  private:
   DCMotor m_gearbox;
-  units::meter_t m_drumRadius;
   units::meter_t m_minHeight;
   units::meter_t m_maxHeight;
-  double m_gearing;
   bool m_simulateGravity;
 };
 }  // namespace frc::sim
diff --git a/wpilibc/src/main/native/include/frc/simulation/EncoderSim.h b/wpilibc/src/main/native/include/frc/simulation/EncoderSim.h
index 0d578b4..80ad146 100644
--- a/wpilibc/src/main/native/include/frc/simulation/EncoderSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/EncoderSim.h
@@ -53,7 +53,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -78,8 +79,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterCountCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterCountCallback(NotifyCallback callback,
+                                                       bool initialNotify);
 
   /**
    * Read the count of the encoder.
@@ -103,8 +105,9 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterPeriodCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPeriodCallback(NotifyCallback callback,
+                                                        bool initialNotify);
 
   /**
    * Read the period of the encoder.
@@ -127,8 +130,9 @@
    * @param initialNotify whether to run the callback on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterResetCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterResetCallback(NotifyCallback callback,
+                                                       bool initialNotify);
 
   /**
    * Check if the encoder has been reset.
@@ -152,7 +156,8 @@
    * @param initialNotify whether to run the callback on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterMaxPeriodCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterMaxPeriodCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -177,7 +182,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterDirectionCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterDirectionCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -202,7 +208,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterReverseDirectionCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterReverseDirectionCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -227,7 +234,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterSamplesToAverageCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterSamplesToAverageCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -252,7 +260,8 @@
    * @param initialNotify if true, the callback will be run on the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterDistancePerPulseCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterDistancePerPulseCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -286,7 +295,7 @@
    *
    * @return the encoder distance
    */
-  double GetDistance();
+  double GetDistance() const;
 
   /**
    * Change the rate of the encoder.
@@ -300,7 +309,7 @@
    *
    * @return the rate of change
    */
-  double GetRate();
+  double GetRate() const;
 
  private:
   explicit EncoderSim(int index) : m_index{index} {}
diff --git a/wpilibc/src/main/native/include/frc/simulation/FlywheelSim.h b/wpilibc/src/main/native/include/frc/simulation/FlywheelSim.h
index 9f2272c..cc0eca9 100644
--- a/wpilibc/src/main/native/include/frc/simulation/FlywheelSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/FlywheelSim.h
@@ -20,7 +20,9 @@
   /**
    * Creates a simulated flywheel mechanism.
    *
-   * @param plant              The linear system representing the flywheel.
+   * @param plant              The linear system representing the flywheel. This
+   *                           system can be created with
+   *                           LinearSystemId::FlywheelSystem().
    * @param gearbox            The type of and number of motors in the flywheel
    *                           gearbox.
    * @param gearing            The gearing of the flywheel (numbers greater than
@@ -45,6 +47,15 @@
               units::kilogram_square_meter_t moi,
               const std::array<double, 1>& measurementStdDevs = {0.0});
 
+  using LinearSystemSim::SetState;
+
+  /**
+   * Sets the flywheel's state.
+   *
+   * @param velocity The new velocity
+   */
+  void SetState(units::radians_per_second_t velocity);
+
   /**
    * Returns the flywheel velocity.
    *
diff --git a/wpilibc/src/main/native/include/frc/simulation/PS5ControllerSim.h b/wpilibc/src/main/native/include/frc/simulation/PS5ControllerSim.h
new file mode 100644
index 0000000..6b9e2c7
--- /dev/null
+++ b/wpilibc/src/main/native/include/frc/simulation/PS5ControllerSim.h
@@ -0,0 +1,176 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#pragma once
+
+#include "frc/simulation/GenericHIDSim.h"
+
+namespace frc {
+
+class PS5Controller;
+
+namespace sim {
+
+/**
+ * Class to control a simulated PS5 controller.
+ */
+class PS5ControllerSim : public GenericHIDSim {
+ public:
+  /**
+   * Constructs from a PS5Controller object.
+   *
+   * @param joystick controller to simulate
+   */
+  explicit PS5ControllerSim(const PS5Controller& joystick);
+
+  /**
+   * Constructs from a joystick port number.
+   *
+   * @param port port number
+   */
+  explicit PS5ControllerSim(int port);
+
+  /**
+   * Change the X axis value of the controller's left stick.
+   *
+   * @param value the new value
+   */
+  void SetLeftX(double value);
+
+  /**
+   * Change the X axis value of the controller's right stick.
+   *
+   * @param value the new value
+   */
+  void SetRightX(double value);
+
+  /**
+   * Change the Y axis value of the controller's left stick.
+   *
+   * @param value the new value
+   */
+  void SetLeftY(double value);
+
+  /**
+   * Change the Y axis value of the controller's right stick.
+   *
+   * @param value the new value
+   */
+  void SetRightY(double value);
+
+  /**
+   * Change the L2 axis axis value of the controller.
+   *
+   * @param value the new value
+   */
+  void SetL2Axis(double value);
+
+  /**
+   * Change the R2 axis value of the controller.
+   *
+   * @param value the new value
+   */
+  void SetR2Axis(double value);
+
+  /**
+   * Change the value of the Square button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetSquareButton(bool value);
+
+  /**
+   * Change the value of the Cross button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetCrossButton(bool value);
+
+  /**
+   * Change the value of the Circle button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetCircleButton(bool value);
+
+  /**
+   * Change the value of the Triangle button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetTriangleButton(bool value);
+
+  /**
+   * Change the value of the L1 button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetL1Button(bool value);
+
+  /**
+   * Change the value of the R1 button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetR1Button(bool value);
+
+  /**
+   * Change the value of the L2 button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetL2Button(bool value);
+
+  /**
+   * Change the value of the R2 button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetR2Button(bool value);
+
+  /**
+   * Change the value of the Create button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetCreateButton(bool value);
+
+  /**
+   * Change the value of the Options button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetOptionsButton(bool value);
+
+  /**
+   * Change the value of the L3 (left stick) button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetL3Button(bool value);
+
+  /**
+   * Change the value of the R3 (right stick) button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetR3Button(bool value);
+
+  /**
+   * Change the value of the PS button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetPSButton(bool value);
+
+  /**
+   * Change the value of the touchpad button on the controller.
+   *
+   * @param value the new value
+   */
+  void SetTouchpad(bool value);
+};
+
+}  // namespace sim
+}  // namespace frc
diff --git a/wpilibc/src/main/native/include/frc/simulation/PWMSim.h b/wpilibc/src/main/native/include/frc/simulation/PWMSim.h
index 8b4156e..424b7979 100644
--- a/wpilibc/src/main/native/include/frc/simulation/PWMSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/PWMSim.h
@@ -48,7 +48,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -66,28 +67,29 @@
   void SetInitialized(bool initialized);
 
   /**
-   * Register a callback to be run when the PWM raw value changes.
+   * Register a callback to be run when the PWM pulse microsecond value changes.
    *
    * @param callback the callback
    * @param initialNotify whether to run the callback with the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterRawValueCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPulseMicrosecondCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
-   * Get the PWM raw value.
+   * Get the PWM pulse microsecond value.
    *
-   * @return the PWM raw value
+   * @return the PWM pulse microsecond value
    */
-  int GetRawValue() const;
+  int32_t GetPulseMicrosecond() const;
 
   /**
-   * Set the PWM raw value.
+   * Set the PWM pulse microsecond value.
    *
-   * @param rawValue the PWM raw value
+   * @param microsecondPulseTime the PWM pulse microsecond value
    */
-  void SetRawValue(int rawValue);
+  void SetPulseMicrosecond(int32_t microsecondPulseTime);
 
   /**
    * Register a callback to be run when the PWM speed changes.
@@ -96,8 +98,9 @@
    * @param initialNotify whether to run the callback with the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterSpeedCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterSpeedCallback(NotifyCallback callback,
+                                                       bool initialNotify);
 
   /**
    * Get the PWM speed.
@@ -120,7 +123,8 @@
    * @param initialNotify whether to run the callback with the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterPositionCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPositionCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -144,7 +148,8 @@
    * @param initialNotify whether to run the callback with the initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterPeriodScaleCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPeriodScaleCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -168,7 +173,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterZeroLatchCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterZeroLatchCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/PneumaticsBaseSim.h b/wpilibc/src/main/native/include/frc/simulation/PneumaticsBaseSim.h
index 11110e3..510349f 100644
--- a/wpilibc/src/main/native/include/frc/simulation/PneumaticsBaseSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/PneumaticsBaseSim.h
@@ -42,8 +42,9 @@
    * Save a reference to this object; it being deconstructed cancels the
    * callback.
    */
-  [[nodiscard]] virtual std::unique_ptr<CallbackStore>
-  RegisterInitializedCallback(NotifyCallback callback, bool initialNotify) = 0;
+  [[nodiscard]]
+  virtual std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+      NotifyCallback callback, bool initialNotify) = 0;
 
   /**
    * Check if the compressor is on.
@@ -68,8 +69,9 @@
    * Save a reference to this object; it being deconstructed cancels the
    * callback.
    */
-  [[nodiscard]] virtual std::unique_ptr<CallbackStore>
-  RegisterCompressorOnCallback(NotifyCallback callback, bool initialNotify) = 0;
+  [[nodiscard]]
+  virtual std::unique_ptr<CallbackStore> RegisterCompressorOnCallback(
+      NotifyCallback callback, bool initialNotify) = 0;
 
   /**
    * Check the solenoid output on a specific channel.
@@ -98,9 +100,9 @@
    * Save a reference to this object; it being deconstructed cancels the
    * callback.
    */
-  [[nodiscard]] virtual std::unique_ptr<CallbackStore>
-  RegisterSolenoidOutputCallback(int channel, NotifyCallback callback,
-                                 bool initialNotify) = 0;
+  [[nodiscard]]
+  virtual std::unique_ptr<CallbackStore> RegisterSolenoidOutputCallback(
+      int channel, NotifyCallback callback, bool initialNotify) = 0;
 
   /**
    * Check the value of the pressure switch.
@@ -126,9 +128,9 @@
    * Save a reference to this object; it being deconstructed cancels the
    * callback.
    */
-  [[nodiscard]] virtual std::unique_ptr<CallbackStore>
-  RegisterPressureSwitchCallback(NotifyCallback callback,
-                                 bool initialNotify) = 0;
+  [[nodiscard]]
+  virtual std::unique_ptr<CallbackStore> RegisterPressureSwitchCallback(
+      NotifyCallback callback, bool initialNotify) = 0;
 
   /**
    * Read the compressor current.
@@ -153,9 +155,9 @@
    * Save a reference to this object; it being deconstructed cancels the
    * callback.
    */
-  [[nodiscard]] virtual std::unique_ptr<CallbackStore>
-  RegisterCompressorCurrentCallback(NotifyCallback callback,
-                                    bool initialNotify) = 0;
+  [[nodiscard]]
+  virtual std::unique_ptr<CallbackStore> RegisterCompressorCurrentCallback(
+      NotifyCallback callback, bool initialNotify) = 0;
 
   /**
    * Get the current value of all solenoid outputs.
diff --git a/wpilibc/src/main/native/include/frc/simulation/PowerDistributionSim.h b/wpilibc/src/main/native/include/frc/simulation/PowerDistributionSim.h
index ac54da2..76fa7ba 100644
--- a/wpilibc/src/main/native/include/frc/simulation/PowerDistributionSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/PowerDistributionSim.h
@@ -40,7 +40,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -65,7 +66,8 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterTemperatureCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterTemperatureCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -90,7 +92,8 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterVoltageCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterVoltageCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -116,7 +119,8 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterCurrentCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterCurrentCallback(
       int channel, NotifyCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/REVPHSim.h b/wpilibc/src/main/native/include/frc/simulation/REVPHSim.h
index fe305ba..917eb1f 100644
--- a/wpilibc/src/main/native/include/frc/simulation/REVPHSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/REVPHSim.h
@@ -37,21 +37,24 @@
 
   ~REVPHSim() override = default;
 
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
       NotifyCallback callback, bool initialNotify) override;
 
   bool GetInitialized() const override;
 
   void SetInitialized(bool solenoidInitialized) override;
 
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterSolenoidOutputCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterSolenoidOutputCallback(
       int channel, NotifyCallback callback, bool initialNotify) override;
 
   bool GetSolenoidOutput(int channel) const override;
 
   void SetSolenoidOutput(int channel, bool solenoidOutput) override;
 
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterCompressorOnCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterCompressorOnCallback(
       NotifyCallback callback, bool initialNotify) override;
 
   /**
@@ -76,9 +79,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterCompressorConfigTypeCallback(NotifyCallback callback,
-                                       bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterCompressorConfigTypeCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check whether the closed loop compressor control is active.
@@ -94,16 +97,17 @@
    */
   void SetCompressorConfigType(int compressorConfigType);
 
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterPressureSwitchCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterPressureSwitchCallback(
       NotifyCallback callback, bool initialNotify) override;
 
   bool GetPressureSwitch() const override;
 
   void SetPressureSwitch(bool pressureSwitch) override;
 
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterCompressorCurrentCallback(NotifyCallback callback,
-                                    bool initialNotify) override;
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterCompressorCurrentCallback(
+      NotifyCallback callback, bool initialNotify) override;
 
   double GetCompressorCurrent() const override;
 
diff --git a/wpilibc/src/main/native/include/frc/simulation/RelaySim.h b/wpilibc/src/main/native/include/frc/simulation/RelaySim.h
index 5034885..ecc4ded 100644
--- a/wpilibc/src/main/native/include/frc/simulation/RelaySim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/RelaySim.h
@@ -40,9 +40,9 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterInitializedForwardCallback(NotifyCallback callback,
-                                     bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedForwardCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check whether the forward direction has been initialized.
@@ -65,9 +65,9 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore>
-  RegisterInitializedReverseCallback(NotifyCallback callback,
-                                     bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterInitializedReverseCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Check whether the reverse direction has been initialized.
@@ -90,7 +90,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterForwardCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterForwardCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
@@ -114,7 +115,8 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterReverseCallback(
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterReverseCallback(
       NotifyCallback callback, bool initialNotify);
 
   /**
diff --git a/wpilibc/src/main/native/include/frc/simulation/RoboRioSim.h b/wpilibc/src/main/native/include/frc/simulation/RoboRioSim.h
index ee959b66..64e81e1 100644
--- a/wpilibc/src/main/native/include/frc/simulation/RoboRioSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/RoboRioSim.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include <units/current.h>
+#include <units/temperature.h>
 #include <units/voltage.h>
 
 #include "frc/simulation/CallbackStore.h"
@@ -26,8 +27,9 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterFPGAButtonCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterFPGAButtonCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Query the state of the FPGA button.
@@ -50,8 +52,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterVInVoltageCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterVInVoltageCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the Vin voltage.
@@ -75,8 +78,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterVInCurrentCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterVInCurrentCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the Vin current.
@@ -100,8 +104,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserVoltage6VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserVoltage6VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the 6V rail voltage.
@@ -125,8 +130,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserCurrent6VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserCurrent6VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the 6V rail current.
@@ -150,8 +156,9 @@
    *                      initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserActive6VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserActive6VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the 6V rail active state.
@@ -175,8 +182,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserVoltage5VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserVoltage5VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the 5V rail voltage.
@@ -200,8 +208,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserCurrent5VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserCurrent5VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the 5V rail current.
@@ -225,8 +234,9 @@
    *                      initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserActive5VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserActive5VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the 5V rail active state.
@@ -250,8 +260,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserVoltage3V3Callback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserVoltage3V3Callback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the 3.3V rail voltage.
@@ -275,8 +286,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserCurrent3V3Callback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserCurrent3V3Callback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the 3.3V rail current.
@@ -300,8 +312,9 @@
    *                      initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserActive3V3Callback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserActive3V3Callback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the 3.3V rail active state.
@@ -326,8 +339,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserFaults6VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserFaults6VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the 6V rail number of faults.
@@ -352,8 +366,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserFaults5VCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserFaults5VCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the 5V rail number of faults.
@@ -378,8 +393,9 @@
    *                      initial value
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterUserFaults3V3Callback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterUserFaults3V3Callback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Get the 3.3V rail number of faults.
@@ -402,8 +418,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] static std::unique_ptr<CallbackStore>
-  RegisterBrownoutVoltageCallback(NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterBrownoutVoltageCallback(
+      NotifyCallback callback, bool initialNotify);
 
   /**
    * Measure the brownout voltage.
@@ -420,6 +437,56 @@
   static void SetBrownoutVoltage(units::volt_t brownoutVoltage);
 
   /**
+   * Register a callback to be run whenever the cpu temp changes.
+   *
+   * @param callback the callback
+   * @param initialNotify whether to call the callback with the initial state
+   * @return the CallbackStore object associated with this callback
+   */
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterCPUTempCallback(
+      NotifyCallback callback, bool initialNotify);
+
+  /**
+   * Get the cpu temp.
+   *
+   * @return the cpu temp.
+   */
+  static units::celsius_t GetCPUTemp();
+
+  /**
+   * Define the cpu temp.
+   *
+   * @param cpuTemp the new cpu temp.
+   */
+  static void SetCPUTemp(units::celsius_t cpuTemp);
+
+  /**
+   * Register a callback to be run whenever the team number changes.
+   *
+   * @param callback the callback
+   * @param initialNotify whether to call the callback with the initial state
+   * @return the CallbackStore object associated with this callback
+   */
+  [[nodiscard]]
+  static std::unique_ptr<CallbackStore> RegisterTeamNumberCallback(
+      NotifyCallback callback, bool initialNotify);
+
+  /**
+   * Get the team number.
+   *
+   * @return the team number.
+   */
+  static int32_t GetTeamNumber();
+
+  /**
+   * Set the team number.
+   *
+   * @param teamNumber the new team number.
+   */
+  static void SetTeamNumber(int32_t teamNumber);
+
+  /**
    * Get the serial number.
    *
    * @return The serial number.
diff --git a/wpilibc/src/main/native/include/frc/simulation/SPIAccelerometerSim.h b/wpilibc/src/main/native/include/frc/simulation/SPIAccelerometerSim.h
index 9d31bd0..a84391e 100644
--- a/wpilibc/src/main/native/include/frc/simulation/SPIAccelerometerSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/SPIAccelerometerSim.h
@@ -25,8 +25,9 @@
    * @param initialNotify whether to run the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterActiveCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterActiveCallback(NotifyCallback callback,
+                                                        bool initialNotify);
 
   /**
    * Check whether the accelerometer is active.
@@ -49,8 +50,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterRangeCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterRangeCallback(NotifyCallback callback,
+                                                       bool initialNotify);
 
   /**
    * Check the range of this accelerometer.
@@ -73,8 +75,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterXCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterXCallback(NotifyCallback callback,
+                                                   bool initialNotify);
 
   /**
    * Measure the X axis value.
@@ -97,8 +100,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterYCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterYCallback(NotifyCallback callback,
+                                                   bool initialNotify);
 
   /**
    * Measure the Y axis value.
@@ -121,8 +125,9 @@
    * @param initialNotify whether to call the callback with the initial state
    * @return the CallbackStore object associated with this callback
    */
-  [[nodiscard]] std::unique_ptr<CallbackStore> RegisterZCallback(
-      NotifyCallback callback, bool initialNotify);
+  [[nodiscard]]
+  std::unique_ptr<CallbackStore> RegisterZCallback(NotifyCallback callback,
+                                                   bool initialNotify);
 
   /**
    * Measure the Z axis value.
diff --git a/wpilibc/src/main/native/include/frc/simulation/SimDeviceSim.h b/wpilibc/src/main/native/include/frc/simulation/SimDeviceSim.h
index 0a4e4d8..6e16116 100644
--- a/wpilibc/src/main/native/include/frc/simulation/SimDeviceSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/SimDeviceSim.h
@@ -43,6 +43,20 @@
   SimDeviceSim(const char* name, int index, int channel);
 
   /**
+   * Constructs a SimDeviceSim.
+   *
+   * @param handle the low level handle for the corresponding SimDevice.
+   */
+  explicit SimDeviceSim(HAL_SimDeviceHandle handle);
+
+  /**
+   * Get the name of this object.
+   *
+   * @return name
+   */
+  std::string GetName() const;
+
+  /**
    * Get the property object with the given name.
    *
    * @param name the property name
diff --git a/wpilibc/src/main/native/include/frc/simulation/SingleJointedArmSim.h b/wpilibc/src/main/native/include/frc/simulation/SingleJointedArmSim.h
index 57ad6b1..12a719b 100644
--- a/wpilibc/src/main/native/include/frc/simulation/SingleJointedArmSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/SingleJointedArmSim.h
@@ -23,22 +23,24 @@
   /**
    * Creates a simulated arm mechanism.
    *
-   * @param system             The system representing this arm.
+   * @param system             The system representing this arm. This system can
+   *                           be created with
+   *                           LinearSystemId::SingleJointedArmSystem().
    * @param gearbox            The type and number of motors on the arm gearbox.
    * @param gearing            The gear ratio of the arm (numbers greater than 1
    *                           represent reductions).
    * @param armLength          The length of the arm.
    * @param minAngle           The minimum angle that the arm is capable of.
    * @param maxAngle           The maximum angle that the arm is capable of.
-   * @param armMass            The mass of the arm.
    * @param simulateGravity    Whether gravity should be simulated or not.
+   * @param startingAngle      The initial position of the arm.
    * @param measurementStdDevs The standard deviations of the measurements.
    */
   SingleJointedArmSim(const LinearSystem<2, 1, 1>& system,
                       const DCMotor& gearbox, double gearing,
                       units::meter_t armLength, units::radian_t minAngle,
-                      units::radian_t maxAngle, units::kilogram_t armMass,
-                      bool simulateGravity,
+                      units::radian_t maxAngle, bool simulateGravity,
+                      units::radian_t startingAngle,
                       const std::array<double, 1>& measurementStdDevs = {0.0});
   /**
    * Creates a simulated arm mechanism.
@@ -51,17 +53,28 @@
    * @param armLength          The length of the arm.
    * @param minAngle           The minimum angle that the arm is capable of.
    * @param maxAngle           The maximum angle that the arm is capable of.
-   * @param mass               The mass of the arm.
    * @param simulateGravity    Whether gravity should be simulated or not.
+   * @param startingAngle      The initial position of the arm.
    * @param measurementStdDevs The standard deviation of the measurement noise.
    */
   SingleJointedArmSim(const DCMotor& gearbox, double gearing,
                       units::kilogram_square_meter_t moi,
                       units::meter_t armLength, units::radian_t minAngle,
-                      units::radian_t maxAngle, units::kilogram_t mass,
-                      bool simulateGravity,
+                      units::radian_t maxAngle, bool simulateGravity,
+                      units::radian_t startingAngle,
                       const std::array<double, 1>& measurementStdDevs = {0.0});
 
+  using LinearSystemSim::SetState;
+
+  /**
+   * Sets the arm's state. The new angle will be limited between the minimum and
+   * maximum allowed limits.
+   *
+   * @param angle The new angle.
+   * @param velocity The new angular velocity.
+   */
+  void SetState(units::radian_t angle, units::radians_per_second_t velocity);
+
   /**
    * Returns whether the arm would hit the lower limit.
    *
@@ -146,10 +159,9 @@
                      units::second_t dt) override;
 
  private:
-  units::meter_t m_r;
+  units::meter_t m_armLen;
   units::radian_t m_minAngle;
   units::radian_t m_maxAngle;
-  units::kilogram_t m_armMass;
   const DCMotor m_gearbox;
   double m_gearing;
   bool m_simulateGravity;
diff --git a/wpilibc/src/main/native/include/frc/simulation/SolenoidSim.h b/wpilibc/src/main/native/include/frc/simulation/SolenoidSim.h
index 66e3589..dd2e8e7 100644
--- a/wpilibc/src/main/native/include/frc/simulation/SolenoidSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/SolenoidSim.h
@@ -16,6 +16,7 @@
   SolenoidSim(std::shared_ptr<PneumaticsBaseSim> moduleSim, int channel);
   SolenoidSim(int module, PneumaticsModuleType type, int channel);
   SolenoidSim(PneumaticsModuleType type, int channel);
+  virtual ~SolenoidSim() = default;
 
   bool GetOutput() const;
   void SetOutput(bool output);
@@ -29,7 +30,8 @@
    * Save a reference to this object; it being deconstructed cancels the
    * callback.
    */
-  [[nodiscard]] virtual std::unique_ptr<CallbackStore> RegisterOutputCallback(
+  [[nodiscard]]
+  virtual std::unique_ptr<CallbackStore> RegisterOutputCallback(
       NotifyCallback callback, bool initialNotify);
 
   std::shared_ptr<PneumaticsBaseSim> GetModuleSim() const;
diff --git a/wpilibc/src/main/native/include/frc/simulation/UltrasonicSim.h b/wpilibc/src/main/native/include/frc/simulation/UltrasonicSim.h
index efa9b37..5db41f7 100644
--- a/wpilibc/src/main/native/include/frc/simulation/UltrasonicSim.h
+++ b/wpilibc/src/main/native/include/frc/simulation/UltrasonicSim.h
@@ -14,16 +14,24 @@
 namespace sim {
 
 /**
- * Class to control a simulated ADXRS450 gyroscope.
+ * Class to control a simulated {@link Ultrasonic}.
  */
 class UltrasonicSim {
  public:
   /**
-   * Constructs from a ADXRS450_Gyro object.
+   * Constructor.
    *
-   * @param gyro ADXRS450_Gyro to simulate
+   * @param ultrasonic The real ultrasonic to simulate
    */
-  explicit UltrasonicSim(const Ultrasonic& gyro);
+  explicit UltrasonicSim(const Ultrasonic& ultrasonic);
+
+  /**
+   * Constructor.
+   *
+   * @param ping unused.
+   * @param echo the ultrasonic's echo channel.
+   */
+  UltrasonicSim(int ping, int echo);
 
   /**
    * Sets if the range measurement is valid.
@@ -37,7 +45,7 @@
    *
    * @param range The range
    */
-  void SetRange(units::meter_t range);
+  void SetRange(units::inch_t range);
 
  private:
   hal::SimBoolean m_simRangeValid;
diff --git a/wpilibc/src/main/native/include/frc/smartdashboard/MechanismObject2d.h b/wpilibc/src/main/native/include/frc/smartdashboard/MechanismObject2d.h
index c4185e7..81cbc97 100644
--- a/wpilibc/src/main/native/include/frc/smartdashboard/MechanismObject2d.h
+++ b/wpilibc/src/main/native/include/frc/smartdashboard/MechanismObject2d.h
@@ -4,11 +4,11 @@
 
 #pragma once
 
+#include <concepts>
 #include <memory>
 #include <stdexcept>
 #include <string>
 #include <string_view>
-#include <type_traits>
 #include <utility>
 
 #include <networktables/NetworkTable.h>
@@ -62,9 +62,8 @@
    * assignments and call chaining.
    * @throw if an object with the given name already exists.
    */
-  template <typename T, typename... Args,
-            typename =
-                std::enable_if_t<std::is_convertible_v<T*, MechanismObject2d*>>>
+  template <typename T, typename... Args>
+    requires std::convertible_to<T*, MechanismObject2d*>
   T* Append(std::string_view name, Args&&... args) {
     std::scoped_lock lock(m_mutex);
     auto& obj = m_objects[name];
diff --git a/wpilibc/src/main/native/include/frc/smartdashboard/SendableBuilderImpl.h b/wpilibc/src/main/native/include/frc/smartdashboard/SendableBuilderImpl.h
index 4bd4289..baee6ff 100644
--- a/wpilibc/src/main/native/include/frc/smartdashboard/SendableBuilderImpl.h
+++ b/wpilibc/src/main/native/include/frc/smartdashboard/SendableBuilderImpl.h
@@ -96,44 +96,73 @@
   void AddBooleanProperty(std::string_view key, std::function<bool()> getter,
                           std::function<void(bool)> setter) override;
 
+  void PublishConstBoolean(std::string_view key, bool value) override;
+
   void AddIntegerProperty(std::string_view key, std::function<int64_t()> getter,
                           std::function<void(int64_t)> setter) override;
 
+  void PublishConstInteger(std::string_view key, int64_t value) override;
+
   void AddFloatProperty(std::string_view key, std::function<float()> getter,
                         std::function<void(float)> setter) override;
 
+  void PublishConstFloat(std::string_view key, float value) override;
+
   void AddDoubleProperty(std::string_view key, std::function<double()> getter,
                          std::function<void(double)> setter) override;
 
+  void PublishConstDouble(std::string_view key, double value) override;
+
   void AddStringProperty(std::string_view key,
                          std::function<std::string()> getter,
                          std::function<void(std::string_view)> setter) override;
 
+  void PublishConstString(std::string_view key,
+                          std::string_view value) override;
+
   void AddBooleanArrayProperty(
       std::string_view key, std::function<std::vector<int>()> getter,
       std::function<void(std::span<const int>)> setter) override;
 
+  void PublishConstBooleanArray(std::string_view key,
+                                std::span<const int> value) override;
+
   void AddIntegerArrayProperty(
       std::string_view key, std::function<std::vector<int64_t>()> getter,
       std::function<void(std::span<const int64_t>)> setter) override;
 
+  void PublishConstIntegerArray(std::string_view key,
+                                std::span<const int64_t> value) override;
+
   void AddFloatArrayProperty(
       std::string_view key, std::function<std::vector<float>()> getter,
       std::function<void(std::span<const float>)> setter) override;
 
+  void PublishConstFloatArray(std::string_view key,
+                              std::span<const float> value) override;
+
   void AddDoubleArrayProperty(
       std::string_view key, std::function<std::vector<double>()> getter,
       std::function<void(std::span<const double>)> setter) override;
 
+  void PublishConstDoubleArray(std::string_view key,
+                               std::span<const double> value) override;
+
   void AddStringArrayProperty(
       std::string_view key, std::function<std::vector<std::string>()> getter,
       std::function<void(std::span<const std::string>)> setter) override;
 
+  void PublishConstStringArray(std::string_view key,
+                               std::span<const std::string> value) override;
+
   void AddRawProperty(
       std::string_view key, std::string_view typeString,
       std::function<std::vector<uint8_t>()> getter,
       std::function<void(std::span<const uint8_t>)> setter) override;
 
+  void PublishConstRaw(std::string_view key, std::string_view typeString,
+                       std::span<const uint8_t> value) override;
+
   void AddSmallStringProperty(
       std::string_view key,
       std::function<std::string_view(wpi::SmallVectorImpl<char>& buf)> getter,
@@ -198,6 +227,9 @@
   template <typename Topic, typename Getter, typename Setter>
   void AddPropertyImpl(Topic topic, Getter getter, Setter setter);
 
+  template <typename Topic, typename Value>
+  void PublishConstImpl(Topic topic, Value value);
+
   template <typename T, size_t Size, typename Topic, typename Getter,
             typename Setter>
   void AddSmallPropertyImpl(Topic topic, Getter getter, Setter setter);
diff --git a/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.h b/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.h
index 7fe0b59..f06c252 100644
--- a/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.h
+++ b/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.h
@@ -4,6 +4,8 @@
 
 #pragma once
 
+#include <concepts>
+#include <functional>
 #include <memory>
 #include <string_view>
 
@@ -27,9 +29,10 @@
  * @see SmartDashboard
  */
 template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
 class SendableChooser : public SendableChooserBase {
   wpi::StringMap<T> m_choices;
-
+  std::function<void(T)> m_listener;
   template <class U>
   static U _unwrap_smart_ptr(const U& value);
 
@@ -80,7 +83,15 @@
    */
   auto GetSelected() -> decltype(_unwrap_smart_ptr(m_choices[""]));
 
-  void InitSendable(nt::NTSendableBuilder& builder) override;
+  /**
+   * Bind a listener that's called when the selected value changes.
+   * Only one listener can be bound. Calling this function will replace the
+   * previous listener.
+   * @param listener The function to call that accepts the new value
+   */
+  void OnChange(std::function<void(T)>);
+
+  void InitSendable(wpi::SendableBuilder& builder) override;
 };
 
 }  // namespace frc
diff --git a/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.inc b/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.inc
index e90542b..e40befd 100644
--- a/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.inc
+++ b/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooser.inc
@@ -5,30 +5,34 @@
 #pragma once
 
 #include <algorithm>
+#include <functional>
 #include <memory>
 #include <string>
 #include <string_view>
 #include <utility>
 #include <vector>
 
-#include <networktables/NTSendableBuilder.h>
+#include <wpi/sendable/SendableBuilder.h>
 
 #include "frc/smartdashboard/SendableChooser.h"
 
 namespace frc {
 
 template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
 void SendableChooser<T>::AddOption(std::string_view name, T object) {
   m_choices[name] = std::move(object);
 }
 
 template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
 void SendableChooser<T>::SetDefaultOption(std::string_view name, T object) {
   m_defaultChoice = name;
   AddOption(name, std::move(object));
 }
 
 template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
 auto SendableChooser<T>::GetSelected()
     -> decltype(_unwrap_smart_ptr(m_choices[""])) {
   std::string selected = m_defaultChoice;
@@ -46,16 +50,17 @@
 }
 
 template <class T>
-void SendableChooser<T>::InitSendable(nt::NTSendableBuilder& builder) {
+  requires std::copy_constructible<T> && std::default_initializable<T>
+void SendableChooser<T>::OnChange(std::function<void(T)> listener) {
+  std::scoped_lock lock(m_mutex);
+  m_listener = listener;
+}
+
+template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
+void SendableChooser<T>::InitSendable(wpi::SendableBuilder& builder) {
   builder.SetSmartDashboardType("String Chooser");
-  {
-    std::scoped_lock lock(m_mutex);
-    m_instancePubs.emplace_back(
-        nt::IntegerTopic{builder.GetTopic(kInstance)}.Publish());
-    m_instancePubs.back().Set(m_instance);
-    m_activePubs.emplace_back(
-        nt::StringTopic{builder.GetTopic(kActive)}.Publish());
-  }
+  builder.PublishConstInteger(kInstance, m_instance);
   builder.AddStringArrayProperty(
       kOptions,
       [=, this] {
@@ -91,28 +96,40 @@
       nullptr);
   builder.AddStringProperty(kSelected, nullptr,
                             [=, this](std::string_view val) {
-                              std::scoped_lock lock(m_mutex);
-                              m_haveSelected = true;
-                              m_selected = val;
-                              for (auto& pub : m_activePubs) {
-                                pub.Set(val);
+                              T choice{};
+                              std::function<void(T)> listener;
+                              {
+                                std::scoped_lock lock(m_mutex);
+                                m_haveSelected = true;
+                                m_selected = val;
+                                if (m_previousVal != val && m_listener) {
+                                  choice = m_choices[val];
+                                  listener = m_listener;
+                                }
+                                m_previousVal = val;
+                              }
+                              if (listener) {
+                                listener(choice);
                               }
                             });
 }
 
 template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
 template <class U>
 U SendableChooser<T>::_unwrap_smart_ptr(const U& value) {
   return value;
 }
 
 template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
 template <class U>
 U* SendableChooser<T>::_unwrap_smart_ptr(const std::unique_ptr<U>& value) {
   return value.get();
 }
 
 template <class T>
+  requires std::copy_constructible<T> && std::default_initializable<T>
 template <class U>
 std::weak_ptr<U> SendableChooser<T>::_unwrap_smart_ptr(
     const std::shared_ptr<U>& value) {
diff --git a/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooserBase.h b/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooserBase.h
index b5df73c..f0b4fed 100644
--- a/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooserBase.h
+++ b/wpilibc/src/main/native/include/frc/smartdashboard/SendableChooserBase.h
@@ -7,11 +7,8 @@
 #include <atomic>
 #include <string>
 
-#include <networktables/IntegerTopic.h>
-#include <networktables/NTSendable.h>
-#include <networktables/StringTopic.h>
-#include <wpi/SmallVector.h>
 #include <wpi/mutex.h>
+#include <wpi/sendable/Sendable.h>
 #include <wpi/sendable/SendableHelper.h>
 
 namespace frc {
@@ -22,7 +19,7 @@
  * It contains static, non-templated variables to avoid their duplication in the
  * template class.
  */
-class SendableChooserBase : public nt::NTSendable,
+class SendableChooserBase : public wpi::Sendable,
                             public wpi::SendableHelper<SendableChooserBase> {
  public:
   SendableChooserBase();
@@ -41,10 +38,9 @@
   std::string m_defaultChoice;
   std::string m_selected;
   bool m_haveSelected = false;
-  wpi::SmallVector<nt::IntegerPublisher, 2> m_instancePubs;
-  wpi::SmallVector<nt::StringPublisher, 2> m_activePubs;
   wpi::mutex m_mutex;
   int m_instance;
+  std::string m_previousVal;
   static std::atomic_int s_instances;
 };
 
diff --git a/wpilibc/src/main/native/include/frc/smartdashboard/SmartDashboard.h b/wpilibc/src/main/native/include/frc/smartdashboard/SmartDashboard.h
index aeb4947..04435f0 100644
--- a/wpilibc/src/main/native/include/frc/smartdashboard/SmartDashboard.h
+++ b/wpilibc/src/main/native/include/frc/smartdashboard/SmartDashboard.h
@@ -4,6 +4,7 @@
 
 #pragma once
 
+#include <functional>
 #include <memory>
 #include <span>
 #include <string>
diff --git a/wpilibc/src/test/native/cpp/AnalogPotentiometerTest.cpp b/wpilibc/src/test/native/cpp/AnalogPotentiometerTest.cpp
index de69894..c8d3068 100644
--- a/wpilibc/src/test/native/cpp/AnalogPotentiometerTest.cpp
+++ b/wpilibc/src/test/native/cpp/AnalogPotentiometerTest.cpp
@@ -2,12 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/AnalogPotentiometer.h"
 #include "frc/simulation/AnalogInputSim.h"
 #include "frc/simulation/RoboRioSim.h"
-#include "gtest/gtest.h"
 
 namespace frc {
 using namespace frc::sim;
diff --git a/wpilibc/src/test/native/cpp/DoubleSolenoidTestCTRE.cpp b/wpilibc/src/test/native/cpp/DoubleSolenoidTestCTRE.cpp
index 2678395..7534945 100644
--- a/wpilibc/src/test/native/cpp/DoubleSolenoidTestCTRE.cpp
+++ b/wpilibc/src/test/native/cpp/DoubleSolenoidTestCTRE.cpp
@@ -2,12 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/DoubleSolenoid.h"
 #include "frc/PneumaticsControlModule.h"
 #include "frc/Solenoid.h"
-#include "gtest/gtest.h"
 
 namespace frc {
 
diff --git a/wpilibc/src/test/native/cpp/DoubleSolenoidTestREV.cpp b/wpilibc/src/test/native/cpp/DoubleSolenoidTestREV.cpp
index 23893c4..336d317 100644
--- a/wpilibc/src/test/native/cpp/DoubleSolenoidTestREV.cpp
+++ b/wpilibc/src/test/native/cpp/DoubleSolenoidTestREV.cpp
@@ -2,12 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/DoubleSolenoid.h"
 #include "frc/PneumaticsControlModule.h"
 #include "frc/Solenoid.h"
-#include "gtest/gtest.h"
 
 namespace frc {
 
diff --git a/wpilibc/src/test/native/cpp/DriverStationTest.cpp b/wpilibc/src/test/native/cpp/DriverStationTest.cpp
index c191e2b..b050233 100644
--- a/wpilibc/src/test/native/cpp/DriverStationTest.cpp
+++ b/wpilibc/src/test/native/cpp/DriverStationTest.cpp
@@ -5,11 +5,12 @@
 #include <string>
 #include <tuple>
 
+#include <gtest/gtest.h>
+
 #include "frc/DriverStation.h"
 #include "frc/Joystick.h"
 #include "frc/simulation/DriverStationSim.h"
 #include "frc/simulation/SimHooks.h"
-#include "gtest/gtest.h"
 
 class IsJoystickConnectedParametersTest
     : public ::testing::TestWithParam<std::tuple<int, int, int, bool>> {};
diff --git a/wpilibc/src/test/native/cpp/InterruptTest.cpp b/wpilibc/src/test/native/cpp/InterruptTest.cpp
index 1bf0aa2..96af180 100644
--- a/wpilibc/src/test/native/cpp/InterruptTest.cpp
+++ b/wpilibc/src/test/native/cpp/InterruptTest.cpp
@@ -4,13 +4,13 @@
 
 #include <atomic>
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/AsynchronousInterrupt.h"
 #include "frc/DigitalInput.h"
 #include "frc/Timer.h"
 #include "frc/simulation/DIOSim.h"
-#include "gtest/gtest.h"
 
 namespace frc {
 using namespace frc::sim;
diff --git a/wpilibc/src/test/native/cpp/JoystickTest.cpp b/wpilibc/src/test/native/cpp/JoystickTest.cpp
index 5697879..6aa75ec 100644
--- a/wpilibc/src/test/native/cpp/JoystickTest.cpp
+++ b/wpilibc/src/test/native/cpp/JoystickTest.cpp
@@ -4,12 +4,18 @@
 
 #include "frc/Joystick.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
+
 #include "JoystickTestMacros.h"
 #include "frc/simulation/JoystickSim.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
+// https://github.com/wpilibsuite/allwpilib/issues/1550
+TEST(JoystickTest, FastDeconstruction) {
+  Joystick joystick{0};
+}
+
 AXIS_TEST(Joystick, X)
 AXIS_TEST(Joystick, Y)
 AXIS_TEST(Joystick, Z)
@@ -18,3 +24,46 @@
 
 BUTTON_TEST(Joystick, Trigger)
 BUTTON_TEST(Joystick, Top)
+
+TEST(JoystickTest, GetMagnitude) {
+  Joystick joy{1};
+  sim::JoystickSim joysim{1};
+
+  joysim.SetX(0.5);
+  joysim.SetY(0);
+  joysim.NotifyNewData();
+  ASSERT_NEAR(0.5, joy.GetMagnitude(), 0.001);
+
+  joysim.SetX(0);
+  joysim.SetY(-.5);
+  joysim.NotifyNewData();
+  ASSERT_NEAR(0.5, joy.GetMagnitude(), 0.001);
+
+  joysim.SetX(0.5);
+  joysim.SetY(-0.5);
+  joysim.NotifyNewData();
+  ASSERT_NEAR(0.70710678118, joy.GetMagnitude(), 0.001);
+}
+
+TEST(JoystickTest, GetDirection) {
+  Joystick joy{1};
+  sim::JoystickSim joysim{1};
+
+  joysim.SetX(0.5);
+  joysim.SetY(0);
+  joysim.NotifyNewData();
+  ASSERT_NEAR(units::radian_t{90_deg}.value(), joy.GetDirection().value(),
+              0.001);
+
+  joysim.SetX(0);
+  joysim.SetY(-.5);
+  joysim.NotifyNewData();
+  ASSERT_NEAR(units::radian_t{0_deg}.value(), joy.GetDirection().value(),
+              0.001);
+
+  joysim.SetX(0.5);
+  joysim.SetY(-0.5);
+  joysim.NotifyNewData();
+  ASSERT_NEAR(units::radian_t{45_deg}.value(), joy.GetDirection().value(),
+              0.001);
+}
diff --git a/wpilibc/src/test/native/cpp/NotifierTest.cpp b/wpilibc/src/test/native/cpp/NotifierTest.cpp
new file mode 100644
index 0000000..46e292b
--- /dev/null
+++ b/wpilibc/src/test/native/cpp/NotifierTest.cpp
@@ -0,0 +1,53 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include <atomic>
+
+#include <gtest/gtest.h>
+
+#include "frc/Notifier.h"
+#include "frc/simulation/SimHooks.h"
+
+using namespace frc;
+
+namespace {
+
+class NotifierTest : public ::testing::Test {
+ protected:
+  void SetUp() override {
+    sim::PauseTiming();
+    sim::RestartTiming();
+  }
+
+  void TearDown() override { sim::ResumeTiming(); }
+};
+
+}  // namespace
+
+TEST_F(NotifierTest, StartPeriodicAndStop) {
+  std::atomic<uint32_t> counter{0};
+
+  Notifier notifier{[&] { ++counter; }};
+  notifier.StartPeriodic(1_s);
+
+  sim::StepTiming(10.5_s);
+
+  notifier.Stop();
+  EXPECT_EQ(10u, counter);
+
+  sim::StepTiming(3_s);
+
+  EXPECT_EQ(10u, counter);
+}
+
+TEST_F(NotifierTest, StartSingle) {
+  std::atomic<uint32_t> counter{0};
+
+  Notifier notifier{[&] { ++counter; }};
+  notifier.StartSingle(1_s);
+
+  sim::StepTiming(10.5_s);
+
+  EXPECT_EQ(1u, counter);
+}
diff --git a/wpilibc/src/test/native/cpp/PS4ControllerTest.cpp b/wpilibc/src/test/native/cpp/PS4ControllerTest.cpp
index 329a165..4284aed 100644
--- a/wpilibc/src/test/native/cpp/PS4ControllerTest.cpp
+++ b/wpilibc/src/test/native/cpp/PS4ControllerTest.cpp
@@ -4,9 +4,10 @@
 
 #include "frc/PS4Controller.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
+
 #include "JoystickTestMacros.h"
 #include "frc/simulation/PS4ControllerSim.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/test/native/cpp/PS5ControllerTest.cpp b/wpilibc/src/test/native/cpp/PS5ControllerTest.cpp
new file mode 100644
index 0000000..67dd0ca
--- /dev/null
+++ b/wpilibc/src/test/native/cpp/PS5ControllerTest.cpp
@@ -0,0 +1,38 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include "frc/PS5Controller.h"  // NOLINT(build/include_order)
+
+#include <gtest/gtest.h>
+
+#include "JoystickTestMacros.h"
+#include "frc/simulation/PS5ControllerSim.h"
+
+using namespace frc;
+
+BUTTON_TEST(PS5Controller, SquareButton)
+BUTTON_TEST(PS5Controller, CrossButton)
+BUTTON_TEST(PS5Controller, CircleButton)
+BUTTON_TEST(PS5Controller, TriangleButton)
+
+BUTTON_TEST(PS5Controller, L1Button)
+BUTTON_TEST(PS5Controller, R1Button)
+BUTTON_TEST(PS5Controller, L2Button)
+BUTTON_TEST(PS5Controller, R2Button)
+
+BUTTON_TEST(PS5Controller, CreateButton)
+BUTTON_TEST(PS5Controller, OptionsButton)
+
+BUTTON_TEST(PS5Controller, L3Button)
+BUTTON_TEST(PS5Controller, R3Button)
+
+BUTTON_TEST(PS5Controller, PSButton)
+BUTTON_TEST(PS5Controller, Touchpad)
+
+AXIS_TEST(PS5Controller, LeftX)
+AXIS_TEST(PS5Controller, RightX)
+AXIS_TEST(PS5Controller, LeftY)
+AXIS_TEST(PS5Controller, RightY)
+AXIS_TEST(PS5Controller, L2Axis)
+AXIS_TEST(PS5Controller, R2Axis)
diff --git a/wpilibc/src/test/native/cpp/ScopedTracerTest.cpp b/wpilibc/src/test/native/cpp/ScopedTracerTest.cpp
index c4ef317..f4107e7 100644
--- a/wpilibc/src/test/native/cpp/ScopedTracerTest.cpp
+++ b/wpilibc/src/test/native/cpp/ScopedTracerTest.cpp
@@ -4,13 +4,13 @@
 
 #include <string_view>
 
+#include <gtest/gtest.h>
 #include <wpi/SmallString.h>
 #include <wpi/StringExtras.h>
 #include <wpi/raw_ostream.h>
 
 #include "frc/ScopedTracer.h"
 #include "frc/simulation/SimHooks.h"
-#include "gtest/gtest.h"
 
 TEST(ScopedTracerTest, Timing) {
   wpi::SmallString<128> buf;
diff --git a/wpilibc/src/test/native/cpp/SolenoidTestCTRE.cpp b/wpilibc/src/test/native/cpp/SolenoidTestCTRE.cpp
index 61e3fb6..f30a976 100644
--- a/wpilibc/src/test/native/cpp/SolenoidTestCTRE.cpp
+++ b/wpilibc/src/test/native/cpp/SolenoidTestCTRE.cpp
@@ -2,12 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/DoubleSolenoid.h"
 #include "frc/PneumaticsControlModule.h"
 #include "frc/Solenoid.h"
-#include "gtest/gtest.h"
 
 namespace frc {
 TEST(SolenoidCTRETest, ValidInitialization) {
diff --git a/wpilibc/src/test/native/cpp/SolenoidTestREV.cpp b/wpilibc/src/test/native/cpp/SolenoidTestREV.cpp
index 75ea261..3f3dc40 100644
--- a/wpilibc/src/test/native/cpp/SolenoidTestREV.cpp
+++ b/wpilibc/src/test/native/cpp/SolenoidTestREV.cpp
@@ -2,12 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/DoubleSolenoid.h"
 #include "frc/PneumaticsControlModule.h"
 #include "frc/Solenoid.h"
-#include "gtest/gtest.h"
 
 namespace frc {
 TEST(SolenoidREVTest, ValidInitialization) {
diff --git a/wpilibc/src/test/native/cpp/TimedRobotTest.cpp b/wpilibc/src/test/native/cpp/TimedRobotTest.cpp
index 08c262b..78d18b5 100644
--- a/wpilibc/src/test/native/cpp/TimedRobotTest.cpp
+++ b/wpilibc/src/test/native/cpp/TimedRobotTest.cpp
@@ -9,13 +9,16 @@
 #include <atomic>
 #include <thread>
 
+#include <gtest/gtest.h>
+
 #include "frc/livewindow/LiveWindow.h"
 #include "frc/simulation/DriverStationSim.h"
 #include "frc/simulation/SimHooks.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
+inline constexpr auto kPeriod = 20_ms;
+
 namespace {
 class TimedRobotTest : public ::testing::TestWithParam<bool> {
  protected:
@@ -45,6 +48,8 @@
   std::atomic<uint32_t> m_teleopPeriodicCount{0};
   std::atomic<uint32_t> m_testPeriodicCount{0};
 
+  MockRobot() : TimedRobot{kPeriod} {}
+
   void RobotInit() override { m_robotInitCount++; }
 
   void SimulationInit() override { m_simulationInitCount++; }
@@ -107,7 +112,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -128,7 +133,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -183,7 +188,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -204,7 +209,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -259,7 +264,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -280,7 +285,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -339,7 +344,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -363,7 +368,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_robotInitCount);
   EXPECT_EQ(1u, robot.m_simulationInitCount);
@@ -436,7 +441,7 @@
   EXPECT_EQ(0u, robot.m_teleopExitCount);
   EXPECT_EQ(0u, robot.m_testExitCount);
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_disabledInitCount);
   EXPECT_EQ(0u, robot.m_autonomousInitCount);
@@ -454,7 +459,7 @@
   frc::sim::DriverStationSim::SetTest(false);
   frc::sim::DriverStationSim::NotifyNewData();
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_disabledInitCount);
   EXPECT_EQ(1u, robot.m_autonomousInitCount);
@@ -472,7 +477,7 @@
   frc::sim::DriverStationSim::SetTest(false);
   frc::sim::DriverStationSim::NotifyNewData();
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_disabledInitCount);
   EXPECT_EQ(1u, robot.m_autonomousInitCount);
@@ -490,7 +495,7 @@
   frc::sim::DriverStationSim::SetTest(true);
   frc::sim::DriverStationSim::NotifyNewData();
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(1u, robot.m_disabledInitCount);
   EXPECT_EQ(1u, robot.m_autonomousInitCount);
@@ -508,7 +513,7 @@
   frc::sim::DriverStationSim::SetTest(false);
   frc::sim::DriverStationSim::NotifyNewData();
 
-  frc::sim::StepTiming(20_ms);
+  frc::sim::StepTiming(kPeriod);
 
   EXPECT_EQ(2u, robot.m_disabledInitCount);
   EXPECT_EQ(1u, robot.m_autonomousInitCount);
@@ -528,7 +533,7 @@
   MockRobot robot;
 
   std::atomic<uint32_t> callbackCount{0};
-  robot.AddPeriodic([&] { callbackCount++; }, 10_ms);
+  robot.AddPeriodic([&] { callbackCount++; }, kPeriod / 2.0);
 
   std::thread robotThread{[&] { robot.StartCompetition(); }};
 
@@ -540,13 +545,13 @@
   EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
   EXPECT_EQ(0u, callbackCount);
 
-  frc::sim::StepTiming(10_ms);
+  frc::sim::StepTiming(kPeriod / 2.0);
 
   EXPECT_EQ(0u, robot.m_disabledInitCount);
   EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
   EXPECT_EQ(1u, callbackCount);
 
-  frc::sim::StepTiming(10_ms);
+  frc::sim::StepTiming(kPeriod / 2.0);
 
   EXPECT_EQ(1u, robot.m_disabledInitCount);
   EXPECT_EQ(1u, robot.m_disabledPeriodicCount);
@@ -560,14 +565,14 @@
   MockRobot robot;
 
   std::atomic<uint32_t> callbackCount{0};
-  robot.AddPeriodic([&] { callbackCount++; }, 10_ms, 5_ms);
+  robot.AddPeriodic([&] { callbackCount++; }, kPeriod / 2.0, kPeriod / 4.0);
 
   // Expirations in this test (ms)
   //
   // Robot | Callback
   // ================
-  //    20 |      15
-  //    40 |      25
+  //     p |    0.75p
+  //    2p |    1.25p
 
   std::thread robotThread{[&] { robot.StartCompetition(); }};
 
@@ -579,25 +584,25 @@
   EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
   EXPECT_EQ(0u, callbackCount);
 
-  frc::sim::StepTiming(7.5_ms);
+  frc::sim::StepTiming(kPeriod * 3.0 / 8.0);
 
   EXPECT_EQ(0u, robot.m_disabledInitCount);
   EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
   EXPECT_EQ(0u, callbackCount);
 
-  frc::sim::StepTiming(7.5_ms);
+  frc::sim::StepTiming(kPeriod * 3.0 / 8.0);
 
   EXPECT_EQ(0u, robot.m_disabledInitCount);
   EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
   EXPECT_EQ(1u, callbackCount);
 
-  frc::sim::StepTiming(5_ms);
+  frc::sim::StepTiming(kPeriod / 4.0);
 
   EXPECT_EQ(1u, robot.m_disabledInitCount);
   EXPECT_EQ(1u, robot.m_disabledPeriodicCount);
   EXPECT_EQ(1u, callbackCount);
 
-  frc::sim::StepTiming(5_ms);
+  frc::sim::StepTiming(kPeriod / 4.0);
 
   EXPECT_EQ(1u, robot.m_disabledInitCount);
   EXPECT_EQ(1u, robot.m_disabledPeriodicCount);
diff --git a/wpilibc/src/test/native/cpp/TimerTest.cpp b/wpilibc/src/test/native/cpp/TimerTest.cpp
index a7adc45..fd66541 100644
--- a/wpilibc/src/test/native/cpp/TimerTest.cpp
+++ b/wpilibc/src/test/native/cpp/TimerTest.cpp
@@ -4,8 +4,9 @@
 
 #include "frc/Timer.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
+
 #include "frc/simulation/SimHooks.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/test/native/cpp/TimesliceRobotTest.cpp b/wpilibc/src/test/native/cpp/TimesliceRobotTest.cpp
index a2e4e13..5ff9e1a 100644
--- a/wpilibc/src/test/native/cpp/TimesliceRobotTest.cpp
+++ b/wpilibc/src/test/native/cpp/TimesliceRobotTest.cpp
@@ -9,9 +9,10 @@
 #include <atomic>
 #include <thread>
 
+#include <gtest/gtest.h>
+
 #include "frc/simulation/DriverStationSim.h"
 #include "frc/simulation/SimHooks.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/test/native/cpp/UltrasonicTest.cpp b/wpilibc/src/test/native/cpp/UltrasonicTest.cpp
index 72d72d2..ca901db 100644
--- a/wpilibc/src/test/native/cpp/UltrasonicTest.cpp
+++ b/wpilibc/src/test/native/cpp/UltrasonicTest.cpp
@@ -2,11 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
+
 #include "frc/Ultrasonic.h"
 #include "frc/simulation/UltrasonicSim.h"
-#include "gtest/gtest.h"
 
-namespace frc {
+using namespace frc;
 
 TEST(UltrasonicTest, SimDevices) {
   Ultrasonic ultrasonic{0, 1};
@@ -23,4 +24,19 @@
   EXPECT_EQ(0, ultrasonic.GetRange().value());
 }
 
-}  // namespace frc
+TEST(UltrasonicTest, AutomaticModeToggle) {
+  frc::Ultrasonic ultrasonic{0, 1};
+  EXPECT_NO_THROW({
+    frc::Ultrasonic::SetAutomaticMode(true);
+    frc::Ultrasonic::SetAutomaticMode(false);
+    frc::Ultrasonic::SetAutomaticMode(true);
+  });
+}
+
+TEST(UltrasonicTest, AutomaticModeOnWithZeroInstances) {
+  EXPECT_NO_THROW({ frc::Ultrasonic::SetAutomaticMode(true); });
+}
+
+TEST(UltrasonicTest, AutomaticModeOffWithZeroInstances) {
+  EXPECT_NO_THROW({ frc::Ultrasonic::SetAutomaticMode(false); });
+}
diff --git a/wpilibc/src/test/native/cpp/UnitNetworkTablesTest.cpp b/wpilibc/src/test/native/cpp/UnitNetworkTablesTest.cpp
index 505f906..9b6d10e 100644
--- a/wpilibc/src/test/native/cpp/UnitNetworkTablesTest.cpp
+++ b/wpilibc/src/test/native/cpp/UnitNetworkTablesTest.cpp
@@ -2,13 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <networktables/DoubleTopic.h>
 #include <networktables/NetworkTableInstance.h>
 #include <networktables/UnitTopic.h>
 #include <units/length.h>
 
-#include "gtest/gtest.h"
-
 class UnitNetworkTablesTest : public ::testing::Test {
  public:
   UnitNetworkTablesTest() : inst{nt::NetworkTableInstance::Create()} {}
diff --git a/wpilibc/src/test/native/cpp/WatchdogTest.cpp b/wpilibc/src/test/native/cpp/WatchdogTest.cpp
index 5f55c2f..55031d3 100644
--- a/wpilibc/src/test/native/cpp/WatchdogTest.cpp
+++ b/wpilibc/src/test/native/cpp/WatchdogTest.cpp
@@ -6,8 +6,9 @@
 
 #include <stdint.h>
 
+#include <gtest/gtest.h>
+
 #include "frc/simulation/SimHooks.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/test/native/cpp/XboxControllerTest.cpp b/wpilibc/src/test/native/cpp/XboxControllerTest.cpp
index 0a8316b..3798fde 100644
--- a/wpilibc/src/test/native/cpp/XboxControllerTest.cpp
+++ b/wpilibc/src/test/native/cpp/XboxControllerTest.cpp
@@ -4,9 +4,10 @@
 
 #include "frc/XboxController.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
+
 #include "JoystickTestMacros.h"
 #include "frc/simulation/XboxControllerSim.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/test/native/cpp/drive/DifferentialDriveTest.cpp b/wpilibc/src/test/native/cpp/drive/DifferentialDriveTest.cpp
index 1f542be..f21f268 100644
--- a/wpilibc/src/test/native/cpp/drive/DifferentialDriveTest.cpp
+++ b/wpilibc/src/test/native/cpp/drive/DifferentialDriveTest.cpp
@@ -2,8 +2,9 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
+
 #include "frc/drive/DifferentialDrive.h"
-#include "gtest/gtest.h"
 #include "motorcontrol/MockMotorController.h"
 
 TEST(DifferentialDriveTest, ArcadeDriveIK) {
diff --git a/wpilibc/src/test/native/cpp/drive/MecanumDriveTest.cpp b/wpilibc/src/test/native/cpp/drive/MecanumDriveTest.cpp
index de55462..1bbf464 100644
--- a/wpilibc/src/test/native/cpp/drive/MecanumDriveTest.cpp
+++ b/wpilibc/src/test/native/cpp/drive/MecanumDriveTest.cpp
@@ -2,8 +2,9 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
+
 #include "frc/drive/MecanumDrive.h"
-#include "gtest/gtest.h"
 #include "motorcontrol/MockMotorController.h"
 
 TEST(MecanumDriveTest, CartesianIK) {
diff --git a/wpilibc/src/test/native/cpp/event/BooleanEventTest.cpp b/wpilibc/src/test/native/cpp/event/BooleanEventTest.cpp
new file mode 100644
index 0000000..28209b4
--- /dev/null
+++ b/wpilibc/src/test/native/cpp/event/BooleanEventTest.cpp
@@ -0,0 +1,487 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include <atomic>
+
+#include <gtest/gtest.h>
+
+#include "frc/event/BooleanEvent.h"
+#include "frc/event/EventLoop.h"
+
+using namespace frc;
+
+TEST(BooleanEventTest, BinaryCompositions) {
+  EventLoop loop;
+  int andCounter = 0;
+  int orCounter = 0;
+
+  EXPECT_EQ(0, andCounter);
+  EXPECT_EQ(0, orCounter);
+
+  (BooleanEvent(&loop, [] { return true; }) && BooleanEvent(&loop, [] {
+     return false;
+   })).IfHigh([&] { ++andCounter; });
+  (BooleanEvent(&loop, [] { return true; }) || BooleanEvent(&loop, [] {
+     return false;
+   })).IfHigh([&] { ++orCounter; });
+
+  loop.Poll();
+
+  EXPECT_EQ(0, andCounter);
+  EXPECT_EQ(1, orCounter);
+}
+
+/**
+ * Tests that composed edge events only execute on edges (two
+ * rising edge events composed with and() should only execute when both signals
+ * are on the rising edge)
+ */
+TEST(BooleanEventTest, BinaryCompositionsWithEdgeDecorators) {
+  EventLoop loop;
+  bool boolean1 = false;
+  bool boolean2 = false;
+  bool boolean3 = false;
+  bool boolean4 = false;
+  int counter = 0;
+
+  auto event1 = BooleanEvent(&loop, [&] { return boolean1; }).Rising();
+  auto event2 = BooleanEvent(&loop, [&] { return boolean2; }).Rising();
+  auto event3 = BooleanEvent(&loop, [&] { return boolean3; }).Rising();
+  auto event4 = BooleanEvent(&loop, [&] { return boolean4; }).Rising();
+  (event1 && event2).IfHigh([&] { ++counter; });
+  (event3 || event4).IfHigh([&] { ++counter; });
+  EXPECT_EQ(0, counter);
+
+  boolean1 = true;
+  boolean2 = true;
+  boolean3 = true;
+  boolean4 = true;
+  loop.Poll();  // Both actions execute
+
+  EXPECT_EQ(2, counter);
+
+  loop.Poll();  // Nothing should happen since nothing is on rising edge
+
+  EXPECT_EQ(2, counter);
+
+  boolean1 = false;
+  boolean2 = false;
+  boolean3 = false;
+  boolean4 = false;
+  loop.Poll();  // Nothing should happen
+
+  EXPECT_EQ(2, counter);
+
+  boolean1 = true;
+  loop.Poll();  // Nothing should happen since only Bool 1 is on rising edge
+
+  EXPECT_EQ(2, counter);
+
+  boolean2 = true;
+  loop.Poll();  // Bool 2 is on rising edge, but Bool 1 isn't, nothing should
+                // happen
+
+  EXPECT_EQ(2, counter);
+
+  boolean1 = false;
+  boolean2 = false;
+  loop.Poll();  // Nothing should happen
+
+  EXPECT_EQ(2, counter);
+
+  boolean1 = true;
+  boolean2 = true;
+  loop.Poll();  // Bool 1 and 2 are on rising edge, increments counter once
+
+  EXPECT_EQ(3, counter);
+
+  boolean3 = true;
+  loop.Poll();  // Bool 3 is on rising edge, increments counter once
+
+  EXPECT_EQ(4, counter);
+
+  loop.Poll();  // Nothing should happen, Bool 3 isn't on rising edge
+
+  EXPECT_EQ(4, counter);
+
+  boolean4 = true;
+  loop.Poll();  // Bool 4 is on rising edge, increments counter once
+
+  EXPECT_EQ(5, counter);
+
+  loop.Poll();  // Nothing should happen, Bool 4 isn't on rising edge
+
+  EXPECT_EQ(5, counter);
+}
+
+TEST(BooleanEventTest, BinaryCompositionLoopSemantics) {
+  EventLoop loop1;
+  EventLoop loop2;
+  bool boolean1 = true;
+  bool boolean2 = true;
+  int counter1 = 0;
+  int counter2 = 0;
+
+  (BooleanEvent(&loop1, [&] { return boolean1; }) && BooleanEvent(&loop2, [&] {
+     return boolean2;
+   })).IfHigh([&] { ++counter1; });
+  (BooleanEvent(&loop2, [&] { return boolean2; }) && BooleanEvent(&loop1, [&] {
+     return boolean1;
+   })).IfHigh([&] { ++counter2; });
+
+  EXPECT_EQ(0, counter1);
+  EXPECT_EQ(0, counter2);
+
+  loop1
+      .Poll();  // 1st event executes, Bool 1 and 2 are true, increments counter
+
+  EXPECT_EQ(1, counter1);
+  EXPECT_EQ(0, counter2);
+
+  loop2
+      .Poll();  // 2nd event executes, Bool 1 and 2 are true, increments counter
+
+  EXPECT_EQ(1, counter1);
+  EXPECT_EQ(1, counter2);
+
+  boolean2 = false;
+  loop1.Poll();  // 1st event executes, Bool 2 is still true because loop 2
+                 // hasn't updated it, increments counter
+
+  EXPECT_EQ(2, counter1);
+  EXPECT_EQ(1, counter2);
+
+  loop2.Poll();  // 2nd event executes, Bool 2 is now false because this loop
+                 // updated it, does nothing
+
+  EXPECT_EQ(2, counter1);
+  EXPECT_EQ(1, counter2);
+
+  loop1.Poll();  // All bools are updated at this point, nothing should happen
+
+  EXPECT_EQ(2, counter1);
+  EXPECT_EQ(1, counter2);
+
+  boolean2 = true;
+  loop2.Poll();  // 2nd event executes, Bool 2 is true because this loop updated
+                 // it, increments counter
+
+  EXPECT_EQ(2, counter1);
+  EXPECT_EQ(2, counter2);
+
+  loop1.Poll();  // 1st event executes, Bool 2 is true because loop 2 updated
+                 // it, increments counter
+
+  EXPECT_EQ(3, counter1);
+  EXPECT_EQ(2, counter2);
+
+  boolean1 = false;
+  loop2.Poll();  // 2nd event executes, Bool 1 is still true because loop 1
+                 // hasn't updated it, increments counter
+
+  EXPECT_EQ(3, counter1);
+  EXPECT_EQ(3, counter2);
+
+  loop1.Poll();  // 1st event executes, Bool 1 is false because this loop
+                 // updated it, does nothing
+
+  EXPECT_EQ(3, counter1);
+  EXPECT_EQ(3, counter2);
+
+  loop2.Poll();  // All bools are updated at this point, nothing should happen
+
+  EXPECT_EQ(3, counter1);
+  EXPECT_EQ(3, counter2);
+}
+
+/** Tests the order of actions bound to an event loop. */
+TEST(BooleanEventTest, PollOrdering) {
+  EventLoop loop;
+  bool boolean1 = true;
+  bool boolean2 = true;
+  bool enableAssert = false;
+  int counter = 0;
+
+  (BooleanEvent(  // This event binds an action to the event loop first
+       &loop,
+       [&] {
+         if (enableAssert) {
+           ++counter;
+           EXPECT_EQ(1, counter % 3);
+         }
+         return boolean1;
+       }) &&  // The composed event binds an action to the event loop third
+              // This event binds an action to the event loop second
+   BooleanEvent(&loop, [&] {
+     if (enableAssert) {
+       ++counter;
+       EXPECT_EQ(2, counter % 3);
+     }
+     return boolean2;
+     // This binds an action to the event loop fourth
+   })).IfHigh([&] {
+    if (enableAssert) {
+      ++counter;
+      EXPECT_EQ(0, counter % 3);
+    }
+  });
+  enableAssert = true;
+  loop.Poll();
+  loop.Poll();
+  loop.Poll();
+  loop.Poll();
+}
+
+TEST(BooleanEventTest, EdgeDecorators) {
+  EventLoop loop;
+  bool boolean = false;
+  int counter = 0;
+
+  BooleanEvent(&loop, [&] { return boolean; }).Falling().IfHigh([&] {
+    --counter;
+  });
+  BooleanEvent(&loop, [&] { return boolean; }).Rising().IfHigh([&] {
+    ++counter;
+  });
+
+  EXPECT_EQ(0, counter);
+
+  boolean = false;
+  loop.Poll();
+
+  EXPECT_EQ(0, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(1, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(1, counter);
+
+  boolean = false;
+  loop.Poll();
+
+  EXPECT_EQ(0, counter);
+}
+
+/**
+ * Tests that binding actions to the same edge event will result in all actions
+ * executing.
+ */
+TEST(BooleanEventTest, EdgeReuse) {
+  EventLoop loop;
+  bool boolean = false;
+  int counter = 0;
+
+  auto event = BooleanEvent(&loop, [&] { return boolean; }).Rising();
+  event.IfHigh([&] { ++counter; });
+  event.IfHigh([&] { ++counter; });
+
+  EXPECT_EQ(0, counter);
+
+  loop.Poll();
+
+  EXPECT_EQ(0, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  boolean = false;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(4, counter);
+}
+
+/**
+ * Tests that all actions execute on separate edge events constructed from the
+ * original event.
+ */
+TEST(BooleanEventTest, EdgeReconstruct) {
+  EventLoop loop;
+  bool boolean = false;
+  int counter = 0;
+
+  auto event = BooleanEvent(&loop, [&] { return boolean; });
+  event.Rising().IfHigh([&] { ++counter; });
+  event.Rising().IfHigh([&] { ++counter; });
+
+  EXPECT_EQ(0, counter);
+
+  loop.Poll();
+
+  EXPECT_EQ(0, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  boolean = false;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(4, counter);
+}
+
+/** Tests that all actions bound to an event will still execute even if the
+ * signal is changed during the loop poll */
+TEST(BooleanEventTest, MidLoopBooleanChange) {
+  EventLoop loop;
+  bool boolean = false;
+  int counter = 0;
+
+  auto event = BooleanEvent(&loop, [&] { return boolean; }).Rising();
+  event.IfHigh([&] {
+    boolean = false;
+    ++counter;
+  });
+  event.IfHigh([&] { ++counter; });
+
+  EXPECT_EQ(0, counter);
+
+  loop.Poll();
+
+  EXPECT_EQ(0, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  boolean = false;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(4, counter);
+}
+
+/**
+ * Tests that all actions bound to composed events will still execute even if
+ * the composed signal changes during the loop poll.
+ */
+TEST(BooleanEventTest, MidLoopBooleanChangeWithComposedEvents) {
+  EventLoop loop;
+  bool boolean1 = false;
+  bool boolean2 = false;
+  bool boolean3 = false;
+  bool boolean4 = false;
+  int counter = 0;
+
+  auto event1 = BooleanEvent(&loop, [&] { return boolean1; });
+  auto event2 = BooleanEvent(&loop, [&] { return boolean2; });
+  auto event3 = BooleanEvent(&loop, [&] { return boolean3; });
+  auto event4 = BooleanEvent(&loop, [&] { return boolean4; });
+  event1.IfHigh([&] {
+    boolean2 = false;
+    boolean3 = false;
+    ++counter;
+  });
+  (event3 || event4).IfHigh([&] {
+    boolean1 = false;
+    ++counter;
+  });
+  (event1 && event2).IfHigh([&] {
+    boolean4 = false;
+    ++counter;
+  });
+
+  EXPECT_EQ(0, counter);
+
+  boolean1 = true;
+  boolean2 = true;
+  boolean3 = true;
+  boolean4 = true;
+  loop.Poll();  // All three actions execute, incrementing the counter three
+                // times and setting all booleans to false
+
+  EXPECT_EQ(3, counter);
+
+  loop.Poll();  // Nothing should happen since everything was set to false
+
+  EXPECT_EQ(3, counter);
+
+  boolean1 = true;
+  boolean2 = true;
+  loop.Poll();  // Bool 1 and 2 are true, increments counter twice, Bool 2 gets
+                // set to false
+
+  EXPECT_EQ(5, counter);
+
+  boolean1 = false;
+  loop.Poll();  // Nothing should happen
+
+  EXPECT_EQ(5, counter);
+
+  boolean1 = true;
+  boolean3 = true;
+  loop.Poll();  // Bool 1 and 3 are true, increments counter twice, Bool 3 gets
+                // set to false
+
+  EXPECT_EQ(7, counter);
+
+  boolean1 = false;
+  boolean4 = true;
+  loop.Poll();  // Bool 4 is true, increments counter once
+
+  EXPECT_EQ(8, counter);
+}
+
+TEST(BooleanEventTest, Negation) {
+  EventLoop loop;
+  bool boolean = false;
+  int counter = 0;
+
+  (!BooleanEvent(&loop, [&] { return boolean; })).IfHigh([&] { ++counter; });
+
+  EXPECT_EQ(0, counter);
+
+  loop.Poll();
+
+  EXPECT_EQ(1, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(1, counter);
+
+  boolean = false;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+
+  boolean = true;
+  loop.Poll();
+
+  EXPECT_EQ(2, counter);
+}
diff --git a/wpilibc/src/test/native/cpp/event/NetworkBooleanEventTest.cpp b/wpilibc/src/test/native/cpp/event/NetworkBooleanEventTest.cpp
index d2ac7c4..0d4ce49 100644
--- a/wpilibc/src/test/native/cpp/event/NetworkBooleanEventTest.cpp
+++ b/wpilibc/src/test/native/cpp/event/NetworkBooleanEventTest.cpp
@@ -2,12 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <networktables/BooleanTopic.h>
 #include <networktables/NetworkTableInstance.h>
 
 #include "frc/event/EventLoop.h"
 #include "frc/event/NetworkBooleanEvent.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/test/native/cpp/main.cpp b/wpilibc/src/test/native/cpp/main.cpp
index ba29975..e0bad04 100644
--- a/wpilibc/src/test/native/cpp/main.cpp
+++ b/wpilibc/src/test/native/cpp/main.cpp
@@ -2,10 +2,9 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <hal/HALBase.h>
 
-#include "gtest/gtest.h"
-
 #ifndef __FRC_ROBORIO__
 namespace frc::impl {
 void ResetMotorSafety();
diff --git a/wpilibc/src/test/native/cpp/motorcontrol/MotorControllerGroupTest.cpp b/wpilibc/src/test/native/cpp/motorcontrol/MotorControllerGroupTest.cpp
index 48cf700..4ff889a 100644
--- a/wpilibc/src/test/native/cpp/motorcontrol/MotorControllerGroupTest.cpp
+++ b/wpilibc/src/test/native/cpp/motorcontrol/MotorControllerGroupTest.cpp
@@ -7,7 +7,8 @@
 #include <memory>
 #include <vector>
 
-#include "gtest/gtest.h"
+#include <gtest/gtest.h>
+
 #include "motorcontrol/MockMotorController.h"
 
 using namespace frc;
diff --git a/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardInstanceTest.cpp b/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardInstanceTest.cpp
index 0b0c8df..cb2e002 100644
--- a/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardInstanceTest.cpp
+++ b/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardInstanceTest.cpp
@@ -6,10 +6,12 @@
 
 #include <string_view>
 
+#include <gtest/gtest.h>
 #include <networktables/NetworkTableInstance.h>
+#include <networktables/NetworkTableListener.h>
+#include <networktables/StringTopic.h>
 
 #include "frc/shuffleboard/ShuffleboardInstance.h"
-#include "gtest/gtest.h"
 #include "shuffleboard/MockActuatorSendable.h"
 
 class NTWrapper {
@@ -106,3 +108,24 @@
   EXPECT_FALSE(controllable)
       << "The nested actuator widget should have been disabled";
 }
+
+TEST(ShuffleboardInstanceTest, DuplicateSelectTabs) {
+  NTWrapper ntInst;
+  frc::detail::ShuffleboardInstance shuffleboardInst{ntInst.inst};
+  std::atomic_int counter = 0;
+  auto subscriber =
+      ntInst.inst.GetStringTopic("/Shuffleboard/.metadata/Selected")
+          .Subscribe("", {.keepDuplicates = true});
+  ntInst.inst.AddListener(
+      subscriber, nt::EventFlags::kValueAll | nt::EventFlags::kImmediate,
+      [&counter](auto& event) { counter++; });
+
+  // There shouldn't be anything there
+  EXPECT_EQ(0, counter);
+
+  shuffleboardInst.SelectTab("tab1");
+  shuffleboardInst.SelectTab("tab1");
+  EXPECT_TRUE(ntInst.inst.WaitForListenerQueue(1.0))
+      << "Listener queue timed out!";
+  EXPECT_EQ(2, counter);
+}
diff --git a/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardTest.cpp b/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardTest.cpp
index 693aac4..db689db 100644
--- a/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardTest.cpp
+++ b/wpilibc/src/test/native/cpp/shuffleboard/ShuffleboardTest.cpp
@@ -2,8 +2,9 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
+
 #include "frc/shuffleboard/Shuffleboard.h"
-#include "gtest/gtest.h"
 
 TEST(ShuffleboardTest, TabObjectsCached) {
   auto& tab1 = frc::Shuffleboard::GetTab("testTabObjectsCached");
diff --git a/wpilibc/src/test/native/cpp/shuffleboard/SuppliedValueWidgetTest.cpp b/wpilibc/src/test/native/cpp/shuffleboard/SuppliedValueWidgetTest.cpp
index d964639..37185dd 100644
--- a/wpilibc/src/test/native/cpp/shuffleboard/SuppliedValueWidgetTest.cpp
+++ b/wpilibc/src/test/native/cpp/shuffleboard/SuppliedValueWidgetTest.cpp
@@ -2,12 +2,12 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <networktables/NetworkTableEntry.h>
 #include <networktables/NetworkTableInstance.h>
 
 #include "frc/shuffleboard/ShuffleboardInstance.h"
 #include "frc/shuffleboard/ShuffleboardTab.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 
diff --git a/wpilibc/src/test/native/cpp/simulation/ADXL345SimTest.cpp b/wpilibc/src/test/native/cpp/simulation/ADXL345SimTest.cpp
index 2bec0ed..2495ad0 100644
--- a/wpilibc/src/test/native/cpp/simulation/ADXL345SimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/ADXL345SimTest.cpp
@@ -4,18 +4,18 @@
 
 #include "frc/simulation/ADXL345Sim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/ADXL345_I2C.h"
 #include "frc/ADXL345_SPI.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
 TEST(ADXL345SimTest, SetSpiAttributes) {
   HAL_Initialize(500, 0);
 
-  ADXL345_SPI accel(SPI::kMXP, Accelerometer::kRange_2G);
+  ADXL345_SPI accel(SPI::kMXP, ADXL345_SPI::kRange_2G);
   ADXL345Sim sim(accel);
 
   EXPECT_EQ(0, accel.GetX());
diff --git a/wpilibc/src/test/native/cpp/simulation/ADXL362SimTest.cpp b/wpilibc/src/test/native/cpp/simulation/ADXL362SimTest.cpp
index 13f6c00..3658ffd 100644
--- a/wpilibc/src/test/native/cpp/simulation/ADXL362SimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/ADXL362SimTest.cpp
@@ -4,17 +4,17 @@
 
 #include "frc/simulation/ADXL362Sim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/ADXL362.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
 TEST(ADXL362SimTest, SetAttributes) {
   HAL_Initialize(500, 0);
 
-  ADXL362 accel(SPI::kMXP, Accelerometer::kRange_2G);
+  ADXL362 accel(SPI::kMXP, ADXL362::kRange_2G);
   ADXL362Sim sim(accel);
 
   EXPECT_EQ(0, accel.GetX());
diff --git a/wpilibc/src/test/native/cpp/simulation/ADXRS450_GyroSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/ADXRS450_GyroSimTest.cpp
index 57c4fbe..ea99f80 100644
--- a/wpilibc/src/test/native/cpp/simulation/ADXRS450_GyroSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/ADXRS450_GyroSimTest.cpp
@@ -4,10 +4,10 @@
 
 #include "frc/simulation/ADXRS450_GyroSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/ADXRS450_Gyro.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/AccelerometerSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/AccelerometerSimTest.cpp
index 3dc8582..328645d 100644
--- a/wpilibc/src/test/native/cpp/simulation/AccelerometerSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/AccelerometerSimTest.cpp
@@ -4,12 +4,12 @@
 
 #include "frc/simulation/BuiltInAccelerometerSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/Accelerometer.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/BuiltInAccelerometer.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
@@ -99,7 +99,7 @@
 
   EnumCallback callback;
 
-  Accelerometer::Range range = Accelerometer::kRange_4G;
+  BuiltInAccelerometer::Range range = BuiltInAccelerometer::kRange_4G;
   auto cb = sim.RegisterRangeCallback(callback.GetCallback(), false);
   BuiltInAccelerometer accel(range);
   EXPECT_TRUE(callback.WasTriggered());
@@ -108,7 +108,7 @@
 
   // 2G
   callback.Reset();
-  range = Accelerometer::kRange_2G;
+  range = BuiltInAccelerometer::kRange_2G;
   accel.SetRange(range);
   EXPECT_TRUE(callback.WasTriggered());
   EXPECT_EQ(static_cast<int>(range), sim.GetRange());
@@ -116,7 +116,7 @@
 
   // 4G
   callback.Reset();
-  range = Accelerometer::kRange_4G;
+  range = BuiltInAccelerometer::kRange_4G;
   accel.SetRange(range);
   EXPECT_TRUE(callback.WasTriggered());
   EXPECT_EQ(static_cast<int>(range), sim.GetRange());
@@ -124,15 +124,10 @@
 
   // 8G
   callback.Reset();
-  range = Accelerometer::kRange_8G;
+  range = BuiltInAccelerometer::kRange_8G;
   accel.SetRange(range);
   EXPECT_TRUE(callback.WasTriggered());
   EXPECT_EQ(static_cast<int>(range), sim.GetRange());
   EXPECT_EQ(static_cast<int>(range), callback.GetLastValue());
-
-  // 16G - Not supported
-  callback.Reset();
-  EXPECT_THROW(accel.SetRange(Accelerometer::kRange_16G), std::runtime_error);
-  EXPECT_FALSE(callback.WasTriggered());
 }
 }  // namespace frc::sim
diff --git a/wpilibc/src/test/native/cpp/simulation/AddressableLEDSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/AddressableLEDSimTest.cpp
index e450477..6907cf6 100644
--- a/wpilibc/src/test/native/cpp/simulation/AddressableLEDSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/AddressableLEDSimTest.cpp
@@ -6,11 +6,11 @@
 
 #include <array>
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/AddressableLED.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/AnalogEncoderSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/AnalogEncoderSimTest.cpp
index 0a1b687..3f0ea45 100644
--- a/wpilibc/src/test/native/cpp/simulation/AnalogEncoderSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/AnalogEncoderSimTest.cpp
@@ -4,13 +4,13 @@
 
 #include <numbers>
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 #include <units/math.h>
 
 #include "frc/AnalogEncoder.h"
 #include "frc/AnalogInput.h"
 #include "frc/simulation/AnalogEncoderSim.h"
-#include "gtest/gtest.h"
 
 #define EXPECT_NEAR_UNITS(val1, val2, eps) \
   EXPECT_LE(units::math::abs(val1 - val2), eps)
diff --git a/wpilibc/src/test/native/cpp/simulation/AnalogGyroSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/AnalogGyroSimTest.cpp
index f1baaca..e82fa04 100644
--- a/wpilibc/src/test/native/cpp/simulation/AnalogGyroSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/AnalogGyroSimTest.cpp
@@ -4,12 +4,12 @@
 
 #include "frc/simulation/AnalogGyroSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/AnalogGyro.h"
 #include "frc/AnalogInput.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/AnalogInputSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/AnalogInputSimTest.cpp
index 8b4569e..2f963fa 100644
--- a/wpilibc/src/test/native/cpp/simulation/AnalogInputSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/AnalogInputSimTest.cpp
@@ -4,11 +4,11 @@
 
 #include "frc/simulation/AnalogInputSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/AnalogInput.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/AnalogOutputSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/AnalogOutputSimTest.cpp
index 630f2c9..bbe2b81 100644
--- a/wpilibc/src/test/native/cpp/simulation/AnalogOutputSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/AnalogOutputSimTest.cpp
@@ -4,11 +4,11 @@
 
 #include "frc/simulation/AnalogOutputSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/AnalogOutput.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/AnalogTriggerSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/AnalogTriggerSimTest.cpp
index 5e9e28e..c01f64f 100644
--- a/wpilibc/src/test/native/cpp/simulation/AnalogTriggerSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/AnalogTriggerSimTest.cpp
@@ -4,11 +4,11 @@
 
 #include "frc/simulation/AnalogTriggerSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/AnalogTrigger.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/CTREPCMSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/CTREPCMSimTest.cpp
index 8082ed5..0d3e6ec 100644
--- a/wpilibc/src/test/native/cpp/simulation/CTREPCMSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/CTREPCMSimTest.cpp
@@ -4,12 +4,12 @@
 
 #include "frc/simulation/CTREPCMSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/DoubleSolenoid.h"
 #include "frc/PneumaticsControlModule.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/DCMotorSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/DCMotorSimTest.cpp
index efed939..75b8a4b 100644
--- a/wpilibc/src/test/native/cpp/simulation/DCMotorSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/DCMotorSimTest.cpp
@@ -2,6 +2,8 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
+
 #include "frc/Encoder.h"
 #include "frc/RobotController.h"
 #include "frc/controller/PIDController.h"
@@ -10,7 +12,6 @@
 #include "frc/simulation/DCMotorSim.h"
 #include "frc/simulation/EncoderSim.h"
 #include "frc/simulation/RoboRioSim.h"
-#include "gtest/gtest.h"
 
 TEST(DCMotorSimTest, VoltageSteadyState) {
   frc::DCMotor gearbox = frc::DCMotor::NEO(1);
@@ -62,7 +63,7 @@
   frc::sim::DCMotorSim sim{gearbox, 1.0,
                            units::kilogram_square_meter_t{0.0005}};
 
-  frc2::PIDController controller{0.04, 0.0, 0.001};
+  frc::PIDController controller{0.04, 0.0, 0.001};
 
   frc::Encoder encoder{0, 1};
   frc::sim::EncoderSim encoderSim{encoder};
diff --git a/wpilibc/src/test/native/cpp/simulation/DIOSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/DIOSimTest.cpp
index 338d24e..3e67955 100644
--- a/wpilibc/src/test/native/cpp/simulation/DIOSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/DIOSimTest.cpp
@@ -4,12 +4,12 @@
 
 #include "frc/simulation/DIOSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/DigitalInput.h"
 #include "frc/DigitalOutput.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/DifferentialDrivetrainSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/DifferentialDrivetrainSimTest.cpp
index 6edfde0..7e56426 100644
--- a/wpilibc/src/test/native/cpp/simulation/DifferentialDrivetrainSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/DifferentialDrivetrainSimTest.cpp
@@ -2,6 +2,7 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <units/current.h>
 #include <units/math.h>
 #include <units/moment_of_inertia.h>
@@ -15,7 +16,6 @@
 #include "frc/system/plant/LinearSystemId.h"
 #include "frc/trajectory/TrajectoryGenerator.h"
 #include "frc/trajectory/constraint/DifferentialDriveKinematicsConstraint.h"
-#include "gtest/gtest.h"
 
 TEST(DifferentialDrivetrainSimTest, Convergence) {
   auto motor = frc::DCMotor::NEO(2);
diff --git a/wpilibc/src/test/native/cpp/simulation/DigitalPWMSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/DigitalPWMSimTest.cpp
index fd62edc..27fb5cb 100644
--- a/wpilibc/src/test/native/cpp/simulation/DigitalPWMSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/DigitalPWMSimTest.cpp
@@ -4,11 +4,11 @@
 
 #include "frc/simulation/DigitalPWMSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/DigitalOutput.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/DriverStationSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/DriverStationSimTest.cpp
index 6aa31c6..2513252 100644
--- a/wpilibc/src/test/native/cpp/simulation/DriverStationSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/DriverStationSimTest.cpp
@@ -5,13 +5,14 @@
 #include <string>
 #include <tuple>
 
+#include <gtest/gtest.h>
+
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/DriverStation.h"
 #include "frc/Joystick.h"
 #include "frc/RobotState.h"
 #include "frc/simulation/DriverStationSim.h"
 #include "frc/simulation/SimHooks.h"
-#include "gtest/gtest.h"
 
 using namespace frc;
 using namespace frc::sim;
@@ -129,6 +130,17 @@
 
   auto cb = DriverStationSim::RegisterAllianceStationIdCallback(
       callback.GetCallback(), false);
+
+  // Unknown
+  allianceStation = HAL_AllianceStationID_kUnknown;
+  DriverStationSim::SetAllianceStationId(allianceStation);
+  frc::sim::DriverStationSim::NotifyNewData();
+  EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
+  EXPECT_FALSE(DriverStation::GetAlliance().has_value());
+  EXPECT_FALSE(DriverStation::GetLocation().has_value());
+  EXPECT_TRUE(callback.WasTriggered());
+  EXPECT_EQ(allianceStation, callback.GetLastValue());
+
   // B1
   allianceStation = HAL_AllianceStationID_kBlue1;
   DriverStationSim::SetAllianceStationId(allianceStation);
@@ -219,7 +231,7 @@
   DriverStationSim::SetMatchTime(kTestTime);
   frc::sim::DriverStationSim::NotifyNewData();
   EXPECT_EQ(kTestTime, DriverStationSim::GetMatchTime());
-  EXPECT_EQ(kTestTime, DriverStation::GetMatchTime());
+  EXPECT_EQ(kTestTime, DriverStation::GetMatchTime().value());
   EXPECT_TRUE(callback.WasTriggered());
   EXPECT_EQ(kTestTime, callback.GetLastValue());
 }
diff --git a/wpilibc/src/test/native/cpp/simulation/DutyCycleEncoderSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/DutyCycleEncoderSimTest.cpp
index 8249499..e81c63e 100644
--- a/wpilibc/src/test/native/cpp/simulation/DutyCycleEncoderSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/DutyCycleEncoderSimTest.cpp
@@ -4,11 +4,11 @@
 
 #include "frc/simulation/DutyCycleEncoderSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/DutyCycleEncoder.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
@@ -32,4 +32,45 @@
   EXPECT_EQ(19.1, enc.GetDistance());
 }
 
+TEST(DutyCycleEncoderSimTest, SetDistancePerRotation) {
+  HAL_Initialize(500, 0);
+
+  DutyCycleEncoder enc{0};
+  DutyCycleEncoderSim sim(enc);
+  sim.Set(units::turn_t{1.5});
+  enc.SetDistancePerRotation(42);
+  EXPECT_EQ(63, enc.GetDistance());
+}
+
+TEST(DutyCycleEncoderSimTest, SetAbsolutePosition) {
+  HAL_Initialize(500, 0);
+
+  DutyCycleEncoder enc{0};
+  DutyCycleEncoderSim sim(enc);
+  sim.SetAbsolutePosition(0.75);
+  EXPECT_EQ(0.75, enc.GetAbsolutePosition());
+}
+
+TEST(DutyCycleEncoderSimTest, SetIsConnected) {
+  HAL_Initialize(500, 0);
+
+  DutyCycleEncoder enc{0};
+  DutyCycleEncoderSim sim(enc);
+  sim.SetConnected(true);
+  EXPECT_TRUE(enc.IsConnected());
+  sim.SetConnected(false);
+  EXPECT_FALSE(enc.IsConnected());
+}
+
+TEST(DutyCycleEncoderSimTest, Reset) {
+  HAL_Initialize(500, 0);
+
+  DutyCycleEncoder enc{0};
+  DutyCycleEncoderSim sim(enc);
+  sim.SetDistance(2.5);
+  EXPECT_EQ(2.5, enc.GetDistance());
+  enc.Reset();
+  EXPECT_EQ(0, enc.GetDistance());
+}
+
 }  // namespace frc::sim
diff --git a/wpilibc/src/test/native/cpp/simulation/DutyCycleSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/DutyCycleSimTest.cpp
index 56e0592..297acc9 100644
--- a/wpilibc/src/test/native/cpp/simulation/DutyCycleSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/DutyCycleSimTest.cpp
@@ -4,12 +4,12 @@
 
 #include "frc/simulation/DutyCycleSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/DigitalInput.h"
 #include "frc/DutyCycle.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp
index 3c647e6..28777bd 100644
--- a/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp
@@ -2,6 +2,7 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <units/math.h>
 #include <units/time.h>
 
@@ -14,15 +15,14 @@
 #include "frc/system/NumericalIntegration.h"
 #include "frc/system/plant/DCMotor.h"
 #include "frc/system/plant/LinearSystemId.h"
-#include "gtest/gtest.h"
 
 #define EXPECT_NEAR_UNITS(val1, val2, eps) \
   EXPECT_LE(units::math::abs(val1 - val2), eps)
 
 TEST(ElevatorSimTest, StateSpaceSim) {
   frc::sim::ElevatorSim sim(frc::DCMotor::Vex775Pro(4), 14.67, 8_kg, 0.75_in,
-                            0_m, 3_m, true, {0.01});
-  frc2::PIDController controller(10, 0.0, 0.0);
+                            0_m, 3_m, true, 0_m, {0.01});
+  frc::PIDController controller(10, 0.0, 0.0);
 
   frc::PWMVictorSPX motor(0);
   frc::Encoder encoder(0, 1);
@@ -46,7 +46,7 @@
 
 TEST(ElevatorSimTest, MinMax) {
   frc::sim::ElevatorSim sim(frc::DCMotor::Vex775Pro(4), 14.67, 8_kg, 0.75_in,
-                            0_m, 1_m, true, {0.01});
+                            0_m, 1_m, true, 0_m, {0.01});
   for (size_t i = 0; i < 100; ++i) {
     sim.SetInput(frc::Vectord<1>{0.0});
     sim.Update(20_ms);
@@ -66,7 +66,7 @@
 
 TEST(ElevatorSimTest, Stability) {
   frc::sim::ElevatorSim sim{
-      frc::DCMotor::Vex775Pro(4), 100, 4_kg, 0.5_in, 0_m, 10_m, true};
+      frc::DCMotor::Vex775Pro(4), 100, 4_kg, 0.5_in, 0_m, 10_m, false, 0_m};
 
   sim.SetState(frc::Vectord<2>{0.0, 0.0});
   sim.SetInput(frc::Vectord<1>{12.0});
diff --git a/wpilibc/src/test/native/cpp/simulation/EncoderSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/EncoderSimTest.cpp
index 7722ccc..2a763af 100644
--- a/wpilibc/src/test/native/cpp/simulation/EncoderSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/EncoderSimTest.cpp
@@ -4,11 +4,12 @@
 
 #include "frc/simulation/EncoderSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
+#include <wpi/deprecated.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/Encoder.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
@@ -198,7 +199,7 @@
   DoubleCallback callback;
   auto cb = sim.RegisterDistancePerPulseCallback(callback.GetCallback(), false);
 
-  encoder.SetDistancePerPulse(.03405);
+  sim.SetDistancePerPulse(.03405);
   EXPECT_EQ(.03405, sim.GetDistancePerPulse());
   EXPECT_EQ(.03405, encoder.GetDistancePerPulse());
   EXPECT_TRUE(callback.WasTriggered());
diff --git a/wpilibc/src/test/native/cpp/simulation/PDPSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/PDPSimTest.cpp
index 78711b1..ad058de 100644
--- a/wpilibc/src/test/native/cpp/simulation/PDPSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/PDPSimTest.cpp
@@ -4,11 +4,11 @@
 
 #include "frc/simulation/PowerDistributionSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/PowerDistribution.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/PWMSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/PWMSimTest.cpp
index 0df3590..4dcdbb1 100644
--- a/wpilibc/src/test/native/cpp/simulation/PWMSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/PWMSimTest.cpp
@@ -4,14 +4,16 @@
 
 #include "frc/simulation/PWMSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/PWM.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
+constexpr double kPWMStepSize = 1.0 / 2000.0;
+
 TEST(PWMSimTest, Initialize) {
   HAL_Initialize(500, 0);
 
@@ -26,7 +28,7 @@
   EXPECT_TRUE(sim.GetInitialized());
 }
 
-TEST(PWMSimTest, SetRawValue) {
+TEST(PWMSimTest, SetPulseTime) {
   HAL_Initialize(500, 0);
 
   PWMSim sim{0};
@@ -35,13 +37,13 @@
 
   IntCallback callback;
 
-  auto cb = sim.RegisterRawValueCallback(callback.GetCallback(), false);
+  auto cb = sim.RegisterPulseMicrosecondCallback(callback.GetCallback(), false);
   PWM pwm{0};
-  sim.SetRawValue(229);
-  EXPECT_EQ(229, sim.GetRawValue());
-  EXPECT_EQ(229, pwm.GetRaw());
+  sim.SetPulseMicrosecond(2290);
+  EXPECT_EQ(2290, sim.GetPulseMicrosecond());
+  EXPECT_EQ(2290, std::lround(pwm.GetPulseTime().value()));
   EXPECT_TRUE(callback.WasTriggered());
-  EXPECT_EQ(229, callback.GetLastValue());
+  EXPECT_EQ(2290, callback.GetLastValue());
 }
 
 TEST(PWMSimTest, SetSpeed) {
@@ -55,13 +57,47 @@
 
   auto cb = sim.RegisterSpeedCallback(callback.GetCallback(), false);
   PWM pwm{0};
-  constexpr double kTestValue = 0.3504;
+  double kTestValue = 0.3504;
   pwm.SetSpeed(kTestValue);
 
-  EXPECT_EQ(kTestValue, sim.GetSpeed());
-  EXPECT_EQ(kTestValue, pwm.GetSpeed());
+  EXPECT_NEAR(kTestValue, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetSpeed(), kPWMStepSize);
   EXPECT_TRUE(callback.WasTriggered());
-  EXPECT_EQ(kTestValue, callback.GetLastValue());
+  EXPECT_NEAR(kTestValue, callback.GetLastValue(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue / 2 + 0.5, sim.GetPosition(), kPWMStepSize * 2);
+  EXPECT_NEAR(kTestValue / 2 + 0.5, pwm.GetPosition(), kPWMStepSize * 2);
+
+  kTestValue = -1.0;
+  pwm.SetSpeed(kTestValue);
+
+  EXPECT_NEAR(kTestValue, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(0.0, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(0.0, pwm.GetPosition(), kPWMStepSize);
+
+  kTestValue = 0.0;
+  pwm.SetSpeed(kTestValue);
+
+  EXPECT_NEAR(kTestValue, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(0.5, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(0.5, pwm.GetPosition(), kPWMStepSize);
+
+  kTestValue = 1.0;
+  pwm.SetSpeed(kTestValue);
+
+  EXPECT_NEAR(kTestValue, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetPosition(), kPWMStepSize);
+
+  kTestValue = 1.1;
+  pwm.SetSpeed(kTestValue);
+
+  EXPECT_NEAR(1.0, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(1.0, pwm.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(1.0, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(1.0, pwm.GetPosition(), kPWMStepSize);
 }
 
 TEST(PWMSimTest, SetPosition) {
@@ -75,13 +111,47 @@
 
   auto cb = sim.RegisterPositionCallback(callback.GetCallback(), false);
   PWM pwm{0};
-  constexpr double kTestValue = 0.3504;
+  double kTestValue = 0.3504;
   pwm.SetPosition(kTestValue);
 
-  EXPECT_EQ(kTestValue, sim.GetPosition());
-  EXPECT_EQ(kTestValue, pwm.GetPosition());
+  EXPECT_NEAR(kTestValue, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetPosition(), kPWMStepSize);
   EXPECT_TRUE(callback.WasTriggered());
-  EXPECT_EQ(kTestValue, callback.GetLastValue());
+  EXPECT_NEAR(kTestValue, callback.GetLastValue(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue * 2 - 1.0, sim.GetSpeed(), kPWMStepSize * 2);
+  EXPECT_NEAR(kTestValue * 2 - 1.0, pwm.GetSpeed(), kPWMStepSize * 2);
+
+  kTestValue = -1.0;
+  pwm.SetPosition(kTestValue);
+
+  EXPECT_NEAR(0.0, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(0.0, pwm.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetSpeed(), kPWMStepSize);
+
+  kTestValue = 0.0;
+  pwm.SetPosition(kTestValue);
+
+  EXPECT_NEAR(kTestValue, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(-1.0, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(-1.0, pwm.GetSpeed(), kPWMStepSize);
+
+  kTestValue = 1.0;
+  pwm.SetPosition(kTestValue);
+
+  EXPECT_NEAR(kTestValue, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(kTestValue, pwm.GetSpeed(), kPWMStepSize);
+
+  kTestValue = 1.1;
+  pwm.SetPosition(kTestValue);
+
+  EXPECT_NEAR(1.0, sim.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(1.0, pwm.GetPosition(), kPWMStepSize);
+  EXPECT_NEAR(1.0, sim.GetSpeed(), kPWMStepSize);
+  EXPECT_NEAR(1.0, pwm.GetSpeed(), kPWMStepSize);
 }
 
 TEST(PWMSimTest, SetPeriodScale) {
diff --git a/wpilibc/src/test/native/cpp/simulation/REVPHSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/REVPHSimTest.cpp
index 688f37e..952107b 100644
--- a/wpilibc/src/test/native/cpp/simulation/REVPHSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/REVPHSimTest.cpp
@@ -4,12 +4,12 @@
 
 #include "frc/simulation/REVPHSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/DoubleSolenoid.h"
 #include "frc/PneumaticHub.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/RelaySimTest.cpp b/wpilibc/src/test/native/cpp/simulation/RelaySimTest.cpp
index 292d629..200ce11 100644
--- a/wpilibc/src/test/native/cpp/simulation/RelaySimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/RelaySimTest.cpp
@@ -4,11 +4,11 @@
 
 #include "frc/simulation/RelaySim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/Relay.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
diff --git a/wpilibc/src/test/native/cpp/simulation/RoboRioSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/RoboRioSimTest.cpp
index 98d4620..e42f38f 100644
--- a/wpilibc/src/test/native/cpp/simulation/RoboRioSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/RoboRioSimTest.cpp
@@ -4,12 +4,12 @@
 
 #include "frc/simulation/RoboRioSim.h"  // NOLINT(build/include_order)
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 #include <hal/HALBase.h>
 
 #include "callback_helpers/TestCallbackHelpers.h"
 #include "frc/RobotController.h"
-#include "gtest/gtest.h"
 
 namespace frc::sim {
 
@@ -207,6 +207,36 @@
   EXPECT_EQ(kTestFaults, RobotController::GetFaultCount3V3());
 }
 
+TEST(RoboRioSimTest, SetCPUTemp) {
+  RoboRioSim::ResetData();
+
+  DoubleCallback callback;
+  auto cbHandle =
+      RoboRioSim::RegisterCPUTempCallback(callback.GetCallback(), false);
+  constexpr double kCPUTemp = 100.0;
+
+  RoboRioSim::SetCPUTemp(units::celsius_t{kCPUTemp});
+  EXPECT_TRUE(callback.WasTriggered());
+  EXPECT_EQ(kCPUTemp, callback.GetLastValue());
+  EXPECT_EQ(kCPUTemp, RoboRioSim::GetCPUTemp().value());
+  EXPECT_EQ(kCPUTemp, RobotController::GetCPUTemp().value());
+}
+
+TEST(RoboRioSimTest, SetTeamNumber) {
+  RoboRioSim::ResetData();
+
+  IntCallback callback;
+  auto cbHandle =
+      RoboRioSim::RegisterTeamNumberCallback(callback.GetCallback(), false);
+  constexpr int kTeamNumber = 9999;
+
+  RoboRioSim::SetTeamNumber(kTeamNumber);
+  EXPECT_TRUE(callback.WasTriggered());
+  EXPECT_EQ(kTeamNumber, callback.GetLastValue());
+  EXPECT_EQ(kTeamNumber, RoboRioSim::GetTeamNumber());
+  EXPECT_EQ(kTeamNumber, RobotController::GetTeamNumber());
+}
+
 TEST(RoboRioSimTest, SetSerialNumber) {
   const std::string kSerialNum = "Hello";
 
diff --git a/wpilibc/src/test/native/cpp/simulation/SimDeviceSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/SimDeviceSimTest.cpp
index 5ef2675..3cd2a63 100644
--- a/wpilibc/src/test/native/cpp/simulation/SimDeviceSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/SimDeviceSimTest.cpp
@@ -4,10 +4,10 @@
 
 #include <string_view>
 
+#include <gtest/gtest.h>
 #include <hal/SimDevice.h>
 
 #include "frc/simulation/SimDeviceSim.h"
-#include "gtest/gtest.h"
 
 using namespace frc::sim;
 
@@ -20,6 +20,8 @@
   EXPECT_FALSE(simBool.Get());
   simBool.Set(true);
   EXPECT_TRUE(devBool.Get());
+
+  EXPECT_EQ(sim.GetName(), "test");
 }
 
 TEST(SimDeviceSimTest, EnumerateDevices) {
diff --git a/wpilibc/src/test/native/cpp/simulation/SimInitializationTest.cpp b/wpilibc/src/test/native/cpp/simulation/SimInitializationTest.cpp
index e703912..51c5386 100644
--- a/wpilibc/src/test/native/cpp/simulation/SimInitializationTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/SimInitializationTest.cpp
@@ -4,6 +4,7 @@
 
 #include <exception>
 
+#include <gtest/gtest.h>
 #include <hal/HAL.h>
 
 #include "frc/simulation/AddressableLEDSim.h"
@@ -23,7 +24,6 @@
 #include "frc/simulation/RelaySim.h"
 #include "frc/simulation/RoboRioSim.h"
 #include "frc/simulation/SPIAccelerometerSim.h"
-#include "gtest/gtest.h"
 
 using namespace frc::sim;
 
diff --git a/wpilibc/src/test/native/cpp/simulation/SingleJointedArmSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/SingleJointedArmSimTest.cpp
index 2e4c793..1311a0e 100644
--- a/wpilibc/src/test/native/cpp/simulation/SingleJointedArmSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/SingleJointedArmSimTest.cpp
@@ -4,12 +4,13 @@
 
 #include <numbers>
 
+#include <gtest/gtest.h>
+
 #include "frc/simulation/SingleJointedArmSim.h"
-#include "gtest/gtest.h"
 
 TEST(SingleJointedArmTest, Disabled) {
-  frc::sim::SingleJointedArmSim sim(frc::DCMotor::Vex775Pro(2), 100, 3_kg_sq_m,
-                                    9.5_in, -180_deg, 0_deg, 10_lb, true);
+  frc::sim::SingleJointedArmSim sim(frc::DCMotor::Vex775Pro(2), 300, 3_kg_sq_m,
+                                    30_in, -180_deg, 0_deg, true, 90_deg);
   sim.SetState(frc::Vectord<2>{0.0, 0.0});
 
   for (size_t i = 0; i < 12 / 0.02; ++i) {
diff --git a/wpilibc/src/test/native/cpp/simulation/StateSpaceSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/StateSpaceSimTest.cpp
index 7456adb..6d15fc4 100644
--- a/wpilibc/src/test/native/cpp/simulation/StateSpaceSimTest.cpp
+++ b/wpilibc/src/test/native/cpp/simulation/StateSpaceSimTest.cpp
@@ -2,6 +2,7 @@
 // Open Source Software; you can modify and/or share it under the terms of
 // the WPILib BSD license file in the root directory of this project.
 
+#include <gtest/gtest.h>
 #include <units/angular_acceleration.h>
 #include <units/angular_velocity.h>
 
@@ -18,16 +19,14 @@
 #include "frc/simulation/LinearSystemSim.h"
 #include "frc/simulation/PWMSim.h"
 #include "frc/simulation/RoboRioSim.h"
-#include "frc/simulation/SingleJointedArmSim.h"
 #include "frc/system/plant/LinearSystemId.h"
-#include "gtest/gtest.h"
 
 TEST(StateSpaceSimTest, FlywheelSim) {
   const frc::LinearSystem<1, 1, 1> plant =
       frc::LinearSystemId::IdentifyVelocitySystem<units::radian>(
           0.02_V / 1_rad_per_s, 0.01_V / 1_rad_per_s_sq);
   frc::sim::FlywheelSim sim{plant, frc::DCMotor::NEO(2), 1.0};
-  frc2::PIDController controller{0.2, 0.0, 0.0};
+  frc::PIDController controller{0.2, 0.0, 0.0};
   frc::SimpleMotorFeedforward<units::radian> feedforward{
       0_V, 0.02_V / 1_rad_per_s, 0.01_V / 1_rad_per_s_sq};
   frc::Encoder encoder{0, 1};
diff --git a/wpilibc/src/test/native/cpp/smartdashboard/Mechanism2dTest.cpp b/wpilibc/src/test/native/cpp/smartdashboard/Mechanism2dTest.cpp
new file mode 100644
index 0000000..a500232
--- /dev/null
+++ b/wpilibc/src/test/native/cpp/smartdashboard/Mechanism2dTest.cpp
@@ -0,0 +1,85 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include <frc/smartdashboard/Mechanism2d.h>
+#include <frc/smartdashboard/MechanismLigament2d.h>
+#include <frc/smartdashboard/SmartDashboard.h>
+#include <frc/util/Color8Bit.h>
+
+#include <gtest/gtest.h>
+#include <networktables/NetworkTableInstance.h>
+#include <units/angle.h>
+
+class Mechanism2dTest;
+
+TEST(Mechanism2dTest, Canvas) {
+  frc::Mechanism2d mechanism{5, 10};
+  auto dimsEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/dims");
+  auto colorEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/backgroundColor");
+  frc::SmartDashboard::PutData("mechanism", &mechanism);
+  frc::SmartDashboard::UpdateValues();
+  EXPECT_EQ(5.0, dimsEntry.GetDoubleArray({})[0]);
+  EXPECT_EQ(10.0, dimsEntry.GetDoubleArray({})[1]);
+  EXPECT_EQ("#000020", colorEntry.GetString(""));
+  mechanism.SetBackgroundColor({255, 255, 255});
+  frc::SmartDashboard::UpdateValues();
+  EXPECT_EQ("#FFFFFF", colorEntry.GetString(""));
+}
+
+TEST(Mechanism2dTest, Root) {
+  frc::Mechanism2d mechanism{5, 10};
+  auto xEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/root/x");
+  auto yEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/root/y");
+  frc::MechanismRoot2d* root = mechanism.GetRoot("root", 1, 2);
+  frc::SmartDashboard::PutData("mechanism", &mechanism);
+  frc::SmartDashboard::UpdateValues();
+  EXPECT_EQ(1.0, xEntry.GetDouble(0.0));
+  EXPECT_EQ(2.0, yEntry.GetDouble(0.0));
+  root->SetPosition(2, 4);
+  frc::SmartDashboard::UpdateValues();
+  EXPECT_EQ(2.0, xEntry.GetDouble(0.0));
+  EXPECT_EQ(4.0, yEntry.GetDouble(0.0));
+}
+
+TEST(Mechanism2dTest, Ligament) {
+  frc::Mechanism2d mechanism{5, 10};
+  auto angleEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/root/ligament/angle");
+  auto colorEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/root/ligament/color");
+  auto lengthEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/root/ligament/length");
+  auto weightEntry = nt::NetworkTableInstance::GetDefault().GetEntry(
+      "/SmartDashboard/mechanism/root/ligament/weight");
+  frc::MechanismRoot2d* root = mechanism.GetRoot("root", 1, 2);
+  frc::MechanismLigament2d* ligament = root->Append<frc::MechanismLigament2d>(
+      "ligament", 3, units::degree_t{90}, 1, frc::Color8Bit{255, 255, 255});
+  frc::SmartDashboard::PutData("mechanism", &mechanism);
+  EXPECT_EQ(ligament->GetAngle(), angleEntry.GetDouble(0.0));
+  EXPECT_EQ(ligament->GetColor().HexString(), colorEntry.GetString(""));
+  EXPECT_EQ(ligament->GetLength(), lengthEntry.GetDouble(0.0));
+  EXPECT_EQ(ligament->GetLineWeight(), weightEntry.GetDouble(0.0));
+  ligament->SetAngle(units::degree_t{45});
+  ligament->SetColor({0, 0, 0});
+  ligament->SetLength(2);
+  ligament->SetLineWeight(4);
+  frc::SmartDashboard::UpdateValues();
+  EXPECT_EQ(ligament->GetAngle(), angleEntry.GetDouble(0.0));
+  EXPECT_EQ(ligament->GetColor().HexString(), colorEntry.GetString(""));
+  EXPECT_EQ(ligament->GetLength(), lengthEntry.GetDouble(0.0));
+  EXPECT_EQ(ligament->GetLineWeight(), weightEntry.GetDouble(0.0));
+  angleEntry.SetDouble(22.5);
+  colorEntry.SetString("#FF00FF");
+  lengthEntry.SetDouble(4.0);
+  weightEntry.SetDouble(6.0);
+  frc::SmartDashboard::UpdateValues();
+  EXPECT_EQ(ligament->GetAngle(), angleEntry.GetDouble(0.0));
+  EXPECT_EQ(ligament->GetColor().HexString(), colorEntry.GetString(""));
+  EXPECT_EQ(ligament->GetLength(), lengthEntry.GetDouble(0.0));
+  EXPECT_EQ(ligament->GetLineWeight(), weightEntry.GetDouble(0.0));
+}
diff --git a/wpilibc/src/test/native/cpp/smartdashboard/SendableChooserTest.cpp b/wpilibc/src/test/native/cpp/smartdashboard/SendableChooserTest.cpp
new file mode 100644
index 0000000..610afb8
--- /dev/null
+++ b/wpilibc/src/test/native/cpp/smartdashboard/SendableChooserTest.cpp
@@ -0,0 +1,81 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include <frc/smartdashboard/SendableChooser.h>
+#include <frc/smartdashboard/SmartDashboard.h>
+
+#include <string>
+
+#include <fmt/core.h>
+#include <gtest/gtest.h>
+#include <networktables/NetworkTableInstance.h>
+#include <networktables/StringTopic.h>
+
+class SendableChooserTest : public ::testing::TestWithParam<int> {};
+
+TEST_P(SendableChooserTest, ReturnsSelected) {
+  frc::SendableChooser<int> chooser;
+
+  for (int i = 1; i <= 3; i++) {
+    chooser.AddOption(std::to_string(i), i);
+  }
+  chooser.SetDefaultOption("0", 0);
+
+  auto pub =
+      nt::NetworkTableInstance::GetDefault()
+          .GetStringTopic(fmt::format(
+              "/SmartDashboard/ReturnsSelectedChooser{}/selected", GetParam()))
+          .Publish();
+
+  frc::SmartDashboard::PutData(
+      fmt::format("ReturnsSelectedChooser{}", GetParam()), &chooser);
+  frc::SmartDashboard::UpdateValues();
+  pub.Set(std::to_string(GetParam()));
+  frc::SmartDashboard::UpdateValues();
+  EXPECT_EQ(GetParam(), chooser.GetSelected());
+}
+
+TEST(SendableChooserTest, DefaultIsReturnedOnNoSelect) {
+  frc::SendableChooser<int> chooser;
+
+  for (int i = 1; i <= 3; i++) {
+    chooser.AddOption(std::to_string(i), i);
+  }
+
+  // Use 4 here rather than 0 to make sure it's not default-init int.
+  chooser.SetDefaultOption("4", 4);
+
+  EXPECT_EQ(4, chooser.GetSelected());
+}
+
+TEST(SendableChooserTest,
+     DefaultConstructableIsReturnedOnNoSelectAndNoDefault) {
+  frc::SendableChooser<int> chooser;
+
+  for (int i = 1; i <= 3; i++) {
+    chooser.AddOption(std::to_string(i), i);
+  }
+
+  EXPECT_EQ(0, chooser.GetSelected());
+}
+
+TEST(SendableChooserTest, ChangeListener) {
+  frc::SendableChooser<int> chooser;
+
+  for (int i = 1; i <= 3; i++) {
+    chooser.AddOption(std::to_string(i), i);
+  }
+  int currentVal = 0;
+  chooser.OnChange([&](int val) { currentVal = val; });
+
+  frc::SmartDashboard::PutData("ChangeListenerChooser", &chooser);
+  frc::SmartDashboard::UpdateValues();
+  frc::SmartDashboard::PutString("ChangeListenerChooser/selected", "3");
+  frc::SmartDashboard::UpdateValues();
+
+  EXPECT_EQ(3, currentVal);
+}
+
+INSTANTIATE_TEST_SUITE_P(SendableChooserTests, SendableChooserTest,
+                         ::testing::Values(0, 1, 2, 3));
