diff --git a/hal/src/dev/java/DevMain.java b/hal/src/dev/java/edu/wpi/first/hal/DevMain.java
similarity index 84%
rename from hal/src/dev/java/DevMain.java
rename to hal/src/dev/java/edu/wpi/first/hal/DevMain.java
index 8cdb8ba..25c6c90 100644
--- a/hal/src/dev/java/DevMain.java
+++ b/hal/src/dev/java/edu/wpi/first/hal/DevMain.java
@@ -1,10 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
+package edu.wpi.first.hal;
+
 public final class DevMain {
   public static void main(String[] args) {
 
diff --git a/hal/src/main/java/edu/wpi/first/hal/CANAPIJNI.java b/hal/src/main/java/edu/wpi/first/hal/CANAPIJNI.java
index 029cc6d..3507569 100644
--- a/hal/src/main/java/edu/wpi/first/hal/CANAPIJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/CANAPIJNI.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -20,6 +20,13 @@
 
   public static native void writeCANRTRFrame(int handle, int length, int apiId);
 
+  public static native int writeCANPacketNoThrow(int handle, byte[] data, int apiId);
+
+  public static native int writeCANPacketRepeatingNoThrow(int handle, byte[] data, int apiId,
+                                                         int repeatMs);
+
+  public static native int writeCANRTRFrameNoThrow(int handle, int length, int apiId);
+
   public static native void stopCANPacketRepeating(int handle, int apiId);
 
   public static native boolean readCANPacketNew(int handle, int apiId, CANData data);
diff --git a/hal/src/main/java/edu/wpi/first/hal/HAL.java b/hal/src/main/java/edu/wpi/first/hal/HAL.java
index 8f09a0a..5e07488 100644
--- a/hal/src/main/java/edu/wpi/first/hal/HAL.java
+++ b/hal/src/main/java/edu/wpi/first/hal/HAL.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -12,12 +12,14 @@
 /**
  * JNI Wrapper for HAL<br>.
  */
-@SuppressWarnings({"AbbreviationAsWordInName", "MethodName", "PMD.TooManyMethods"})
+@SuppressWarnings({"AbbreviationAsWordInName", "MethodName"})
 public final class HAL extends JNIWrapper {
   public static native void waitForDSData();
 
   public static native boolean initialize(int timeout, int mode);
 
+  public static native void shutdown();
+
   public static native boolean hasMain();
 
   public static native void runMain();
@@ -130,6 +132,8 @@
                                      String details, String location, String callStack,
                                      boolean printMsg);
 
+  public static native int sendConsoleLine(String line);
+
   public static native int getPortWithModule(byte module, byte channel);
 
   public static native int getPort(byte channel);
diff --git a/hal/src/main/java/edu/wpi/first/hal/InterruptJNI.java b/hal/src/main/java/edu/wpi/first/hal/InterruptJNI.java
index 8574a25..e370d5b 100644
--- a/hal/src/main/java/edu/wpi/first/hal/InterruptJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/InterruptJNI.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -38,4 +38,6 @@
 
   public static native void setInterruptUpSourceEdge(int interruptHandle, boolean risingEdge,
                                                      boolean fallingEdge);
+
+  public static native void releaseWaitingInterrupt(int interruptHandle);
 }
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/AccelerometerSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/AccelerometerSim.java
deleted file mode 100644
index d9c95af..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/AccelerometerSim.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.AccelerometerDataJNI;
-
-public class AccelerometerSim {
-  private final int m_index;
-
-  public AccelerometerSim() {
-    m_index = 0;
-  }
-
-  public CallbackStore registerActiveCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AccelerometerDataJNI.registerActiveCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AccelerometerDataJNI::cancelActiveCallback);
-  }
-  public boolean getActive() {
-    return AccelerometerDataJNI.getActive(m_index);
-  }
-  public void setActive(boolean active) {
-    AccelerometerDataJNI.setActive(m_index, active);
-  }
-
-  public CallbackStore registerRangeCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AccelerometerDataJNI.registerRangeCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AccelerometerDataJNI::cancelRangeCallback);
-  }
-  public int getRange() {
-    return AccelerometerDataJNI.getRange(m_index);
-  }
-  public void setRange(int range) {
-    AccelerometerDataJNI.setRange(m_index, range);
-  }
-
-  public CallbackStore registerXCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AccelerometerDataJNI.registerXCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AccelerometerDataJNI::cancelXCallback);
-  }
-  public double getX() {
-    return AccelerometerDataJNI.getX(m_index);
-  }
-  public void setX(double x) {
-    AccelerometerDataJNI.setX(m_index, x);
-  }
-
-  public CallbackStore registerYCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AccelerometerDataJNI.registerYCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AccelerometerDataJNI::cancelYCallback);
-  }
-  public double getY() {
-    return AccelerometerDataJNI.getY(m_index);
-  }
-  public void setY(double y) {
-    AccelerometerDataJNI.setY(m_index, y);
-  }
-
-  public CallbackStore registerZCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AccelerometerDataJNI.registerZCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AccelerometerDataJNI::cancelZCallback);
-  }
-  public double getZ() {
-    return AccelerometerDataJNI.getZ(m_index);
-  }
-  public void setZ(double z) {
-    AccelerometerDataJNI.setZ(m_index, z);
-  }
-
-  public void resetData() {
-    AccelerometerDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/AddressableLEDSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/AddressableLEDSim.java
deleted file mode 100644
index cc6eefa..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/AddressableLEDSim.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.AddressableLEDDataJNI;
-
-public class AddressableLEDSim {
-  private final int m_index;
-
-  public AddressableLEDSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AddressableLEDDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AddressableLEDDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return AddressableLEDDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    AddressableLEDDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerOutputPortCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AddressableLEDDataJNI.registerOutputPortCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AddressableLEDDataJNI::cancelOutputPortCallback);
-  }
-  public int getOutputPort() {
-    return AddressableLEDDataJNI.getOutputPort(m_index);
-  }
-  public void setOutputPort(int outputPort) {
-    AddressableLEDDataJNI.setOutputPort(m_index, outputPort);
-  }
-
-  public CallbackStore registerLengthCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AddressableLEDDataJNI.registerLengthCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AddressableLEDDataJNI::cancelLengthCallback);
-  }
-  public int getLength() {
-    return AddressableLEDDataJNI.getLength(m_index);
-  }
-  public void setLength(int length) {
-    AddressableLEDDataJNI.setLength(m_index, length);
-  }
-
-  public CallbackStore registerRunningCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AddressableLEDDataJNI.registerRunningCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AddressableLEDDataJNI::cancelRunningCallback);
-  }
-  public boolean getRunning() {
-    return AddressableLEDDataJNI.getRunning(m_index);
-  }
-  public void setRunning(boolean running) {
-    AddressableLEDDataJNI.setRunning(m_index, running);
-  }
-
-  public CallbackStore registerDataCallback(ConstBufferCallback callback) {
-    int uid = AddressableLEDDataJNI.registerDataCallback(m_index, callback);
-    return new CallbackStore(m_index, uid, AddressableLEDDataJNI::cancelDataCallback);
-  }
-  public byte[] getData() {
-    return AddressableLEDDataJNI.getData(m_index);
-  }
-  public void setData(byte[] data) {
-    AddressableLEDDataJNI.setData(m_index, data);
-  }
-
-  public void resetData() {
-    AddressableLEDDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogGyroSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/AnalogGyroSim.java
deleted file mode 100644
index ddaa0ce..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogGyroSim.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.AnalogGyroDataJNI;
-
-public class AnalogGyroSim {
-  private final int m_index;
-
-  public AnalogGyroSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerAngleCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogGyroDataJNI.registerAngleCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogGyroDataJNI::cancelAngleCallback);
-  }
-  public double getAngle() {
-    return AnalogGyroDataJNI.getAngle(m_index);
-  }
-  public void setAngle(double angle) {
-    AnalogGyroDataJNI.setAngle(m_index, angle);
-  }
-
-  public CallbackStore registerRateCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogGyroDataJNI.registerRateCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogGyroDataJNI::cancelRateCallback);
-  }
-  public double getRate() {
-    return AnalogGyroDataJNI.getRate(m_index);
-  }
-  public void setRate(double rate) {
-    AnalogGyroDataJNI.setRate(m_index, rate);
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogGyroDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogGyroDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return AnalogGyroDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    AnalogGyroDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public void resetData() {
-    AnalogGyroDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogInSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/AnalogInSim.java
deleted file mode 100644
index f7f86bb..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogInSim.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.AnalogInDataJNI;
-
-public class AnalogInSim {
-  private final int m_index;
-
-  public AnalogInSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return AnalogInDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    AnalogInDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerAverageBitsCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerAverageBitsCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelAverageBitsCallback);
-  }
-  public int getAverageBits() {
-    return AnalogInDataJNI.getAverageBits(m_index);
-  }
-  public void setAverageBits(int averageBits) {
-    AnalogInDataJNI.setAverageBits(m_index, averageBits);
-  }
-
-  public CallbackStore registerOversampleBitsCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerOversampleBitsCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelOversampleBitsCallback);
-  }
-  public int getOversampleBits() {
-    return AnalogInDataJNI.getOversampleBits(m_index);
-  }
-  public void setOversampleBits(int oversampleBits) {
-    AnalogInDataJNI.setOversampleBits(m_index, oversampleBits);
-  }
-
-  public CallbackStore registerVoltageCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerVoltageCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelVoltageCallback);
-  }
-  public double getVoltage() {
-    return AnalogInDataJNI.getVoltage(m_index);
-  }
-  public void setVoltage(double voltage) {
-    AnalogInDataJNI.setVoltage(m_index, voltage);
-  }
-
-  public CallbackStore registerAccumulatorInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerAccumulatorInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelAccumulatorInitializedCallback);
-  }
-  public boolean getAccumulatorInitialized() {
-    return AnalogInDataJNI.getAccumulatorInitialized(m_index);
-  }
-  public void setAccumulatorInitialized(boolean accumulatorInitialized) {
-    AnalogInDataJNI.setAccumulatorInitialized(m_index, accumulatorInitialized);
-  }
-
-  public CallbackStore registerAccumulatorValueCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerAccumulatorValueCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelAccumulatorValueCallback);
-  }
-  public long getAccumulatorValue() {
-    return AnalogInDataJNI.getAccumulatorValue(m_index);
-  }
-  public void setAccumulatorValue(long accumulatorValue) {
-    AnalogInDataJNI.setAccumulatorValue(m_index, accumulatorValue);
-  }
-
-  public CallbackStore registerAccumulatorCountCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerAccumulatorCountCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelAccumulatorCountCallback);
-  }
-  public long getAccumulatorCount() {
-    return AnalogInDataJNI.getAccumulatorCount(m_index);
-  }
-  public void setAccumulatorCount(long accumulatorCount) {
-    AnalogInDataJNI.setAccumulatorCount(m_index, accumulatorCount);
-  }
-
-  public CallbackStore registerAccumulatorCenterCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerAccumulatorCenterCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelAccumulatorCenterCallback);
-  }
-  public int getAccumulatorCenter() {
-    return AnalogInDataJNI.getAccumulatorCenter(m_index);
-  }
-  public void setAccumulatorCenter(int accumulatorCenter) {
-    AnalogInDataJNI.setAccumulatorCenter(m_index, accumulatorCenter);
-  }
-
-  public CallbackStore registerAccumulatorDeadbandCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogInDataJNI.registerAccumulatorDeadbandCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogInDataJNI::cancelAccumulatorDeadbandCallback);
-  }
-  public int getAccumulatorDeadband() {
-    return AnalogInDataJNI.getAccumulatorDeadband(m_index);
-  }
-  public void setAccumulatorDeadband(int accumulatorDeadband) {
-    AnalogInDataJNI.setAccumulatorDeadband(m_index, accumulatorDeadband);
-  }
-
-  public void resetData() {
-    AnalogInDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogOutSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/AnalogOutSim.java
deleted file mode 100644
index 4731b11..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogOutSim.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.AnalogOutDataJNI;
-
-public class AnalogOutSim {
-  private final int m_index;
-
-  public AnalogOutSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerVoltageCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogOutDataJNI.registerVoltageCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogOutDataJNI::cancelVoltageCallback);
-  }
-  public double getVoltage() {
-    return AnalogOutDataJNI.getVoltage(m_index);
-  }
-  public void setVoltage(double voltage) {
-    AnalogOutDataJNI.setVoltage(m_index, voltage);
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogOutDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogOutDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return AnalogOutDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    AnalogOutDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public void resetData() {
-    AnalogOutDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogTriggerSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/AnalogTriggerSim.java
deleted file mode 100644
index fd88d5f..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/AnalogTriggerSim.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.AnalogTriggerDataJNI;
-
-public class AnalogTriggerSim {
-  private final int m_index;
-
-  public AnalogTriggerSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogTriggerDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogTriggerDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return AnalogTriggerDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    AnalogTriggerDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerTriggerLowerBoundCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogTriggerDataJNI.registerTriggerLowerBoundCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogTriggerDataJNI::cancelTriggerLowerBoundCallback);
-  }
-  public double getTriggerLowerBound() {
-    return AnalogTriggerDataJNI.getTriggerLowerBound(m_index);
-  }
-  public void setTriggerLowerBound(double triggerLowerBound) {
-    AnalogTriggerDataJNI.setTriggerLowerBound(m_index, triggerLowerBound);
-  }
-
-  public CallbackStore registerTriggerUpperBoundCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = AnalogTriggerDataJNI.registerTriggerUpperBoundCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, AnalogTriggerDataJNI::cancelTriggerUpperBoundCallback);
-  }
-  public double getTriggerUpperBound() {
-    return AnalogTriggerDataJNI.getTriggerUpperBound(m_index);
-  }
-  public void setTriggerUpperBound(double triggerUpperBound) {
-    AnalogTriggerDataJNI.setTriggerUpperBound(m_index, triggerUpperBound);
-  }
-
-  public void resetData() {
-    AnalogTriggerDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/CallbackStore.java b/hal/src/main/java/edu/wpi/first/hal/sim/CallbackStore.java
deleted file mode 100644
index 7564104..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/CallbackStore.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-public class CallbackStore implements AutoCloseable {
-  interface CancelCallbackFunc {
-    void cancel(int index, int uid);
-  }
-
-  interface CancelCallbackChannelFunc {
-    void cancel(int index, int channel, int uid);
-  }
-
-  interface CancelCallbackNoIndexFunc {
-    void cancel(int uid);
-  }
-
-  public CallbackStore(int index, int uid, CancelCallbackFunc ccf) {
-    this.m_cancelType = kNormalCancel;
-    this.m_index = index;
-    this.m_uid = uid;
-    this.m_cancelCallback = ccf;
-  }
-
-  public CallbackStore(int index, int channel, int uid, CancelCallbackChannelFunc ccf) {
-    this.m_cancelType = kChannelCancel;
-    this.m_index = index;
-    this.m_uid = uid;
-    this.m_channel = channel;
-    this.m_cancelCallbackChannel = ccf;
-  }
-
-  public CallbackStore(int uid, CancelCallbackNoIndexFunc ccf) {
-    this.m_cancelType = kNoIndexCancel;
-    this.m_uid = uid;
-    this.m_cancelCallbackNoIndex = ccf;
-  }
-
-  private int m_index;
-  private int m_channel;
-  private final int m_uid;
-  private CancelCallbackFunc m_cancelCallback;
-  private CancelCallbackChannelFunc m_cancelCallbackChannel;
-  private CancelCallbackNoIndexFunc m_cancelCallbackNoIndex;
-  private static final int kNormalCancel = 0;
-  private static final int kChannelCancel = 1;
-  private static final int kNoIndexCancel = 2;
-  private int m_cancelType;
-
-  @Override
-  public void close() {
-    switch (m_cancelType) {
-      case kNormalCancel:
-        m_cancelCallback.cancel(m_index, m_uid);
-        break;
-      case kChannelCancel:
-        m_cancelCallbackChannel.cancel(m_index, m_channel, m_uid);
-        break;
-      case kNoIndexCancel:
-        m_cancelCallbackNoIndex.cancel(m_uid);
-        break;
-      default:
-        assert false;
-        break;
-    }
-    m_cancelType = -1;
-  }
-
-  @Override
-  protected void finalize() throws Throwable {
-    try {
-      if (m_cancelType >= 0) {
-        close();        // close open files
-      }
-    } finally {
-      super.finalize();
-    }
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/DIOSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/DIOSim.java
deleted file mode 100644
index cd75822..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/DIOSim.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.DIODataJNI;
-
-public class DIOSim {
-  private final int m_index;
-
-  public DIOSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DIODataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DIODataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return DIODataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    DIODataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerValueCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DIODataJNI.registerValueCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DIODataJNI::cancelValueCallback);
-  }
-  public boolean getValue() {
-    return DIODataJNI.getValue(m_index);
-  }
-  public void setValue(boolean value) {
-    DIODataJNI.setValue(m_index, value);
-  }
-
-  public CallbackStore registerPulseLengthCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DIODataJNI.registerPulseLengthCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DIODataJNI::cancelPulseLengthCallback);
-  }
-  public double getPulseLength() {
-    return DIODataJNI.getPulseLength(m_index);
-  }
-  public void setPulseLength(double pulseLength) {
-    DIODataJNI.setPulseLength(m_index, pulseLength);
-  }
-
-  public CallbackStore registerIsInputCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DIODataJNI.registerIsInputCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DIODataJNI::cancelIsInputCallback);
-  }
-  public boolean getIsInput() {
-    return DIODataJNI.getIsInput(m_index);
-  }
-  public void setIsInput(boolean isInput) {
-    DIODataJNI.setIsInput(m_index, isInput);
-  }
-
-  public CallbackStore registerFilterIndexCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DIODataJNI.registerFilterIndexCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DIODataJNI::cancelFilterIndexCallback);
-  }
-  public int getFilterIndex() {
-    return DIODataJNI.getFilterIndex(m_index);
-  }
-  public void setFilterIndex(int filterIndex) {
-    DIODataJNI.setFilterIndex(m_index, filterIndex);
-  }
-
-  public void resetData() {
-    DIODataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/DigitalPWMSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/DigitalPWMSim.java
deleted file mode 100644
index 314d994..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/DigitalPWMSim.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.DigitalPWMDataJNI;
-
-public class DigitalPWMSim {
-  private final int m_index;
-
-  public DigitalPWMSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DigitalPWMDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DigitalPWMDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return DigitalPWMDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    DigitalPWMDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerDutyCycleCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DigitalPWMDataJNI.registerDutyCycleCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DigitalPWMDataJNI::cancelDutyCycleCallback);
-  }
-  public double getDutyCycle() {
-    return DigitalPWMDataJNI.getDutyCycle(m_index);
-  }
-  public void setDutyCycle(double dutyCycle) {
-    DigitalPWMDataJNI.setDutyCycle(m_index, dutyCycle);
-  }
-
-  public CallbackStore registerPinCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DigitalPWMDataJNI.registerPinCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DigitalPWMDataJNI::cancelPinCallback);
-  }
-  public int getPin() {
-    return DigitalPWMDataJNI.getPin(m_index);
-  }
-  public void setPin(int pin) {
-    DigitalPWMDataJNI.setPin(m_index, pin);
-  }
-
-  public void resetData() {
-    DigitalPWMDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/DriverStationSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/DriverStationSim.java
deleted file mode 100644
index d14af9f..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/DriverStationSim.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.DriverStationDataJNI;
-
-public class DriverStationSim {
-  public CallbackStore registerEnabledCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DriverStationDataJNI.registerEnabledCallback(callback, initialNotify);
-    return new CallbackStore(uid, DriverStationDataJNI::cancelEnabledCallback);
-  }
-  public boolean getEnabled() {
-    return DriverStationDataJNI.getEnabled();
-  }
-  public void setEnabled(boolean enabled) {
-    DriverStationDataJNI.setEnabled(enabled);
-  }
-
-  public CallbackStore registerAutonomousCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DriverStationDataJNI.registerAutonomousCallback(callback, initialNotify);
-    return new CallbackStore(uid, DriverStationDataJNI::cancelAutonomousCallback);
-  }
-  public boolean getAutonomous() {
-    return DriverStationDataJNI.getAutonomous();
-  }
-  public void setAutonomous(boolean autonomous) {
-    DriverStationDataJNI.setAutonomous(autonomous);
-  }
-
-  public CallbackStore registerTestCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DriverStationDataJNI.registerTestCallback(callback, initialNotify);
-    return new CallbackStore(uid, DriverStationDataJNI::cancelTestCallback);
-  }
-  public boolean getTest() {
-    return DriverStationDataJNI.getTest();
-  }
-  public void setTest(boolean test) {
-    DriverStationDataJNI.setTest(test);
-  }
-
-  public CallbackStore registerEStopCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DriverStationDataJNI.registerEStopCallback(callback, initialNotify);
-    return new CallbackStore(uid, DriverStationDataJNI::cancelEStopCallback);
-  }
-  public boolean getEStop() {
-    return DriverStationDataJNI.getEStop();
-  }
-  public void setEStop(boolean eStop) {
-    DriverStationDataJNI.setEStop(eStop);
-  }
-
-  public CallbackStore registerFmsAttachedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DriverStationDataJNI.registerFmsAttachedCallback(callback, initialNotify);
-    return new CallbackStore(uid, DriverStationDataJNI::cancelFmsAttachedCallback);
-  }
-  public boolean getFmsAttached() {
-    return DriverStationDataJNI.getFmsAttached();
-  }
-  public void setFmsAttached(boolean fmsAttached) {
-    DriverStationDataJNI.setFmsAttached(fmsAttached);
-  }
-
-  public CallbackStore registerDsAttachedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DriverStationDataJNI.registerDsAttachedCallback(callback, initialNotify);
-    return new CallbackStore(uid, DriverStationDataJNI::cancelDsAttachedCallback);
-  }
-  public boolean getDsAttached() {
-    return DriverStationDataJNI.getDsAttached();
-  }
-  public void setDsAttached(boolean dsAttached) {
-    DriverStationDataJNI.setDsAttached(dsAttached);
-  }
-  public void notifyNewData() {
-    DriverStationDataJNI.notifyNewData();
-  }
-
-  /**
-   * Toggles suppression of DriverStation.reportError and reportWarning messages.
-   *
-   * @param shouldSend If false then messages will will be suppressed.
-   */
-  public void setSendError(boolean shouldSend) {
-    DriverStationDataJNI.setSendError(shouldSend);
-  }
-
-  public void resetData() {
-    DriverStationDataJNI.resetData();
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/DutyCycleSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/DutyCycleSim.java
deleted file mode 100644
index 9b2806b..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/DutyCycleSim.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.DutyCycleDataJNI;
-
-public class DutyCycleSim {
-  private final int m_index;
-
-  public DutyCycleSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DutyCycleDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DutyCycleDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return DutyCycleDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    DutyCycleDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerFrequencyCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DutyCycleDataJNI.registerFrequencyCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DutyCycleDataJNI::cancelFrequencyCallback);
-  }
-  public int getFrequency() {
-    return DutyCycleDataJNI.getFrequency(m_index);
-  }
-  public void setFrequency(int frequency) {
-    DutyCycleDataJNI.setFrequency(m_index, frequency);
-  }
-
-  public CallbackStore registerOutputCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = DutyCycleDataJNI.registerOutputCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, DutyCycleDataJNI::cancelOutputCallback);
-  }
-  public double getOutput() {
-    return DutyCycleDataJNI.getOutput(m_index);
-  }
-  public void setOutput(double output) {
-    DutyCycleDataJNI.setOutput(m_index, output);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/EncoderSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/EncoderSim.java
deleted file mode 100644
index 408ca84..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/EncoderSim.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.EncoderDataJNI;
-
-public class EncoderSim {
-  private final int m_index;
-
-  public EncoderSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return EncoderDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    EncoderDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerCountCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerCountCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelCountCallback);
-  }
-  public int getCount() {
-    return EncoderDataJNI.getCount(m_index);
-  }
-  public void setCount(int count) {
-    EncoderDataJNI.setCount(m_index, count);
-  }
-
-  public CallbackStore registerPeriodCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerPeriodCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelPeriodCallback);
-  }
-  public double getPeriod() {
-    return EncoderDataJNI.getPeriod(m_index);
-  }
-  public void setPeriod(double period) {
-    EncoderDataJNI.setPeriod(m_index, period);
-  }
-
-  public CallbackStore registerResetCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerResetCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelResetCallback);
-  }
-  public boolean getReset() {
-    return EncoderDataJNI.getReset(m_index);
-  }
-  public void setReset(boolean reset) {
-    EncoderDataJNI.setReset(m_index, reset);
-  }
-
-  public CallbackStore registerMaxPeriodCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerMaxPeriodCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelMaxPeriodCallback);
-  }
-  public double getMaxPeriod() {
-    return EncoderDataJNI.getMaxPeriod(m_index);
-  }
-  public void setMaxPeriod(double maxPeriod) {
-    EncoderDataJNI.setMaxPeriod(m_index, maxPeriod);
-  }
-
-  public CallbackStore registerDirectionCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerDirectionCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelDirectionCallback);
-  }
-  public boolean getDirection() {
-    return EncoderDataJNI.getDirection(m_index);
-  }
-  public void setDirection(boolean direction) {
-    EncoderDataJNI.setDirection(m_index, direction);
-  }
-
-  public CallbackStore registerReverseDirectionCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerReverseDirectionCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelReverseDirectionCallback);
-  }
-  public boolean getReverseDirection() {
-    return EncoderDataJNI.getReverseDirection(m_index);
-  }
-  public void setReverseDirection(boolean reverseDirection) {
-    EncoderDataJNI.setReverseDirection(m_index, reverseDirection);
-  }
-
-  public CallbackStore registerSamplesToAverageCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = EncoderDataJNI.registerSamplesToAverageCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, EncoderDataJNI::cancelSamplesToAverageCallback);
-  }
-  public int getSamplesToAverage() {
-    return EncoderDataJNI.getSamplesToAverage(m_index);
-  }
-  public void setSamplesToAverage(int samplesToAverage) {
-    EncoderDataJNI.setSamplesToAverage(m_index, samplesToAverage);
-  }
-
-  public void resetData() {
-    EncoderDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/I2CSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/I2CSim.java
deleted file mode 100644
index 3a9aa02..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/I2CSim.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.I2CDataJNI;
-
-public class I2CSim {
-  private final int m_index;
-
-  public I2CSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = I2CDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, I2CDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return I2CDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    I2CDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerReadCallback(BufferCallback callback) {
-    int uid = I2CDataJNI.registerReadCallback(m_index, callback);
-    return new CallbackStore(m_index, uid, I2CDataJNI::cancelReadCallback);
-  }
-
-  public CallbackStore registerWriteCallback(ConstBufferCallback callback) {
-    int uid = I2CDataJNI.registerWriteCallback(m_index, callback);
-    return new CallbackStore(m_index, uid, I2CDataJNI::cancelWriteCallback);
-  }
-
-  public void resetData() {
-    I2CDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/NotifierSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/NotifierSim.java
deleted file mode 100644
index f19a674..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/NotifierSim.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.NotifierDataJNI;
-
-public final class NotifierSim {
-  private NotifierSim() {
-  }
-
-  public static long getNextTimeout() {
-    return NotifierDataJNI.getNextTimeout();
-  }
-
-  public static int getNumNotifiers() {
-    return NotifierDataJNI.getNumNotifiers();
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/PCMSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/PCMSim.java
deleted file mode 100644
index f8cc327..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/PCMSim.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.PCMDataJNI;
-
-public class PCMSim {
-  private final int m_index;
-
-  public PCMSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerSolenoidInitializedCallback(int channel, NotifyCallback callback, boolean initialNotify) {
-    int uid = PCMDataJNI.registerSolenoidInitializedCallback(m_index, channel, callback, initialNotify);
-    return new CallbackStore(m_index, channel, uid, PCMDataJNI::cancelSolenoidInitializedCallback);
-  }
-  public boolean getSolenoidInitialized(int channel) {
-    return PCMDataJNI.getSolenoidInitialized(m_index, channel);
-  }
-  public void setSolenoidInitialized(int channel, boolean solenoidInitialized) {
-    PCMDataJNI.setSolenoidInitialized(m_index, channel, solenoidInitialized);
-  }
-
-  public CallbackStore registerSolenoidOutputCallback(int channel, NotifyCallback callback, boolean initialNotify) {
-    int uid = PCMDataJNI.registerSolenoidOutputCallback(m_index, channel, callback, initialNotify);
-    return new CallbackStore(m_index, channel, uid, PCMDataJNI::cancelSolenoidOutputCallback);
-  }
-  public boolean getSolenoidOutput(int channel) {
-    return PCMDataJNI.getSolenoidOutput(m_index, channel);
-  }
-  public void setSolenoidOutput(int channel, boolean solenoidOutput) {
-    PCMDataJNI.setSolenoidOutput(m_index, channel, solenoidOutput);
-  }
-
-  public CallbackStore registerCompressorInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PCMDataJNI.registerCompressorInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PCMDataJNI::cancelCompressorInitializedCallback);
-  }
-  public boolean getCompressorInitialized() {
-    return PCMDataJNI.getCompressorInitialized(m_index);
-  }
-  public void setCompressorInitialized(boolean compressorInitialized) {
-    PCMDataJNI.setCompressorInitialized(m_index, compressorInitialized);
-  }
-
-  public CallbackStore registerCompressorOnCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PCMDataJNI.registerCompressorOnCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PCMDataJNI::cancelCompressorOnCallback);
-  }
-  public boolean getCompressorOn() {
-    return PCMDataJNI.getCompressorOn(m_index);
-  }
-  public void setCompressorOn(boolean compressorOn) {
-    PCMDataJNI.setCompressorOn(m_index, compressorOn);
-  }
-
-  public CallbackStore registerClosedLoopEnabledCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PCMDataJNI.registerClosedLoopEnabledCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PCMDataJNI::cancelClosedLoopEnabledCallback);
-  }
-  public boolean getClosedLoopEnabled() {
-    return PCMDataJNI.getClosedLoopEnabled(m_index);
-  }
-  public void setClosedLoopEnabled(boolean closedLoopEnabled) {
-    PCMDataJNI.setClosedLoopEnabled(m_index, closedLoopEnabled);
-  }
-
-  public CallbackStore registerPressureSwitchCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PCMDataJNI.registerPressureSwitchCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PCMDataJNI::cancelPressureSwitchCallback);
-  }
-  public boolean getPressureSwitch() {
-    return PCMDataJNI.getPressureSwitch(m_index);
-  }
-  public void setPressureSwitch(boolean pressureSwitch) {
-    PCMDataJNI.setPressureSwitch(m_index, pressureSwitch);
-  }
-
-  public CallbackStore registerCompressorCurrentCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PCMDataJNI.registerCompressorCurrentCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PCMDataJNI::cancelCompressorCurrentCallback);
-  }
-  public double getCompressorCurrent() {
-    return PCMDataJNI.getCompressorCurrent(m_index);
-  }
-  public void setCompressorCurrent(double compressorCurrent) {
-    PCMDataJNI.setCompressorCurrent(m_index, compressorCurrent);
-  }
-
-  public void resetData() {
-    PCMDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/PDPSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/PDPSim.java
deleted file mode 100644
index d44cf3a..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/PDPSim.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.PDPDataJNI;
-
-public class PDPSim {
-  private final int m_index;
-
-  public PDPSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PDPDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PDPDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return PDPDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    PDPDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerTemperatureCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PDPDataJNI.registerTemperatureCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PDPDataJNI::cancelTemperatureCallback);
-  }
-  public double getTemperature() {
-    return PDPDataJNI.getTemperature(m_index);
-  }
-  public void setTemperature(double temperature) {
-    PDPDataJNI.setTemperature(m_index, temperature);
-  }
-
-  public CallbackStore registerVoltageCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PDPDataJNI.registerVoltageCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PDPDataJNI::cancelVoltageCallback);
-  }
-  public double getVoltage() {
-    return PDPDataJNI.getVoltage(m_index);
-  }
-  public void setVoltage(double voltage) {
-    PDPDataJNI.setVoltage(m_index, voltage);
-  }
-
-  public CallbackStore registerCurrentCallback(int channel, NotifyCallback callback, boolean initialNotify) {
-    int uid = PDPDataJNI.registerCurrentCallback(m_index, channel, callback, initialNotify);
-    return new CallbackStore(m_index, channel, uid, PDPDataJNI::cancelCurrentCallback);
-  }
-  public double getCurrent(int channel) {
-    return PDPDataJNI.getCurrent(m_index, channel);
-  }
-  public void setCurrent(int channel, double current) {
-    PDPDataJNI.setCurrent(m_index, channel, current);
-  }
-
-  public void resetData() {
-    PDPDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/PWMSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/PWMSim.java
deleted file mode 100644
index dde38a4..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/PWMSim.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.PWMDataJNI;
-
-public class PWMSim {
-  private final int m_index;
-
-  public PWMSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PWMDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PWMDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return PWMDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    PWMDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerRawValueCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PWMDataJNI.registerRawValueCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PWMDataJNI::cancelRawValueCallback);
-  }
-  public int getRawValue() {
-    return PWMDataJNI.getRawValue(m_index);
-  }
-  public void setRawValue(int rawValue) {
-    PWMDataJNI.setRawValue(m_index, rawValue);
-  }
-
-  public CallbackStore registerSpeedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PWMDataJNI.registerSpeedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PWMDataJNI::cancelSpeedCallback);
-  }
-  public double getSpeed() {
-    return PWMDataJNI.getSpeed(m_index);
-  }
-  public void setSpeed(double speed) {
-    PWMDataJNI.setSpeed(m_index, speed);
-  }
-
-  public CallbackStore registerPositionCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PWMDataJNI.registerPositionCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PWMDataJNI::cancelPositionCallback);
-  }
-  public double getPosition() {
-    return PWMDataJNI.getPosition(m_index);
-  }
-  public void setPosition(double position) {
-    PWMDataJNI.setPosition(m_index, position);
-  }
-
-  public CallbackStore registerPeriodScaleCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PWMDataJNI.registerPeriodScaleCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PWMDataJNI::cancelPeriodScaleCallback);
-  }
-  public int getPeriodScale() {
-    return PWMDataJNI.getPeriodScale(m_index);
-  }
-  public void setPeriodScale(int periodScale) {
-    PWMDataJNI.setPeriodScale(m_index, periodScale);
-  }
-
-  public CallbackStore registerZeroLatchCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = PWMDataJNI.registerZeroLatchCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, PWMDataJNI::cancelZeroLatchCallback);
-  }
-  public boolean getZeroLatch() {
-    return PWMDataJNI.getZeroLatch(m_index);
-  }
-  public void setZeroLatch(boolean zeroLatch) {
-    PWMDataJNI.setZeroLatch(m_index, zeroLatch);
-  }
-
-  public void resetData() {
-    PWMDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/RelaySim.java b/hal/src/main/java/edu/wpi/first/hal/sim/RelaySim.java
deleted file mode 100644
index 84059e8..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/RelaySim.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.RelayDataJNI;
-
-public class RelaySim {
-  private final int m_index;
-
-  public RelaySim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedForwardCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RelayDataJNI.registerInitializedForwardCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RelayDataJNI::cancelInitializedForwardCallback);
-  }
-  public boolean getInitializedForward() {
-    return RelayDataJNI.getInitializedForward(m_index);
-  }
-  public void setInitializedForward(boolean initializedForward) {
-    RelayDataJNI.setInitializedForward(m_index, initializedForward);
-  }
-
-  public CallbackStore registerInitializedReverseCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RelayDataJNI.registerInitializedReverseCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RelayDataJNI::cancelInitializedReverseCallback);
-  }
-  public boolean getInitializedReverse() {
-    return RelayDataJNI.getInitializedReverse(m_index);
-  }
-  public void setInitializedReverse(boolean initializedReverse) {
-    RelayDataJNI.setInitializedReverse(m_index, initializedReverse);
-  }
-
-  public CallbackStore registerForwardCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RelayDataJNI.registerForwardCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RelayDataJNI::cancelForwardCallback);
-  }
-  public boolean getForward() {
-    return RelayDataJNI.getForward(m_index);
-  }
-  public void setForward(boolean forward) {
-    RelayDataJNI.setForward(m_index, forward);
-  }
-
-  public CallbackStore registerReverseCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RelayDataJNI.registerReverseCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RelayDataJNI::cancelReverseCallback);
-  }
-  public boolean getReverse() {
-    return RelayDataJNI.getReverse(m_index);
-  }
-  public void setReverse(boolean reverse) {
-    RelayDataJNI.setReverse(m_index, reverse);
-  }
-
-  public void resetData() {
-    RelayDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/RoboRioSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/RoboRioSim.java
deleted file mode 100644
index 082f712..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/RoboRioSim.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.RoboRioDataJNI;
-
-@SuppressWarnings({"PMD.ExcessivePublicCount", "PMD.TooManyMethods"})
-public class RoboRioSim {
-  private final int m_index;
-
-  public RoboRioSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerFPGAButtonCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerFPGAButtonCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelFPGAButtonCallback);
-  }
-  public boolean getFPGAButton() {
-    return RoboRioDataJNI.getFPGAButton(m_index);
-  }
-  public void setFPGAButton(boolean fPGAButton) {
-    RoboRioDataJNI.setFPGAButton(m_index, fPGAButton);
-  }
-
-  public CallbackStore registerVInVoltageCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerVInVoltageCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelVInVoltageCallback);
-  }
-  public double getVInVoltage() {
-    return RoboRioDataJNI.getVInVoltage(m_index);
-  }
-  public void setVInVoltage(double vInVoltage) {
-    RoboRioDataJNI.setVInVoltage(m_index, vInVoltage);
-  }
-
-  public CallbackStore registerVInCurrentCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerVInCurrentCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelVInCurrentCallback);
-  }
-  public double getVInCurrent() {
-    return RoboRioDataJNI.getVInCurrent(m_index);
-  }
-  public void setVInCurrent(double vInCurrent) {
-    RoboRioDataJNI.setVInCurrent(m_index, vInCurrent);
-  }
-
-  public CallbackStore registerUserVoltage6VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserVoltage6VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserVoltage6VCallback);
-  }
-  public double getUserVoltage6V() {
-    return RoboRioDataJNI.getUserVoltage6V(m_index);
-  }
-  public void setUserVoltage6V(double userVoltage6V) {
-    RoboRioDataJNI.setUserVoltage6V(m_index, userVoltage6V);
-  }
-
-  public CallbackStore registerUserCurrent6VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserCurrent6VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserCurrent6VCallback);
-  }
-  public double getUserCurrent6V() {
-    return RoboRioDataJNI.getUserCurrent6V(m_index);
-  }
-  public void setUserCurrent6V(double userCurrent6V) {
-    RoboRioDataJNI.setUserCurrent6V(m_index, userCurrent6V);
-  }
-
-  public CallbackStore registerUserActive6VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserActive6VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserActive6VCallback);
-  }
-  public boolean getUserActive6V() {
-    return RoboRioDataJNI.getUserActive6V(m_index);
-  }
-  public void setUserActive6V(boolean userActive6V) {
-    RoboRioDataJNI.setUserActive6V(m_index, userActive6V);
-  }
-
-  public CallbackStore registerUserVoltage5VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserVoltage5VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserVoltage5VCallback);
-  }
-  public double getUserVoltage5V() {
-    return RoboRioDataJNI.getUserVoltage5V(m_index);
-  }
-  public void setUserVoltage5V(double userVoltage5V) {
-    RoboRioDataJNI.setUserVoltage5V(m_index, userVoltage5V);
-  }
-
-  public CallbackStore registerUserCurrent5VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserCurrent5VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserCurrent5VCallback);
-  }
-  public double getUserCurrent5V() {
-    return RoboRioDataJNI.getUserCurrent5V(m_index);
-  }
-  public void setUserCurrent5V(double userCurrent5V) {
-    RoboRioDataJNI.setUserCurrent5V(m_index, userCurrent5V);
-  }
-
-  public CallbackStore registerUserActive5VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserActive5VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserActive5VCallback);
-  }
-  public boolean getUserActive5V() {
-    return RoboRioDataJNI.getUserActive5V(m_index);
-  }
-  public void setUserActive5V(boolean userActive5V) {
-    RoboRioDataJNI.setUserActive5V(m_index, userActive5V);
-  }
-
-  public CallbackStore registerUserVoltage3V3Callback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserVoltage3V3Callback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserVoltage3V3Callback);
-  }
-  public double getUserVoltage3V3() {
-    return RoboRioDataJNI.getUserVoltage3V3(m_index);
-  }
-  public void setUserVoltage3V3(double userVoltage3V3) {
-    RoboRioDataJNI.setUserVoltage3V3(m_index, userVoltage3V3);
-  }
-
-  public CallbackStore registerUserCurrent3V3Callback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserCurrent3V3Callback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserCurrent3V3Callback);
-  }
-  public double getUserCurrent3V3() {
-    return RoboRioDataJNI.getUserCurrent3V3(m_index);
-  }
-  public void setUserCurrent3V3(double userCurrent3V3) {
-    RoboRioDataJNI.setUserCurrent3V3(m_index, userCurrent3V3);
-  }
-
-  public CallbackStore registerUserActive3V3Callback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserActive3V3Callback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserActive3V3Callback);
-  }
-  public boolean getUserActive3V3() {
-    return RoboRioDataJNI.getUserActive3V3(m_index);
-  }
-  public void setUserActive3V3(boolean userActive3V3) {
-    RoboRioDataJNI.setUserActive3V3(m_index, userActive3V3);
-  }
-
-  public CallbackStore registerUserFaults6VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserFaults6VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserFaults6VCallback);
-  }
-  public int getUserFaults6V() {
-    return RoboRioDataJNI.getUserFaults6V(m_index);
-  }
-  public void setUserFaults6V(int userFaults6V) {
-    RoboRioDataJNI.setUserFaults6V(m_index, userFaults6V);
-  }
-
-  public CallbackStore registerUserFaults5VCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserFaults5VCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserFaults5VCallback);
-  }
-  public int getUserFaults5V() {
-    return RoboRioDataJNI.getUserFaults5V(m_index);
-  }
-  public void setUserFaults5V(int userFaults5V) {
-    RoboRioDataJNI.setUserFaults5V(m_index, userFaults5V);
-  }
-
-  public CallbackStore registerUserFaults3V3Callback(NotifyCallback callback, boolean initialNotify) {
-    int uid = RoboRioDataJNI.registerUserFaults3V3Callback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, RoboRioDataJNI::cancelUserFaults3V3Callback);
-  }
-  public int getUserFaults3V3() {
-    return RoboRioDataJNI.getUserFaults3V3(m_index);
-  }
-  public void setUserFaults3V3(int userFaults3V3) {
-    RoboRioDataJNI.setUserFaults3V3(m_index, userFaults3V3);
-  }
-
-  public void resetData() {
-    RoboRioDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/SPIAccelerometerSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/SPIAccelerometerSim.java
deleted file mode 100644
index 94577bd..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/SPIAccelerometerSim.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.SPIAccelerometerDataJNI;
-
-public class SPIAccelerometerSim {
-  private final int m_index;
-
-  public SPIAccelerometerSim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerActiveCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = SPIAccelerometerDataJNI.registerActiveCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, SPIAccelerometerDataJNI::cancelActiveCallback);
-  }
-  public boolean getActive() {
-    return SPIAccelerometerDataJNI.getActive(m_index);
-  }
-  public void setActive(boolean active) {
-    SPIAccelerometerDataJNI.setActive(m_index, active);
-  }
-
-  public CallbackStore registerRangeCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = SPIAccelerometerDataJNI.registerRangeCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, SPIAccelerometerDataJNI::cancelRangeCallback);
-  }
-  public int getRange() {
-    return SPIAccelerometerDataJNI.getRange(m_index);
-  }
-  public void setRange(int range) {
-    SPIAccelerometerDataJNI.setRange(m_index, range);
-  }
-
-  public CallbackStore registerXCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = SPIAccelerometerDataJNI.registerXCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, SPIAccelerometerDataJNI::cancelXCallback);
-  }
-  public double getX() {
-    return SPIAccelerometerDataJNI.getX(m_index);
-  }
-  public void setX(double x) {
-    SPIAccelerometerDataJNI.setX(m_index, x);
-  }
-
-  public CallbackStore registerYCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = SPIAccelerometerDataJNI.registerYCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, SPIAccelerometerDataJNI::cancelYCallback);
-  }
-  public double getY() {
-    return SPIAccelerometerDataJNI.getY(m_index);
-  }
-  public void setY(double y) {
-    SPIAccelerometerDataJNI.setY(m_index, y);
-  }
-
-  public CallbackStore registerZCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = SPIAccelerometerDataJNI.registerZCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, SPIAccelerometerDataJNI::cancelZCallback);
-  }
-  public double getZ() {
-    return SPIAccelerometerDataJNI.getZ(m_index);
-  }
-  public void setZ(double z) {
-    SPIAccelerometerDataJNI.setZ(m_index, z);
-  }
-
-  public void resetData() {
-    SPIAccelerometerDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/SPISim.java b/hal/src/main/java/edu/wpi/first/hal/sim/SPISim.java
deleted file mode 100644
index 5f43bca..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/SPISim.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.SPIDataJNI;
-
-public class SPISim {
-  private final int m_index;
-
-  public SPISim(int index) {
-    m_index = index;
-  }
-
-  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
-    int uid = SPIDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
-    return new CallbackStore(m_index, uid, SPIDataJNI::cancelInitializedCallback);
-  }
-  public boolean getInitialized() {
-    return SPIDataJNI.getInitialized(m_index);
-  }
-  public void setInitialized(boolean initialized) {
-    SPIDataJNI.setInitialized(m_index, initialized);
-  }
-
-  public CallbackStore registerReadCallback(BufferCallback callback) {
-    int uid = SPIDataJNI.registerReadCallback(m_index, callback);
-    return new CallbackStore(m_index, uid, SPIDataJNI::cancelReadCallback);
-  }
-
-  public CallbackStore registerWriteCallback(ConstBufferCallback callback) {
-    int uid = SPIDataJNI.registerWriteCallback(m_index, callback);
-    return new CallbackStore(m_index, uid, SPIDataJNI::cancelWriteCallback);
-  }
-
-  public CallbackStore registerReadAutoReceiveBufferCallback(SpiReadAutoReceiveBufferCallback callback) {
-    int uid = SPIDataJNI.registerReadAutoReceiveBufferCallback(m_index, callback);
-    return new CallbackStore(m_index, uid, SPIDataJNI::cancelReadAutoReceiveBufferCallback);
-  }
-
-  public void resetData() {
-    SPIDataJNI.resetData(m_index);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/SimDeviceSim.java b/hal/src/main/java/edu/wpi/first/hal/sim/SimDeviceSim.java
deleted file mode 100644
index e46c811..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/SimDeviceSim.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.SimBoolean;
-import edu.wpi.first.hal.SimDouble;
-import edu.wpi.first.hal.SimEnum;
-import edu.wpi.first.hal.SimValue;
-import edu.wpi.first.hal.sim.mockdata.SimDeviceDataJNI;
-
-public class SimDeviceSim {
-  private final int m_handle;
-
-  public SimDeviceSim(String name) {
-    m_handle = SimDeviceDataJNI.getSimDeviceHandle(name);
-  }
-
-  public SimValue getValue(String name) {
-    int handle = SimDeviceDataJNI.getSimValueHandle(m_handle, name);
-    if (handle <= 0) {
-      return null;
-    }
-    return new SimValue(handle);
-  }
-
-  public SimDouble getDouble(String name) {
-    int handle = SimDeviceDataJNI.getSimValueHandle(m_handle, name);
-    if (handle <= 0) {
-      return null;
-    }
-    return new SimDouble(handle);
-  }
-
-  public SimEnum getEnum(String name) {
-    int handle = SimDeviceDataJNI.getSimValueHandle(m_handle, name);
-    if (handle <= 0) {
-      return null;
-    }
-    return new SimEnum(handle);
-  }
-
-  public SimBoolean getBoolean(String name) {
-    int handle = SimDeviceDataJNI.getSimValueHandle(m_handle, name);
-    if (handle <= 0) {
-      return null;
-    }
-    return new SimBoolean(handle);
-  }
-
-  public static String[] getEnumOptions(SimEnum val) {
-    return SimDeviceDataJNI.getSimValueEnumOptions(val.getNativeHandle());
-  }
-
-  public SimDeviceDataJNI.SimValueInfo[] enumerateValues() {
-    return SimDeviceDataJNI.enumerateSimValues(m_handle);
-  }
-
-  public int getNativeHandle() {
-    return m_handle;
-  }
-
-  public CallbackStore registerValueCreatedCallback(SimValueCallback callback, boolean initialNotify) {
-    int uid = SimDeviceDataJNI.registerSimValueCreatedCallback(m_handle, callback, initialNotify);
-    return new CallbackStore(uid, SimDeviceDataJNI::cancelSimValueCreatedCallback);
-  }
-
-  public CallbackStore registerValueChangedCallback(SimValueCallback callback, boolean initialNotify) {
-    int uid = SimDeviceDataJNI.registerSimValueChangedCallback(m_handle, callback, initialNotify);
-    return new CallbackStore(uid, SimDeviceDataJNI::cancelSimValueChangedCallback);
-  }
-
-  public static SimDeviceDataJNI.SimDeviceInfo[] enumerateDevices(String prefix) {
-    return SimDeviceDataJNI.enumerateSimDevices(prefix);
-  }
-
-  public CallbackStore registerDeviceCreatedCallback(String prefix, SimDeviceCallback callback, boolean initialNotify) {
-    int uid = SimDeviceDataJNI.registerSimDeviceCreatedCallback(prefix, callback, initialNotify);
-    return new CallbackStore(uid, SimDeviceDataJNI::cancelSimDeviceCreatedCallback);
-  }
-
-  public CallbackStore registerDeviceFreedCallback(String prefix, SimDeviceCallback callback) {
-    int uid = SimDeviceDataJNI.registerSimDeviceFreedCallback(prefix, callback);
-    return new CallbackStore(uid, SimDeviceDataJNI::cancelSimDeviceFreedCallback);
-  }
-
-  public static void resetData() {
-    SimDeviceDataJNI.resetSimDeviceData();
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/SimHooks.java b/hal/src/main/java/edu/wpi/first/hal/sim/SimHooks.java
deleted file mode 100644
index 9805497..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/SimHooks.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import edu.wpi.first.hal.sim.mockdata.SimulatorJNI;
-
-public final class SimHooks {
-  private SimHooks() {
-  }
-
-  public static void waitForProgramStart() {
-    SimulatorJNI.waitForProgramStart();
-  }
-
-  public static void setProgramStarted() {
-    SimulatorJNI.setProgramStarted();
-  }
-
-  public static void restartTiming() {
-    SimulatorJNI.restartTiming();
-  }
-
-  public static void pauseTiming() {
-    SimulatorJNI.pauseTiming();
-  }
-
-  public static void resumeTiming() {
-    SimulatorJNI.resumeTiming();
-  }
-
-  public static boolean isTimingPaused() {
-    return SimulatorJNI.isTimingPaused();
-  }
-
-  public static void stepTiming(long delta) {
-    SimulatorJNI.stepTiming(delta);
-  }
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DriverStationDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DriverStationDataJNI.java
deleted file mode 100644
index ec19735..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DriverStationDataJNI.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim.mockdata;
-
-import edu.wpi.first.hal.JNIWrapper;
-import edu.wpi.first.hal.sim.NotifyCallback;
-
-public class DriverStationDataJNI extends JNIWrapper {
-  public static native int registerEnabledCallback(NotifyCallback callback, boolean initialNotify);
-  public static native void cancelEnabledCallback(int uid);
-  public static native boolean getEnabled();
-  public static native void setEnabled(boolean enabled);
-
-  public static native int registerAutonomousCallback(NotifyCallback callback, boolean initialNotify);
-  public static native void cancelAutonomousCallback(int uid);
-  public static native boolean getAutonomous();
-  public static native void setAutonomous(boolean autonomous);
-
-  public static native int registerTestCallback(NotifyCallback callback, boolean initialNotify);
-  public static native void cancelTestCallback(int uid);
-  public static native boolean getTest();
-  public static native void setTest(boolean test);
-
-  public static native int registerEStopCallback(NotifyCallback callback, boolean initialNotify);
-  public static native void cancelEStopCallback(int uid);
-  public static native boolean getEStop();
-  public static native void setEStop(boolean eStop);
-
-  public static native int registerFmsAttachedCallback(NotifyCallback callback, boolean initialNotify);
-  public static native void cancelFmsAttachedCallback(int uid);
-  public static native boolean getFmsAttached();
-  public static native void setFmsAttached(boolean fmsAttached);
-
-  public static native int registerDsAttachedCallback(NotifyCallback callback, boolean initialNotify);
-  public static native void cancelDsAttachedCallback(int uid);
-  public static native boolean getDsAttached();
-  public static native void setDsAttached(boolean dsAttached);
-
-  public static native void setJoystickAxes(byte joystickNum, float[] axesArray);
-  public static native void setJoystickPOVs(byte joystickNum, short[] povsArray);
-  public static native void setJoystickButtons(byte joystickNum, int buttons, int count);
-
-  public static native void setMatchInfo(String eventName, String gameSpecificMessage, int matchNumber, int replayNumber, int matchType);
-  public static native void registerAllCallbacks(NotifyCallback callback, boolean initialNotify);
-  public static native void notifyNewData();
-
-  public static native void setSendError(boolean shouldSend);
-
-  public static native void resetData();
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/RoboRioDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/RoboRioDataJNI.java
deleted file mode 100644
index a13845c..0000000
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/RoboRioDataJNI.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim.mockdata;
-
-import edu.wpi.first.hal.sim.NotifyCallback;
-import edu.wpi.first.hal.JNIWrapper;
-
-public class RoboRioDataJNI extends JNIWrapper {
-  public static native int registerFPGAButtonCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelFPGAButtonCallback(int index, int uid);
-  public static native boolean getFPGAButton(int index);
-  public static native void setFPGAButton(int index, boolean fPGAButton);
-
-  public static native int registerVInVoltageCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelVInVoltageCallback(int index, int uid);
-  public static native double getVInVoltage(int index);
-  public static native void setVInVoltage(int index, double vInVoltage);
-
-  public static native int registerVInCurrentCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelVInCurrentCallback(int index, int uid);
-  public static native double getVInCurrent(int index);
-  public static native void setVInCurrent(int index, double vInCurrent);
-
-  public static native int registerUserVoltage6VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserVoltage6VCallback(int index, int uid);
-  public static native double getUserVoltage6V(int index);
-  public static native void setUserVoltage6V(int index, double userVoltage6V);
-
-  public static native int registerUserCurrent6VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserCurrent6VCallback(int index, int uid);
-  public static native double getUserCurrent6V(int index);
-  public static native void setUserCurrent6V(int index, double userCurrent6V);
-
-  public static native int registerUserActive6VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserActive6VCallback(int index, int uid);
-  public static native boolean getUserActive6V(int index);
-  public static native void setUserActive6V(int index, boolean userActive6V);
-
-  public static native int registerUserVoltage5VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserVoltage5VCallback(int index, int uid);
-  public static native double getUserVoltage5V(int index);
-  public static native void setUserVoltage5V(int index, double userVoltage5V);
-
-  public static native int registerUserCurrent5VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserCurrent5VCallback(int index, int uid);
-  public static native double getUserCurrent5V(int index);
-  public static native void setUserCurrent5V(int index, double userCurrent5V);
-
-  public static native int registerUserActive5VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserActive5VCallback(int index, int uid);
-  public static native boolean getUserActive5V(int index);
-  public static native void setUserActive5V(int index, boolean userActive5V);
-
-  public static native int registerUserVoltage3V3Callback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserVoltage3V3Callback(int index, int uid);
-  public static native double getUserVoltage3V3(int index);
-  public static native void setUserVoltage3V3(int index, double userVoltage3V3);
-
-  public static native int registerUserCurrent3V3Callback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserCurrent3V3Callback(int index, int uid);
-  public static native double getUserCurrent3V3(int index);
-  public static native void setUserCurrent3V3(int index, double userCurrent3V3);
-
-  public static native int registerUserActive3V3Callback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserActive3V3Callback(int index, int uid);
-  public static native boolean getUserActive3V3(int index);
-  public static native void setUserActive3V3(int index, boolean userActive3V3);
-
-  public static native int registerUserFaults6VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserFaults6VCallback(int index, int uid);
-  public static native int getUserFaults6V(int index);
-  public static native void setUserFaults6V(int index, int userFaults6V);
-
-  public static native int registerUserFaults5VCallback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserFaults5VCallback(int index, int uid);
-  public static native int getUserFaults5V(int index);
-  public static native void setUserFaults5V(int index, int userFaults5V);
-
-  public static native int registerUserFaults3V3Callback(int index, NotifyCallback callback, boolean initialNotify);
-  public static native void cancelUserFaults3V3Callback(int index, int uid);
-  public static native int getUserFaults3V3(int index);
-  public static native void setUserFaults3V3(int index, int userFaults3V3);
-
-  public static native void resetData(int index);
-}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AccelerometerDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/AccelerometerDataJNI.java
similarity index 92%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AccelerometerDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/AccelerometerDataJNI.java
index 22276d4..cb42c98 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AccelerometerDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/AccelerometerDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class AccelerometerDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AddressableLEDDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/AddressableLEDDataJNI.java
similarity index 91%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AddressableLEDDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/AddressableLEDDataJNI.java
index 8098e68..0aa4d47 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AddressableLEDDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/AddressableLEDDataJNI.java
@@ -1,14 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.ConstBufferCallback;
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class AddressableLEDDataJNI extends JNIWrapper {
@@ -38,4 +36,6 @@
   public static native void setData(int index, byte[] data);
 
   public static native void resetData(int index);
+
+  public static native int findForChannel(int channel);
 }
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogGyroDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogGyroDataJNI.java
similarity index 90%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogGyroDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/AnalogGyroDataJNI.java
index 4995df2..42cc508 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogGyroDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogGyroDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class AnalogGyroDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogInDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogInDataJNI.java
similarity index 95%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogInDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/AnalogInDataJNI.java
index ed4fbac..3656ffa 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogInDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogInDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class AnalogInDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogOutDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogOutDataJNI.java
similarity index 88%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogOutDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/AnalogOutDataJNI.java
index 2f7596c..23bc8ac 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogOutDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogOutDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class AnalogOutDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogTriggerDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogTriggerDataJNI.java
similarity index 90%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogTriggerDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/AnalogTriggerDataJNI.java
index cf4187f..ca89a28 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/AnalogTriggerDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/AnalogTriggerDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class AnalogTriggerDataJNI extends JNIWrapper {
@@ -27,4 +26,6 @@
   public static native void setTriggerUpperBound(int index, double triggerUpperBound);
 
   public static native void resetData(int index);
+
+  public static native int findForChannel(int channel);
 }
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/BufferCallback.java b/hal/src/main/java/edu/wpi/first/hal/simulation/BufferCallback.java
similarity index 83%
rename from hal/src/main/java/edu/wpi/first/hal/sim/BufferCallback.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/BufferCallback.java
index 0f7b2d9..a8d8ce1 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/BufferCallback.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/BufferCallback.java
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim;
+package edu.wpi.first.hal.simulation;
 
 public interface BufferCallback {
   void callback(String name, byte[] buffer, int count);
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/ConstBufferCallback.java b/hal/src/main/java/edu/wpi/first/hal/simulation/ConstBufferCallback.java
similarity index 83%
rename from hal/src/main/java/edu/wpi/first/hal/sim/ConstBufferCallback.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/ConstBufferCallback.java
index a4251c2..6cb2375 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/ConstBufferCallback.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/ConstBufferCallback.java
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim;
+package edu.wpi.first.hal.simulation;
 
 public interface ConstBufferCallback {
   void callback(String name, byte[] buffer, int count);
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DIODataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/DIODataJNI.java
similarity index 93%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DIODataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/DIODataJNI.java
index 55de7de..5d41a2f 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DIODataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/DIODataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class DIODataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DigitalPWMDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/DigitalPWMDataJNI.java
similarity index 90%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DigitalPWMDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/DigitalPWMDataJNI.java
index 69bee07..4e2709f 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DigitalPWMDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/DigitalPWMDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class DigitalPWMDataJNI extends JNIWrapper {
@@ -27,4 +26,6 @@
   public static native void setPin(int index, int pin);
 
   public static native void resetData(int index);
+
+  public static native int findForChannel(int channel);
 }
diff --git a/hal/src/main/java/edu/wpi/first/hal/simulation/DriverStationDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/DriverStationDataJNI.java
new file mode 100644
index 0000000..a1046c5
--- /dev/null
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/DriverStationDataJNI.java
@@ -0,0 +1,87 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+package edu.wpi.first.hal.simulation;
+
+import edu.wpi.first.hal.JNIWrapper;
+
+public class DriverStationDataJNI extends JNIWrapper {
+  public static native int registerEnabledCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelEnabledCallback(int uid);
+  public static native boolean getEnabled();
+  public static native void setEnabled(boolean enabled);
+
+  public static native int registerAutonomousCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelAutonomousCallback(int uid);
+  public static native boolean getAutonomous();
+  public static native void setAutonomous(boolean autonomous);
+
+  public static native int registerTestCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelTestCallback(int uid);
+  public static native boolean getTest();
+  public static native void setTest(boolean test);
+
+  public static native int registerEStopCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelEStopCallback(int uid);
+  public static native boolean getEStop();
+  public static native void setEStop(boolean eStop);
+
+  public static native int registerFmsAttachedCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelFmsAttachedCallback(int uid);
+  public static native boolean getFmsAttached();
+  public static native void setFmsAttached(boolean fmsAttached);
+
+  public static native int registerDsAttachedCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelDsAttachedCallback(int uid);
+  public static native boolean getDsAttached();
+  public static native void setDsAttached(boolean dsAttached);
+
+  public static native int registerAllianceStationIdCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelAllianceStationIdCallback(int uid);
+  public static native int getAllianceStationId();
+  public static native void setAllianceStationId(int allianceStationId);
+
+  public static native int registerMatchTimeCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelMatchTimeCallback(int uid);
+  public static native double getMatchTime();
+  public static native void setMatchTime(double matchTime);
+
+  public static native void setJoystickAxes(byte joystickNum, float[] axesArray);
+  public static native void setJoystickPOVs(byte joystickNum, short[] povsArray);
+  public static native void setJoystickButtons(byte joystickNum, int buttons, int count);
+  public static native long getJoystickOutputs(int stick);
+  public static native int getJoystickRumble(int stick, int rumbleNum);
+
+  public static native void setMatchInfo(String eventName, String gameSpecificMessage, int matchNumber, int replayNumber, int matchType);
+
+  public static native void registerAllCallbacks(NotifyCallback callback, boolean initialNotify);
+  public static native void notifyNewData();
+
+  public static native void setSendError(boolean shouldSend);
+  public static native void setSendConsoleLine(boolean shouldSend);
+
+  public static native void setJoystickButton(int stick, int button, boolean state);
+  public static native void setJoystickAxis(int stick, int axis, double value);
+  public static native void setJoystickPOV(int stick, int pov, int value);
+  public static native void setJoystickButtonsValue(int stick, int buttons);
+  public static native void setJoystickAxisCount(int stick, int count);
+  public static native void setJoystickPOVCount(int stick, int count);
+  public static native void setJoystickButtonCount(int stick, int count);
+
+  public static native void setJoystickIsXbox(int stick, boolean isXbox);
+  public static native void setJoystickType(int stick, int type);
+  public static native void setJoystickName(int stick, String name);
+  public static native void setJoystickAxisType(int stick, int axis, int type);
+
+  public static native void setGameSpecificMessage(String message);
+  public static native void setEventName(String name);
+  public static native void setMatchType(int type);
+  public static native void setMatchNumber(int matchNumber);
+  public static native void setReplayNumber(int replayNumber);
+
+  public static native void resetData();
+}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DutyCycleDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/DutyCycleDataJNI.java
similarity index 90%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DutyCycleDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/DutyCycleDataJNI.java
index 5cbae6e..3228341 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/DutyCycleDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/DutyCycleDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class DutyCycleDataJNI extends JNIWrapper {
@@ -27,4 +26,6 @@
   public static native void setOutput(int index, double output);
 
   public static native void resetData(int index);
+
+  public static native int findForChannel(int channel);
 }
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/EncoderDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/EncoderDataJNI.java
similarity index 88%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/EncoderDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/EncoderDataJNI.java
index 17e242e..db78d3c 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/EncoderDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/EncoderDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class EncoderDataJNI extends JNIWrapper {
@@ -51,5 +50,12 @@
   public static native int getSamplesToAverage(int index);
   public static native void setSamplesToAverage(int index, int samplesToAverage);
 
+  public static native void setDistance(int index, double distance);
+  public static native double getDistance(int index);
+  public static native void setRate(int index, double rate);
+  public static native double getRate(int index);
+
   public static native void resetData(int index);
+
+  public static native int findForChannel(int channel);
 }
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/I2CDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/I2CDataJNI.java
similarity index 82%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/I2CDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/I2CDataJNI.java
index 33d78f8..8dbc9e6 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/I2CDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/I2CDataJNI.java
@@ -1,15 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.BufferCallback;
-import edu.wpi.first.hal.sim.ConstBufferCallback;
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class I2CDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/NotifierDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/NotifierDataJNI.java
similarity index 85%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/NotifierDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/NotifierDataJNI.java
index ecc0842..823318c 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/NotifierDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/NotifierDataJNI.java
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
 import edu.wpi.first.hal.JNIWrapper;
 
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/NotifyCallback.java b/hal/src/main/java/edu/wpi/first/hal/simulation/NotifyCallback.java
similarity index 86%
rename from hal/src/main/java/edu/wpi/first/hal/sim/NotifyCallback.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/NotifyCallback.java
index 9c655e4..22ec015 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/NotifyCallback.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/NotifyCallback.java
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim;
+package edu.wpi.first.hal.simulation;
 
 import edu.wpi.first.hal.HALValue;
 
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PCMDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/PCMDataJNI.java
similarity index 95%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PCMDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/PCMDataJNI.java
index c5de287..6b72297 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PCMDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/PCMDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class PCMDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PDPDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/PDPDataJNI.java
similarity index 92%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PDPDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/PDPDataJNI.java
index 581a727..8825f60 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PDPDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/PDPDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class PDPDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PWMDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/PWMDataJNI.java
similarity index 93%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PWMDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/PWMDataJNI.java
index e36990e..f44b56b 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/PWMDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/PWMDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class PWMDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/RelayDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/RelayDataJNI.java
similarity index 92%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/RelayDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/RelayDataJNI.java
index 320a86d..e7973a3 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/RelayDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/RelayDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class RelayDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/simulation/RoboRioDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/RoboRioDataJNI.java
new file mode 100644
index 0000000..a95abfe
--- /dev/null
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/RoboRioDataJNI.java
@@ -0,0 +1,89 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+package edu.wpi.first.hal.simulation;
+
+import edu.wpi.first.hal.JNIWrapper;
+
+public class RoboRioDataJNI extends JNIWrapper {
+  public static native int registerFPGAButtonCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelFPGAButtonCallback(int uid);
+  public static native boolean getFPGAButton();
+  public static native void setFPGAButton(boolean fPGAButton);
+
+  public static native int registerVInVoltageCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelVInVoltageCallback(int uid);
+  public static native double getVInVoltage();
+  public static native void setVInVoltage(double vInVoltage);
+
+  public static native int registerVInCurrentCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelVInCurrentCallback(int uid);
+  public static native double getVInCurrent();
+  public static native void setVInCurrent(double vInCurrent);
+
+  public static native int registerUserVoltage6VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserVoltage6VCallback(int uid);
+  public static native double getUserVoltage6V();
+  public static native void setUserVoltage6V(double userVoltage6V);
+
+  public static native int registerUserCurrent6VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserCurrent6VCallback(int uid);
+  public static native double getUserCurrent6V();
+  public static native void setUserCurrent6V(double userCurrent6V);
+
+  public static native int registerUserActive6VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserActive6VCallback(int uid);
+  public static native boolean getUserActive6V();
+  public static native void setUserActive6V(boolean userActive6V);
+
+  public static native int registerUserVoltage5VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserVoltage5VCallback(int uid);
+  public static native double getUserVoltage5V();
+  public static native void setUserVoltage5V(double userVoltage5V);
+
+  public static native int registerUserCurrent5VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserCurrent5VCallback(int uid);
+  public static native double getUserCurrent5V();
+  public static native void setUserCurrent5V(double userCurrent5V);
+
+  public static native int registerUserActive5VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserActive5VCallback(int uid);
+  public static native boolean getUserActive5V();
+  public static native void setUserActive5V(boolean userActive5V);
+
+  public static native int registerUserVoltage3V3Callback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserVoltage3V3Callback(int uid);
+  public static native double getUserVoltage3V3();
+  public static native void setUserVoltage3V3(double userVoltage3V3);
+
+  public static native int registerUserCurrent3V3Callback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserCurrent3V3Callback(int uid);
+  public static native double getUserCurrent3V3();
+  public static native void setUserCurrent3V3(double userCurrent3V3);
+
+  public static native int registerUserActive3V3Callback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserActive3V3Callback(int uid);
+  public static native boolean getUserActive3V3();
+  public static native void setUserActive3V3(boolean userActive3V3);
+
+  public static native int registerUserFaults6VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserFaults6VCallback(int uid);
+  public static native int getUserFaults6V();
+  public static native void setUserFaults6V(int userFaults6V);
+
+  public static native int registerUserFaults5VCallback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserFaults5VCallback(int uid);
+  public static native int getUserFaults5V();
+  public static native void setUserFaults5V(int userFaults5V);
+
+  public static native int registerUserFaults3V3Callback(NotifyCallback callback, boolean initialNotify);
+  public static native void cancelUserFaults3V3Callback(int uid);
+  public static native int getUserFaults3V3();
+  public static native void setUserFaults3V3(int userFaults3V3);
+
+  public static native void resetData();
+}
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SPIAccelerometerDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/SPIAccelerometerDataJNI.java
similarity index 92%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SPIAccelerometerDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/SPIAccelerometerDataJNI.java
index d8e7353..2e8ebae 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SPIAccelerometerDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/SPIAccelerometerDataJNI.java
@@ -1,13 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.NotifyCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class SPIAccelerometerDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SPIDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/SPIDataJNI.java
similarity index 81%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SPIDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/SPIDataJNI.java
index a12ec66..fd6b854 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SPIDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/SPIDataJNI.java
@@ -1,16 +1,12 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.BufferCallback;
-import edu.wpi.first.hal.sim.ConstBufferCallback;
-import edu.wpi.first.hal.sim.NotifyCallback;
-import edu.wpi.first.hal.sim.SpiReadAutoReceiveBufferCallback;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class SPIDataJNI extends JNIWrapper {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/SimDeviceCallback.java b/hal/src/main/java/edu/wpi/first/hal/simulation/SimDeviceCallback.java
similarity index 83%
rename from hal/src/main/java/edu/wpi/first/hal/sim/SimDeviceCallback.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/SimDeviceCallback.java
index ff9e45b..2390bf4 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/SimDeviceCallback.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/SimDeviceCallback.java
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim;
+package edu.wpi.first.hal.simulation;
 
 @FunctionalInterface
 public interface SimDeviceCallback {
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SimDeviceDataJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/SimDeviceDataJNI.java
similarity index 85%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SimDeviceDataJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/SimDeviceDataJNI.java
index 2b8a38a..ea2a9f6 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SimDeviceDataJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/SimDeviceDataJNI.java
@@ -1,18 +1,19 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
-import edu.wpi.first.hal.sim.SimDeviceCallback;
-import edu.wpi.first.hal.sim.SimValueCallback;
 import edu.wpi.first.hal.HALValue;
 import edu.wpi.first.hal.JNIWrapper;
 
 public class SimDeviceDataJNI extends JNIWrapper {
+  public static native void setSimDeviceEnabled(String prefix, boolean enabled);
+  public static native boolean isSimDeviceEnabled(String name);
+
   public static native int registerSimDeviceCreatedCallback(String prefix, SimDeviceCallback callback, boolean initialNotify);
   public static native void cancelSimDeviceCreatedCallback(int uid);
 
@@ -30,10 +31,10 @@
     }
 
     @SuppressWarnings("MemberName")
-    String name;
+    public String name;
 
     @SuppressWarnings("MemberName")
-    int handle;
+    public int handle;
   }
   public static native SimDeviceInfo[] enumerateSimDevices(String prefix);
 
@@ -54,16 +55,16 @@
     }
 
     @SuppressWarnings("MemberName")
-    String name;
+    public String name;
 
     @SuppressWarnings("MemberName")
-    int handle;
+    public int handle;
 
     @SuppressWarnings("MemberName")
-    boolean readonly;
+    public boolean readonly;
 
     @SuppressWarnings("MemberName")
-    HALValue value;
+    public HALValue value;
   }
   public static native SimValueInfo[] enumerateSimValues(int device);
 
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/SimValueCallback.java b/hal/src/main/java/edu/wpi/first/hal/simulation/SimValueCallback.java
similarity index 88%
rename from hal/src/main/java/edu/wpi/first/hal/sim/SimValueCallback.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/SimValueCallback.java
index 786158a..d65ab38 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/SimValueCallback.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/SimValueCallback.java
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim;
+package edu.wpi.first.hal.simulation;
 
 import edu.wpi.first.hal.HALValue;
 
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SimulatorJNI.java b/hal/src/main/java/edu/wpi/first/hal/simulation/SimulatorJNI.java
similarity index 76%
rename from hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SimulatorJNI.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/SimulatorJNI.java
index bfd8505..8147507 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/mockdata/SimulatorJNI.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/SimulatorJNI.java
@@ -1,21 +1,24 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim.mockdata;
+package edu.wpi.first.hal.simulation;
 
 import edu.wpi.first.hal.JNIWrapper;
 
 public class SimulatorJNI extends JNIWrapper {
+  public static native void setRuntimeType(int type);
   public static native void waitForProgramStart();
   public static native void setProgramStarted();
+  public static native boolean getProgramStarted();
   public static native void restartTiming();
   public static native void pauseTiming();
   public static native void resumeTiming();
   public static native boolean isTimingPaused();
   public static native void stepTiming(long delta);
+  public static native void stepTimingAsync(long delta);
   public static native void resetHandles();
 }
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/SpiReadAutoReceiveBufferCallback.java b/hal/src/main/java/edu/wpi/first/hal/simulation/SpiReadAutoReceiveBufferCallback.java
similarity index 83%
rename from hal/src/main/java/edu/wpi/first/hal/sim/SpiReadAutoReceiveBufferCallback.java
rename to hal/src/main/java/edu/wpi/first/hal/simulation/SpiReadAutoReceiveBufferCallback.java
index 5083fab..8061b5b 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/SpiReadAutoReceiveBufferCallback.java
+++ b/hal/src/main/java/edu/wpi/first/hal/simulation/SpiReadAutoReceiveBufferCallback.java
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim;
+package edu.wpi.first.hal.simulation;
 
 public interface SpiReadAutoReceiveBufferCallback {
   int callback(String name, int[] buffer, int numToRead);
diff --git a/hal/src/main/java/edu/wpi/first/hal/util/AllocationException.java b/hal/src/main/java/edu/wpi/first/hal/util/AllocationException.java
index 6f789d8..42e2059 100644
--- a/hal/src/main/java/edu/wpi/first/hal/util/AllocationException.java
+++ b/hal/src/main/java/edu/wpi/first/hal/util/AllocationException.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2008-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2008-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,6 +10,7 @@
 /**
  * Exception indicating that the resource is already allocated.
  */
+@SuppressWarnings("serial")
 public class AllocationException extends RuntimeException {
   /**
    * Create a new AllocationException.
diff --git a/hal/src/main/java/edu/wpi/first/hal/util/BoundaryException.java b/hal/src/main/java/edu/wpi/first/hal/util/BoundaryException.java
index 8f21e60..8fef4c9 100644
--- a/hal/src/main/java/edu/wpi/first/hal/util/BoundaryException.java
+++ b/hal/src/main/java/edu/wpi/first/hal/util/BoundaryException.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2008-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2008-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,6 +10,7 @@
 /**
  * This exception represents an error in which a lower limit was set as higher than an upper limit.
  */
+@SuppressWarnings("serial")
 public class BoundaryException extends RuntimeException {
   /**
    * Create a new exception with the given message.
diff --git a/hal/src/main/java/edu/wpi/first/hal/util/CheckedAllocationException.java b/hal/src/main/java/edu/wpi/first/hal/util/CheckedAllocationException.java
index f17e381..d9a8a80 100644
--- a/hal/src/main/java/edu/wpi/first/hal/util/CheckedAllocationException.java
+++ b/hal/src/main/java/edu/wpi/first/hal/util/CheckedAllocationException.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2008-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2008-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,6 +11,7 @@
  * Exception indicating that the resource is already allocated This is meant to be thrown by the
  * resource class.
  */
+@SuppressWarnings("serial")
 public class CheckedAllocationException extends Exception {
   /**
    * Create a new CheckedAllocationException.
diff --git a/hal/src/main/java/edu/wpi/first/hal/util/HalHandleException.java b/hal/src/main/java/edu/wpi/first/hal/util/HalHandleException.java
index 874b07a..a775ec4 100644
--- a/hal/src/main/java/edu/wpi/first/hal/util/HalHandleException.java
+++ b/hal/src/main/java/edu/wpi/first/hal/util/HalHandleException.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2008-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2008-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,8 +8,9 @@
 package edu.wpi.first.hal.util;
 
 /**
- * Exception indicating that an error has occured with a HAL Handle.
+ * Exception indicating that an error has occurred with a HAL Handle.
  */
+@SuppressWarnings("serial")
 public class HalHandleException extends RuntimeException {
   /**
    * Create a new HalHandleException.
diff --git a/hal/src/main/java/edu/wpi/first/hal/util/UncleanStatusException.java b/hal/src/main/java/edu/wpi/first/hal/util/UncleanStatusException.java
index 3a3e217..3d6ab36 100644
--- a/hal/src/main/java/edu/wpi/first/hal/util/UncleanStatusException.java
+++ b/hal/src/main/java/edu/wpi/first/hal/util/UncleanStatusException.java
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2008-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2008-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,6 +10,7 @@
 /**
  * Exception for bad status codes from the chip object.
  */
+@SuppressWarnings("serial")
 public final class UncleanStatusException extends IllegalStateException {
   private final int m_statusCode;
 
diff --git a/hal/src/main/native/athena/Accelerometer.cpp b/hal/src/main/native/athena/Accelerometer.cpp
index f83c06e..bc4d502 100644
--- a/hal/src/main/native/athena/Accelerometer.cpp
+++ b/hal/src/main/native/athena/Accelerometer.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -176,7 +176,7 @@
  * 1 g-force, taking into account the accelerometer range.
  */
 static double unpackAxis(int16_t raw) {
-  // The raw value is actually 12 bits, not 16, so we need to propogate the
+  // The raw value is actually 12 bits, not 16, so we need to propagate the
   // 2's complement sign bit to the unused 4 bits for this to work with
   // negative numbers.
   raw <<= 4;
diff --git a/hal/src/main/native/athena/AddressableLED.cpp b/hal/src/main/native/athena/AddressableLED.cpp
index 64b6457..7334c99 100644
--- a/hal/src/main/native/athena/AddressableLED.cpp
+++ b/hal/src/main/native/athena/AddressableLED.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,6 +15,7 @@
 #include "DigitalInternal.h"
 #include "HALInitializer.h"
 #include "PortsInternal.h"
+#include "hal/AddressableLEDTypes.h"
 #include "hal/ChipObject.h"
 #include "hal/handles/HandlesInternal.h"
 #include "hal/handles/LimitedHandleResource.h"
diff --git a/hal/src/main/native/athena/AnalogInternal.cpp b/hal/src/main/native/athena/AnalogInternal.cpp
index 03a246d..6ac16b8 100644
--- a/hal/src/main/native/athena/AnalogInternal.cpp
+++ b/hal/src/main/native/athena/AnalogInternal.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -93,7 +93,7 @@
   config.ConvertRate = ticksPerConversion;
   analogInputSystem->writeConfig(config, status);
 
-  // Indicate that the scan size has been commited to hardware.
+  // Indicate that the scan size has been committed to hardware.
   setAnalogNumChannelsToActivate(0);
 }
 
diff --git a/hal/src/main/native/athena/CANAPI.cpp b/hal/src/main/native/athena/CANAPI.cpp
index 44cdb58..d460885 100644
--- a/hal/src/main/native/athena/CANAPI.cpp
+++ b/hal/src/main/native/athena/CANAPI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,7 +7,6 @@
 
 #include "hal/CANAPI.h"
 
-#include <atomic>
 #include <ctime>
 
 #include <wpi/DenseMap.h>
@@ -15,7 +14,6 @@
 #include "HALInitializer.h"
 #include "hal/CAN.h"
 #include "hal/Errors.h"
-#include "hal/HAL.h"
 #include "hal/handles/UnlimitedHandleResource.h"
 
 using namespace hal;
diff --git a/hal/src/main/native/athena/DMA.cpp b/hal/src/main/native/athena/DMA.cpp
index 19c3068..ee39d2d 100644
--- a/hal/src/main/native/athena/DMA.cpp
+++ b/hal/src/main/native/athena/DMA.cpp
@@ -18,7 +18,7 @@
 #include "EncoderInternal.h"
 #include "PortsInternal.h"
 #include "hal/AnalogAccumulator.h"
-//#include "hal/AnalogGyro.h"
+#include "hal/AnalogGyro.h"
 #include "hal/AnalogInput.h"
 #include "hal/ChipObject.h"
 #include "hal/Errors.h"
diff --git a/hal/src/main/native/athena/DutyCycle.cpp b/hal/src/main/native/athena/DutyCycle.cpp
index 1c1a678..3749a2b 100644
--- a/hal/src/main/native/athena/DutyCycle.cpp
+++ b/hal/src/main/native/athena/DutyCycle.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -75,6 +75,9 @@
   dutyCycleHandles->Free(dutyCycleHandle);
 }
 
+void HAL_SetDutyCycleSimDevice(HAL_EncoderHandle handle,
+                               HAL_SimDeviceHandle device) {}
+
 int32_t HAL_GetDutyCycleFrequency(HAL_DutyCycleHandle dutyCycleHandle,
                                   int32_t* status) {
   auto dutyCycle = dutyCycleHandles->Get(dutyCycleHandle);
diff --git a/hal/src/main/native/athena/FRCDriverStation.cpp b/hal/src/main/native/athena/FRCDriverStation.cpp
index 5b29815..51fe327 100644
--- a/hal/src/main/native/athena/FRCDriverStation.cpp
+++ b/hal/src/main/native/athena/FRCDriverStation.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -124,7 +124,7 @@
 
 static wpi::mutex* newDSDataAvailableMutex;
 static wpi::condition_variable* newDSDataAvailableCond;
-static std::atomic_int newDSDataAvailableCounter{0};
+static int newDSDataAvailableCounter{0};
 
 namespace hal {
 namespace init {
@@ -176,27 +176,27 @@
 
     if (baseLength + detailsRef.size() + locationRef.size() +
             callStackRef.size() <=
-        65536) {
+        65535) {
       // Pass through
       retval = FRC_NetworkCommunication_sendError(isError, errorCode, isLVCode,
                                                   details, location, callStack);
-    } else if (baseLength + detailsRef.size() > 65536) {
+    } else if (baseLength + detailsRef.size() > 65535) {
       // Details too long, cut both location and stack
-      auto newLen = 65536 - baseLength;
+      auto newLen = 65535 - baseLength;
       std::string newDetails{details, newLen};
       char empty = '\0';
       retval = FRC_NetworkCommunication_sendError(
           isError, errorCode, isLVCode, newDetails.c_str(), &empty, &empty);
-    } else if (baseLength + detailsRef.size() + locationRef.size() > 65536) {
+    } else if (baseLength + detailsRef.size() + locationRef.size() > 65535) {
       // Location too long, cut stack
-      auto newLen = 65536 - baseLength - detailsRef.size();
+      auto newLen = 65535 - baseLength - detailsRef.size();
       std::string newLocation{location, newLen};
       char empty = '\0';
       retval = FRC_NetworkCommunication_sendError(
           isError, errorCode, isLVCode, details, newLocation.c_str(), &empty);
     } else {
       // Stack too long
-      auto newLen = 65536 - baseLength - detailsRef.size() - locationRef.size();
+      auto newLen = 65535 - baseLength - detailsRef.size() - locationRef.size();
       std::string newCallStack{callStack, newLen};
       retval = FRC_NetworkCommunication_sendError(isError, errorCode, isLVCode,
                                                   details, location,
@@ -229,6 +229,18 @@
   return retval;
 }
 
+int32_t HAL_SendConsoleLine(const char* line) {
+  wpi::StringRef lineRef{line};
+  if (lineRef.size() <= 65535) {
+    // Send directly
+    return FRC_NetworkCommunication_sendConsoleLine(line);
+  } else {
+    // Need to truncate
+    std::string newLine{line, 65535};
+    return FRC_NetworkCommunication_sendConsoleLine(newLine.c_str());
+  }
+}
+
 int32_t HAL_GetControlWord(HAL_ControlWord* controlWord) {
   return HAL_GetControlWordInternal(controlWord);
 }
@@ -343,41 +355,14 @@
   // will return false when instead it should return true. However, this at a
   // 20ms rate occurs once every 2.7 years of DS connected runtime, so not
   // worth the cycles to check.
-  thread_local int lastCount{-1};
+  thread_local int lastCount{0};
   return lastCount;
 }
 
-void HAL_WaitForCachedControlData(void) {
-  HAL_WaitForCachedControlDataTimeout(0);
-}
-
-HAL_Bool HAL_WaitForCachedControlDataTimeout(double timeout) {
-  int& lastCount = GetThreadLocalLastCount();
-  int currentCount = newDSDataAvailableCounter.load();
-  if (lastCount != currentCount) {
-    lastCount = currentCount;
-    return true;
-  }
-  auto timeoutTime =
-      std::chrono::steady_clock::now() + std::chrono::duration<double>(timeout);
-
-  std::unique_lock lock{*newDSDataAvailableMutex};
-  while (newDSDataAvailableCounter.load() == currentCount) {
-    if (timeout > 0) {
-      auto timedOut = newDSDataAvailableCond->wait_until(lock, timeoutTime);
-      if (timedOut == std::cv_status::timeout) {
-        return false;
-      }
-    } else {
-      newDSDataAvailableCond->wait(lock);
-    }
-  }
-  return true;
-}
-
 HAL_Bool HAL_IsNewControlData(void) {
+  std::scoped_lock lock{*newDSDataAvailableMutex};
   int& lastCount = GetThreadLocalLastCount();
-  int currentCount = newDSDataAvailableCounter.load();
+  int currentCount = newDSDataAvailableCounter;
   if (lastCount == currentCount) return false;
   lastCount = currentCount;
   return true;
@@ -394,12 +379,17 @@
  * time has passed. Returns true on new data, false on timeout.
  */
 HAL_Bool HAL_WaitForDSDataTimeout(double timeout) {
+  std::unique_lock lock{*newDSDataAvailableMutex};
+  int& lastCount = GetThreadLocalLastCount();
+  int currentCount = newDSDataAvailableCounter;
+  if (lastCount != currentCount) {
+    lastCount = currentCount;
+    return true;
+  }
   auto timeoutTime =
       std::chrono::steady_clock::now() + std::chrono::duration<double>(timeout);
 
-  int currentCount = newDSDataAvailableCounter.load();
-  std::unique_lock lock{*newDSDataAvailableMutex};
-  while (newDSDataAvailableCounter.load() == currentCount) {
+  while (newDSDataAvailableCounter == currentCount) {
     if (timeout > 0) {
       auto timedOut = newDSDataAvailableCond->wait_until(lock, timeoutTime);
       if (timedOut == std::cv_status::timeout) {
@@ -409,6 +399,7 @@
       newDSDataAvailableCond->wait(lock);
     }
   }
+  lastCount = newDSDataAvailableCounter;
   return true;
 }
 
@@ -419,8 +410,9 @@
   // Since we could get other values, require our specific handle
   // to signal our threads
   if (refNum != refNumber) return;
+  std::scoped_lock lock{*newDSDataAvailableMutex};
   // Notify all threads
-  newDSDataAvailableCounter.fetch_add(1);
+  ++newDSDataAvailableCounter;
   newDSDataAvailableCond->notify_all();
 }
 
diff --git a/hal/src/main/native/athena/HAL.cpp b/hal/src/main/native/athena/HAL.cpp
index f698fa0..17ef0b9 100644
--- a/hal/src/main/native/athena/HAL.cpp
+++ b/hal/src/main/native/athena/HAL.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -24,12 +24,14 @@
 #include <wpi/timestamp.h>
 
 #include "HALInitializer.h"
+#include "HALInternal.h"
 #include "ctre/ctre.h"
 #include "hal/ChipObject.h"
 #include "hal/DriverStation.h"
 #include "hal/Errors.h"
 #include "hal/Notifier.h"
 #include "hal/handles/HandlesInternal.h"
+#include "visa/visa.h"
 
 using namespace hal;
 
@@ -44,6 +46,7 @@
   InitializeAddressableLED();
   InitializeAccelerometer();
   InitializeAnalogAccumulator();
+  InitializeAnalogGyro();
   InitializeAnalogInput();
   InitializeAnalogInternal();
   InitializeAnalogOutput();
@@ -61,7 +64,7 @@
   InitializeFPGAEncoder();
   InitializeFRCDriverStation();
   InitializeI2C();
-  InitialzeInterrupts();
+  InitializeInterrupts();
   InitializeMain();
   InitializeNotifier();
   InitializePCMInternal();
@@ -70,11 +73,22 @@
   InitializePower();
   InitializePWM();
   InitializeRelay();
+  InitializeSerialPort();
   InitializeSolenoid();
   InitializeSPI();
   InitializeThreads();
 }
 }  // namespace init
+
+void ReleaseFPGAInterrupt(int32_t interruptNumber) {
+  if (!global) {
+    return;
+  }
+  int32_t status = 0;
+  global->writeInterruptForceNumber(static_cast<unsigned char>(interruptNumber),
+                                    &status);
+  global->strobeInterruptForceOnce(&status);
+}
 }  // namespace hal
 
 extern "C" {
@@ -170,6 +184,30 @@
       return ERR_CANSessionMux_NotAllowed_MESSAGE;
     case HAL_ERR_CANSessionMux_NotInitialized:
       return ERR_CANSessionMux_NotInitialized_MESSAGE;
+    case VI_ERROR_SYSTEM_ERROR:
+      return VI_ERROR_SYSTEM_ERROR_MESSAGE;
+    case VI_ERROR_INV_OBJECT:
+      return VI_ERROR_INV_OBJECT_MESSAGE;
+    case VI_ERROR_RSRC_LOCKED:
+      return VI_ERROR_RSRC_LOCKED_MESSAGE;
+    case VI_ERROR_RSRC_NFOUND:
+      return VI_ERROR_RSRC_NFOUND_MESSAGE;
+    case VI_ERROR_INV_RSRC_NAME:
+      return VI_ERROR_INV_RSRC_NAME_MESSAGE;
+    case VI_ERROR_QUEUE_OVERFLOW:
+      return VI_ERROR_QUEUE_OVERFLOW_MESSAGE;
+    case VI_ERROR_IO:
+      return VI_ERROR_IO_MESSAGE;
+    case VI_ERROR_ASRL_PARITY:
+      return VI_ERROR_ASRL_PARITY_MESSAGE;
+    case VI_ERROR_ASRL_FRAMING:
+      return VI_ERROR_ASRL_FRAMING_MESSAGE;
+    case VI_ERROR_ASRL_OVERRUN:
+      return VI_ERROR_ASRL_OVERRUN_MESSAGE;
+    case VI_ERROR_RSRC_BUSY:
+      return VI_ERROR_RSRC_BUSY_MESSAGE;
+    case VI_ERROR_INV_PARAMETER:
+      return VI_ERROR_INV_PARAMETER_MESSAGE;
     case HAL_PWM_SCALE_ERROR:
       return HAL_PWM_SCALE_ERROR_MESSAGE;
     case HAL_SERIAL_PORT_NOT_FOUND:
@@ -296,7 +334,7 @@
       kill(pid, SIGTERM);  // try to kill it
       std::this_thread::sleep_for(std::chrono::milliseconds(timeout));
       if (kill(pid, 0) == 0) {
-        // still not successfull
+        // still not successful
         wpi::outs() << "FRC pid " << pid << " did not die within " << timeout
                     << "ms. Force killing with kill -9\n";
         // Force kill -9
@@ -352,9 +390,8 @@
     setNewDataSem(nullptr);
   });
 
-  // image 4; Fixes errors caused by multiple processes. Talk to NI about this
   nFPGA::nRoboRIO_FPGANamespace::g_currentTargetClass =
-      nLoadOut::kTargetClass_RoboRIO;
+      nLoadOut::getTargetClass();
 
   int32_t status = 0;
   global.reset(tGlobal::create(&status));
@@ -383,6 +420,8 @@
   return true;
 }
 
+void HAL_Shutdown(void) {}
+
 int64_t HAL_Report(int32_t resource, int32_t instanceNumber, int32_t context,
                    const char* feature) {
   if (feature == nullptr) {
diff --git a/hal/src/main/native/athena/HALInitializer.cpp b/hal/src/main/native/athena/HALInitializer.cpp
index a0456d4..5c2242b 100644
--- a/hal/src/main/native/athena/HALInitializer.cpp
+++ b/hal/src/main/native/athena/HALInitializer.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,7 +7,7 @@
 
 #include "HALInitializer.h"
 
-#include "hal/HAL.h"
+#include "hal/HALBase.h"
 
 namespace hal {
 namespace init {
diff --git a/hal/src/main/native/athena/HALInitializer.h b/hal/src/main/native/athena/HALInitializer.h
index cf59394..c54660f 100644
--- a/hal/src/main/native/athena/HALInitializer.h
+++ b/hal/src/main/native/athena/HALInitializer.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -21,6 +21,7 @@
 extern void InitializeAccelerometer();
 extern void InitializeAddressableLED();
 extern void InitializeAnalogAccumulator();
+extern void InitializeAnalogGyro();
 extern void InitializeAnalogInput();
 extern void InitializeAnalogInternal();
 extern void InitializeAnalogOutput();
@@ -39,7 +40,7 @@
 extern void InitializeFRCDriverStation();
 extern void InitializeHAL();
 extern void InitializeI2C();
-extern void InitialzeInterrupts();
+extern void InitializeInterrupts();
 extern void InitializeMain();
 extern void InitializeNotifier();
 extern void InitializePCMInternal();
@@ -48,6 +49,7 @@
 extern void InitializePower();
 extern void InitializePWM();
 extern void InitializeRelay();
+extern void InitializeSerialPort();
 extern void InitializeSolenoid();
 extern void InitializeSPI();
 extern void InitializeThreads();
diff --git a/hal/src/main/java/edu/wpi/first/hal/sim/ConstBufferCallback.java b/hal/src/main/native/athena/HALInternal.h
similarity index 68%
copy from hal/src/main/java/edu/wpi/first/hal/sim/ConstBufferCallback.java
copy to hal/src/main/native/athena/HALInternal.h
index a4251c2..e3033bf 100644
--- a/hal/src/main/java/edu/wpi/first/hal/sim/ConstBufferCallback.java
+++ b/hal/src/main/native/athena/HALInternal.h
@@ -1,12 +1,15 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2020 FIRST. All Rights Reserved.                             */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-package edu.wpi.first.hal.sim;
+#pragma once
 
-public interface ConstBufferCallback {
-  void callback(String name, byte[] buffer, int count);
-}
+#include <stdint.h>
+
+namespace hal {
+void ReleaseFPGAInterrupt(int32_t interruptNumber);
+
+}  // namespace hal
diff --git a/hal/src/main/native/athena/Interrupts.cpp b/hal/src/main/native/athena/Interrupts.cpp
index 78d518c..a330e3c 100644
--- a/hal/src/main/native/athena/Interrupts.cpp
+++ b/hal/src/main/native/athena/Interrupts.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,9 +13,11 @@
 
 #include "DigitalInternal.h"
 #include "HALInitializer.h"
+#include "HALInternal.h"
 #include "PortsInternal.h"
 #include "hal/ChipObject.h"
 #include "hal/Errors.h"
+#include "hal/HALBase.h"
 #include "hal/handles/HandlesInternal.h"
 #include "hal/handles/LimitedHandleResource.h"
 
@@ -82,7 +84,7 @@
 
 namespace hal {
 namespace init {
-void InitialzeInterrupts() {
+void InitializeInterrupts() {
   static LimitedHandleResource<HAL_InterruptHandle, Interrupt, kNumInterrupts,
                                HAL_HandleEnum::Interrupt>
       iH;
@@ -268,4 +270,19 @@
   anInterrupt->anInterrupt->writeConfig_FallingEdge(fallingEdge, status);
 }
 
+void HAL_ReleaseWaitingInterrupt(HAL_InterruptHandle interruptHandle,
+                                 int32_t* status) {
+  auto anInterrupt = interruptHandles->Get(interruptHandle);
+  if (anInterrupt == nullptr) {
+    *status = HAL_HANDLE_ERROR;
+    return;
+  }
+
+  uint32_t interruptIndex =
+      static_cast<uint32_t>(getHandleIndex(interruptHandle));
+
+  hal::ReleaseFPGAInterrupt(interruptIndex);
+  hal::ReleaseFPGAInterrupt(interruptIndex + 8);
+}
+
 }  // extern "C"
diff --git a/hal/src/main/native/athena/Notifier.cpp b/hal/src/main/native/athena/Notifier.cpp
index c30e8d1..905c440 100644
--- a/hal/src/main/native/athena/Notifier.cpp
+++ b/hal/src/main/native/athena/Notifier.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,11 +10,13 @@
 #include <atomic>
 #include <cstdlib>  // For std::atexit()
 #include <memory>
+#include <thread>
 
 #include <wpi/condition_variable.h>
 #include <wpi/mutex.h>
 
 #include "HALInitializer.h"
+#include "HALInternal.h"
 #include "hal/ChipObject.h"
 #include "hal/Errors.h"
 #include "hal/HAL.h"
@@ -26,7 +28,7 @@
 
 static wpi::mutex notifierMutex;
 static std::unique_ptr<tAlarm> notifierAlarm;
-static std::unique_ptr<tInterruptManager> notifierManager;
+static std::thread notifierThread;
 static uint64_t closestTrigger{UINT64_MAX};
 
 namespace {
@@ -43,6 +45,7 @@
 
 static std::atomic_flag notifierAtexitRegistered{ATOMIC_FLAG_INIT};
 static std::atomic_int notifierRefCount{0};
+static std::atomic_bool notifierRunning{false};
 
 using namespace hal;
 
@@ -65,7 +68,7 @@
 
 static NotifierHandleContainer* notifierHandles;
 
-static void alarmCallback(uint32_t, void*) {
+static void alarmCallback() {
   std::scoped_lock lock(notifierMutex);
   int32_t status = 0;
   uint64_t currentTime = 0;
@@ -97,9 +100,24 @@
   }
 }
 
+static void notifierThreadMain() {
+  tRioStatusCode status = 0;
+  tInterruptManager manager{1 << kTimerInterruptNumber, true, &status};
+  while (notifierRunning) {
+    auto triggeredMask = manager.watch(10000, false, &status);
+    if (!notifierRunning) break;
+    if (triggeredMask == 0) continue;
+    alarmCallback();
+  }
+}
+
 static void cleanupNotifierAtExit() {
+  int32_t status = 0;
+  if (notifierAlarm) notifierAlarm->writeEnable(false, &status);
   notifierAlarm = nullptr;
-  notifierManager = nullptr;
+  notifierRunning = false;
+  hal::ReleaseFPGAInterrupt(kTimerInterruptNumber);
+  if (notifierThread.joinable()) notifierThread.join();
 }
 
 namespace hal {
@@ -120,14 +138,9 @@
 
   if (notifierRefCount.fetch_add(1) == 0) {
     std::scoped_lock lock(notifierMutex);
-    // create manager and alarm if not already created
-    if (!notifierManager) {
-      notifierManager = std::make_unique<tInterruptManager>(
-          1 << kTimerInterruptNumber, false, status);
-      notifierManager->registerHandler(alarmCallback, nullptr, status);
-      notifierManager->enable(status);
-    }
-    if (!notifierAlarm) notifierAlarm.reset(tAlarm::create(status));
+    notifierRunning = true;
+    notifierThread = std::thread(notifierThreadMain);
+    notifierAlarm.reset(tAlarm::create(status));
   }
 
   std::shared_ptr<Notifier> notifier = std::make_shared<Notifier>();
@@ -169,21 +182,19 @@
   notifier->cond.notify_all();
 
   if (notifierRefCount.fetch_sub(1) == 1) {
-    // if this was the last notifier, clean up alarm and manager
+    // if this was the last notifier, clean up alarm and thread
     // the notifier can call back into our callback, so don't hold the lock
     // here (the atomic fetch_sub will prevent multiple parallel entries
     // into this function)
 
-    // Cleaning up the manager takes up to a second to complete, so don't do
-    // that here. Fix it more permanently in 2019...
+    if (notifierAlarm) notifierAlarm->writeEnable(false, status);
+    notifierRunning = false;
+    hal::ReleaseFPGAInterrupt(kTimerInterruptNumber);
+    if (notifierThread.joinable()) notifierThread.join();
 
-    // if (notifierAlarm) notifierAlarm->writeEnable(false, status);
-    // if (notifierManager) notifierManager->disable(status);
-
-    // std::scoped_lock lock(notifierMutex);
-    // notifierAlarm = nullptr;
-    // notifierManager = nullptr;
-    // closestTrigger = UINT64_MAX;
+    std::scoped_lock lock(notifierMutex);
+    notifierAlarm = nullptr;
+    closestTrigger = UINT64_MAX;
   }
 }
 
diff --git a/hal/src/main/native/athena/PCMInternal.cpp b/hal/src/main/native/athena/PCMInternal.cpp
index dee64cf..c81dc1a 100644
--- a/hal/src/main/native/athena/PCMInternal.cpp
+++ b/hal/src/main/native/athena/PCMInternal.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,7 +8,6 @@
 #include "PCMInternal.h"
 
 #include "HALInitializer.h"
-#include "PortsInternal.h"
 #include "hal/Errors.h"
 #include "hal/Solenoid.h"
 
diff --git a/hal/src/main/native/athena/PCMInternal.h b/hal/src/main/native/athena/PCMInternal.h
index 52f0f75..a9d076c 100644
--- a/hal/src/main/native/athena/PCMInternal.h
+++ b/hal/src/main/native/athena/PCMInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -14,7 +14,6 @@
 #include "PortsInternal.h"
 #include "ctre/PCM.h"
 #include "hal/Errors.h"
-#include "hal/Ports.h"
 #include "hal/Solenoid.h"
 
 namespace hal {
diff --git a/hal/src/main/native/athena/PDP.cpp b/hal/src/main/native/athena/PDP.cpp
index f5cf92b..f60e881 100644
--- a/hal/src/main/native/athena/PDP.cpp
+++ b/hal/src/main/native/athena/PDP.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,16 +7,12 @@
 
 #include "hal/PDP.h"
 
-#include <memory>
-
 #include <wpi/mutex.h>
 
 #include "HALInitializer.h"
 #include "PortsInternal.h"
 #include "hal/CANAPI.h"
 #include "hal/Errors.h"
-#include "hal/Ports.h"
-#include "hal/handles/IndexedHandleResource.h"
 
 using namespace hal;
 
@@ -438,7 +434,7 @@
   energyJoules *=
       pdpStatus.bits
           .TmeasMs_likelywillbe20ms_; /* multiplied by TmeasMs = joules */
-  return 0.125 * raw;
+  return energyJoules;
 }
 
 void HAL_ResetPDPTotalEnergy(HAL_PDPHandle handle, int32_t* status) {
diff --git a/hal/src/main/native/athena/Relay.cpp b/hal/src/main/native/athena/Relay.cpp
index 71880a8..4dffa36 100644
--- a/hal/src/main/native/athena/Relay.cpp
+++ b/hal/src/main/native/athena/Relay.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -88,8 +88,8 @@
 
 HAL_Bool HAL_CheckRelayChannel(int32_t channel) {
   // roboRIO only has 4 headers, and the FPGA has
-  // seperate functions for forward and reverse,
-  // instead of seperate channel IDs
+  // separate functions for forward and reverse,
+  // instead of separate channel IDs
   return channel < kNumRelayHeaders && channel >= 0;
 }
 
diff --git a/hal/src/main/native/athena/SPI.cpp b/hal/src/main/native/athena/SPI.cpp
index 977d447..37c5f0e 100644
--- a/hal/src/main/native/athena/SPI.cpp
+++ b/hal/src/main/native/athena/SPI.cpp
@@ -565,18 +565,12 @@
 void HAL_SetSPIAutoTransmitData(HAL_SPIPort port, const uint8_t* dataToSend,
                                 int32_t dataSize, int32_t zeroSize,
                                 int32_t* status) {
-  static_assert(tSPI::kNumAutoTxRegisters >= 6,
-                "FPGA does not have enough tx registers");
-  static_assert(tSPI::kNumAutoTxElements == 4,
-                "FPGA has the wrong number of tx elements");
-  // 24 = 6 * 4, but the documentation needs updating if it ever changes, so
-  // just hard-code it here.
-  if (dataSize < 0 || dataSize > 23) {
+  if (dataSize < 0 || dataSize > 32) {
     *status = PARAMETER_OUT_OF_RANGE;
     return;
   }
 
-  if (zeroSize < 0 || zeroSize >= 128) {
+  if (zeroSize < 0 || zeroSize > 127) {
     *status = PARAMETER_OUT_OF_RANGE;
     return;
   }
diff --git a/hal/src/main/native/athena/Solenoid.cpp b/hal/src/main/native/athena/Solenoid.cpp
index c53db11..ab563b3 100644
--- a/hal/src/main/native/athena/Solenoid.cpp
+++ b/hal/src/main/native/athena/Solenoid.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,15 +7,11 @@
 
 #include "hal/Solenoid.h"
 
-#include <FRC_NetworkCommunication/LoadOut.h>
-
 #include "HALInitializer.h"
 #include "PCMInternal.h"
 #include "PortsInternal.h"
 #include "ctre/PCM.h"
-#include "hal/ChipObject.h"
 #include "hal/Errors.h"
-#include "hal/Ports.h"
 #include "hal/handles/HandlesInternal.h"
 #include "hal/handles/IndexedHandleResource.h"
 
diff --git a/hal/src/main/native/athena/cpp/SerialHelper.cpp b/hal/src/main/native/athena/cpp/SerialHelper.cpp
index e312e2a..2156147 100644
--- a/hal/src/main/native/athena/cpp/SerialHelper.cpp
+++ b/hal/src/main/native/athena/cpp/SerialHelper.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -199,7 +199,7 @@
 
     *status = viGetAttribute(vSession, VI_ATTR_INTF_INST_NAME, &osName);
     // Ignore an error here, as we want to close the session on an error
-    // Use a seperate close variable so we can check
+    // Use a separate close variable so we can check
     ViStatus closeStatus = viClose(vSession);
     if (*status < 0) goto done;
     if (closeStatus < 0) goto done;
diff --git a/hal/src/main/native/athena/ctre/CtreCanNode.h b/hal/src/main/native/athena/ctre/CtreCanNode.h
index f00060d..ce2d6ac 100644
--- a/hal/src/main/native/athena/ctre/CtreCanNode.h
+++ b/hal/src/main/native/athena/ctre/CtreCanNode.h
@@ -2,8 +2,6 @@
 #define CtreCanNode_H_
 #include "ctre.h"				//BIT Defines + Typedefs
 #include <map>
-#include <string.h> // memcpy
-#include <sys/time.h>
 #include <wpi/mutex.h>
 class CtreCanNode
 {
diff --git a/hal/src/main/native/athena/ctre/PCM.cpp b/hal/src/main/native/athena/ctre/PCM.cpp
index e05d4d4..4fd633f 100644
--- a/hal/src/main/native/athena/ctre/PCM.cpp
+++ b/hal/src/main/native/athena/ctre/PCM.cpp
@@ -2,7 +2,6 @@
 
 #include "PCM.h"
 #include "FRC_NetworkCommunication/CANSessionMux.h"
-#include <string.h> // memset
 /* This can be a constant, as long as nobody needs to update solenoids within
     1/50 of a second. */
 static const INT32 kCANPeriod = 20;
diff --git a/hal/src/main/native/athena/ctre/PCM.h b/hal/src/main/native/athena/ctre/PCM.h
index b485219..4923202 100644
--- a/hal/src/main/native/athena/ctre/PCM.h
+++ b/hal/src/main/native/athena/ctre/PCM.h
@@ -57,7 +57,7 @@
 
     /* Get compressor state
      * @Return	-	CTR_Code	-	Error code (if any)
-     * @Param	-	status		-	True if compress ouput is on, false if otherwise
+     * @Param	-	status		-	True if compress output is on, false if otherwise
      */
     CTR_Code	GetCompressor(bool &status);
 
diff --git a/hal/src/main/native/athena/mockdata/AccelerometerData.cpp b/hal/src/main/native/athena/mockdata/AccelerometerData.cpp
new file mode 100644
index 0000000..2baaf78
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/AccelerometerData.cpp
@@ -0,0 +1,28 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/AccelerometerData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetAccelerometerData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, Accelerometer##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Active, false)
+DEFINE_CAPI(HAL_AccelerometerRange, Range, HAL_AccelerometerRange_k2G)
+DEFINE_CAPI(double, X, 0)
+DEFINE_CAPI(double, Y, 0)
+DEFINE_CAPI(double, Z, 0)
+
+void HALSIM_RegisterAccelerometerAllCallbacks(int32_t index,
+                                              HAL_NotifyCallback callback,
+                                              void* param,
+                                              HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/AddressableLEDData.cpp b/hal/src/main/native/athena/mockdata/AddressableLEDData.cpp
new file mode 100644
index 0000000..d718789
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/AddressableLEDData.cpp
@@ -0,0 +1,45 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/AddressableLEDData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+
+int32_t HALSIM_FindAddressableLEDForChannel(int32_t channel) { return 0; }
+
+void HALSIM_ResetAddressableLEDData(int32_t index) {}
+
+int32_t HALSIM_GetAddressableLEDData(int32_t index,
+                                     struct HAL_AddressableLEDData* data) {
+  return 0;
+}
+
+void HALSIM_SetAddressableLEDData(int32_t index,
+                                  const struct HAL_AddressableLEDData* data,
+                                  int32_t length) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, AddressableLED##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(int32_t, OutputPort, 0)
+DEFINE_CAPI(int32_t, Length, 0)
+DEFINE_CAPI(HAL_Bool, Running, false)
+
+#undef DEFINE_CAPI
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMCALLBACKREGISTRY_STUB_CAPI(TYPE, HALSIM, AddressableLED##CAPINAME)
+
+DEFINE_CAPI(HAL_ConstBufferCallback, Data, data)
+
+void HALSIM_RegisterAddressableLEDAllCallbacks(int32_t index,
+                                               HAL_NotifyCallback callback,
+                                               void* param,
+                                               HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/AnalogGyroData.cpp b/hal/src/main/native/athena/mockdata/AnalogGyroData.cpp
new file mode 100644
index 0000000..d91ce27
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/AnalogGyroData.cpp
@@ -0,0 +1,26 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/AnalogGyroData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetAnalogGyroData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, AnalogGyro##CAPINAME, RETURN)
+
+DEFINE_CAPI(double, Angle, 0)
+DEFINE_CAPI(double, Rate, 0)
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+
+void HALSIM_RegisterAnalogGyroAllCallbacks(int32_t index,
+                                           HAL_NotifyCallback callback,
+                                           void* param,
+                                           HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/AnalogInData.cpp b/hal/src/main/native/athena/mockdata/AnalogInData.cpp
new file mode 100644
index 0000000..4288538
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/AnalogInData.cpp
@@ -0,0 +1,33 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/AnalogInData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetAnalogInData(int32_t index) {}
+
+HAL_SimDeviceHandle HALSIM_GetAnalogInSimDevice(int32_t index) { return 0; }
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, AnalogIn##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(int32_t, AverageBits, 0)
+DEFINE_CAPI(int32_t, OversampleBits, 0)
+DEFINE_CAPI(double, Voltage, 0)
+DEFINE_CAPI(HAL_Bool, AccumulatorInitialized, false)
+DEFINE_CAPI(int64_t, AccumulatorValue, 0)
+DEFINE_CAPI(int64_t, AccumulatorCount, 0)
+DEFINE_CAPI(int32_t, AccumulatorCenter, 0)
+DEFINE_CAPI(int32_t, AccumulatorDeadband, 0)
+
+void HALSIM_RegisterAnalogInAllCallbacks(int32_t index,
+                                         HAL_NotifyCallback callback,
+                                         void* param, HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/AnalogOutData.cpp b/hal/src/main/native/athena/mockdata/AnalogOutData.cpp
new file mode 100644
index 0000000..f05b0be
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/AnalogOutData.cpp
@@ -0,0 +1,25 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/AnalogOutData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetAnalogOutData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, AnalogOut##CAPINAME, RETURN)
+
+DEFINE_CAPI(double, Voltage, 0)
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+
+void HALSIM_RegisterAnalogOutAllCallbacks(int32_t index,
+                                          HAL_NotifyCallback callback,
+                                          void* param, HAL_Bool initialNotify) {
+}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/AnalogTriggerData.cpp b/hal/src/main/native/athena/mockdata/AnalogTriggerData.cpp
new file mode 100644
index 0000000..7781cf2
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/AnalogTriggerData.cpp
@@ -0,0 +1,31 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/AnalogTriggerData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+
+int32_t HALSIM_FindAnalogTriggerForChannel(int32_t channel) { return 0; }
+
+void HALSIM_ResetAnalogTriggerData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, AnalogTrigger##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(double, TriggerLowerBound, 0)
+DEFINE_CAPI(double, TriggerUpperBound, 0)
+DEFINE_CAPI(HALSIM_AnalogTriggerMode, TriggerMode,
+            HALSIM_AnalogTriggerUnassigned)
+
+void HALSIM_RegisterAnalogTriggerAllCallbacks(int32_t index,
+                                              HAL_NotifyCallback callback,
+                                              void* param,
+                                              HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/CanDataInternal.cpp b/hal/src/main/native/athena/mockdata/CanDataInternal.cpp
new file mode 100644
index 0000000..69debf0
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/CanDataInternal.cpp
@@ -0,0 +1,25 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/CanData.h"
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+
+void HALSIM_ResetCanData(void) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME) \
+  HAL_SIMCALLBACKREGISTRY_STUB_CAPI_NOINDEX(TYPE, HALSIM, Can##CAPINAME)
+
+DEFINE_CAPI(HAL_CAN_SendMessageCallback, SendMessage)
+DEFINE_CAPI(HAL_CAN_ReceiveMessageCallback, ReceiveMessage)
+DEFINE_CAPI(HAL_CAN_OpenStreamSessionCallback, OpenStream)
+DEFINE_CAPI(HAL_CAN_CloseStreamSessionCallback, CloseStream)
+DEFINE_CAPI(HAL_CAN_ReadStreamSessionCallback, ReadStream)
+DEFINE_CAPI(HAL_CAN_GetCANStatusCallback, GetCANStatus)
+
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/DIOData.cpp b/hal/src/main/native/athena/mockdata/DIOData.cpp
new file mode 100644
index 0000000..a06855d
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/DIOData.cpp
@@ -0,0 +1,28 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/DIOData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetDIOData(int32_t index) {}
+
+HAL_SimDeviceHandle HALSIM_GetDIOSimDevice(int32_t index) { return 0; }
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, DIO##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(HAL_Bool, Value, false)
+DEFINE_CAPI(double, PulseLength, 0)
+DEFINE_CAPI(HAL_Bool, IsInput, false)
+DEFINE_CAPI(int32_t, FilterIndex, 0)
+
+void HALSIM_RegisterDIOAllCallbacks(int32_t index, HAL_NotifyCallback callback,
+                                    void* param, HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/DigitalPWMData.cpp b/hal/src/main/native/athena/mockdata/DigitalPWMData.cpp
new file mode 100644
index 0000000..bcbe370
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/DigitalPWMData.cpp
@@ -0,0 +1,28 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/DigitalPWMData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+int32_t HALSIM_FindDigitalPWMForChannel(int32_t channel) { return 0; }
+
+void HALSIM_ResetDigitalPWMData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, DigitalPWM##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(double, DutyCycle, 0)
+DEFINE_CAPI(int32_t, Pin, 0)
+
+void HALSIM_RegisterDigitalPWMAllCallbacks(int32_t index,
+                                           HAL_NotifyCallback callback,
+                                           void* param,
+                                           HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/DriverStationData.cpp b/hal/src/main/native/athena/mockdata/DriverStationData.cpp
new file mode 100644
index 0000000..b4695ba
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/DriverStationData.cpp
@@ -0,0 +1,126 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/DriverStationData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetDriverStationData(void) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN)                                 \
+  HAL_SIMDATAVALUE_STUB_CAPI_NOINDEX(TYPE, HALSIM, DriverStation##CAPINAME, \
+                                     RETURN)
+
+DEFINE_CAPI(HAL_Bool, Enabled, false)
+DEFINE_CAPI(HAL_Bool, Autonomous, false)
+DEFINE_CAPI(HAL_Bool, Test, false)
+DEFINE_CAPI(HAL_Bool, EStop, false)
+DEFINE_CAPI(HAL_Bool, FmsAttached, false)
+DEFINE_CAPI(HAL_Bool, DsAttached, false)
+DEFINE_CAPI(HAL_AllianceStationID, AllianceStationId,
+            HAL_AllianceStationID_kRed1)
+DEFINE_CAPI(double, MatchTime, 0)
+
+#undef DEFINE_CAPI
+#define DEFINE_CAPI(name, data)                                                \
+  int32_t HALSIM_RegisterJoystick##name##Callback(                             \
+      int32_t joystickNum, HAL_Joystick##name##Callback callback, void* param, \
+      HAL_Bool initialNotify) {                                                \
+    return 0;                                                                  \
+  }                                                                            \
+                                                                               \
+  void HALSIM_CancelJoystick##name##Callback(int32_t uid) {}                   \
+                                                                               \
+  void HALSIM_GetJoystick##name(int32_t joystickNum, HAL_Joystick##name* d) {} \
+                                                                               \
+  void HALSIM_SetJoystick##name(int32_t joystickNum,                           \
+                                const HAL_Joystick##name* d) {}
+
+DEFINE_CAPI(Axes, axes)
+DEFINE_CAPI(POVs, povs)
+DEFINE_CAPI(Buttons, buttons)
+DEFINE_CAPI(Descriptor, descriptor)
+
+int32_t HALSIM_RegisterJoystickOutputsCallback(
+    int32_t joystickNum, HAL_JoystickOutputsCallback callback, void* param,
+    HAL_Bool initialNotify) {
+  return 0;
+}
+
+void HALSIM_CancelJoystickOutputsCallback(int32_t uid) {}
+
+void HALSIM_GetJoystickOutputs(int32_t joystickNum, int64_t* outputs,
+                               int32_t* leftRumble, int32_t* rightRumble) {}
+
+void HALSIM_SetJoystickOutputs(int32_t joystickNum, int64_t outputs,
+                               int32_t leftRumble, int32_t rightRumble) {}
+
+int32_t HALSIM_RegisterMatchInfoCallback(HAL_MatchInfoCallback callback,
+                                         void* param, HAL_Bool initialNotify) {
+  return 0;
+}
+
+void HALSIM_CancelMatchInfoCallback(int32_t uid) {}
+
+void HALSIM_GetMatchInfo(HAL_MatchInfo* info) {}
+
+void HALSIM_SetMatchInfo(const HAL_MatchInfo* info) {}
+
+int32_t HALSIM_RegisterDriverStationNewDataCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify) {
+  return 0;
+}
+
+void HALSIM_CancelDriverStationNewDataCallback(int32_t uid) {}
+
+void HALSIM_NotifyDriverStationNewData(void) {}
+
+void HALSIM_SetJoystickButton(int32_t stick, int32_t button, HAL_Bool state) {}
+
+void HALSIM_SetJoystickAxis(int32_t stick, int32_t axis, double value) {}
+
+void HALSIM_SetJoystickPOV(int32_t stick, int32_t pov, int32_t value) {}
+
+void HALSIM_SetJoystickButtonsValue(int32_t stick, uint32_t buttons) {}
+
+void HALSIM_SetJoystickAxisCount(int32_t stick, int32_t count) {}
+
+void HALSIM_SetJoystickPOVCount(int32_t stick, int32_t count) {}
+
+void HALSIM_SetJoystickButtonCount(int32_t stick, int32_t count) {}
+
+void HALSIM_GetJoystickCounts(int32_t stick, int32_t* axisCount,
+                              int32_t* buttonCount, int32_t* povCount) {
+  *axisCount = 0;
+  *buttonCount = 0;
+  *povCount = 0;
+}
+
+void HALSIM_SetJoystickIsXbox(int32_t stick, HAL_Bool isXbox) {}
+
+void HALSIM_SetJoystickType(int32_t stick, int32_t type) {}
+
+void HALSIM_SetJoystickName(int32_t stick, const char* name) {}
+
+void HALSIM_SetJoystickAxisType(int32_t stick, int32_t axis, int32_t type) {}
+
+void HALSIM_SetGameSpecificMessage(const char* message) {}
+
+void HALSIM_SetEventName(const char* name) {}
+
+void HALSIM_SetMatchType(HAL_MatchType type) {}
+
+void HALSIM_SetMatchNumber(int32_t matchNumber) {}
+
+void HALSIM_SetReplayNumber(int32_t replayNumber) {}
+
+void HALSIM_RegisterDriverStationAllCallbacks(HAL_NotifyCallback callback,
+                                              void* param,
+                                              HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/DutyCycleData.cpp b/hal/src/main/native/athena/mockdata/DutyCycleData.cpp
new file mode 100644
index 0000000..8d3cd61
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/DutyCycleData.cpp
@@ -0,0 +1,33 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/DutyCycleData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+int32_t HALSIM_FindDutyCycleForChannel(int32_t channel) { return 0; }
+
+void HALSIM_ResetDutyCycleData(int32_t index) {}
+
+int32_t HALSIM_GetDutyCycleDigitalChannel(int32_t index) { return 0; }
+
+HAL_SimDeviceHandle HALSIM_GetDutyCycleSimDevice(int32_t index) { return 0; }
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, DutyCycle##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(int32_t, Frequency, 0)
+DEFINE_CAPI(double, Output, 0)
+
+void HALSIM_RegisterDutyCycleAllCallbacks(int32_t index,
+                                          HAL_NotifyCallback callback,
+                                          void* param, HAL_Bool initialNotify) {
+}
+
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/EncoderData.cpp b/hal/src/main/native/athena/mockdata/EncoderData.cpp
new file mode 100644
index 0000000..87a7385
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/EncoderData.cpp
@@ -0,0 +1,47 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/EncoderData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+int32_t HALSIM_FindEncoderForChannel(int32_t channel) { return 0; }
+
+void HALSIM_ResetEncoderData(int32_t index) {}
+
+int32_t HALSIM_GetEncoderDigitalChannelA(int32_t index) { return 0; }
+
+int32_t HALSIM_GetEncoderDigitalChannelB(int32_t index) { return 0; }
+
+HAL_SimDeviceHandle HALSIM_GetEncoderSimDevice(int32_t index) { return 0; }
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, Encoder##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(int32_t, Count, 0)
+DEFINE_CAPI(double, Period, 0)
+DEFINE_CAPI(HAL_Bool, Reset, false)
+DEFINE_CAPI(double, MaxPeriod, 0)
+DEFINE_CAPI(HAL_Bool, Direction, false)
+DEFINE_CAPI(HAL_Bool, ReverseDirection, false)
+DEFINE_CAPI(int32_t, SamplesToAverage, 0)
+DEFINE_CAPI(double, DistancePerPulse, 0)
+
+void HALSIM_SetEncoderDistance(int32_t index, double distance) {}
+
+double HALSIM_GetEncoderDistance(int32_t index) { return 0; }
+
+void HALSIM_SetEncoderRate(int32_t index, double rate) {}
+
+double HALSIM_GetEncoderRate(int32_t index) { return 0; }
+
+void HALSIM_RegisterEncoderAllCallbacks(int32_t index,
+                                        HAL_NotifyCallback callback,
+                                        void* param, HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/I2CData.cpp b/hal/src/main/native/athena/mockdata/I2CData.cpp
new file mode 100644
index 0000000..eb6a6c9
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/I2CData.cpp
@@ -0,0 +1,27 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/I2CData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetI2CData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, I2C##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+
+#undef DEFINE_CAPI
+#define DEFINE_CAPI(TYPE, CAPINAME) \
+  HAL_SIMCALLBACKREGISTRY_STUB_CAPI(TYPE, HALSIM, I2C##CAPINAME)
+
+DEFINE_CAPI(HAL_BufferCallback, Read)
+DEFINE_CAPI(HAL_ConstBufferCallback, Write)
+
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/MockHooks.cpp b/hal/src/main/native/athena/mockdata/MockHooks.cpp
new file mode 100644
index 0000000..2e7bcfe
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/MockHooks.cpp
@@ -0,0 +1,36 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/MockHooks.h"
+
+extern "C" {
+
+void HALSIM_SetRuntimeType(HAL_RuntimeType type) {}
+
+void HALSIM_WaitForProgramStart(void) {}
+
+void HALSIM_SetProgramStarted(void) {}
+
+HAL_Bool HALSIM_GetProgramStarted(void) { return false; }
+
+void HALSIM_RestartTiming(void) {}
+
+void HALSIM_PauseTiming(void) {}
+
+void HALSIM_ResumeTiming(void) {}
+
+HAL_Bool HALSIM_IsTimingPaused(void) { return false; }
+
+void HALSIM_StepTiming(uint64_t delta) {}
+
+void HALSIM_StepTimingAsync(uint64_t delta) {}
+
+void HALSIM_SetSendError(HALSIM_SendErrorHandler handler) {}
+
+void HALSIM_SetSendConsoleLine(HALSIM_SendConsoleLineHandler handler) {}
+
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/NotifierData.cpp b/hal/src/main/native/athena/mockdata/NotifierData.cpp
new file mode 100644
index 0000000..34aa6e7
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/NotifierData.cpp
@@ -0,0 +1,20 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/NotifierData.h"
+
+extern "C" {
+
+uint64_t HALSIM_GetNextNotifierTimeout(void) { return 0; }
+
+int32_t HALSIM_GetNumNotifiers(void) { return 0; }
+
+int32_t HALSIM_GetNotifierInfo(struct HALSIM_NotifierInfo* arr, int32_t size) {
+  return 0;
+}
+
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/PCMData.cpp b/hal/src/main/native/athena/mockdata/PCMData.cpp
new file mode 100644
index 0000000..29302cb
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/PCMData.cpp
@@ -0,0 +1,40 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/PCMData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetPCMData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, PCM##CAPINAME, RETURN)
+
+HAL_SIMDATAVALUE_STUB_CAPI_CHANNEL(HAL_Bool, HALSIM, PCMSolenoidInitialized,
+                                   false)
+HAL_SIMDATAVALUE_STUB_CAPI_CHANNEL(HAL_Bool, HALSIM, PCMSolenoidOutput, false)
+DEFINE_CAPI(HAL_Bool, CompressorInitialized, false)
+DEFINE_CAPI(HAL_Bool, CompressorOn, false)
+DEFINE_CAPI(HAL_Bool, ClosedLoopEnabled, false)
+DEFINE_CAPI(HAL_Bool, PressureSwitch, false)
+DEFINE_CAPI(double, CompressorCurrent, 0)
+
+void HALSIM_GetPCMAllSolenoids(int32_t index, uint8_t* values) { *values = 0; }
+
+void HALSIM_SetPCMAllSolenoids(int32_t index, uint8_t values) {}
+
+void HALSIM_RegisterPCMAllNonSolenoidCallbacks(int32_t index,
+                                               HAL_NotifyCallback callback,
+                                               void* param,
+                                               HAL_Bool initialNotify) {}
+
+void HALSIM_RegisterPCMAllSolenoidCallbacks(int32_t index, int32_t channel,
+                                            HAL_NotifyCallback callback,
+                                            void* param,
+                                            HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/PDPData.cpp b/hal/src/main/native/athena/mockdata/PDPData.cpp
new file mode 100644
index 0000000..a28bb81
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/PDPData.cpp
@@ -0,0 +1,34 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/PDPData.h"
+
+#include "../PortsInternal.h"
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetPDPData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, PDP##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(double, Temperature, 0)
+DEFINE_CAPI(double, Voltage, 0)
+HAL_SIMDATAVALUE_STUB_CAPI_CHANNEL(double, HALSIM, PDPCurrent, 0)
+
+void HALSIM_GetPDPAllCurrents(int32_t index, double* currents) {
+  for (int i = 0; i < hal::kNumPDPChannels; i++) currents[i] = 0;
+}
+
+void HALSIM_SetPDPAllCurrents(int32_t index, const double* currents) {}
+
+void HALSIM_RegisterPDPAllNonCurrentCallbacks(int32_t index, int32_t channel,
+                                              HAL_NotifyCallback callback,
+                                              void* param,
+                                              HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/PWMData.cpp b/hal/src/main/native/athena/mockdata/PWMData.cpp
new file mode 100644
index 0000000..b9c5691
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/PWMData.cpp
@@ -0,0 +1,27 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/PWMData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetPWMData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, PWM##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+DEFINE_CAPI(int32_t, RawValue, 0)
+DEFINE_CAPI(double, Speed, 0)
+DEFINE_CAPI(double, Position, 0)
+DEFINE_CAPI(int32_t, PeriodScale, 0)
+DEFINE_CAPI(HAL_Bool, ZeroLatch, false)
+
+void HALSIM_RegisterPWMAllCallbacks(int32_t index, HAL_NotifyCallback callback,
+                                    void* param, HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/RelayData.cpp b/hal/src/main/native/athena/mockdata/RelayData.cpp
new file mode 100644
index 0000000..734bf89
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/RelayData.cpp
@@ -0,0 +1,26 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/RelayData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetRelayData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, Relay##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, InitializedForward, false)
+DEFINE_CAPI(HAL_Bool, InitializedReverse, false)
+DEFINE_CAPI(HAL_Bool, Forward, false)
+DEFINE_CAPI(HAL_Bool, Reverse, false)
+
+void HALSIM_RegisterRelayAllCallbacks(int32_t index,
+                                      HAL_NotifyCallback callback, void* param,
+                                      HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/RoboRioData.cpp b/hal/src/main/native/athena/mockdata/RoboRioData.cpp
new file mode 100644
index 0000000..f9e9ca7
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/RoboRioData.cpp
@@ -0,0 +1,36 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/RoboRioData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetRoboRioData(void) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI_NOINDEX(TYPE, HALSIM, RoboRio##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, FPGAButton, false)
+DEFINE_CAPI(double, VInVoltage, 0)
+DEFINE_CAPI(double, VInCurrent, 0)
+DEFINE_CAPI(double, UserVoltage6V, 0)
+DEFINE_CAPI(double, UserCurrent6V, 0)
+DEFINE_CAPI(HAL_Bool, UserActive6V, false)
+DEFINE_CAPI(double, UserVoltage5V, 0)
+DEFINE_CAPI(double, UserCurrent5V, 0)
+DEFINE_CAPI(HAL_Bool, UserActive5V, false)
+DEFINE_CAPI(double, UserVoltage3V3, 0)
+DEFINE_CAPI(double, UserCurrent3V3, 0)
+DEFINE_CAPI(HAL_Bool, UserActive3V3, false)
+DEFINE_CAPI(int32_t, UserFaults6V, 0)
+DEFINE_CAPI(int32_t, UserFaults5V, 0)
+DEFINE_CAPI(int32_t, UserFaults3V3, 0)
+
+void HALSIM_RegisterRoboRioAllCallbacks(HAL_NotifyCallback callback,
+                                        void* param, HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/SPIAccelerometerData.cpp b/hal/src/main/native/athena/mockdata/SPIAccelerometerData.cpp
new file mode 100644
index 0000000..c3e8ede
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/SPIAccelerometerData.cpp
@@ -0,0 +1,28 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/SPIAccelerometerData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetSPIAccelerometerData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, SPIAccelerometer##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Active, false)
+DEFINE_CAPI(int32_t, Range, 0)
+DEFINE_CAPI(double, X, 0)
+DEFINE_CAPI(double, Y, 0)
+DEFINE_CAPI(double, Z, 0)
+
+void HALSIM_RegisterSPIAccelerometerAllCallbcaks(int32_t index,
+                                                 HAL_NotifyCallback callback,
+                                                 void* param,
+                                                 HAL_Bool initialNotify) {}
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/SPIData.cpp b/hal/src/main/native/athena/mockdata/SPIData.cpp
new file mode 100644
index 0000000..13cf67c
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/SPIData.cpp
@@ -0,0 +1,28 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/SPIData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+void HALSIM_ResetSPIData(int32_t index) {}
+
+#define DEFINE_CAPI(TYPE, CAPINAME, RETURN) \
+  HAL_SIMDATAVALUE_STUB_CAPI(TYPE, HALSIM, SPI##CAPINAME, RETURN)
+
+DEFINE_CAPI(HAL_Bool, Initialized, false)
+
+#undef DEFINE_CAPI
+#define DEFINE_CAPI(TYPE, CAPINAME) \
+  HAL_SIMCALLBACKREGISTRY_STUB_CAPI(TYPE, HALSIM, SPI##CAPINAME)
+
+DEFINE_CAPI(HAL_BufferCallback, Read)
+DEFINE_CAPI(HAL_ConstBufferCallback, Write)
+DEFINE_CAPI(HAL_SpiReadAutoReceiveBufferCallback, ReadAutoReceivedData)
+
+}  // extern "C"
diff --git a/hal/src/main/native/athena/mockdata/SimDeviceData.cpp b/hal/src/main/native/athena/mockdata/SimDeviceData.cpp
new file mode 100644
index 0000000..a31160c
--- /dev/null
+++ b/hal/src/main/native/athena/mockdata/SimDeviceData.cpp
@@ -0,0 +1,78 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "hal/simulation/SimDeviceData.h"
+
+#include "hal/simulation/SimDataValue.h"
+
+extern "C" {
+
+void HALSIM_SetSimDeviceEnabled(const char* prefix, HAL_Bool enabled) {}
+
+HAL_Bool HALSIM_IsSimDeviceEnabled(const char* name) { return false; }
+
+int32_t HALSIM_RegisterSimDeviceCreatedCallback(
+    const char* prefix, void* param, HALSIM_SimDeviceCallback callback,
+    HAL_Bool initialNotify) {
+  return 0;
+}
+
+void HALSIM_CancelSimDeviceCreatedCallback(int32_t uid) {}
+
+int32_t HALSIM_RegisterSimDeviceFreedCallback(
+    const char* prefix, void* param, HALSIM_SimDeviceCallback callback) {
+  return 0;
+}
+
+void HALSIM_CancelSimDeviceFreedCallback(int32_t uid) {}
+
+HAL_SimDeviceHandle HALSIM_GetSimDeviceHandle(const char* name) { return 0; }
+
+const char* HALSIM_GetSimDeviceName(HAL_SimDeviceHandle handle) { return ""; }
+
+HAL_SimDeviceHandle HALSIM_GetSimValueDeviceHandle(HAL_SimValueHandle handle) {
+  return 0;
+}
+
+void HALSIM_EnumerateSimDevices(const char* prefix, void* param,
+                                HALSIM_SimDeviceCallback callback) {}
+
+int32_t HALSIM_RegisterSimValueCreatedCallback(HAL_SimDeviceHandle device,
+                                               void* param,
+                                               HALSIM_SimValueCallback callback,
+                                               HAL_Bool initialNotify) {
+  return 0;
+}
+
+void HALSIM_CancelSimValueCreatedCallback(int32_t uid) {}
+
+int32_t HALSIM_RegisterSimValueChangedCallback(HAL_SimValueHandle handle,
+                                               void* param,
+                                               HALSIM_SimValueCallback callback,
+                                               HAL_Bool initialNotify) {
+  return 0;
+}
+
+void HALSIM_CancelSimValueChangedCallback(int32_t uid) {}
+
+HAL_SimValueHandle HALSIM_GetSimValueHandle(HAL_SimDeviceHandle device,
+                                            const char* name) {
+  return 0;
+}
+
+void HALSIM_EnumerateSimValues(HAL_SimDeviceHandle device, void* param,
+                               HALSIM_SimValueCallback callback) {}
+
+const char** HALSIM_GetSimValueEnumOptions(HAL_SimValueHandle handle,
+                                           int32_t* numOptions) {
+  *numOptions = 0;
+  return nullptr;
+}
+
+void HALSIM_ResetSimDeviceData(void) {}
+
+}  // extern "C"
diff --git a/hal/src/main/native/cpp/cpp/fpga_clock.cpp b/hal/src/main/native/cpp/cpp/fpga_clock.cpp
index bcec155..ae65ee7 100644
--- a/hal/src/main/native/cpp/cpp/fpga_clock.cpp
+++ b/hal/src/main/native/cpp/cpp/fpga_clock.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,9 +7,11 @@
 
 #include "hal/cpp/fpga_clock.h"
 
+#include <limits>
+
 #include <wpi/raw_ostream.h>
 
-#include "hal/HAL.h"
+#include "hal/HALBase.h"
 
 namespace hal {
 const fpga_clock::time_point fpga_clock::min_time =
diff --git a/hal/src/main/native/cpp/jni/AddressableLEDJNI.cpp b/hal/src/main/native/cpp/jni/AddressableLEDJNI.cpp
index 3f76e6a..3d74b24 100644
--- a/hal/src/main/native/cpp/jni/AddressableLEDJNI.cpp
+++ b/hal/src/main/native/cpp/jni/AddressableLEDJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,7 +13,7 @@
 #include "edu_wpi_first_hal_AddressableLEDJNI.h"
 #include "hal/AddressableLED.h"
 
-using namespace frc;
+using namespace hal;
 using namespace wpi::java;
 
 static_assert(sizeof(jbyte) * 4 == sizeof(HAL_AddressableLEDData));
diff --git a/hal/src/main/native/cpp/jni/AnalogGyroJNI.cpp b/hal/src/main/native/cpp/jni/AnalogGyroJNI.cpp
index 35b7414..c06e513 100644
--- a/hal/src/main/native/cpp/jni/AnalogGyroJNI.cpp
+++ b/hal/src/main/native/cpp/jni/AnalogGyroJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -14,7 +14,7 @@
 #include "hal/AnalogGyro.h"
 #include "hal/handles/HandlesInternal.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 /*
diff --git a/hal/src/main/native/cpp/jni/AnalogJNI.cpp b/hal/src/main/native/cpp/jni/AnalogJNI.cpp
index 5571d55..8b920ac 100644
--- a/hal/src/main/native/cpp/jni/AnalogJNI.cpp
+++ b/hal/src/main/native/cpp/jni/AnalogJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -18,7 +18,7 @@
 #include "hal/Ports.h"
 #include "hal/handles/HandlesInternal.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/CANAPIJNI.cpp b/hal/src/main/native/cpp/jni/CANAPIJNI.cpp
index 7ac7cf6..f42cc2f 100644
--- a/hal/src/main/native/cpp/jni/CANAPIJNI.cpp
+++ b/hal/src/main/native/cpp/jni/CANAPIJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -19,7 +19,7 @@
 #include "hal/CANAPI.h"
 #include "hal/Errors.h"
 
-using namespace frc;
+using namespace hal;
 using namespace wpi::java;
 
 extern "C" {
@@ -109,6 +109,59 @@
 
 /*
  * Class:     edu_wpi_first_hal_CANAPIJNI
+ * Method:    writeCANPacketNoThrow
+ * Signature: (I[BI)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_CANAPIJNI_writeCANPacketNoThrow
+  (JNIEnv* env, jclass, jint handle, jbyteArray data, jint apiId)
+{
+  auto halHandle = static_cast<HAL_CANHandle>(handle);
+  JByteArrayRef arr{env, data};
+  auto arrRef = arr.array();
+  int32_t status = 0;
+  HAL_WriteCANPacket(halHandle, reinterpret_cast<const uint8_t*>(arrRef.data()),
+                     arrRef.size(), apiId, &status);
+  return status;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_CANAPIJNI
+ * Method:    writeCANPacketRepeatingNoThrow
+ * Signature: (I[BII)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_CANAPIJNI_writeCANPacketRepeatingNoThrow
+  (JNIEnv* env, jclass, jint handle, jbyteArray data, jint apiId,
+   jint timeoutMs)
+{
+  auto halHandle = static_cast<HAL_CANHandle>(handle);
+  JByteArrayRef arr{env, data};
+  auto arrRef = arr.array();
+  int32_t status = 0;
+  HAL_WriteCANPacketRepeating(halHandle,
+                              reinterpret_cast<const uint8_t*>(arrRef.data()),
+                              arrRef.size(), apiId, timeoutMs, &status);
+  return status;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_CANAPIJNI
+ * Method:    writeCANRTRFrameNoThrow
+ * Signature: (III)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_CANAPIJNI_writeCANRTRFrameNoThrow
+  (JNIEnv* env, jclass, jint handle, jint length, jint apiId)
+{
+  auto halHandle = static_cast<HAL_CANHandle>(handle);
+  int32_t status = 0;
+  HAL_WriteCANRTRFrame(halHandle, static_cast<int32_t>(length), apiId, &status);
+  return status;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_CANAPIJNI
  * Method:    stopCANPacketRepeating
  * Signature: (II)V
  */
diff --git a/hal/src/main/native/cpp/jni/CANJNI.cpp b/hal/src/main/native/cpp/jni/CANJNI.cpp
index 9278c24..42b484b 100644
--- a/hal/src/main/native/cpp/jni/CANJNI.cpp
+++ b/hal/src/main/native/cpp/jni/CANJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -17,7 +17,7 @@
 #include "edu_wpi_first_hal_can_CANJNI.h"
 #include "hal/CAN.h"
 
-using namespace frc;
+using namespace hal;
 using namespace wpi::java;
 
 extern "C" {
diff --git a/hal/src/main/native/cpp/jni/CompressorJNI.cpp b/hal/src/main/native/cpp/jni/CompressorJNI.cpp
index 75a5e0a..c214c60 100644
--- a/hal/src/main/native/cpp/jni/CompressorJNI.cpp
+++ b/hal/src/main/native/cpp/jni/CompressorJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,7 +11,7 @@
 #include "hal/Ports.h"
 #include "hal/Solenoid.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/ConstantsJNI.cpp b/hal/src/main/native/cpp/jni/ConstantsJNI.cpp
index fb1ae0b..9c4aa63 100644
--- a/hal/src/main/native/cpp/jni/ConstantsJNI.cpp
+++ b/hal/src/main/native/cpp/jni/ConstantsJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,7 +13,7 @@
 #include "edu_wpi_first_hal_ConstantsJNI.h"
 #include "hal/Constants.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 /*
diff --git a/hal/src/main/native/cpp/jni/CounterJNI.cpp b/hal/src/main/native/cpp/jni/CounterJNI.cpp
index 41dedab..06cbceb 100644
--- a/hal/src/main/native/cpp/jni/CounterJNI.cpp
+++ b/hal/src/main/native/cpp/jni/CounterJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -14,7 +14,7 @@
 #include "hal/Counter.h"
 #include "hal/Errors.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/DIOJNI.cpp b/hal/src/main/native/cpp/jni/DIOJNI.cpp
index 9c44b4c..428dd99 100644
--- a/hal/src/main/native/cpp/jni/DIOJNI.cpp
+++ b/hal/src/main/native/cpp/jni/DIOJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -16,7 +16,7 @@
 #include "hal/Ports.h"
 #include "hal/handles/HandlesInternal.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/DigitalGlitchFilterJNI.cpp b/hal/src/main/native/cpp/jni/DigitalGlitchFilterJNI.cpp
index fbbaadb..cfb504d 100644
--- a/hal/src/main/native/cpp/jni/DigitalGlitchFilterJNI.cpp
+++ b/hal/src/main/native/cpp/jni/DigitalGlitchFilterJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,7 +11,7 @@
 #include "edu_wpi_first_hal_DigitalGlitchFilterJNI.h"
 #include "hal/DIO.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/DutyCycleJNI.cpp b/hal/src/main/native/cpp/jni/DutyCycleJNI.cpp
index 510ca00..b191374 100644
--- a/hal/src/main/native/cpp/jni/DutyCycleJNI.cpp
+++ b/hal/src/main/native/cpp/jni/DutyCycleJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,7 +11,7 @@
 #include "edu_wpi_first_hal_DutyCycleJNI.h"
 #include "hal/DutyCycle.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 /*
diff --git a/hal/src/main/native/cpp/jni/EncoderJNI.cpp b/hal/src/main/native/cpp/jni/EncoderJNI.cpp
index e5aa7e8..11686a6 100644
--- a/hal/src/main/native/cpp/jni/EncoderJNI.cpp
+++ b/hal/src/main/native/cpp/jni/EncoderJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -14,7 +14,7 @@
 #include "hal/Encoder.h"
 #include "hal/Errors.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/HAL.cpp b/hal/src/main/native/cpp/jni/HAL.cpp
index 393b0b4..3d736bf 100644
--- a/hal/src/main/native/cpp/jni/HAL.cpp
+++ b/hal/src/main/native/cpp/jni/HAL.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -19,7 +19,7 @@
 #include "hal/DriverStation.h"
 #include "hal/Main.h"
 
-using namespace frc;
+using namespace hal;
 using namespace wpi::java;
 
 extern "C" {
@@ -38,6 +38,18 @@
 
 /*
  * Class:     edu_wpi_first_hal_HAL
+ * Method:    shutdown
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_HAL_shutdown
+  (JNIEnv*, jclass)
+{
+  return HAL_Shutdown();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_HAL
  * Method:    hasMain
  * Signature: ()Z
  */
@@ -450,6 +462,21 @@
 
 /*
  * Class:     edu_wpi_first_hal_HAL
+ * Method:    sendConsoleLine
+ * Signature: (Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_HAL_sendConsoleLine
+  (JNIEnv* env, jclass, jstring line)
+{
+  JStringRef lineStr{env, line};
+
+  jint returnValue = HAL_SendConsoleLine(lineStr.c_str());
+  return returnValue;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_HAL
  * Method:    getPortWithModule
  * Signature: (BB)I
  */
diff --git a/hal/src/main/native/cpp/jni/HALUtil.cpp b/hal/src/main/native/cpp/jni/HALUtil.cpp
index 26b7919..2938f45 100644
--- a/hal/src/main/native/cpp/jni/HALUtil.cpp
+++ b/hal/src/main/native/cpp/jni/HALUtil.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -73,7 +73,7 @@
      &canNotInitializedExCls},
     {"edu/wpi/first/hal/util/UncleanStatusException", &uncleanStatusExCls}};
 
-namespace frc {
+namespace hal {
 
 void ThrowUncleanStatusException(JNIEnv* env, wpi::StringRef msg,
                                  int32_t status) {
@@ -304,14 +304,14 @@
 
 JavaVM* GetJVM() { return jvm; }
 
-}  // namespace frc
-
 namespace sim {
 jint SimOnLoad(JavaVM* vm, void* reserved);
 void SimOnUnload(JavaVM* vm, void* reserved);
 }  // namespace sim
 
-using namespace frc;
+}  // namespace hal
+
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/HALUtil.h b/hal/src/main/native/cpp/jni/HALUtil.h
index c035f75..0a192da 100644
--- a/hal/src/main/native/cpp/jni/HALUtil.h
+++ b/hal/src/main/native/cpp/jni/HALUtil.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -16,7 +16,7 @@
 struct HAL_MatchInfo;
 struct HAL_Value;
 
-namespace frc {
+namespace hal {
 
 void ReportError(JNIEnv* env, int32_t status, bool doThrow = true);
 
@@ -72,6 +72,6 @@
 
 JavaVM* GetJVM();
 
-}  // namespace frc
+}  // namespace hal
 
 #endif  // HAL_HAL_SRC_MAIN_NATIVE_CPP_JNI_HALUTIL_H_
diff --git a/hal/src/main/native/cpp/jni/I2CJNI.cpp b/hal/src/main/native/cpp/jni/I2CJNI.cpp
index 7812bdb..de27df6 100644
--- a/hal/src/main/native/cpp/jni/I2CJNI.cpp
+++ b/hal/src/main/native/cpp/jni/I2CJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,7 +15,7 @@
 #include "edu_wpi_first_hal_I2CJNI.h"
 #include "hal/I2C.h"
 
-using namespace frc;
+using namespace hal;
 using namespace wpi::java;
 
 extern "C" {
diff --git a/hal/src/main/native/cpp/jni/InterruptJNI.cpp b/hal/src/main/native/cpp/jni/InterruptJNI.cpp
index e3a783d..d18ef27 100644
--- a/hal/src/main/native/cpp/jni/InterruptJNI.cpp
+++ b/hal/src/main/native/cpp/jni/InterruptJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -18,7 +18,7 @@
 #include "edu_wpi_first_hal_InterruptJNI.h"
 #include "hal/Interrupts.h"
 
-using namespace frc;
+using namespace hal;
 
 // Thread where callbacks are actually performed.
 //
@@ -294,4 +294,19 @@
   CheckStatus(env, status);
 }
 
+/*
+ * Class:     edu_wpi_first_hal_InterruptJNI
+ * Method:    releaseWaitingInterrupt
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_InterruptJNI_releaseWaitingInterrupt
+  (JNIEnv* env, jclass, jint interruptHandle)
+{
+  int32_t status = 0;
+  HAL_ReleaseWaitingInterrupt((HAL_InterruptHandle)interruptHandle, &status);
+
+  CheckStatus(env, status);
+}
+
 }  // extern "C"
diff --git a/hal/src/main/native/cpp/jni/NotifierJNI.cpp b/hal/src/main/native/cpp/jni/NotifierJNI.cpp
index 874d750..ed0b324 100644
--- a/hal/src/main/native/cpp/jni/NotifierJNI.cpp
+++ b/hal/src/main/native/cpp/jni/NotifierJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -16,7 +16,7 @@
 #include "edu_wpi_first_hal_NotifierJNI.h"
 #include "hal/Notifier.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/PDPJNI.cpp b/hal/src/main/native/cpp/jni/PDPJNI.cpp
index f649a8d..bb28fdf 100644
--- a/hal/src/main/native/cpp/jni/PDPJNI.cpp
+++ b/hal/src/main/native/cpp/jni/PDPJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,7 +10,7 @@
 #include "hal/PDP.h"
 #include "hal/Ports.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/PWMJNI.cpp b/hal/src/main/native/cpp/jni/PWMJNI.cpp
index 80293c4..085cd0c 100644
--- a/hal/src/main/native/cpp/jni/PWMJNI.cpp
+++ b/hal/src/main/native/cpp/jni/PWMJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -16,7 +16,7 @@
 #include "hal/Ports.h"
 #include "hal/handles/HandlesInternal.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/PortsJNI.cpp b/hal/src/main/native/cpp/jni/PortsJNI.cpp
index 1adb7fb..65fabd4 100644
--- a/hal/src/main/native/cpp/jni/PortsJNI.cpp
+++ b/hal/src/main/native/cpp/jni/PortsJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,7 +13,7 @@
 #include "edu_wpi_first_hal_PortsJNI.h"
 #include "hal/Ports.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 /*
diff --git a/hal/src/main/native/cpp/jni/PowerJNI.cpp b/hal/src/main/native/cpp/jni/PowerJNI.cpp
index 9184e9e..6fc42b4 100644
--- a/hal/src/main/native/cpp/jni/PowerJNI.cpp
+++ b/hal/src/main/native/cpp/jni/PowerJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,7 +11,7 @@
 #include "edu_wpi_first_hal_PowerJNI.h"
 #include "hal/Power.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/RelayJNI.cpp b/hal/src/main/native/cpp/jni/RelayJNI.cpp
index c058435..ce43307 100644
--- a/hal/src/main/native/cpp/jni/RelayJNI.cpp
+++ b/hal/src/main/native/cpp/jni/RelayJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,7 +15,7 @@
 #include "hal/Relay.h"
 #include "hal/handles/HandlesInternal.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/SPIJNI.cpp b/hal/src/main/native/cpp/jni/SPIJNI.cpp
index 7962e21..d7709e2 100644
--- a/hal/src/main/native/cpp/jni/SPIJNI.cpp
+++ b/hal/src/main/native/cpp/jni/SPIJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,7 +15,7 @@
 #include "edu_wpi_first_hal_SPIJNI.h"
 #include "hal/SPI.h"
 
-using namespace frc;
+using namespace hal;
 using namespace wpi::java;
 
 extern "C" {
diff --git a/hal/src/main/native/cpp/jni/SerialPortJNI.cpp b/hal/src/main/native/cpp/jni/SerialPortJNI.cpp
index 9fe9d92..13f1f99 100644
--- a/hal/src/main/native/cpp/jni/SerialPortJNI.cpp
+++ b/hal/src/main/native/cpp/jni/SerialPortJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,7 +15,7 @@
 #include "edu_wpi_first_hal_SerialPortJNI.h"
 #include "hal/SerialPort.h"
 
-using namespace frc;
+using namespace hal;
 using namespace wpi::java;
 
 extern "C" {
diff --git a/hal/src/main/native/cpp/jni/SimDeviceJNI.cpp b/hal/src/main/native/cpp/jni/SimDeviceJNI.cpp
index d9652cc..b69a8bb 100644
--- a/hal/src/main/native/cpp/jni/SimDeviceJNI.cpp
+++ b/hal/src/main/native/cpp/jni/SimDeviceJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -114,7 +114,7 @@
 Java_edu_wpi_first_hal_SimDeviceJNI_getSimValue
   (JNIEnv* env, jclass, jint handle)
 {
-  return frc::CreateHALValue(env, HAL_GetSimValue(handle));
+  return hal::CreateHALValue(env, HAL_GetSimValue(handle));
 }
 
 /*
diff --git a/hal/src/main/native/cpp/jni/SolenoidJNI.cpp b/hal/src/main/native/cpp/jni/SolenoidJNI.cpp
index 4e6f139..4877db3 100644
--- a/hal/src/main/native/cpp/jni/SolenoidJNI.cpp
+++ b/hal/src/main/native/cpp/jni/SolenoidJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,7 +13,7 @@
 #include "hal/Solenoid.h"
 #include "hal/handles/HandlesInternal.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 
diff --git a/hal/src/main/native/cpp/jni/ThreadsJNI.cpp b/hal/src/main/native/cpp/jni/ThreadsJNI.cpp
index d4620e2..a26a4bf 100644
--- a/hal/src/main/native/cpp/jni/ThreadsJNI.cpp
+++ b/hal/src/main/native/cpp/jni/ThreadsJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,7 +13,7 @@
 #include "edu_wpi_first_hal_ThreadsJNI.h"
 #include "hal/Threads.h"
 
-using namespace frc;
+using namespace hal;
 
 extern "C" {
 /*
diff --git a/hal/src/main/native/sim/jni/AccelerometerDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/AccelerometerDataJNI.cpp
similarity index 63%
rename from hal/src/main/native/sim/jni/AccelerometerDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/AccelerometerDataJNI.cpp
index 8964a41..21d93fe 100644
--- a/hal/src/main/native/sim/jni/AccelerometerDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/AccelerometerDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI.h"
-#include "mockdata/AccelerometerData.h"
+#include "edu_wpi_first_hal_simulation_AccelerometerDataJNI.h"
+#include "hal/simulation/AccelerometerData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    registerActiveCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_registerActiveCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_registerActiveCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    cancelActiveCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_cancelActiveCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_cancelActiveCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    getActive
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_getActive
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_getActive
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAccelerometerActive(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    setActive
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_setActive
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_setActive
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAccelerometerActive(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    registerRangeCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_registerRangeCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_registerRangeCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    cancelRangeCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_cancelRangeCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_cancelRangeCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,24 +92,24 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    getRange
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_getRange
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_getRange
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAccelerometerRange(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    setRange
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_setRange
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_setRange
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetAccelerometerRange(index,
@@ -115,12 +117,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    registerXCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_registerXCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_registerXCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -128,12 +130,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    cancelXCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_cancelXCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_cancelXCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -141,36 +143,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    getX
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_getX
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_getX
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAccelerometerX(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    setX
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_setX
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_setX
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAccelerometerX(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    registerYCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_registerYCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_registerYCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -178,12 +180,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    cancelYCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_cancelYCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_cancelYCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -191,36 +193,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    getY
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_getY
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_getY
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAccelerometerY(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    setY
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_setY
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_setY
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAccelerometerY(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    registerZCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_registerZCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_registerZCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -228,12 +230,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    cancelZCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_cancelZCallback
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_cancelZCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -241,36 +243,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    getZ
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_getZ
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_getZ
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAccelerometerZ(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    setZ
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_setZ
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_setZ
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAccelerometerZ(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AccelerometerDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AccelerometerDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_AccelerometerDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetAccelerometerData(index);
diff --git a/hal/src/main/native/sim/jni/AddressableLEDDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/AddressableLEDDataJNI.cpp
similarity index 63%
rename from hal/src/main/native/sim/jni/AddressableLEDDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/AddressableLEDDataJNI.cpp
index 530eae2..8ac59ec 100644
--- a/hal/src/main/native/sim/jni/AddressableLEDDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/AddressableLEDDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,22 +9,23 @@
 
 #include "CallbackStore.h"
 #include "ConstBufferCallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI.h"
-#include "mockdata/AddressableLEDData.h"
+#include "edu_wpi_first_hal_simulation_AddressableLEDDataJNI.h"
+#include "hal/simulation/AddressableLEDData.h"
 
 static_assert(sizeof(jbyte) * 4 == sizeof(HAL_AddressableLEDData));
 
+using namespace hal;
 using namespace wpi::java;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -33,12 +34,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -46,36 +47,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAddressableLEDInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAddressableLEDInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    registerOutputPortCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_registerOutputPortCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_registerOutputPortCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -84,12 +85,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    cancelOutputPortCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_cancelOutputPortCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_cancelOutputPortCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -97,36 +98,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    getOutputPort
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_getOutputPort
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_getOutputPort
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAddressableLEDOutputPort(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    setOutputPort
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_setOutputPort
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_setOutputPort
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetAddressableLEDOutputPort(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    registerLengthCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_registerLengthCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_registerLengthCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -134,12 +135,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    cancelLengthCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_cancelLengthCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_cancelLengthCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -147,36 +148,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    getLength
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_getLength
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_getLength
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAddressableLEDLength(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    setLength
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_setLength
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_setLength
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetAddressableLEDLength(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    registerRunningCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_registerRunningCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_registerRunningCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -184,12 +185,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    cancelRunningCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_cancelRunningCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_cancelRunningCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -197,36 +198,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    getRunning
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_getRunning
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_getRunning
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAddressableLEDRunning(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    setRunning
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_setRunning
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_setRunning
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAddressableLEDRunning(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    registerDataCallback
  * Signature: (ILjava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_registerDataCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_registerDataCallback
   (JNIEnv* env, jclass, jint index, jobject callback)
 {
   return sim::AllocateConstBufferCallback(
@@ -234,12 +235,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    cancelDataCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_cancelDataCallback
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_cancelDataCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   sim::FreeConstBufferCallback(env, handle, index,
@@ -247,12 +248,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    getData
  * Signature: (I)[B
  */
 JNIEXPORT jbyteArray JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_getData
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_getData
   (JNIEnv* env, jclass, jint index)
 {
   auto data =
@@ -263,12 +264,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    setData
  * Signature: (I[B)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_setData
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_setData
   (JNIEnv* env, jclass, jint index, jbyteArray arr)
 {
   JByteArrayRef jArrRef{env, arr};
@@ -279,15 +280,27 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AddressableLEDDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetAddressableLEDData(index);
 }
 
+/*
+ * Class:     edu_wpi_first_hal_simulation_AddressableLEDDataJNI
+ * Method:    findForChannel
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_AddressableLEDDataJNI_findForChannel
+  (JNIEnv*, jclass, jint channel)
+{
+  return HALSIM_FindAddressableLEDForChannel(channel);
+}
+
 }  // extern "C"
diff --git a/hal/src/main/native/sim/jni/AnalogGyroDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/AnalogGyroDataJNI.cpp
similarity index 64%
rename from hal/src/main/native/sim/jni/AnalogGyroDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/AnalogGyroDataJNI.cpp
index 08d18de..ed867cd 100644
--- a/hal/src/main/native/sim/jni/AnalogGyroDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/AnalogGyroDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI.h"
-#include "mockdata/AnalogGyroData.h"
+#include "edu_wpi_first_hal_simulation_AnalogGyroDataJNI.h"
+#include "hal/simulation/AnalogGyroData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    registerAngleCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_registerAngleCallback
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_registerAngleCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    cancelAngleCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_cancelAngleCallback
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_cancelAngleCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    getAngle
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_getAngle
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_getAngle
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogGyroAngle(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    setAngle
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_setAngle
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_setAngle
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAnalogGyroAngle(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    registerRateCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_registerRateCallback
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_registerRateCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    cancelRateCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_cancelRateCallback
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_cancelRateCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    getRate
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_getRate
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_getRate
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogGyroRate(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    setRate
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_setRate
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_setRate
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAnalogGyroRate(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,12 +129,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -140,36 +142,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogGyroInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAnalogGyroInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogGyroDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogGyroDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_AnalogGyroDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetAnalogGyroData(index);
diff --git a/hal/src/main/native/sim/jni/AnalogInDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/AnalogInDataJNI.cpp
similarity index 64%
rename from hal/src/main/native/sim/jni/AnalogInDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/AnalogInDataJNI.cpp
index c6cee7b..0266a76 100644
--- a/hal/src/main/native/sim/jni/AnalogInDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/AnalogInDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI.h"
-#include "mockdata/AnalogInData.h"
+#include "edu_wpi_first_hal_simulation_AnalogInDataJNI.h"
+#include "hal/simulation/AnalogInData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAnalogInInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerAverageBitsCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerAverageBitsCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerAverageBitsCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelAverageBitsCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelAverageBitsCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelAverageBitsCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getAverageBits
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getAverageBits
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getAverageBits
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInAverageBits(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setAverageBits
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setAverageBits
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setAverageBits
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetAnalogInAverageBits(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerOversampleBitsCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerOversampleBitsCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerOversampleBitsCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,12 +129,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelOversampleBitsCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelOversampleBitsCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelOversampleBitsCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -140,36 +142,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getOversampleBits
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getOversampleBits
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getOversampleBits
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInOversampleBits(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setOversampleBits
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setOversampleBits
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setOversampleBits
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetAnalogInOversampleBits(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerVoltageCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerVoltageCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerVoltageCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -177,12 +179,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelVoltageCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelVoltageCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelVoltageCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -190,36 +192,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getVoltage
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getVoltage
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getVoltage
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInVoltage(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setVoltage
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setVoltage
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setVoltage
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAnalogInVoltage(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerAccumulatorInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerAccumulatorInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerAccumulatorInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -228,12 +230,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelAccumulatorInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelAccumulatorInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelAccumulatorInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(
@@ -241,36 +243,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getAccumulatorInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getAccumulatorInitialized
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getAccumulatorInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInAccumulatorInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setAccumulatorInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setAccumulatorInitialized
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setAccumulatorInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAnalogInAccumulatorInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerAccumulatorValueCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerAccumulatorValueCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerAccumulatorValueCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -279,12 +281,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelAccumulatorValueCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelAccumulatorValueCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelAccumulatorValueCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -292,36 +294,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getAccumulatorValue
  * Signature: (I)J
  */
 JNIEXPORT jlong JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getAccumulatorValue
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getAccumulatorValue
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInAccumulatorValue(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setAccumulatorValue
  * Signature: (IJ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setAccumulatorValue
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setAccumulatorValue
   (JNIEnv*, jclass, jint index, jlong value)
 {
   HALSIM_SetAnalogInAccumulatorValue(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerAccumulatorCountCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerAccumulatorCountCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerAccumulatorCountCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -330,12 +332,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelAccumulatorCountCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelAccumulatorCountCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelAccumulatorCountCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -343,36 +345,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getAccumulatorCount
  * Signature: (I)J
  */
 JNIEXPORT jlong JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getAccumulatorCount
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getAccumulatorCount
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInAccumulatorCount(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setAccumulatorCount
  * Signature: (IJ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setAccumulatorCount
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setAccumulatorCount
   (JNIEnv*, jclass, jint index, jlong value)
 {
   HALSIM_SetAnalogInAccumulatorCount(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerAccumulatorCenterCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerAccumulatorCenterCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerAccumulatorCenterCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -381,12 +383,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelAccumulatorCenterCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelAccumulatorCenterCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelAccumulatorCenterCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -394,36 +396,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getAccumulatorCenter
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getAccumulatorCenter
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getAccumulatorCenter
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInAccumulatorCenter(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setAccumulatorCenter
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setAccumulatorCenter
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setAccumulatorCenter
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetAnalogInAccumulatorCenter(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    registerAccumulatorDeadbandCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_registerAccumulatorDeadbandCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_registerAccumulatorDeadbandCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -432,12 +434,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    cancelAccumulatorDeadbandCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_cancelAccumulatorDeadbandCallback
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_cancelAccumulatorDeadbandCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -445,36 +447,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    getAccumulatorDeadband
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_getAccumulatorDeadband
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_getAccumulatorDeadband
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogInAccumulatorDeadband(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    setAccumulatorDeadband
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_setAccumulatorDeadband
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_setAccumulatorDeadband
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetAnalogInAccumulatorDeadband(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogInDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogInDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_AnalogInDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetAnalogInData(index);
diff --git a/hal/src/main/native/sim/jni/AnalogOutDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/AnalogOutDataJNI.cpp
similarity index 65%
rename from hal/src/main/native/sim/jni/AnalogOutDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/AnalogOutDataJNI.cpp
index af9d6d6..06f5be6 100644
--- a/hal/src/main/native/sim/jni/AnalogOutDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/AnalogOutDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI.h"
-#include "mockdata/AnalogOutData.h"
+#include "edu_wpi_first_hal_simulation_AnalogOutDataJNI.h"
+#include "hal/simulation/AnalogOutData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    registerVoltageCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_registerVoltageCallback
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_registerVoltageCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    cancelVoltageCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_cancelVoltageCallback
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_cancelVoltageCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    getVoltage
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_getVoltage
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_getVoltage
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogOutVoltage(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    setVoltage
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_setVoltage
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_setVoltage
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAnalogOutVoltage(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogOutInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAnalogOutInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogOutDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogOutDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_AnalogOutDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetAnalogOutData(index);
diff --git a/hal/src/main/native/sim/jni/AnalogTriggerDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/AnalogTriggerDataJNI.cpp
similarity index 61%
rename from hal/src/main/native/sim/jni/AnalogTriggerDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/AnalogTriggerDataJNI.cpp
index 66af737..be92c6d 100644
--- a/hal/src/main/native/sim/jni/AnalogTriggerDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/AnalogTriggerDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI.h"
-#include "mockdata/AnalogTriggerData.h"
+#include "edu_wpi_first_hal_simulation_AnalogTriggerDataJNI.h"
+#include "hal/simulation/AnalogTriggerData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -28,12 +30,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -41,36 +43,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogTriggerInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetAnalogTriggerInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    registerTriggerLowerBoundCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_registerTriggerLowerBoundCallback
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_registerTriggerLowerBoundCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -79,12 +81,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    cancelTriggerLowerBoundCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_cancelTriggerLowerBoundCallback
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_cancelTriggerLowerBoundCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(
@@ -92,36 +94,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    getTriggerLowerBound
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_getTriggerLowerBound
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_getTriggerLowerBound
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogTriggerTriggerLowerBound(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    setTriggerLowerBound
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_setTriggerLowerBound
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_setTriggerLowerBound
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAnalogTriggerTriggerLowerBound(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    registerTriggerUpperBoundCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_registerTriggerUpperBoundCallback
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_registerTriggerUpperBoundCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -130,12 +132,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    cancelTriggerUpperBoundCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_cancelTriggerUpperBoundCallback
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_cancelTriggerUpperBoundCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(
@@ -143,39 +145,51 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    getTriggerUpperBound
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_getTriggerUpperBound
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_getTriggerUpperBound
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetAnalogTriggerTriggerUpperBound(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    setTriggerUpperBound
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_setTriggerUpperBound
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_setTriggerUpperBound
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetAnalogTriggerTriggerUpperBound(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_AnalogTriggerDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetAnalogTriggerData(index);
 }
 
+/*
+ * Class:     edu_wpi_first_hal_simulation_AnalogTriggerDataJNI
+ * Method:    findForChannel
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_AnalogTriggerDataJNI_findForChannel
+  (JNIEnv*, jclass, jint channel)
+{
+  return HALSIM_FindAnalogTriggerForChannel(channel);
+}
+
 }  // extern "C"
diff --git a/hal/src/main/native/sim/jni/BufferCallbackStore.cpp b/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.cpp
similarity index 95%
rename from hal/src/main/native/sim/jni/BufferCallbackStore.cpp
rename to hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.cpp
index 3c9941e..6751e03 100644
--- a/hal/src/main/native/sim/jni/BufferCallbackStore.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,15 +15,17 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
+using namespace hal;
+using namespace hal::sim;
 using namespace wpi::java;
-using namespace sim;
 
 static hal::UnlimitedHandleResource<SIM_JniHandle, BufferCallbackStore,
                                     hal::HAL_HandleEnum::SimulationJni>*
     callbackHandles;
 
+namespace hal {
 namespace sim {
 void InitializeBufferStore() {
   static hal::UnlimitedHandleResource<SIM_JniHandle, BufferCallbackStore,
@@ -32,6 +34,7 @@
   callbackHandles = &cb;
 }
 }  // namespace sim
+}  // namespace hal
 
 void BufferCallbackStore::create(JNIEnv* env, jobject obj) {
   m_call = JGlobal<jobject>(env, obj);
diff --git a/hal/src/main/native/sim/jni/BufferCallbackStore.h b/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.h
similarity index 91%
rename from hal/src/main/native/sim/jni/BufferCallbackStore.h
rename to hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.h
index 6b472ac..8e746d2 100644
--- a/hal/src/main/native/sim/jni/BufferCallbackStore.h
+++ b/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,8 +15,9 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
+namespace hal {
 namespace sim {
 class BufferCallbackStore {
  public:
@@ -43,3 +44,4 @@
 void FreeBufferCallback(JNIEnv* env, SIM_JniHandle handle, jint index,
                         FreeBufferCallbackFunc freeCallback);
 }  // namespace sim
+}  // namespace hal
diff --git a/hal/src/main/native/sim/jni/CallbackStore.cpp b/hal/src/main/native/cpp/jni/simulation/CallbackStore.cpp
similarity index 96%
rename from hal/src/main/native/sim/jni/CallbackStore.cpp
rename to hal/src/main/native/cpp/jni/simulation/CallbackStore.cpp
index 318ab1e..5ce046d 100644
--- a/hal/src/main/native/sim/jni/CallbackStore.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/CallbackStore.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,15 +15,17 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
+using namespace hal;
+using namespace hal::sim;
 using namespace wpi::java;
-using namespace sim;
 
 static hal::UnlimitedHandleResource<SIM_JniHandle, CallbackStore,
                                     hal::HAL_HandleEnum::SimulationJni>*
     callbackHandles;
 
+namespace hal {
 namespace sim {
 void InitializeStore() {
   static hal::UnlimitedHandleResource<SIM_JniHandle, CallbackStore,
@@ -32,6 +34,7 @@
   callbackHandles = &cb;
 }
 }  // namespace sim
+}  // namespace hal
 
 void CallbackStore::create(JNIEnv* env, jobject obj) {
   m_call = JGlobal<jobject>(env, obj);
diff --git a/hal/src/main/native/sim/jni/CallbackStore.h b/hal/src/main/native/cpp/jni/simulation/CallbackStore.h
similarity index 94%
rename from hal/src/main/native/sim/jni/CallbackStore.h
rename to hal/src/main/native/cpp/jni/simulation/CallbackStore.h
index eacf314..0ba44d3 100644
--- a/hal/src/main/native/sim/jni/CallbackStore.h
+++ b/hal/src/main/native/cpp/jni/simulation/CallbackStore.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,8 +15,9 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
+namespace hal {
 namespace sim {
 class CallbackStore {
  public:
@@ -64,3 +65,4 @@
 void FreeCallbackNoIndex(JNIEnv* env, SIM_JniHandle handle,
                          FreeCallbackNoIndexFunc freeCallback);
 }  // namespace sim
+}  // namespace hal
diff --git a/hal/src/main/native/sim/jni/ConstBufferCallbackStore.cpp b/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.cpp
similarity index 94%
rename from hal/src/main/native/sim/jni/ConstBufferCallbackStore.cpp
rename to hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.cpp
index d681983..b9c9808 100644
--- a/hal/src/main/native/sim/jni/ConstBufferCallbackStore.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,15 +15,17 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
+using namespace hal;
+using namespace hal::sim;
 using namespace wpi::java;
-using namespace sim;
 
 static hal::UnlimitedHandleResource<SIM_JniHandle, ConstBufferCallbackStore,
                                     hal::HAL_HandleEnum::SimulationJni>*
     callbackHandles;
 
+namespace hal {
 namespace sim {
 void InitializeConstBufferStore() {
   static hal::UnlimitedHandleResource<SIM_JniHandle, ConstBufferCallbackStore,
@@ -32,6 +34,7 @@
   callbackHandles = &cb;
 }
 }  // namespace sim
+}  // namespace hal
 
 void ConstBufferCallbackStore::create(JNIEnv* env, jobject obj) {
   m_call = JGlobal<jobject>(env, obj);
diff --git a/hal/src/main/native/sim/jni/ConstBufferCallbackStore.h b/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.h
similarity index 91%
rename from hal/src/main/native/sim/jni/ConstBufferCallbackStore.h
rename to hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.h
index 2164a74..b69eccf 100644
--- a/hal/src/main/native/sim/jni/ConstBufferCallbackStore.h
+++ b/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,8 +15,9 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
+namespace hal {
 namespace sim {
 class ConstBufferCallbackStore {
  public:
@@ -44,3 +45,4 @@
 void FreeConstBufferCallback(JNIEnv* env, SIM_JniHandle handle, jint index,
                              FreeConstBufferCallbackFunc freeCallback);
 }  // namespace sim
+}  // namespace hal
diff --git a/hal/src/main/native/sim/jni/DIODataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/DIODataJNI.cpp
similarity index 66%
rename from hal/src/main/native/sim/jni/DIODataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/DIODataJNI.cpp
index 2ad55f9..f757558 100644
--- a/hal/src/main/native/sim/jni/DIODataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/DIODataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_DIODataJNI.h"
-#include "mockdata/DIOData.h"
+#include "edu_wpi_first_hal_simulation_DIODataJNI.h"
+#include "hal/simulation/DIOData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_DIODataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDIOInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_DIODataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetDIOInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    registerValueCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_registerValueCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_registerValueCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,48 +79,48 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    cancelValueCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_cancelValueCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_cancelValueCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index, &HALSIM_CancelDIOValueCallback);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    getValue
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_getValue
+Java_edu_wpi_first_hal_simulation_DIODataJNI_getValue
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDIOValue(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    setValue
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_setValue
+Java_edu_wpi_first_hal_simulation_DIODataJNI_setValue
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetDIOValue(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    registerPulseLengthCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_registerPulseLengthCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_registerPulseLengthCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -126,12 +128,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    cancelPulseLengthCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_cancelPulseLengthCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_cancelPulseLengthCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -139,36 +141,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    getPulseLength
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_getPulseLength
+Java_edu_wpi_first_hal_simulation_DIODataJNI_getPulseLength
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDIOPulseLength(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    setPulseLength
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_setPulseLength
+Java_edu_wpi_first_hal_simulation_DIODataJNI_setPulseLength
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetDIOPulseLength(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    registerIsInputCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_registerIsInputCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_registerIsInputCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -176,12 +178,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    cancelIsInputCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_cancelIsInputCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_cancelIsInputCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -189,36 +191,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    getIsInput
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_getIsInput
+Java_edu_wpi_first_hal_simulation_DIODataJNI_getIsInput
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDIOIsInput(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    setIsInput
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_setIsInput
+Java_edu_wpi_first_hal_simulation_DIODataJNI_setIsInput
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetDIOIsInput(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    registerFilterIndexCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_registerFilterIndexCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_registerFilterIndexCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -226,12 +228,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    cancelFilterIndexCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_cancelFilterIndexCallback
+Java_edu_wpi_first_hal_simulation_DIODataJNI_cancelFilterIndexCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -239,36 +241,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    getFilterIndex
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_getFilterIndex
+Java_edu_wpi_first_hal_simulation_DIODataJNI_getFilterIndex
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDIOFilterIndex(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    setFilterIndex
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_setFilterIndex
+Java_edu_wpi_first_hal_simulation_DIODataJNI_setFilterIndex
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetDIOFilterIndex(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DIODataJNI
+ * Class:     edu_wpi_first_hal_simulation_DIODataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DIODataJNI_resetData
+Java_edu_wpi_first_hal_simulation_DIODataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetDIOData(index);
diff --git a/hal/src/main/native/sim/jni/DigitalPWMDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/DigitalPWMDataJNI.cpp
similarity index 61%
rename from hal/src/main/native/sim/jni/DigitalPWMDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/DigitalPWMDataJNI.cpp
index 0800917..ea6bee2 100644
--- a/hal/src/main/native/sim/jni/DigitalPWMDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/DigitalPWMDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI.h"
-#include "mockdata/DigitalPWMData.h"
+#include "edu_wpi_first_hal_simulation_DigitalPWMDataJNI.h"
+#include "hal/simulation/DigitalPWMData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDigitalPWMInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetDigitalPWMInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    registerDutyCycleCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_registerDutyCycleCallback
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_registerDutyCycleCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    cancelDutyCycleCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_cancelDutyCycleCallback
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_cancelDutyCycleCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    getDutyCycle
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_getDutyCycle
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_getDutyCycle
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDigitalPWMDutyCycle(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    setDutyCycle
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_setDutyCycle
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_setDutyCycle
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetDigitalPWMDutyCycle(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    registerPinCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_registerPinCallback
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_registerPinCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,12 +129,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    cancelPinCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_cancelPinCallback
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_cancelPinCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -140,39 +142,51 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    getPin
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_getPin
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_getPin
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDigitalPWMPin(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    setPin
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_setPin
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_setPin
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetDigitalPWMPin(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DigitalPWMDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetDigitalPWMData(index);
 }
 
+/*
+ * Class:     edu_wpi_first_hal_simulation_DigitalPWMDataJNI
+ * Method:    findForChannel
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DigitalPWMDataJNI_findForChannel
+  (JNIEnv*, jclass, jint channel)
+{
+  return HALSIM_FindDigitalPWMForChannel(channel);
+}
+
 }  // extern "C"
diff --git a/hal/src/main/native/cpp/jni/simulation/DriverStationDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/DriverStationDataJNI.cpp
new file mode 100644
index 0000000..7868e43
--- /dev/null
+++ b/hal/src/main/native/cpp/jni/simulation/DriverStationDataJNI.cpp
@@ -0,0 +1,825 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include <jni.h>
+
+#include <cstring>
+
+#include <wpi/jni_util.h>
+
+#include "CallbackStore.h"
+#include "edu_wpi_first_hal_simulation_DriverStationDataJNI.h"
+#include "hal/simulation/DriverStationData.h"
+#include "hal/simulation/MockHooks.h"
+
+using namespace hal;
+using namespace wpi::java;
+
+extern "C" {
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerEnabledCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerEnabledCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterDriverStationEnabledCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelEnabledCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelEnabledCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelDriverStationEnabledCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getEnabled
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getEnabled
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationEnabled();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setEnabled
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setEnabled
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetDriverStationEnabled(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerAutonomousCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerAutonomousCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterDriverStationAutonomousCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelAutonomousCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelAutonomousCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(
+      env, handle, &HALSIM_CancelDriverStationAutonomousCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getAutonomous
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getAutonomous
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationAutonomous();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setAutonomous
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setAutonomous
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetDriverStationAutonomous(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerTestCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerTestCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify, &HALSIM_RegisterDriverStationTestCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelTestCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelTestCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelDriverStationTestCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getTest
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getTest
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationTest();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setTest
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setTest
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetDriverStationTest(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerEStopCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerEStopCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify, &HALSIM_RegisterDriverStationEStopCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelEStopCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelEStopCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelDriverStationEStopCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getEStop
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getEStop
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationEStop();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setEStop
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setEStop
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetDriverStationEStop(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerFmsAttachedCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerFmsAttachedCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterDriverStationFmsAttachedCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelFmsAttachedCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelFmsAttachedCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(
+      env, handle, &HALSIM_CancelDriverStationFmsAttachedCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getFmsAttached
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getFmsAttached
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationFmsAttached();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setFmsAttached
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setFmsAttached
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetDriverStationFmsAttached(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerDsAttachedCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerDsAttachedCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterDriverStationDsAttachedCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelDsAttachedCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelDsAttachedCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(
+      env, handle, &HALSIM_CancelDriverStationDsAttachedCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getDsAttached
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getDsAttached
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationDsAttached();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setDsAttached
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setDsAttached
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetDriverStationDsAttached(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerAllianceStationIdCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerAllianceStationIdCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterDriverStationAllianceStationIdCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelAllianceStationIdCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelAllianceStationIdCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(
+      env, handle, &HALSIM_CancelDriverStationAllianceStationIdCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getAllianceStationId
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getAllianceStationId
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationAllianceStationId();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setAllianceStationId
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setAllianceStationId
+  (JNIEnv*, jclass, jint value)
+{
+  HALSIM_SetDriverStationAllianceStationId(
+      static_cast<HAL_AllianceStationID>(value));
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerMatchTimeCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerMatchTimeCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterDriverStationMatchTimeCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    cancelMatchTimeCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_cancelMatchTimeCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelDriverStationMatchTimeCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getMatchTime
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getMatchTime
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetDriverStationMatchTime();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setMatchTime
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setMatchTime
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetDriverStationMatchTime(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickAxes
+ * Signature: (B[F)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickAxes
+  (JNIEnv* env, jclass, jbyte joystickNum, jfloatArray axesArray)
+{
+  HAL_JoystickAxes axes;
+  {
+    wpi::java::JFloatArrayRef jArrayRef(env, axesArray);
+    auto arrayRef = jArrayRef.array();
+    auto arraySize = arrayRef.size();
+    int maxCount =
+        arraySize < HAL_kMaxJoystickAxes ? arraySize : HAL_kMaxJoystickAxes;
+    axes.count = maxCount;
+    for (int i = 0; i < maxCount; i++) {
+      axes.axes[i] = arrayRef[i];
+    }
+  }
+  HALSIM_SetJoystickAxes(joystickNum, &axes);
+  return;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickPOVs
+ * Signature: (B[S)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickPOVs
+  (JNIEnv* env, jclass, jbyte joystickNum, jshortArray povsArray)
+{
+  HAL_JoystickPOVs povs;
+  {
+    wpi::java::JShortArrayRef jArrayRef(env, povsArray);
+    auto arrayRef = jArrayRef.array();
+    auto arraySize = arrayRef.size();
+    int maxCount =
+        arraySize < HAL_kMaxJoystickPOVs ? arraySize : HAL_kMaxJoystickPOVs;
+    povs.count = maxCount;
+    for (int i = 0; i < maxCount; i++) {
+      povs.povs[i] = arrayRef[i];
+    }
+  }
+  HALSIM_SetJoystickPOVs(joystickNum, &povs);
+  return;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickButtons
+ * Signature: (BII)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickButtons
+  (JNIEnv* env, jclass, jbyte joystickNum, jint buttons, jint count)
+{
+  if (count > 32) {
+    count = 32;
+  }
+  HAL_JoystickButtons joystickButtons;
+  joystickButtons.count = count;
+  joystickButtons.buttons = buttons;
+  HALSIM_SetJoystickButtons(joystickNum, &joystickButtons);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getJoystickOutputs
+ * Signature: (I)J
+ */
+JNIEXPORT jlong JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getJoystickOutputs
+  (JNIEnv* env, jclass, jint stick)
+{
+  int64_t outputs = 0;
+  int32_t leftRumble;
+  int32_t rightRumble;
+  HALSIM_GetJoystickOutputs(stick, &outputs, &leftRumble, &rightRumble);
+  return outputs;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    getJoystickRumble
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_getJoystickRumble
+  (JNIEnv* env, jclass, jint stick, jint rumbleNum)
+{
+  int64_t outputs;
+  int32_t leftRumble = 0;
+  int32_t rightRumble = 0;
+  HALSIM_GetJoystickOutputs(stick, &outputs, &leftRumble, &rightRumble);
+  return rumbleNum == 0 ? leftRumble : rightRumble;
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setMatchInfo
+ * Signature: (Ljava/lang/String;Ljava/lang/String;III)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setMatchInfo
+  (JNIEnv* env, jclass, jstring eventName, jstring gameSpecificMessage,
+   jint matchNumber, jint replayNumber, jint matchType)
+{
+  JStringRef eventNameRef{env, eventName};
+  JStringRef gameSpecificMessageRef{env, gameSpecificMessage};
+
+  HAL_MatchInfo halMatchInfo;
+  std::snprintf(halMatchInfo.eventName, sizeof(halMatchInfo.eventName), "%s",
+                eventNameRef.c_str());
+  std::snprintf(reinterpret_cast<char*>(halMatchInfo.gameSpecificMessage),
+                sizeof(halMatchInfo.gameSpecificMessage), "%s",
+                gameSpecificMessageRef.c_str());
+  halMatchInfo.gameSpecificMessageSize = gameSpecificMessageRef.size();
+  halMatchInfo.matchType = (HAL_MatchType)matchType;
+  halMatchInfo.matchNumber = matchNumber;
+  halMatchInfo.replayNumber = replayNumber;
+  HALSIM_SetMatchInfo(&halMatchInfo);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    registerAllCallbacks
+ * Signature: (Ljava/lang/Object;Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_registerAllCallbacks
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      [](HAL_NotifyCallback cb, void* param, HAL_Bool in) {
+        HALSIM_RegisterDriverStationAllCallbacks(cb, param, in);
+        return 0;
+      });
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    notifyNewData
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_notifyNewData
+  (JNIEnv*, jclass)
+{
+  HALSIM_NotifyDriverStationNewData();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setSendError
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setSendError
+  (JNIEnv*, jclass, jboolean shouldSend)
+{
+  if (shouldSend) {
+    HALSIM_SetSendError(nullptr);
+  } else {
+    HALSIM_SetSendError([](HAL_Bool isError, int32_t errorCode,
+                           HAL_Bool isLVCode, const char* details,
+                           const char* location, const char* callStack,
+                           HAL_Bool printMsg) { return 0; });
+  }
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setSendConsoleLine
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setSendConsoleLine
+  (JNIEnv*, jclass, jboolean shouldSend)
+{
+  if (shouldSend) {
+    HALSIM_SetSendConsoleLine(nullptr);
+  } else {
+    HALSIM_SetSendConsoleLine([](const char* line) { return 0; });
+  }
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickButton
+ * Signature: (IIZ)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickButton
+  (JNIEnv*, jclass, jint stick, jint button, jboolean state)
+{
+  HALSIM_SetJoystickButton(stick, button, state);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickAxis
+ * Signature: (IID)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickAxis
+  (JNIEnv*, jclass, jint stick, jint axis, jdouble value)
+{
+  HALSIM_SetJoystickAxis(stick, axis, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickPOV
+ * Signature: (III)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickPOV
+  (JNIEnv*, jclass, jint stick, jint pov, jint value)
+{
+  HALSIM_SetJoystickPOV(stick, pov, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickButtonsValue
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickButtonsValue
+  (JNIEnv*, jclass, jint stick, jint buttons)
+{
+  HALSIM_SetJoystickButtonsValue(stick, buttons);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickAxisCount
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickAxisCount
+  (JNIEnv*, jclass, jint stick, jint count)
+{
+  HALSIM_SetJoystickAxisCount(stick, count);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickPOVCount
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickPOVCount
+  (JNIEnv*, jclass, jint stick, jint count)
+{
+  HALSIM_SetJoystickPOVCount(stick, count);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickButtonCount
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickButtonCount
+  (JNIEnv*, jclass, jint stick, jint count)
+{
+  HALSIM_SetJoystickButtonCount(stick, count);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickIsXbox
+ * Signature: (IZ)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickIsXbox
+  (JNIEnv*, jclass, jint stick, jboolean isXbox)
+{
+  HALSIM_SetJoystickIsXbox(stick, isXbox);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickType
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickType
+  (JNIEnv*, jclass, jint stick, jint type)
+{
+  HALSIM_SetJoystickType(stick, type);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickName
+ * Signature: (ILjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickName
+  (JNIEnv* env, jclass, jint stick, jstring name)
+{
+  HALSIM_SetJoystickName(stick, JStringRef{env, name}.c_str());
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setJoystickAxisType
+ * Signature: (III)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setJoystickAxisType
+  (JNIEnv*, jclass, jint stick, jint axis, jint type)
+{
+  HALSIM_SetJoystickAxisType(stick, axis, type);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setGameSpecificMessage
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setGameSpecificMessage
+  (JNIEnv* env, jclass, jstring message)
+{
+  HALSIM_SetGameSpecificMessage(JStringRef{env, message}.c_str());
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setEventName
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setEventName
+  (JNIEnv* env, jclass, jstring name)
+{
+  HALSIM_SetEventName(JStringRef{env, name}.c_str());
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setMatchType
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setMatchType
+  (JNIEnv*, jclass, jint type)
+{
+  HALSIM_SetMatchType(static_cast<HAL_MatchType>(static_cast<int>(type)));
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setMatchNumber
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setMatchNumber
+  (JNIEnv*, jclass, jint matchNumber)
+{
+  HALSIM_SetMatchNumber(matchNumber);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    setReplayNumber
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_setReplayNumber
+  (JNIEnv*, jclass, jint replayNumber)
+{
+  HALSIM_SetReplayNumber(replayNumber);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_DriverStationDataJNI
+ * Method:    resetData
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_DriverStationDataJNI_resetData
+  (JNIEnv*, jclass)
+{
+  HALSIM_ResetDriverStationData();
+}
+
+}  // extern "C"
diff --git a/hal/src/main/native/sim/jni/DutyCycleDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/DutyCycleDataJNI.cpp
similarity index 62%
rename from hal/src/main/native/sim/jni/DutyCycleDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/DutyCycleDataJNI.cpp
index d746ce1..054fa67 100644
--- a/hal/src/main/native/sim/jni/DutyCycleDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/DutyCycleDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI.h"
-#include "mockdata/DutyCycleData.h"
+#include "edu_wpi_first_hal_simulation_DutyCycleDataJNI.h"
+#include "hal/simulation/DutyCycleData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDutyCycleInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetDutyCycleInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    registerFrequencyCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_registerFrequencyCallback
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_registerFrequencyCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    cancelFrequencyCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_cancelFrequencyCallback
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_cancelFrequencyCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    getFrequency
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_getFrequency
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_getFrequency
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDutyCycleFrequency(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    setFrequency
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_setFrequency
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_setFrequency
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetDutyCycleFrequency(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    registerOutputCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_registerOutputCallback
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_registerOutputCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,12 +129,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    cancelOutputCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_cancelOutputCallback
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_cancelOutputCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -140,39 +142,51 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    getOutput
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_getOutput
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_getOutput
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetDutyCycleOutput(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    setOutput
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_setOutput
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_setOutput
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetDutyCycleOutput(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DutyCycleDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetDutyCycleData(index);
 }
 
+/*
+ * Class:     edu_wpi_first_hal_simulation_DutyCycleDataJNI
+ * Method:    findForChannel
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_DutyCycleDataJNI_findForChannel
+  (JNIEnv*, jclass, jint channel)
+{
+  return HALSIM_FindDutyCycleForChannel(channel);
+}
+
 }  // extern "C"
diff --git a/hal/src/main/native/cpp/jni/simulation/EncoderDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/EncoderDataJNI.cpp
new file mode 100644
index 0000000..b97e0fe
--- /dev/null
+++ b/hal/src/main/native/cpp/jni/simulation/EncoderDataJNI.cpp
@@ -0,0 +1,490 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include <jni.h>
+
+#include "CallbackStore.h"
+#include "edu_wpi_first_hal_simulation_EncoderDataJNI.h"
+#include "hal/simulation/EncoderData.h"
+
+using namespace hal;
+
+extern "C" {
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerInitializedCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerInitializedCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderInitializedCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelInitializedCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelInitializedCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderInitializedCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getInitialized
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getInitialized
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderInitialized(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setInitialized
+ * Signature: (IZ)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setInitialized
+  (JNIEnv*, jclass, jint index, jboolean value)
+{
+  HALSIM_SetEncoderInitialized(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerCountCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerCountCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderCountCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelCountCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelCountCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderCountCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getCount
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getCount
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderCount(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setCount
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setCount
+  (JNIEnv*, jclass, jint index, jint value)
+{
+  HALSIM_SetEncoderCount(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerPeriodCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerPeriodCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderPeriodCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelPeriodCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelPeriodCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderPeriodCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getPeriod
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getPeriod
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderPeriod(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setPeriod
+ * Signature: (ID)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setPeriod
+  (JNIEnv*, jclass, jint index, jdouble value)
+{
+  HALSIM_SetEncoderPeriod(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerResetCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerResetCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderResetCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelResetCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelResetCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderResetCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getReset
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getReset
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderReset(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setReset
+ * Signature: (IZ)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setReset
+  (JNIEnv*, jclass, jint index, jboolean value)
+{
+  HALSIM_SetEncoderReset(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerMaxPeriodCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerMaxPeriodCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderMaxPeriodCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelMaxPeriodCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelMaxPeriodCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderMaxPeriodCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getMaxPeriod
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getMaxPeriod
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderMaxPeriod(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setMaxPeriod
+ * Signature: (ID)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setMaxPeriod
+  (JNIEnv*, jclass, jint index, jdouble value)
+{
+  HALSIM_SetEncoderMaxPeriod(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerDirectionCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerDirectionCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderDirectionCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelDirectionCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelDirectionCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderDirectionCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getDirection
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getDirection
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderDirection(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setDirection
+ * Signature: (IZ)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setDirection
+  (JNIEnv*, jclass, jint index, jboolean value)
+{
+  HALSIM_SetEncoderDirection(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerReverseDirectionCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerReverseDirectionCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderReverseDirectionCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelReverseDirectionCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelReverseDirectionCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderReverseDirectionCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getReverseDirection
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getReverseDirection
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderReverseDirection(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setReverseDirection
+ * Signature: (IZ)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setReverseDirection
+  (JNIEnv*, jclass, jint index, jboolean value)
+{
+  HALSIM_SetEncoderReverseDirection(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    registerSamplesToAverageCallback
+ * Signature: (ILjava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_registerSamplesToAverageCallback
+  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallback(env, index, callback, initialNotify,
+                               &HALSIM_RegisterEncoderSamplesToAverageCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    cancelSamplesToAverageCallback
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_cancelSamplesToAverageCallback
+  (JNIEnv* env, jclass, jint index, jint handle)
+{
+  return sim::FreeCallback(env, handle, index,
+                           &HALSIM_CancelEncoderSamplesToAverageCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getSamplesToAverage
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getSamplesToAverage
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderSamplesToAverage(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setSamplesToAverage
+ * Signature: (II)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setSamplesToAverage
+  (JNIEnv*, jclass, jint index, jint value)
+{
+  HALSIM_SetEncoderSamplesToAverage(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setDistance
+ * Signature: (ID)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setDistance
+  (JNIEnv*, jclass, jint index, jdouble value)
+{
+  HALSIM_SetEncoderDistance(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getDistance
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getDistance
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderDistance(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    setRate
+ * Signature: (ID)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_setRate
+  (JNIEnv*, jclass, jint index, jdouble value)
+{
+  HALSIM_SetEncoderRate(index, value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    getRate
+ * Signature: (I)D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_getRate
+  (JNIEnv*, jclass, jint index)
+{
+  return HALSIM_GetEncoderRate(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    resetData
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_resetData
+  (JNIEnv*, jclass, jint index)
+{
+  HALSIM_ResetEncoderData(index);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_EncoderDataJNI
+ * Method:    findForChannel
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_EncoderDataJNI_findForChannel
+  (JNIEnv*, jclass, jint channel)
+{
+  return HALSIM_FindEncoderForChannel(channel);
+}
+
+}  // extern "C"
diff --git a/hal/src/main/native/sim/jni/I2CDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/I2CDataJNI.cpp
similarity index 68%
rename from hal/src/main/native/sim/jni/I2CDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/I2CDataJNI.cpp
index 14b3292..e4c2259 100644
--- a/hal/src/main/native/sim/jni/I2CDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/I2CDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,18 +10,20 @@
 #include "BufferCallbackStore.h"
 #include "CallbackStore.h"
 #include "ConstBufferCallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_I2CDataJNI.h"
-#include "mockdata/I2CData.h"
+#include "edu_wpi_first_hal_simulation_I2CDataJNI.h"
+#include "hal/simulation/I2CData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -29,12 +31,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -42,36 +44,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetI2CInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetI2CInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    registerReadCallback
  * Signature: (ILjava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_registerReadCallback
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_registerReadCallback
   (JNIEnv* env, jclass, jint index, jobject callback)
 {
   return sim::AllocateBufferCallback(env, index, callback,
@@ -79,24 +81,24 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    cancelReadCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_cancelReadCallback
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_cancelReadCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   sim::FreeBufferCallback(env, handle, index, &HALSIM_CancelI2CReadCallback);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    registerWriteCallback
  * Signature: (ILjava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_registerWriteCallback
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_registerWriteCallback
   (JNIEnv* env, jclass, jint index, jobject callback)
 {
   return sim::AllocateConstBufferCallback(env, index, callback,
@@ -104,12 +106,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    cancelWriteCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_cancelWriteCallback
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_cancelWriteCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   sim::FreeConstBufferCallback(env, handle, index,
@@ -117,12 +119,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_I2CDataJNI
+ * Class:     edu_wpi_first_hal_simulation_I2CDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_I2CDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_I2CDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetI2CData(index);
diff --git a/hal/src/main/native/sim/jni/NotifierDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/NotifierDataJNI.cpp
similarity index 63%
rename from hal/src/main/native/sim/jni/NotifierDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/NotifierDataJNI.cpp
index b59b6e0..845c164 100644
--- a/hal/src/main/native/sim/jni/NotifierDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/NotifierDataJNI.cpp
@@ -1,34 +1,34 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include "edu_wpi_first_hal_sim_mockdata_NotifierDataJNI.h"
-#include "mockdata/NotifierData.h"
+#include "edu_wpi_first_hal_simulation_NotifierDataJNI.h"
+#include "hal/simulation/NotifierData.h"
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_NotifierDataJNI
+ * Class:     edu_wpi_first_hal_simulation_NotifierDataJNI
  * Method:    getNextTimeout
  * Signature: ()J
  */
 JNIEXPORT jlong JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_NotifierDataJNI_getNextTimeout
+Java_edu_wpi_first_hal_simulation_NotifierDataJNI_getNextTimeout
   (JNIEnv*, jclass)
 {
   return HALSIM_GetNextNotifierTimeout();
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_NotifierDataJNI
+ * Class:     edu_wpi_first_hal_simulation_NotifierDataJNI
  * Method:    getNumNotifiers
  * Signature: ()I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_NotifierDataJNI_getNumNotifiers
+Java_edu_wpi_first_hal_simulation_NotifierDataJNI_getNumNotifiers
   (JNIEnv*, jclass)
 {
   return HALSIM_GetNumNotifiers();
diff --git a/hal/src/main/native/sim/jni/PCMDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/PCMDataJNI.cpp
similarity index 68%
rename from hal/src/main/native/sim/jni/PCMDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/PCMDataJNI.cpp
index de6f738..cfcd2c0 100644
--- a/hal/src/main/native/sim/jni/PCMDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/PCMDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_PCMDataJNI.h"
-#include "mockdata/PCMData.h"
+#include "edu_wpi_first_hal_simulation_PCMDataJNI.h"
+#include "hal/simulation/PCMData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerSolenoidInitializedCallback
  * Signature: (IILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerSolenoidInitializedCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerSolenoidInitializedCallback
   (JNIEnv* env, jclass, jint index, jint channel, jobject callback,
    jboolean initialNotify)
 {
@@ -29,12 +31,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    cancelSolenoidInitializedCallback
  * Signature: (III)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_cancelSolenoidInitializedCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_cancelSolenoidInitializedCallback
   (JNIEnv* env, jclass, jint index, jint channel, jint handle)
 {
   return sim::FreeChannelCallback(env, handle, index, channel,
@@ -42,36 +44,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    getSolenoidInitialized
  * Signature: (II)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_getSolenoidInitialized
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_getSolenoidInitialized
   (JNIEnv*, jclass, jint index, jint channel)
 {
   return HALSIM_GetPCMSolenoidInitialized(index, channel);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    setSolenoidInitialized
  * Signature: (IIZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_setSolenoidInitialized
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_setSolenoidInitialized
   (JNIEnv*, jclass, jint index, jint channel, jboolean value)
 {
   HALSIM_SetPCMSolenoidInitialized(index, channel, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerSolenoidOutputCallback
  * Signature: (IILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerSolenoidOutputCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerSolenoidOutputCallback
   (JNIEnv* env, jclass, jint index, jint channel, jobject callback,
    jboolean initialNotify)
 {
@@ -81,12 +83,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    cancelSolenoidOutputCallback
  * Signature: (III)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_cancelSolenoidOutputCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_cancelSolenoidOutputCallback
   (JNIEnv* env, jclass, jint index, jint channel, jint handle)
 {
   return sim::FreeChannelCallback(env, handle, index, channel,
@@ -94,36 +96,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    getSolenoidOutput
  * Signature: (II)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_getSolenoidOutput
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_getSolenoidOutput
   (JNIEnv*, jclass, jint index, jint channel)
 {
   return HALSIM_GetPCMSolenoidOutput(index, channel);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    setSolenoidOutput
  * Signature: (IIZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_setSolenoidOutput
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_setSolenoidOutput
   (JNIEnv*, jclass, jint index, jint channel, jboolean value)
 {
   HALSIM_SetPCMSolenoidOutput(index, channel, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerCompressorInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerCompressorInitializedCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerCompressorInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(
@@ -132,12 +134,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    cancelCompressorInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_cancelCompressorInitializedCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_cancelCompressorInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -145,36 +147,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    getCompressorInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_getCompressorInitialized
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_getCompressorInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPCMCompressorInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    setCompressorInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_setCompressorInitialized
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_setCompressorInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetPCMCompressorInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerCompressorOnCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerCompressorOnCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerCompressorOnCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -182,12 +184,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    cancelCompressorOnCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_cancelCompressorOnCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_cancelCompressorOnCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -195,36 +197,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    getCompressorOn
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_getCompressorOn
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_getCompressorOn
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPCMCompressorOn(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    setCompressorOn
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_setCompressorOn
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_setCompressorOn
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetPCMCompressorOn(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerClosedLoopEnabledCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerClosedLoopEnabledCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerClosedLoopEnabledCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -232,12 +234,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    cancelClosedLoopEnabledCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_cancelClosedLoopEnabledCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_cancelClosedLoopEnabledCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -245,36 +247,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    getClosedLoopEnabled
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_getClosedLoopEnabled
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_getClosedLoopEnabled
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPCMClosedLoopEnabled(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    setClosedLoopEnabled
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_setClosedLoopEnabled
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_setClosedLoopEnabled
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetPCMClosedLoopEnabled(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerPressureSwitchCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerPressureSwitchCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerPressureSwitchCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -282,12 +284,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    cancelPressureSwitchCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_cancelPressureSwitchCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_cancelPressureSwitchCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -295,36 +297,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    getPressureSwitch
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_getPressureSwitch
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_getPressureSwitch
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPCMPressureSwitch(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    setPressureSwitch
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_setPressureSwitch
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_setPressureSwitch
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetPCMPressureSwitch(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerCompressorCurrentCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerCompressorCurrentCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerCompressorCurrentCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -332,12 +334,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    cancelCompressorCurrentCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_cancelCompressorCurrentCallback
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_cancelCompressorCurrentCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -345,36 +347,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    getCompressorCurrent
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_getCompressorCurrent
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_getCompressorCurrent
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPCMCompressorCurrent(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    setCompressorCurrent
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_setCompressorCurrent
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_setCompressorCurrent
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetPCMCompressorCurrent(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerAllNonSolenoidCallbacks
  * Signature: (ILjava/lang/Object;Z)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerAllNonSolenoidCallbacks
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerAllNonSolenoidCallbacks
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   sim::AllocateCallback(
@@ -386,12 +388,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    registerAllSolenoidCallbacks
  * Signature: (IILjava/lang/Object;Z)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_registerAllSolenoidCallbacks
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_registerAllSolenoidCallbacks
   (JNIEnv* env, jclass, jint index, jint channel, jobject callback,
    jboolean initialNotify)
 {
@@ -405,12 +407,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PCMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PCMDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PCMDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_PCMDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetPCMData(index);
diff --git a/hal/src/main/native/sim/jni/PDPDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/PDPDataJNI.cpp
similarity index 67%
rename from hal/src/main/native/sim/jni/PDPDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/PDPDataJNI.cpp
index 5d39e87..2ce6cbd 100644
--- a/hal/src/main/native/sim/jni/PDPDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/PDPDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_PDPDataJNI.h"
-#include "mockdata/PDPData.h"
+#include "edu_wpi_first_hal_simulation_PDPDataJNI.h"
+#include "hal/simulation/PDPData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPDPInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetPDPInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    registerTemperatureCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_registerTemperatureCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_registerTemperatureCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    cancelTemperatureCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_cancelTemperatureCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_cancelTemperatureCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    getTemperature
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_getTemperature
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_getTemperature
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPDPTemperature(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    setTemperature
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_setTemperature
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_setTemperature
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetPDPTemperature(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    registerVoltageCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_registerVoltageCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_registerVoltageCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,12 +129,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    cancelVoltageCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_cancelVoltageCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_cancelVoltageCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -140,36 +142,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    getVoltage
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_getVoltage
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_getVoltage
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPDPVoltage(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    setVoltage
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_setVoltage
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_setVoltage
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetPDPVoltage(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    registerCurrentCallback
  * Signature: (IILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_registerCurrentCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_registerCurrentCallback
   (JNIEnv* env, jclass, jint index, jint channel, jobject callback,
    jboolean initialNotify)
 {
@@ -179,12 +181,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    cancelCurrentCallback
  * Signature: (III)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_cancelCurrentCallback
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_cancelCurrentCallback
   (JNIEnv* env, jclass, jint index, jint channel, jint handle)
 {
   return sim::FreeChannelCallback(env, handle, index, channel,
@@ -192,36 +194,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    getCurrent
  * Signature: (II)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_getCurrent
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_getCurrent
   (JNIEnv*, jclass, jint index, jint channel)
 {
   return HALSIM_GetPDPCurrent(index, channel);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    setCurrent
  * Signature: (IID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_setCurrent
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_setCurrent
   (JNIEnv*, jclass, jint index, jint channel, jdouble value)
 {
   HALSIM_SetPDPCurrent(index, channel, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PDPDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PDPDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PDPDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_PDPDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetPDPData(index);
diff --git a/hal/src/main/native/sim/jni/PWMDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/PWMDataJNI.cpp
similarity index 65%
rename from hal/src/main/native/sim/jni/PWMDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/PWMDataJNI.cpp
index b8a7c41..03e61ef 100644
--- a/hal/src/main/native/sim/jni/PWMDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/PWMDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_PWMDataJNI.h"
-#include "mockdata/PWMData.h"
+#include "edu_wpi_first_hal_simulation_PWMDataJNI.h"
+#include "hal/simulation/PWMData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPWMInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetPWMInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    registerRawValueCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_registerRawValueCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_registerRawValueCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    cancelRawValueCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_cancelRawValueCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_cancelRawValueCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    getRawValue
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_getRawValue
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_getRawValue
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPWMRawValue(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    setRawValue
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_setRawValue
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_setRawValue
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetPWMRawValue(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    registerSpeedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_registerSpeedCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_registerSpeedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,48 +129,48 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    cancelSpeedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_cancelSpeedCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_cancelSpeedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index, &HALSIM_CancelPWMSpeedCallback);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    getSpeed
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_getSpeed
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_getSpeed
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPWMSpeed(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    setSpeed
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_setSpeed
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_setSpeed
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetPWMSpeed(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    registerPositionCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_registerPositionCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_registerPositionCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -176,12 +178,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    cancelPositionCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_cancelPositionCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_cancelPositionCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -189,36 +191,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    getPosition
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_getPosition
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_getPosition
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPWMPosition(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    setPosition
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_setPosition
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_setPosition
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetPWMPosition(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    registerPeriodScaleCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_registerPeriodScaleCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_registerPeriodScaleCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -226,12 +228,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    cancelPeriodScaleCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_cancelPeriodScaleCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_cancelPeriodScaleCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -239,36 +241,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    getPeriodScale
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_getPeriodScale
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_getPeriodScale
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPWMPeriodScale(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    setPeriodScale
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_setPeriodScale
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_setPeriodScale
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetPWMPeriodScale(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    registerZeroLatchCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_registerZeroLatchCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_registerZeroLatchCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -276,12 +278,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    cancelZeroLatchCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_cancelZeroLatchCallback
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_cancelZeroLatchCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -289,36 +291,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    getZeroLatch
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_getZeroLatch
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_getZeroLatch
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetPWMZeroLatch(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    setZeroLatch
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_setZeroLatch
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_setZeroLatch
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetPWMZeroLatch(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_PWMDataJNI
+ * Class:     edu_wpi_first_hal_simulation_PWMDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_PWMDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_PWMDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetPWMData(index);
diff --git a/hal/src/main/native/sim/jni/RelayDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/RelayDataJNI.cpp
similarity index 66%
rename from hal/src/main/native/sim/jni/RelayDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/RelayDataJNI.cpp
index bf85407..7abe7cb 100644
--- a/hal/src/main/native/sim/jni/RelayDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/RelayDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_RelayDataJNI.h"
-#include "mockdata/RelayData.h"
+#include "edu_wpi_first_hal_simulation_RelayDataJNI.h"
+#include "hal/simulation/RelayData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    registerInitializedForwardCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_registerInitializedForwardCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_registerInitializedForwardCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    cancelInitializedForwardCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_cancelInitializedForwardCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_cancelInitializedForwardCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    getInitializedForward
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_getInitializedForward
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_getInitializedForward
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetRelayInitializedForward(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    setInitializedForward
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_setInitializedForward
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_setInitializedForward
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetRelayInitializedForward(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    registerInitializedReverseCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_registerInitializedReverseCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_registerInitializedReverseCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    cancelInitializedReverseCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_cancelInitializedReverseCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_cancelInitializedReverseCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    getInitializedReverse
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_getInitializedReverse
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_getInitializedReverse
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetRelayInitializedReverse(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    setInitializedReverse
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_setInitializedReverse
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_setInitializedReverse
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetRelayInitializedReverse(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    registerForwardCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_registerForwardCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_registerForwardCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,12 +129,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    cancelForwardCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_cancelForwardCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_cancelForwardCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -140,36 +142,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    getForward
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_getForward
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_getForward
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetRelayForward(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    setForward
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_setForward
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_setForward
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetRelayForward(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    registerReverseCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_registerReverseCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_registerReverseCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -177,12 +179,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    cancelReverseCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_cancelReverseCallback
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_cancelReverseCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -190,36 +192,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    getReverse
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_getReverse
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_getReverse
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetRelayReverse(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    setReverse
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_setReverse
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_setReverse
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetRelayReverse(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_RelayDataJNI
+ * Class:     edu_wpi_first_hal_simulation_RelayDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RelayDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_RelayDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetRelayData(index);
diff --git a/hal/src/main/native/cpp/jni/simulation/RoboRioDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/RoboRioDataJNI.cpp
new file mode 100644
index 0000000..1ff6044
--- /dev/null
+++ b/hal/src/main/native/cpp/jni/simulation/RoboRioDataJNI.cpp
@@ -0,0 +1,792 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include <jni.h>
+
+#include "CallbackStore.h"
+#include "edu_wpi_first_hal_simulation_RoboRioDataJNI.h"
+#include "hal/simulation/RoboRioData.h"
+
+using namespace hal;
+
+extern "C" {
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerFPGAButtonCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerFPGAButtonCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify, &HALSIM_RegisterRoboRioFPGAButtonCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelFPGAButtonCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelFPGAButtonCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioFPGAButtonCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getFPGAButton
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getFPGAButton
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioFPGAButton();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setFPGAButton
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setFPGAButton
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetRoboRioFPGAButton(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerVInVoltageCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerVInVoltageCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify, &HALSIM_RegisterRoboRioVInVoltageCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelVInVoltageCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelVInVoltageCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioVInVoltageCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getVInVoltage
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getVInVoltage
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioVInVoltage();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setVInVoltage
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setVInVoltage
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioVInVoltage(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerVInCurrentCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerVInCurrentCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify, &HALSIM_RegisterRoboRioVInCurrentCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelVInCurrentCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelVInCurrentCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioVInCurrentCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getVInCurrent
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getVInCurrent
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioVInCurrent();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setVInCurrent
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setVInCurrent
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioVInCurrent(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserVoltage6VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserVoltage6VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserVoltage6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserVoltage6VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserVoltage6VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserVoltage6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserVoltage6V
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserVoltage6V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserVoltage6V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserVoltage6V
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserVoltage6V
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioUserVoltage6V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserCurrent6VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserCurrent6VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserCurrent6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserCurrent6VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserCurrent6VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserCurrent6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserCurrent6V
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserCurrent6V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserCurrent6V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserCurrent6V
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserCurrent6V
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioUserCurrent6V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserActive6VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserActive6VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserActive6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserActive6VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserActive6VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserActive6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserActive6V
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserActive6V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserActive6V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserActive6V
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserActive6V
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetRoboRioUserActive6V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserVoltage5VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserVoltage5VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserVoltage5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserVoltage5VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserVoltage5VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserVoltage5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserVoltage5V
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserVoltage5V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserVoltage5V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserVoltage5V
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserVoltage5V
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioUserVoltage5V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserCurrent5VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserCurrent5VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserCurrent5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserCurrent5VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserCurrent5VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserCurrent5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserCurrent5V
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserCurrent5V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserCurrent5V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserCurrent5V
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserCurrent5V
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioUserCurrent5V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserActive5VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserActive5VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserActive5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserActive5VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserActive5VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserActive5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserActive5V
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserActive5V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserActive5V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserActive5V
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserActive5V
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetRoboRioUserActive5V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserVoltage3V3Callback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserVoltage3V3Callback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserVoltage3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserVoltage3V3Callback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserVoltage3V3Callback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserVoltage3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserVoltage3V3
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserVoltage3V3
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserVoltage3V3();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserVoltage3V3
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserVoltage3V3
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioUserVoltage3V3(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserCurrent3V3Callback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserCurrent3V3Callback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserCurrent3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserCurrent3V3Callback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserCurrent3V3Callback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserCurrent3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserCurrent3V3
+ * Signature: ()D
+ */
+JNIEXPORT jdouble JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserCurrent3V3
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserCurrent3V3();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserCurrent3V3
+ * Signature: (D)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserCurrent3V3
+  (JNIEnv*, jclass, jdouble value)
+{
+  HALSIM_SetRoboRioUserCurrent3V3(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserActive3V3Callback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserActive3V3Callback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserActive3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserActive3V3Callback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserActive3V3Callback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserActive3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserActive3V3
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserActive3V3
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserActive3V3();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserActive3V3
+ * Signature: (Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserActive3V3
+  (JNIEnv*, jclass, jboolean value)
+{
+  HALSIM_SetRoboRioUserActive3V3(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserFaults6VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserFaults6VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserFaults6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserFaults6VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserFaults6VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserFaults6VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserFaults6V
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserFaults6V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserFaults6V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserFaults6V
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserFaults6V
+  (JNIEnv*, jclass, jint value)
+{
+  HALSIM_SetRoboRioUserFaults6V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserFaults5VCallback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserFaults5VCallback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserFaults5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserFaults5VCallback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserFaults5VCallback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserFaults5VCallback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserFaults5V
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserFaults5V
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserFaults5V();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserFaults5V
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserFaults5V
+  (JNIEnv*, jclass, jint value)
+{
+  HALSIM_SetRoboRioUserFaults5V(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    registerUserFaults3V3Callback
+ * Signature: (Ljava/lang/Object;Z)I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_registerUserFaults3V3Callback
+  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
+{
+  return sim::AllocateCallbackNoIndex(
+      env, callback, initialNotify,
+      &HALSIM_RegisterRoboRioUserFaults3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    cancelUserFaults3V3Callback
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_cancelUserFaults3V3Callback
+  (JNIEnv* env, jclass, jint handle)
+{
+  return sim::FreeCallbackNoIndex(env, handle,
+                                  &HALSIM_CancelRoboRioUserFaults3V3Callback);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    getUserFaults3V3
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_getUserFaults3V3
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetRoboRioUserFaults3V3();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    setUserFaults3V3
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_setUserFaults3V3
+  (JNIEnv*, jclass, jint value)
+{
+  HALSIM_SetRoboRioUserFaults3V3(value);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_RoboRioDataJNI
+ * Method:    resetData
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_RoboRioDataJNI_resetData
+  (JNIEnv*, jclass)
+{
+  HALSIM_ResetRoboRioData();
+}
+
+}  // extern "C"
diff --git a/hal/src/main/native/sim/jni/SPIAccelerometerDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/SPIAccelerometerDataJNI.cpp
similarity index 62%
rename from hal/src/main/native/sim/jni/SPIAccelerometerDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/SPIAccelerometerDataJNI.cpp
index ca12f79..fe0c410 100644
--- a/hal/src/main/native/sim/jni/SPIAccelerometerDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/SPIAccelerometerDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,18 +8,20 @@
 #include <jni.h>
 
 #include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI.h"
-#include "mockdata/SPIAccelerometerData.h"
+#include "edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI.h"
+#include "hal/simulation/SPIAccelerometerData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    registerActiveCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_registerActiveCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_registerActiveCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -27,12 +29,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    cancelActiveCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_cancelActiveCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_cancelActiveCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -40,36 +42,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    getActive
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_getActive
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_getActive
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetSPIAccelerometerActive(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    setActive
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_setActive
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_setActive
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetSPIAccelerometerActive(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    registerRangeCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_registerRangeCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_registerRangeCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -77,12 +79,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    cancelRangeCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_cancelRangeCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_cancelRangeCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -90,36 +92,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    getRange
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_getRange
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_getRange
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetSPIAccelerometerRange(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    setRange
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_setRange
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_setRange
   (JNIEnv*, jclass, jint index, jint value)
 {
   HALSIM_SetSPIAccelerometerRange(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    registerXCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_registerXCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_registerXCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -127,12 +129,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    cancelXCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_cancelXCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_cancelXCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -140,36 +142,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    getX
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_getX
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_getX
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetSPIAccelerometerX(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    setX
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_setX
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_setX
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetSPIAccelerometerX(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    registerYCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_registerYCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_registerYCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -177,12 +179,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    cancelYCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_cancelYCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_cancelYCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -190,36 +192,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    getY
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_getY
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_getY
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetSPIAccelerometerY(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    setY
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_setY
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_setY
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetSPIAccelerometerY(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    registerZCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_registerZCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_registerZCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -227,12 +229,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    cancelZCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_cancelZCallback
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_cancelZCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -240,36 +242,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    getZ
  * Signature: (I)D
  */
 JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_getZ
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_getZ
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetSPIAccelerometerZ(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    setZ
  * Signature: (ID)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_setZ
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_setZ
   (JNIEnv*, jclass, jint index, jdouble value)
 {
   HALSIM_SetSPIAccelerometerZ(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIAccelerometerDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_SPIAccelerometerDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetSPIAccelerometerData(index);
diff --git a/hal/src/main/native/sim/jni/SPIDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/SPIDataJNI.cpp
similarity index 69%
rename from hal/src/main/native/sim/jni/SPIDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/SPIDataJNI.cpp
index 4eb342c..3709984 100644
--- a/hal/src/main/native/sim/jni/SPIDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/SPIDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,18 +11,20 @@
 #include "CallbackStore.h"
 #include "ConstBufferCallbackStore.h"
 #include "SpiReadAutoReceiveBufferCallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_SPIDataJNI.h"
-#include "mockdata/SPIData.h"
+#include "edu_wpi_first_hal_simulation_SPIDataJNI.h"
+#include "hal/simulation/SPIData.h"
+
+using namespace hal;
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    registerInitializedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_registerInitializedCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_registerInitializedCallback
   (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
 {
   return sim::AllocateCallback(env, index, callback, initialNotify,
@@ -30,12 +32,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    cancelInitializedCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_cancelInitializedCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_cancelInitializedCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   return sim::FreeCallback(env, handle, index,
@@ -43,36 +45,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    getInitialized
  * Signature: (I)Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_getInitialized
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_getInitialized
   (JNIEnv*, jclass, jint index)
 {
   return HALSIM_GetSPIInitialized(index);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    setInitialized
  * Signature: (IZ)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_setInitialized
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_setInitialized
   (JNIEnv*, jclass, jint index, jboolean value)
 {
   HALSIM_SetSPIInitialized(index, value);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    registerReadCallback
  * Signature: (ILjava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_registerReadCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_registerReadCallback
   (JNIEnv* env, jclass, jint index, jobject callback)
 {
   return sim::AllocateBufferCallback(env, index, callback,
@@ -80,24 +82,24 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    cancelReadCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_cancelReadCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_cancelReadCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   sim::FreeBufferCallback(env, handle, index, &HALSIM_CancelSPIReadCallback);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    registerWriteCallback
  * Signature: (ILjava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_registerWriteCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_registerWriteCallback
   (JNIEnv* env, jclass, jint index, jobject callback)
 {
   return sim::AllocateConstBufferCallback(env, index, callback,
@@ -105,12 +107,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    cancelWriteCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_cancelWriteCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_cancelWriteCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   sim::FreeConstBufferCallback(env, handle, index,
@@ -118,12 +120,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    registerReadAutoReceiveBufferCallback
  * Signature: (ILjava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_registerReadAutoReceiveBufferCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_registerReadAutoReceiveBufferCallback
   (JNIEnv* env, jclass, jint index, jobject callback)
 {
   return sim::AllocateSpiBufferCallback(
@@ -131,12 +133,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    cancelReadAutoReceiveBufferCallback
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_cancelReadAutoReceiveBufferCallback
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_cancelReadAutoReceiveBufferCallback
   (JNIEnv* env, jclass, jint index, jint handle)
 {
   sim::FreeSpiBufferCallback(env, handle, index,
@@ -144,12 +146,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SPIDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SPIDataJNI
  * Method:    resetData
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SPIDataJNI_resetData
+Java_edu_wpi_first_hal_simulation_SPIDataJNI_resetData
   (JNIEnv*, jclass, jint index)
 {
   HALSIM_ResetSPIData(index);
diff --git a/hal/src/main/native/sim/jni/SimDeviceDataJNI.cpp b/hal/src/main/native/cpp/jni/simulation/SimDeviceDataJNI.cpp
similarity index 82%
rename from hal/src/main/native/sim/jni/SimDeviceDataJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/SimDeviceDataJNI.cpp
index f6cd05e..0b43d24 100644
--- a/hal/src/main/native/sim/jni/SimDeviceDataJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/SimDeviceDataJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -17,9 +17,10 @@
 #include <wpi/jni_util.h>
 
 #include "SimulatorJNI.h"
-#include "edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI.h"
-#include "mockdata/SimDeviceData.h"
+#include "edu_wpi_first_hal_simulation_SimDeviceDataJNI.h"
+#include "hal/simulation/SimDeviceData.h"
 
+using namespace hal;
 using namespace wpi::java;
 
 static JClass simDeviceInfoCls;
@@ -259,25 +260,28 @@
   store->Free(env);
 }
 
+namespace hal {
 namespace sim {
 
 bool InitializeSimDeviceDataJNI(JNIEnv* env) {
   simDeviceInfoCls = JClass(
-      env, "edu/wpi/first/hal/sim/mockdata/SimDeviceDataJNI$SimDeviceInfo");
+      env, "edu/wpi/first/hal/simulation/SimDeviceDataJNI$SimDeviceInfo");
   if (!simDeviceInfoCls) return false;
 
-  simValueInfoCls = JClass(
-      env, "edu/wpi/first/hal/sim/mockdata/SimDeviceDataJNI$SimValueInfo");
+  simValueInfoCls =
+      JClass(env, "edu/wpi/first/hal/simulation/SimDeviceDataJNI$SimValueInfo");
   if (!simValueInfoCls) return false;
 
-  simDeviceCallbackCls = JClass(env, "edu/wpi/first/hal/sim/SimDeviceCallback");
+  simDeviceCallbackCls =
+      JClass(env, "edu/wpi/first/hal/simulation/SimDeviceCallback");
   if (!simDeviceCallbackCls) return false;
 
   simDeviceCallbackCallback = env->GetMethodID(simDeviceCallbackCls, "callback",
                                                "(Ljava/lang/String;I)V");
   if (!simDeviceCallbackCallback) return false;
 
-  simValueCallbackCls = JClass(env, "edu/wpi/first/hal/sim/SimValueCallback");
+  simValueCallbackCls =
+      JClass(env, "edu/wpi/first/hal/simulation/SimValueCallback");
   if (!simValueCallbackCls) return false;
 
   simValueCallbackCallback = env->GetMethodID(
@@ -295,16 +299,41 @@
 }
 
 }  // namespace sim
+}  // namespace hal
 
 extern "C" {
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
+ * Method:    setSimDeviceEnabled
+ * Signature: (Ljava/lang/String;Z)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_setSimDeviceEnabled
+  (JNIEnv* env, jclass, jstring prefix, jboolean enabled)
+{
+  HALSIM_SetSimDeviceEnabled(JStringRef{env, prefix}.c_str(), enabled);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
+ * Method:    isSimDeviceEnabled
+ * Signature: (Ljava/lang/String;)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_isSimDeviceEnabled
+  (JNIEnv* env, jclass, jstring name)
+{
+  return HALSIM_IsSimDeviceEnabled(JStringRef{env, name}.c_str());
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    registerSimDeviceCreatedCallback
  * Signature: (Ljava/lang/String;Ljava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_registerSimDeviceCreatedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_registerSimDeviceCreatedCallback
   (JNIEnv* env, jclass, jstring prefix, jobject callback,
    jboolean initialNotify)
 {
@@ -323,24 +352,24 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    cancelSimDeviceCreatedCallback
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_cancelSimDeviceCreatedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_cancelSimDeviceCreatedCallback
   (JNIEnv* env, jclass, jint uid)
 {
   CallbackJNI::GetInstance().FreeCallback(env, uid);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    registerSimDeviceFreedCallback
  * Signature: (Ljava/lang/String;Ljava/lang/Object;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_registerSimDeviceFreedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_registerSimDeviceFreedCallback
   (JNIEnv* env, jclass, jstring prefix, jobject callback)
 {
   auto [uid, store] =
@@ -357,48 +386,48 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    cancelSimDeviceFreedCallback
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_cancelSimDeviceFreedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_cancelSimDeviceFreedCallback
   (JNIEnv* env, jclass, jint uid)
 {
   CallbackJNI::GetInstance().FreeCallback(env, uid);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    getSimDeviceHandle
  * Signature: (Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_getSimDeviceHandle
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_getSimDeviceHandle
   (JNIEnv* env, jclass, jstring name)
 {
   return HALSIM_GetSimDeviceHandle(JStringRef{env, name}.c_str());
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    getSimValueDeviceHandle
  * Signature: (I)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_getSimValueDeviceHandle
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_getSimValueDeviceHandle
   (JNIEnv*, jclass, jint handle)
 {
   return HALSIM_GetSimValueDeviceHandle(handle);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    enumerateSimDevices
  * Signature: (Ljava/lang/String;)[Ljava/lang/Object;
  */
 JNIEXPORT jobjectArray JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_enumerateSimDevices
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_enumerateSimDevices
   (JNIEnv* env, jclass, jstring prefix)
 {
   // get values
@@ -423,12 +452,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    registerSimValueCreatedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_registerSimValueCreatedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_registerSimValueCreatedCallback
   (JNIEnv* env, jclass, jint device, jobject callback, jboolean initialNotify)
 {
   auto [uid, store] =
@@ -447,24 +476,24 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    cancelSimValueCreatedCallback
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_cancelSimValueCreatedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_cancelSimValueCreatedCallback
   (JNIEnv* env, jclass, jint uid)
 {
   CallbackJNI::GetInstance().FreeCallback(env, uid);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    registerSimValueChangedCallback
  * Signature: (ILjava/lang/Object;Z)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_registerSimValueChangedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_registerSimValueChangedCallback
   (JNIEnv* env, jclass, jint handle, jobject callback, jboolean initialNotify)
 {
   auto [uid, store] =
@@ -483,36 +512,36 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    cancelSimValueChangedCallback
  * Signature: (I)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_cancelSimValueChangedCallback
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_cancelSimValueChangedCallback
   (JNIEnv* env, jclass, jint uid)
 {
   CallbackJNI::GetInstance().FreeCallback(env, uid);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    getSimValueHandle
  * Signature: (ILjava/lang/String;)I
  */
 JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_getSimValueHandle
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_getSimValueHandle
   (JNIEnv* env, jclass, jint device, jstring name)
 {
   return HALSIM_GetSimValueHandle(device, JStringRef{env, name}.c_str());
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    enumerateSimValues
  * Signature: (I)[Ljava/lang/Object;
  */
 JNIEXPORT jobjectArray JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_enumerateSimValues
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_enumerateSimValues
   (JNIEnv* env, jclass, jint device)
 {
   // get values
@@ -537,12 +566,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    getSimValueEnumOptions
  * Signature: (I)[Ljava/lang/Object;
  */
 JNIEXPORT jobjectArray JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_getSimValueEnumOptions
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_getSimValueEnumOptions
   (JNIEnv* env, jclass, jint handle)
 {
   static JClass stringCls{env, "java/lang/String"};
@@ -559,12 +588,12 @@
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI
+ * Class:     edu_wpi_first_hal_simulation_SimDeviceDataJNI
  * Method:    resetSimDeviceData
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimDeviceDataJNI_resetSimDeviceData
+Java_edu_wpi_first_hal_simulation_SimDeviceDataJNI_resetSimDeviceData
   (JNIEnv*, jclass)
 {
   HALSIM_ResetSimDeviceData();
diff --git a/hal/src/main/native/sim/jni/SimDeviceDataJNI.h b/hal/src/main/native/cpp/jni/simulation/SimDeviceDataJNI.h
similarity index 84%
rename from hal/src/main/native/sim/jni/SimDeviceDataJNI.h
rename to hal/src/main/native/cpp/jni/simulation/SimDeviceDataJNI.h
index 56f6d9b..44fc27f 100644
--- a/hal/src/main/native/sim/jni/SimDeviceDataJNI.h
+++ b/hal/src/main/native/cpp/jni/simulation/SimDeviceDataJNI.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,9 @@
 
 #include <jni.h>
 
+namespace hal {
 namespace sim {
 bool InitializeSimDeviceDataJNI(JNIEnv* env);
 void FreeSimDeviceDataJNI(JNIEnv* env);
 }  // namespace sim
+}  // namespace hal
diff --git a/hal/src/main/native/sim/jni/SimulatorJNI.cpp b/hal/src/main/native/cpp/jni/simulation/SimulatorJNI.cpp
similarity index 65%
rename from hal/src/main/native/sim/jni/SimulatorJNI.cpp
rename to hal/src/main/native/cpp/jni/simulation/SimulatorJNI.cpp
index 9226f91..b6336e8 100644
--- a/hal/src/main/native/sim/jni/SimulatorJNI.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/SimulatorJNI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -14,10 +14,10 @@
 #include "ConstBufferCallbackStore.h"
 #include "SimDeviceDataJNI.h"
 #include "SpiReadAutoReceiveBufferCallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_SimulatorJNI.h"
+#include "edu_wpi_first_hal_simulation_SimulatorJNI.h"
 #include "hal/HAL.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/MockHooks.h"
+#include "hal/simulation/MockHooks.h"
 
 using namespace wpi::java;
 
@@ -31,6 +31,7 @@
 static jmethodID constBufferCallbackCallback;
 static jmethodID spiReadAutoReceiveBufferCallbackCallback;
 
+namespace hal {
 namespace sim {
 jint SimOnLoad(JavaVM* vm, void* reserved) {
   jvm = vm;
@@ -39,14 +40,16 @@
   if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK)
     return JNI_ERR;
 
-  notifyCallbackCls = JClass(env, "edu/wpi/first/hal/sim/NotifyCallback");
+  notifyCallbackCls =
+      JClass(env, "edu/wpi/first/hal/simulation/NotifyCallback");
   if (!notifyCallbackCls) return JNI_ERR;
 
   notifyCallbackCallback = env->GetMethodID(notifyCallbackCls, "callbackNative",
                                             "(Ljava/lang/String;IJD)V");
   if (!notifyCallbackCallback) return JNI_ERR;
 
-  bufferCallbackCls = JClass(env, "edu/wpi/first/hal/sim/BufferCallback");
+  bufferCallbackCls =
+      JClass(env, "edu/wpi/first/hal/simulation/BufferCallback");
   if (!bufferCallbackCls) return JNI_ERR;
 
   bufferCallbackCallback = env->GetMethodID(bufferCallbackCls, "callback",
@@ -54,15 +57,15 @@
   if (!bufferCallbackCallback) return JNI_ERR;
 
   constBufferCallbackCls =
-      JClass(env, "edu/wpi/first/hal/sim/ConstBufferCallback");
+      JClass(env, "edu/wpi/first/hal/simulation/ConstBufferCallback");
   if (!constBufferCallbackCls) return JNI_ERR;
 
   constBufferCallbackCallback = env->GetMethodID(
       constBufferCallbackCls, "callback", "(Ljava/lang/String;[BI)V");
   if (!constBufferCallbackCallback) return JNI_ERR;
 
-  spiReadAutoReceiveBufferCallbackCls =
-      JClass(env, "edu/wpi/first/hal/sim/SpiReadAutoReceiveBufferCallback");
+  spiReadAutoReceiveBufferCallbackCls = JClass(
+      env, "edu/wpi/first/hal/simulation/SpiReadAutoReceiveBufferCallback");
   if (!spiReadAutoReceiveBufferCallbackCls) return JNI_ERR;
 
   spiReadAutoReceiveBufferCallbackCallback =
@@ -104,99 +107,136 @@
   return spiReadAutoReceiveBufferCallbackCallback;
 }
 }  // namespace sim
+}  // namespace hal
 
 extern "C" {
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
+ * Method:    setRuntimeType
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_setRuntimeType
+  (JNIEnv*, jclass, jint type)
+{
+  HALSIM_SetRuntimeType(static_cast<HAL_RuntimeType>(type));
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    waitForProgramStart
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_waitForProgramStart
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_waitForProgramStart
   (JNIEnv*, jclass)
 {
   HALSIM_WaitForProgramStart();
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    setProgramStarted
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_setProgramStarted
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_setProgramStarted
   (JNIEnv*, jclass)
 {
   HALSIM_SetProgramStarted();
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
+ * Method:    getProgramStarted
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_getProgramStarted
+  (JNIEnv*, jclass)
+{
+  return HALSIM_GetProgramStarted();
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    restartTiming
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_restartTiming
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_restartTiming
   (JNIEnv*, jclass)
 {
   HALSIM_RestartTiming();
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    pauseTiming
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_pauseTiming
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_pauseTiming
   (JNIEnv*, jclass)
 {
   HALSIM_PauseTiming();
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    resumeTiming
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_resumeTiming
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_resumeTiming
   (JNIEnv*, jclass)
 {
   HALSIM_ResumeTiming();
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    isTimingPaused
  * Signature: ()Z
  */
 JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_isTimingPaused
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_isTimingPaused
   (JNIEnv*, jclass)
 {
   return HALSIM_IsTimingPaused();
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    stepTiming
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_stepTiming
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_stepTiming
   (JNIEnv*, jclass, jlong delta)
 {
   HALSIM_StepTiming(delta);
 }
 
 /*
- * Class:     edu_wpi_first_hal_sim_mockdata_SimulatorJNI
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
+ * Method:    stepTimingAsync
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_stepTimingAsync
+  (JNIEnv*, jclass, jlong delta)
+{
+  HALSIM_StepTimingAsync(delta);
+}
+
+/*
+ * Class:     edu_wpi_first_hal_simulation_SimulatorJNI
  * Method:    resetHandles
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_SimulatorJNI_resetHandles
+Java_edu_wpi_first_hal_simulation_SimulatorJNI_resetHandles
   (JNIEnv*, jclass)
 {
   hal::HandleBase::ResetGlobalHandles();
diff --git a/hal/src/main/native/sim/jni/SimulatorJNI.h b/hal/src/main/native/cpp/jni/simulation/SimulatorJNI.h
similarity index 87%
rename from hal/src/main/native/sim/jni/SimulatorJNI.h
rename to hal/src/main/native/cpp/jni/simulation/SimulatorJNI.h
index 8680396..d6710e8 100644
--- a/hal/src/main/native/sim/jni/SimulatorJNI.h
+++ b/hal/src/main/native/cpp/jni/simulation/SimulatorJNI.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -12,6 +12,7 @@
 
 typedef HAL_Handle SIM_JniHandle;
 
+namespace hal {
 namespace sim {
 JavaVM* GetJVM();
 
@@ -20,3 +21,4 @@
 jmethodID GetConstBufferCallback();
 jmethodID GetSpiReadAutoReceiveBufferCallback();
 }  // namespace sim
+}  // namespace hal
diff --git a/hal/src/main/native/sim/jni/SpiReadAutoReceiveBufferCallbackStore.cpp b/hal/src/main/native/cpp/jni/simulation/SpiReadAutoReceiveBufferCallbackStore.cpp
similarity index 95%
rename from hal/src/main/native/sim/jni/SpiReadAutoReceiveBufferCallbackStore.cpp
rename to hal/src/main/native/cpp/jni/simulation/SpiReadAutoReceiveBufferCallbackStore.cpp
index b75bb1e..5432840 100644
--- a/hal/src/main/native/sim/jni/SpiReadAutoReceiveBufferCallbackStore.cpp
+++ b/hal/src/main/native/cpp/jni/simulation/SpiReadAutoReceiveBufferCallbackStore.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,15 +15,17 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
+using namespace hal;
+using namespace hal::sim;
 using namespace wpi::java;
-using namespace sim;
 
 static hal::UnlimitedHandleResource<
     SIM_JniHandle, SpiReadAutoReceiveBufferCallbackStore,
     hal::HAL_HandleEnum::SimulationJni>* callbackHandles;
 
+namespace hal {
 namespace sim {
 void InitializeSpiBufferStore() {
   static hal::UnlimitedHandleResource<SIM_JniHandle,
@@ -33,6 +35,7 @@
   callbackHandles = &cb;
 }
 }  // namespace sim
+}  // namespace hal
 
 void SpiReadAutoReceiveBufferCallbackStore::create(JNIEnv* env, jobject obj) {
   m_call = JGlobal<jobject>(env, obj);
diff --git a/hal/src/main/native/sim/jni/SpiReadAutoReceiveBufferCallbackStore.h b/hal/src/main/native/cpp/jni/simulation/SpiReadAutoReceiveBufferCallbackStore.h
similarity index 89%
rename from hal/src/main/native/sim/jni/SpiReadAutoReceiveBufferCallbackStore.h
rename to hal/src/main/native/cpp/jni/simulation/SpiReadAutoReceiveBufferCallbackStore.h
index 1a03f59..6a457de 100644
--- a/hal/src/main/native/sim/jni/SpiReadAutoReceiveBufferCallbackStore.h
+++ b/hal/src/main/native/cpp/jni/simulation/SpiReadAutoReceiveBufferCallbackStore.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -15,9 +15,10 @@
 #include "hal/Types.h"
 #include "hal/Value.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifyListener.h"
-#include "mockdata/SPIData.h"
+#include "hal/simulation/NotifyListener.h"
+#include "hal/simulation/SPIData.h"
 
+namespace hal {
 namespace sim {
 class SpiReadAutoReceiveBufferCallbackStore {
  public:
@@ -45,3 +46,4 @@
 void FreeSpiBufferCallback(JNIEnv* env, SIM_JniHandle handle, jint index,
                            FreeSpiBufferCallbackFunc freeCallback);
 }  // namespace sim
+}  // namespace hal
diff --git a/hal/src/main/native/include/hal/CAN.h b/hal/src/main/native/include/hal/CAN.h
index 8cc9c17..4f91bc1 100644
--- a/hal/src/main/native/include/hal/CAN.h
+++ b/hal/src/main/native/include/hal/CAN.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,8 +9,6 @@
 
 #include <stdint.h>
 
-#include "hal/Types.h"
-
 /**
  * @defgroup hal_canstream CAN Stream Functions
  * @ingroup hal_capi
diff --git a/hal/src/main/native/include/hal/CANAPITypes.h b/hal/src/main/native/include/hal/CANAPITypes.h
index a23cee1..5155d93 100644
--- a/hal/src/main/native/include/hal/CANAPITypes.h
+++ b/hal/src/main/native/include/hal/CANAPITypes.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -35,6 +35,7 @@
   HAL_CAN_Dev_kPowerDistribution = 8,
   HAL_CAN_Dev_kPneumatics = 9,
   HAL_CAN_Dev_kMiscellaneous = 10,
+  HAL_CAN_Dev_kIOBreakout = 11,
   HAL_CAN_Dev_kFirmwareUpdate = 31
 };
 
diff --git a/hal/src/main/native/include/hal/DriverStation.h b/hal/src/main/native/include/hal/DriverStation.h
index 471c18b..23595db 100644
--- a/hal/src/main/native/include/hal/DriverStation.h
+++ b/hal/src/main/native/include/hal/DriverStation.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2013-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2013-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -37,6 +37,12 @@
 int32_t HAL_SendError(HAL_Bool isError, int32_t errorCode, HAL_Bool isLVCode,
                       const char* details, const char* location,
                       const char* callStack, HAL_Bool printMsg);
+/**
+ * Sends a line to the driver station console.
+ *
+ * @param line the line to send (null terminated)
+ */
+int32_t HAL_SendConsoleLine(const char* line);
 
 /**
  * Gets the current control word of the driver station.
@@ -171,7 +177,7 @@
  * 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 behaviour seen on
+ * The Practice Match function of the DS approximates the behavior seen on
  * the field.
  *
  * @param status the error code, or 0 for success
@@ -194,24 +200,6 @@
 void HAL_ReleaseDSMutex(void);
 
 /**
- * Checks if new control data has arrived since the last
- * HAL_WaitForCachedControlData or HAL_IsNewControlData call. If new data has
- * not arrived, waits for new data to arrive. Otherwise, returns immediately.
- */
-void HAL_WaitForCachedControlData(void);
-
-/**
- * Checks if new control data has arrived since the last
- * HAL_WaitForCachedControlData or HAL_IsNewControlData call. If new data has
- * not arrived, waits for new data to arrive, or a timeout. Otherwise, returns
- * immediately.
- *
- * @param timeout timeout in seconds
- * @return        true for new data, false for timeout
- */
-HAL_Bool HAL_WaitForCachedControlDataTimeout(double timeout);
-
-/**
  * Has a new control packet from the driver station arrived since the last
  * time this function was called?
  *
@@ -221,6 +209,9 @@
 
 /**
  * Waits for the newest DS packet to arrive. Note that this is a blocking call.
+ * Checks if new control data has arrived since the last HAL_WaitForDSData or
+ * HAL_IsNewControlData call. If new data has not arrived, waits for new data
+ * to arrive. Otherwise, returns immediately.
  */
 void HAL_WaitForDSData(void);
 
diff --git a/hal/src/main/native/include/hal/Extensions.h b/hal/src/main/native/include/hal/Extensions.h
index 3a435c0..13de7f8 100644
--- a/hal/src/main/native/include/hal/Extensions.h
+++ b/hal/src/main/native/include/hal/Extensions.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -25,7 +25,10 @@
  */
 typedef int halsim_extension_init_func_t(void);
 
+#ifdef __cplusplus
 extern "C" {
+#endif
+
 /**
  * Loads a single extension from a direct path.
  *
@@ -45,6 +48,31 @@
 int HAL_LoadExtensions(void);
 
 /**
+ * Registers an extension such that other extensions can discover it.
+ *
+ * The passed data pointer is retained and the extension must keep this
+ * pointer valid.
+ *
+ * @param name extension name (may embed version number)
+ * @param data data pointer
+ */
+void HAL_RegisterExtension(const char* name, void* data);
+
+/**
+ * Registers an extension registration listener function. The function will
+ * be called immediately with any currently registered extensions, and will
+ * be called later when any additional extensions are registered.
+ *
+ * @param param parameter data to pass to callback function
+ * @param func callback function to be called for each registered extension;
+ *             parameters are the parameter data, extension name, and extension
+ *             data pointer passed to HAL_RegisterExtension()
+ */
+void HAL_RegisterExtensionListener(void* param,
+                                   void (*func)(void*, const char* name,
+                                                void* data));
+
+/**
  * Enables or disables the message saying no HAL extensions were found.
  *
  * Some apps don't care, and the message create clutter. For general team code,
@@ -57,5 +85,17 @@
  * @param showMessage true to show message, false to not.
  */
 void HAL_SetShowExtensionsNotFoundMessages(HAL_Bool showMessage);
+
+/**
+ * Registers a function to be called from HAL_Shutdown(). This is intended
+ * for use only by simulation extensions.
+ *
+ * @param param parameter data to pass to callback function
+ * @param func callback function
+ */
+void HAL_OnShutdown(void* param, void (*func)(void*));
+
+#ifdef __cplusplus
 }  // extern "C"
+#endif
 /** @} */
diff --git a/hal/src/main/native/include/hal/HAL.h b/hal/src/main/native/include/hal/HAL.h
index cf9b2f8..4412886 100644
--- a/hal/src/main/native/include/hal/HAL.h
+++ b/hal/src/main/native/include/hal/HAL.h
@@ -11,6 +11,7 @@
 
 #include "hal/Accelerometer.h"
 #include "hal/AnalogAccumulator.h"
+#include "hal/AnalogGyro.h"
 #include "hal/AnalogInput.h"
 #include "hal/AnalogOutput.h"
 #include "hal/AnalogTrigger.h"
@@ -35,6 +36,7 @@
 #include "hal/Power.h"
 #include "hal/Relay.h"
 #include "hal/SPI.h"
+#include "hal/SerialPort.h"
 #include "hal/SimDevice.h"
 #include "hal/Solenoid.h"
 #include "hal/Threads.h"
diff --git a/hal/src/main/native/include/hal/HALBase.h b/hal/src/main/native/include/hal/HALBase.h
index f61d9e4..ee5b054 100644
--- a/hal/src/main/native/include/hal/HALBase.h
+++ b/hal/src/main/native/include/hal/HALBase.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2008-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2008-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -149,6 +149,14 @@
  */
 HAL_Bool HAL_Initialize(int32_t timeout, int32_t mode);
 
+/**
+ * Call this to shut down HAL.
+ *
+ * This must be called at termination of the robot program to avoid potential
+ * segmentation faults with simulation extensions at exit.
+ */
+void HAL_Shutdown(void);
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/hal/src/main/native/include/hal/I2C.h b/hal/src/main/native/include/hal/I2C.h
index fc8b5c8..4147cbb 100644
--- a/hal/src/main/native/include/hal/I2C.h
+++ b/hal/src/main/native/include/hal/I2C.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,7 +10,6 @@
 #include <stdint.h>
 
 #include "hal/I2CTypes.h"
-#include "hal/Types.h"
 
 /**
  * @defgroup hal_i2c I2C Functions
diff --git a/hal/src/main/native/include/hal/Interrupts.h b/hal/src/main/native/include/hal/Interrupts.h
index 126b92c..ff68d48 100644
--- a/hal/src/main/native/include/hal/Interrupts.h
+++ b/hal/src/main/native/include/hal/Interrupts.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -153,6 +153,16 @@
 void HAL_SetInterruptUpSourceEdge(HAL_InterruptHandle interruptHandle,
                                   HAL_Bool risingEdge, HAL_Bool fallingEdge,
                                   int32_t* status);
+
+/**
+ * Releases a waiting interrupt.
+ *
+ * This will release both rising and falling waiters.
+ *
+ * @param interruptHandle the interrupt handle to release
+ */
+void HAL_ReleaseWaitingInterrupt(HAL_InterruptHandle interruptHandle,
+                                 int32_t* status);
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/hal/src/main/native/include/hal/Main.h b/hal/src/main/native/include/hal/Main.h
index 866e274..097f819 100644
--- a/hal/src/main/native/include/hal/Main.h
+++ b/hal/src/main/native/include/hal/Main.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,6 @@
 
 #pragma once
 
-#include <stdint.h>
-
 #include "hal/Types.h"
 
 /**
diff --git a/hal/src/main/native/include/hal/PWM.h b/hal/src/main/native/include/hal/PWM.h
index 781a423..7267823 100644
--- a/hal/src/main/native/include/hal/PWM.h
+++ b/hal/src/main/native/include/hal/PWM.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -158,7 +158,7 @@
  * Sets a PWM channel to be disabled.
  *
  * The channel is disabled until the next time it is set. Note this is different
- * from just setting a 0 speed, as this will actively stop all signalling on the
+ * from just setting a 0 speed, as this will actively stop all signaling on the
  * channel.
  *
  * @param pwmPortHandle the PWM handle.
diff --git a/hal/src/main/native/include/hal/SimDevice.h b/hal/src/main/native/include/hal/SimDevice.h
index b05021e..ff4c12e 100644
--- a/hal/src/main/native/include/hal/SimDevice.h
+++ b/hal/src/main/native/include/hal/SimDevice.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -473,14 +473,6 @@
    */
   SimDevice(const char* name, int index, int channel);
 
-  /**
-   * Wraps a simulated device handle as returned by HAL_CreateSimDevice().
-   *
-   * @param handle simulated device handle
-   */
-  /*implicit*/ SimDevice(HAL_SimDeviceHandle val)  // NOLINT(runtime/explicit)
-      : m_handle(val) {}
-
   ~SimDevice() {
     if (m_handle != HAL_kInvalidHandle) HAL_FreeSimDevice(m_handle);
   }
diff --git a/hal/src/main/native/include/hal/cpp/fpga_clock.h b/hal/src/main/native/include/hal/cpp/fpga_clock.h
index 94031b1..f6d5c6c 100644
--- a/hal/src/main/native/include/hal/cpp/fpga_clock.h
+++ b/hal/src/main/native/include/hal/cpp/fpga_clock.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,7 +8,6 @@
 #pragma once
 
 #include <chrono>
-#include <limits>
 
 /** WPILib Hardware Abstraction Layer (HAL) namespace */
 namespace hal {
diff --git a/hal/src/main/native/include/hal/handles/DigitalHandleResource.h b/hal/src/main/native/include/hal/handles/DigitalHandleResource.h
index dcd4b97..5fd8506 100644
--- a/hal/src/main/native/include/hal/handles/DigitalHandleResource.h
+++ b/hal/src/main/native/include/hal/handles/DigitalHandleResource.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -23,7 +23,7 @@
 /**
  * The DigitalHandleResource class is a way to track handles. This version
  * allows a limited number of handles that are allocated by index.
- * The enum value is seperate, as 2 enum values are allowed per handle
+ * The enum value is separate, as 2 enum values are allowed per handle
  * Because they are allocated by index, each individual index holds its own
  * mutex, which reduces contention heavily.]
  *
@@ -42,6 +42,9 @@
   DigitalHandleResource& operator=(const DigitalHandleResource&) = delete;
 
   THandle Allocate(int16_t index, HAL_HandleEnum enumValue, int32_t* status);
+  int16_t GetIndex(THandle handle, HAL_HandleEnum enumValue) {
+    return getHandleTypedIndex(handle, enumValue, m_version);
+  }
   std::shared_ptr<TStruct> Get(THandle handle, HAL_HandleEnum enumValue);
   void Free(THandle handle, HAL_HandleEnum enumValue);
   void ResetHandles() override;
@@ -54,7 +57,7 @@
 template <typename THandle, typename TStruct, int16_t size>
 THandle DigitalHandleResource<THandle, TStruct, size>::Allocate(
     int16_t index, HAL_HandleEnum enumValue, int32_t* status) {
-  // don't aquire the lock if we can fail early.
+  // don't acquire the lock if we can fail early.
   if (index < 0 || index >= size) {
     *status = RESOURCE_OUT_OF_RANGE;
     return HAL_kInvalidHandle;
@@ -73,12 +76,12 @@
 std::shared_ptr<TStruct> DigitalHandleResource<THandle, TStruct, size>::Get(
     THandle handle, HAL_HandleEnum enumValue) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle, enumValue);
   if (index < 0 || index >= size) {
     return nullptr;
   }
   std::scoped_lock lock(m_handleMutexes[index]);
-  // return structure. Null will propogate correctly, so no need to manually
+  // return structure. Null will propagate correctly, so no need to manually
   // check.
   return m_structures[index];
 }
@@ -87,7 +90,7 @@
 void DigitalHandleResource<THandle, TStruct, size>::Free(
     THandle handle, HAL_HandleEnum enumValue) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle, enumValue);
   if (index < 0 || index >= size) return;
   // lock and deallocated handle
   std::scoped_lock lock(m_handleMutexes[index]);
diff --git a/hal/src/main/native/include/hal/handles/IndexedClassedHandleResource.h b/hal/src/main/native/include/hal/handles/IndexedClassedHandleResource.h
index 2725573..902f023 100644
--- a/hal/src/main/native/include/hal/handles/IndexedClassedHandleResource.h
+++ b/hal/src/main/native/include/hal/handles/IndexedClassedHandleResource.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -47,6 +47,9 @@
 
   THandle Allocate(int16_t index, std::shared_ptr<TStruct> toSet,
                    int32_t* status);
+  int16_t GetIndex(THandle handle) {
+    return getHandleTypedIndex(handle, enumValue, m_version);
+  }
   std::shared_ptr<TStruct> Get(THandle handle);
   void Free(THandle handle);
   void ResetHandles();
@@ -61,7 +64,7 @@
 THandle
 IndexedClassedHandleResource<THandle, TStruct, size, enumValue>::Allocate(
     int16_t index, std::shared_ptr<TStruct> toSet, int32_t* status) {
-  // don't aquire the lock if we can fail early.
+  // don't acquire the lock if we can fail early.
   if (index < 0 || index >= size) {
     *status = RESOURCE_OUT_OF_RANGE;
     return HAL_kInvalidHandle;
@@ -82,12 +85,12 @@
 IndexedClassedHandleResource<THandle, TStruct, size, enumValue>::Get(
     THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) {
     return nullptr;
   }
   std::scoped_lock lock(m_handleMutexes[index]);
-  // return structure. Null will propogate correctly, so no need to manually
+  // return structure. Null will propagate correctly, so no need to manually
   // check.
   return m_structures[index];
 }
@@ -97,7 +100,7 @@
 void IndexedClassedHandleResource<THandle, TStruct, size, enumValue>::Free(
     THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) return;
   // lock and deallocated handle
   std::scoped_lock lock(m_handleMutexes[index]);
diff --git a/hal/src/main/native/include/hal/handles/IndexedHandleResource.h b/hal/src/main/native/include/hal/handles/IndexedHandleResource.h
index 2bca4ce..26fda02 100644
--- a/hal/src/main/native/include/hal/handles/IndexedHandleResource.h
+++ b/hal/src/main/native/include/hal/handles/IndexedHandleResource.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -43,6 +43,9 @@
   IndexedHandleResource& operator=(const IndexedHandleResource&) = delete;
 
   THandle Allocate(int16_t index, int32_t* status);
+  int16_t GetIndex(THandle handle) {
+    return getHandleTypedIndex(handle, enumValue, m_version);
+  }
   std::shared_ptr<TStruct> Get(THandle handle);
   void Free(THandle handle);
   void ResetHandles() override;
@@ -56,7 +59,7 @@
           HAL_HandleEnum enumValue>
 THandle IndexedHandleResource<THandle, TStruct, size, enumValue>::Allocate(
     int16_t index, int32_t* status) {
-  // don't aquire the lock if we can fail early.
+  // don't acquire the lock if we can fail early.
   if (index < 0 || index >= size) {
     *status = RESOURCE_OUT_OF_RANGE;
     return HAL_kInvalidHandle;
@@ -76,12 +79,12 @@
 std::shared_ptr<TStruct>
 IndexedHandleResource<THandle, TStruct, size, enumValue>::Get(THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) {
     return nullptr;
   }
   std::scoped_lock lock(m_handleMutexes[index]);
-  // return structure. Null will propogate correctly, so no need to manually
+  // return structure. Null will propagate correctly, so no need to manually
   // check.
   return m_structures[index];
 }
@@ -91,7 +94,7 @@
 void IndexedHandleResource<THandle, TStruct, size, enumValue>::Free(
     THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) return;
   // lock and deallocated handle
   std::scoped_lock lock(m_handleMutexes[index]);
diff --git a/hal/src/main/native/include/hal/handles/LimitedClassedHandleResource.h b/hal/src/main/native/include/hal/handles/LimitedClassedHandleResource.h
index a991fc3..0ab8aac 100644
--- a/hal/src/main/native/include/hal/handles/LimitedClassedHandleResource.h
+++ b/hal/src/main/native/include/hal/handles/LimitedClassedHandleResource.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -42,6 +42,9 @@
       delete;
 
   THandle Allocate(std::shared_ptr<TStruct> toSet);
+  int16_t GetIndex(THandle handle) {
+    return getHandleTypedIndex(handle, enumValue, m_version);
+  }
   std::shared_ptr<TStruct> Get(THandle handle);
   void Free(THandle handle);
   void ResetHandles() override;
@@ -77,12 +80,12 @@
 LimitedClassedHandleResource<THandle, TStruct, size, enumValue>::Get(
     THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) {
     return nullptr;
   }
   std::scoped_lock lock(m_handleMutexes[index]);
-  // return structure. Null will propogate correctly, so no need to manually
+  // return structure. Null will propagate correctly, so no need to manually
   // check.
   return m_structures[index];
 }
@@ -92,7 +95,7 @@
 void LimitedClassedHandleResource<THandle, TStruct, size, enumValue>::Free(
     THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) return;
   // lock and deallocated handle
   std::scoped_lock allocateLock(m_allocateMutex);
diff --git a/hal/src/main/native/include/hal/handles/LimitedHandleResource.h b/hal/src/main/native/include/hal/handles/LimitedHandleResource.h
index 0756634..2f7ed0d 100644
--- a/hal/src/main/native/include/hal/handles/LimitedHandleResource.h
+++ b/hal/src/main/native/include/hal/handles/LimitedHandleResource.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -40,6 +40,9 @@
   LimitedHandleResource& operator=(const LimitedHandleResource&) = delete;
 
   THandle Allocate();
+  int16_t GetIndex(THandle handle) {
+    return getHandleTypedIndex(handle, enumValue, m_version);
+  }
   std::shared_ptr<TStruct> Get(THandle handle);
   void Free(THandle handle);
   void ResetHandles() override;
@@ -72,12 +75,12 @@
 std::shared_ptr<TStruct>
 LimitedHandleResource<THandle, TStruct, size, enumValue>::Get(THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) {
     return nullptr;
   }
   std::scoped_lock lock(m_handleMutexes[index]);
-  // return structure. Null will propogate correctly, so no need to manually
+  // return structure. Null will propagate correctly, so no need to manually
   // check.
   return m_structures[index];
 }
@@ -87,7 +90,7 @@
 void LimitedHandleResource<THandle, TStruct, size, enumValue>::Free(
     THandle handle) {
   // get handle index, and fail early if index out of range or wrong handle
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   if (index < 0 || index >= size) return;
   // lock and deallocated handle
   std::scoped_lock allocateLock(m_allocateMutex);
diff --git a/hal/src/main/native/include/hal/handles/UnlimitedHandleResource.h b/hal/src/main/native/include/hal/handles/UnlimitedHandleResource.h
index 96a91f8..5f74b88 100644
--- a/hal/src/main/native/include/hal/handles/UnlimitedHandleResource.h
+++ b/hal/src/main/native/include/hal/handles/UnlimitedHandleResource.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2008-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2008-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -44,6 +44,9 @@
   UnlimitedHandleResource& operator=(const UnlimitedHandleResource&) = delete;
 
   THandle Allocate(std::shared_ptr<TStruct> structure);
+  int16_t GetIndex(THandle handle) {
+    return getHandleTypedIndex(handle, enumValue, m_version);
+  }
   std::shared_ptr<TStruct> Get(THandle handle);
   /* Returns structure previously at that handle (or nullptr if none) */
   std::shared_ptr<TStruct> Free(THandle handle);
@@ -81,7 +84,7 @@
 template <typename THandle, typename TStruct, HAL_HandleEnum enumValue>
 std::shared_ptr<TStruct>
 UnlimitedHandleResource<THandle, TStruct, enumValue>::Get(THandle handle) {
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   std::scoped_lock lock(m_handleMutex);
   if (index < 0 || index >= static_cast<int16_t>(m_structures.size()))
     return nullptr;
@@ -91,7 +94,7 @@
 template <typename THandle, typename TStruct, HAL_HandleEnum enumValue>
 std::shared_ptr<TStruct>
 UnlimitedHandleResource<THandle, TStruct, enumValue>::Free(THandle handle) {
-  int16_t index = getHandleTypedIndex(handle, enumValue, m_version);
+  int16_t index = GetIndex(handle);
   std::scoped_lock lock(m_handleMutex);
   if (index < 0 || index >= static_cast<int16_t>(m_structures.size()))
     return nullptr;
diff --git a/hal/src/main/native/include/mockdata/AccelerometerData.h b/hal/src/main/native/include/hal/simulation/AccelerometerData.h
similarity index 96%
rename from hal/src/main/native/include/mockdata/AccelerometerData.h
rename to hal/src/main/native/include/hal/simulation/AccelerometerData.h
index aa89f6e..0a92671 100644
--- a/hal/src/main/native/include/mockdata/AccelerometerData.h
+++ b/hal/src/main/native/include/hal/simulation/AccelerometerData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,9 +7,9 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Accelerometer.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/AddressableLEDData.h b/hal/src/main/native/include/hal/simulation/AddressableLEDData.h
similarity index 94%
rename from hal/src/main/native/include/mockdata/AddressableLEDData.h
rename to hal/src/main/native/include/hal/simulation/AddressableLEDData.h
index 0d8f3f3..91ab30c 100644
--- a/hal/src/main/native/include/mockdata/AddressableLEDData.h
+++ b/hal/src/main/native/include/hal/simulation/AddressableLEDData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,14 +7,16 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/AddressableLEDTypes.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+int32_t HALSIM_FindAddressableLEDForChannel(int32_t channel);
+
 void HALSIM_ResetAddressableLEDData(int32_t index);
 
 int32_t HALSIM_RegisterAddressableLEDInitializedCallback(
diff --git a/hal/src/main/native/include/mockdata/AnalogGyroData.h b/hal/src/main/native/include/hal/simulation/AnalogGyroData.h
similarity index 94%
rename from hal/src/main/native/include/mockdata/AnalogGyroData.h
rename to hal/src/main/native/include/hal/simulation/AnalogGyroData.h
index 56c739d..91e684e 100644
--- a/hal/src/main/native/include/mockdata/AnalogGyroData.h
+++ b/hal/src/main/native/include/hal/simulation/AnalogGyroData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/AnalogInData.h b/hal/src/main/native/include/hal/simulation/AnalogInData.h
similarity index 97%
rename from hal/src/main/native/include/mockdata/AnalogInData.h
rename to hal/src/main/native/include/hal/simulation/AnalogInData.h
index e571563..9ab2d3b 100644
--- a/hal/src/main/native/include/mockdata/AnalogInData.h
+++ b/hal/src/main/native/include/hal/simulation/AnalogInData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/AnalogOutData.h b/hal/src/main/native/include/hal/simulation/AnalogOutData.h
similarity index 93%
rename from hal/src/main/native/include/mockdata/AnalogOutData.h
rename to hal/src/main/native/include/hal/simulation/AnalogOutData.h
index e8f55f6..fa1413d 100644
--- a/hal/src/main/native/include/mockdata/AnalogOutData.h
+++ b/hal/src/main/native/include/hal/simulation/AnalogOutData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/AnalogTriggerData.h b/hal/src/main/native/include/hal/simulation/AnalogTriggerData.h
similarity index 94%
rename from hal/src/main/native/include/mockdata/AnalogTriggerData.h
rename to hal/src/main/native/include/hal/simulation/AnalogTriggerData.h
index 566f2f5..74c762c 100644
--- a/hal/src/main/native/include/mockdata/AnalogTriggerData.h
+++ b/hal/src/main/native/include/hal/simulation/AnalogTriggerData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 enum HALSIM_AnalogTriggerMode : int32_t {
   HALSIM_AnalogTriggerUnassigned,
@@ -21,6 +21,8 @@
 extern "C" {
 #endif
 
+int32_t HALSIM_FindAnalogTriggerForChannel(int32_t channel);
+
 void HALSIM_ResetAnalogTriggerData(int32_t index);
 int32_t HALSIM_RegisterAnalogTriggerInitializedCallback(
     int32_t index, HAL_NotifyCallback callback, void* param,
diff --git a/hal/src/main/native/include/mockdata/CanData.h b/hal/src/main/native/include/hal/simulation/CanData.h
similarity index 96%
rename from hal/src/main/native/include/mockdata/CanData.h
rename to hal/src/main/native/include/hal/simulation/CanData.h
index 0d48290..eb5ea63 100644
--- a/hal/src/main/native/include/mockdata/CanData.h
+++ b/hal/src/main/native/include/hal/simulation/CanData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,9 +7,9 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
 #include "hal/Value.h"
+#include "hal/simulation/NotifyListener.h"
 
 typedef void (*HAL_CAN_SendMessageCallback)(const char* name, void* param,
                                             uint32_t messageID,
diff --git a/hal/src/main/native/include/mockdata/DIOData.h b/hal/src/main/native/include/hal/simulation/DIOData.h
similarity index 96%
rename from hal/src/main/native/include/mockdata/DIOData.h
rename to hal/src/main/native/include/hal/simulation/DIOData.h
index d13eee1..ddda655 100644
--- a/hal/src/main/native/include/mockdata/DIOData.h
+++ b/hal/src/main/native/include/hal/simulation/DIOData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/DigitalPWMData.h b/hal/src/main/native/include/hal/simulation/DigitalPWMData.h
similarity index 92%
rename from hal/src/main/native/include/mockdata/DigitalPWMData.h
rename to hal/src/main/native/include/hal/simulation/DigitalPWMData.h
index 5af17e3..79428b0 100644
--- a/hal/src/main/native/include/mockdata/DigitalPWMData.h
+++ b/hal/src/main/native/include/hal/simulation/DigitalPWMData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,13 +7,15 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+int32_t HALSIM_FindDigitalPWMForChannel(int32_t channel);
+
 void HALSIM_ResetDigitalPWMData(int32_t index);
 int32_t HALSIM_RegisterDigitalPWMInitializedCallback(
     int32_t index, HAL_NotifyCallback callback, void* param,
diff --git a/hal/src/main/native/include/hal/simulation/DriverStationData.h b/hal/src/main/native/include/hal/simulation/DriverStationData.h
new file mode 100644
index 0000000..536738b
--- /dev/null
+++ b/hal/src/main/native/include/hal/simulation/DriverStationData.h
@@ -0,0 +1,172 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#pragma once
+
+#include "hal/DriverStationTypes.h"
+#include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
+
+typedef void (*HAL_JoystickAxesCallback)(const char* name, void* param,
+                                         int32_t joystickNum,
+                                         const HAL_JoystickAxes* axes);
+typedef void (*HAL_JoystickPOVsCallback)(const char* name, void* param,
+                                         int32_t joystickNum,
+                                         const HAL_JoystickPOVs* povs);
+typedef void (*HAL_JoystickButtonsCallback)(const char* name, void* param,
+                                            int32_t joystickNum,
+                                            const HAL_JoystickButtons* buttons);
+typedef void (*HAL_JoystickDescriptorCallback)(
+    const char* name, void* param, int32_t joystickNum,
+    const HAL_JoystickDescriptor* descriptor);
+typedef void (*HAL_JoystickOutputsCallback)(const char* name, void* param,
+                                            int32_t joystickNum,
+                                            int64_t outputs, int32_t leftRumble,
+                                            int32_t rightRumble);
+typedef void (*HAL_MatchInfoCallback)(const char* name, void* param,
+                                      const HAL_MatchInfo* info);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void HALSIM_ResetDriverStationData(void);
+int32_t HALSIM_RegisterDriverStationEnabledCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationEnabledCallback(int32_t uid);
+HAL_Bool HALSIM_GetDriverStationEnabled(void);
+void HALSIM_SetDriverStationEnabled(HAL_Bool enabled);
+
+int32_t HALSIM_RegisterDriverStationAutonomousCallback(
+    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationAutonomousCallback(int32_t uid);
+HAL_Bool HALSIM_GetDriverStationAutonomous(void);
+void HALSIM_SetDriverStationAutonomous(HAL_Bool autonomous);
+
+int32_t HALSIM_RegisterDriverStationTestCallback(HAL_NotifyCallback callback,
+                                                 void* param,
+                                                 HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationTestCallback(int32_t uid);
+HAL_Bool HALSIM_GetDriverStationTest(void);
+void HALSIM_SetDriverStationTest(HAL_Bool test);
+
+int32_t HALSIM_RegisterDriverStationEStopCallback(HAL_NotifyCallback callback,
+                                                  void* param,
+                                                  HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationEStopCallback(int32_t uid);
+HAL_Bool HALSIM_GetDriverStationEStop(void);
+void HALSIM_SetDriverStationEStop(HAL_Bool eStop);
+
+int32_t HALSIM_RegisterDriverStationFmsAttachedCallback(
+    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationFmsAttachedCallback(int32_t uid);
+HAL_Bool HALSIM_GetDriverStationFmsAttached(void);
+void HALSIM_SetDriverStationFmsAttached(HAL_Bool fmsAttached);
+
+int32_t HALSIM_RegisterDriverStationDsAttachedCallback(
+    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationDsAttachedCallback(int32_t uid);
+HAL_Bool HALSIM_GetDriverStationDsAttached(void);
+void HALSIM_SetDriverStationDsAttached(HAL_Bool dsAttached);
+
+int32_t HALSIM_RegisterDriverStationAllianceStationIdCallback(
+    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationAllianceStationIdCallback(int32_t uid);
+HAL_AllianceStationID HALSIM_GetDriverStationAllianceStationId(void);
+void HALSIM_SetDriverStationAllianceStationId(
+    HAL_AllianceStationID allianceStationId);
+
+int32_t HALSIM_RegisterDriverStationMatchTimeCallback(
+    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationMatchTimeCallback(int32_t uid);
+double HALSIM_GetDriverStationMatchTime(void);
+void HALSIM_SetDriverStationMatchTime(double matchTime);
+
+int32_t HALSIM_RegisterJoystickAxesCallback(int32_t joystickNum,
+                                            HAL_JoystickAxesCallback callback,
+                                            void* param,
+                                            HAL_Bool initialNotify);
+void HALSIM_CancelJoystickAxesCallback(int32_t uid);
+void HALSIM_GetJoystickAxes(int32_t joystickNum, HAL_JoystickAxes* axes);
+void HALSIM_SetJoystickAxes(int32_t joystickNum, const HAL_JoystickAxes* axes);
+
+int32_t HALSIM_RegisterJoystickPOVsCallback(int32_t joystickNum,
+                                            HAL_JoystickPOVsCallback callback,
+                                            void* param,
+                                            HAL_Bool initialNotify);
+void HALSIM_CancelJoystickPOVsCallback(int32_t uid);
+void HALSIM_GetJoystickPOVs(int32_t joystickNum, HAL_JoystickPOVs* povs);
+void HALSIM_SetJoystickPOVs(int32_t joystickNum, const HAL_JoystickPOVs* povs);
+
+int32_t HALSIM_RegisterJoystickButtonsCallback(
+    int32_t joystickNum, HAL_JoystickButtonsCallback callback, void* param,
+    HAL_Bool initialNotify);
+void HALSIM_CancelJoystickButtonsCallback(int32_t uid);
+void HALSIM_GetJoystickButtons(int32_t joystickNum,
+                               HAL_JoystickButtons* buttons);
+void HALSIM_SetJoystickButtons(int32_t joystickNum,
+                               const HAL_JoystickButtons* buttons);
+
+int32_t HALSIM_RegisterJoystickDescriptorCallback(
+    int32_t joystickNum, HAL_JoystickDescriptorCallback callback, void* param,
+    HAL_Bool initialNotify);
+void HALSIM_CancelJoystickDescriptorCallback(int32_t uid);
+void HALSIM_GetJoystickDescriptor(int32_t joystickNum,
+                                  HAL_JoystickDescriptor* descriptor);
+void HALSIM_SetJoystickDescriptor(int32_t joystickNum,
+                                  const HAL_JoystickDescriptor* descriptor);
+
+int32_t HALSIM_RegisterJoystickOutputsCallback(
+    int32_t joystickNum, HAL_JoystickOutputsCallback callback, void* param,
+    HAL_Bool initialNotify);
+void HALSIM_CancelJoystickOutputsCallback(int32_t uid);
+void HALSIM_GetJoystickOutputs(int32_t joystickNum, int64_t* outputs,
+                               int32_t* leftRumble, int32_t* rightRumble);
+void HALSIM_SetJoystickOutputs(int32_t joystickNum, int64_t outputs,
+                               int32_t leftRumble, int32_t rightRumble);
+
+int32_t HALSIM_RegisterMatchInfoCallback(HAL_MatchInfoCallback callback,
+                                         void* param, HAL_Bool initialNotify);
+void HALSIM_CancelMatchInfoCallback(int32_t uid);
+void HALSIM_GetMatchInfo(HAL_MatchInfo* info);
+void HALSIM_SetMatchInfo(const HAL_MatchInfo* info);
+
+void HALSIM_SetJoystickButton(int32_t stick, int32_t button, HAL_Bool state);
+void HALSIM_SetJoystickAxis(int32_t stick, int32_t axis, double value);
+void HALSIM_SetJoystickPOV(int32_t stick, int32_t pov, int32_t value);
+void HALSIM_SetJoystickButtonsValue(int32_t stick, uint32_t buttons);
+void HALSIM_SetJoystickAxisCount(int32_t stick, int32_t count);
+void HALSIM_SetJoystickPOVCount(int32_t stick, int32_t count);
+void HALSIM_SetJoystickButtonCount(int32_t stick, int32_t count);
+void HALSIM_GetJoystickCounts(int32_t stick, int32_t* axisCount,
+                              int32_t* buttonCount, int32_t* povCount);
+
+void HALSIM_SetJoystickIsXbox(int32_t stick, HAL_Bool isXbox);
+void HALSIM_SetJoystickType(int32_t stick, int32_t type);
+void HALSIM_SetJoystickName(int32_t stick, const char* name);
+void HALSIM_SetJoystickAxisType(int32_t stick, int32_t axis, int32_t type);
+
+void HALSIM_SetGameSpecificMessage(const char* message);
+void HALSIM_SetEventName(const char* name);
+void HALSIM_SetMatchType(HAL_MatchType type);
+void HALSIM_SetMatchNumber(int32_t matchNumber);
+void HALSIM_SetReplayNumber(int32_t replayNumber);
+
+void HALSIM_RegisterDriverStationAllCallbacks(HAL_NotifyCallback callback,
+                                              void* param,
+                                              HAL_Bool initialNotify);
+
+int32_t HALSIM_RegisterDriverStationNewDataCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelDriverStationNewDataCallback(int32_t uid);
+void HALSIM_NotifyDriverStationNewData(void);
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
diff --git a/hal/src/main/native/include/mockdata/DutyCycleData.h b/hal/src/main/native/include/hal/simulation/DutyCycleData.h
similarity index 93%
rename from hal/src/main/native/include/mockdata/DutyCycleData.h
rename to hal/src/main/native/include/hal/simulation/DutyCycleData.h
index b97b355..7b191f28 100644
--- a/hal/src/main/native/include/mockdata/DutyCycleData.h
+++ b/hal/src/main/native/include/hal/simulation/DutyCycleData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,13 +7,15 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+int32_t HALSIM_FindDutyCycleForChannel(int32_t channel);
+
 void HALSIM_ResetDutyCycleData(int32_t index);
 int32_t HALSIM_GetDutyCycleDigitalChannel(int32_t index);
 
diff --git a/hal/src/main/native/include/mockdata/EncoderData.h b/hal/src/main/native/include/hal/simulation/EncoderData.h
similarity index 92%
rename from hal/src/main/native/include/mockdata/EncoderData.h
rename to hal/src/main/native/include/hal/simulation/EncoderData.h
index d5d12be..80c142d 100644
--- a/hal/src/main/native/include/mockdata/EncoderData.h
+++ b/hal/src/main/native/include/hal/simulation/EncoderData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,13 +7,15 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+int32_t HALSIM_FindEncoderForChannel(int32_t channel);
+
 void HALSIM_ResetEncoderData(int32_t index);
 int32_t HALSIM_GetEncoderDigitalChannelA(int32_t index);
 int32_t HALSIM_GetEncoderDigitalChannelB(int32_t index);
@@ -93,6 +95,11 @@
                                         HAL_NotifyCallback callback,
                                         void* param, HAL_Bool initialNotify);
 
+void HALSIM_SetEncoderDistance(int32_t index, double distance);
+double HALSIM_GetEncoderDistance(int32_t index);
+void HALSIM_SetEncoderRate(int32_t index, double rate);
+double HALSIM_GetEncoderRate(int32_t index);
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/hal/src/main/native/include/mockdata/I2CData.h b/hal/src/main/native/include/hal/simulation/I2CData.h
similarity index 93%
rename from hal/src/main/native/include/mockdata/I2CData.h
rename to hal/src/main/native/include/hal/simulation/I2CData.h
index 32ae3a8..3d72850 100644
--- a/hal/src/main/native/include/mockdata/I2CData.h
+++ b/hal/src/main/native/include/hal/simulation/I2CData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/MockHooks.h b/hal/src/main/native/include/hal/simulation/MockHooks.h
similarity index 76%
rename from hal/src/main/native/include/mockdata/MockHooks.h
rename to hal/src/main/native/include/hal/simulation/MockHooks.h
index 318ff21..cef205e 100644
--- a/hal/src/main/native/include/mockdata/MockHooks.h
+++ b/hal/src/main/native/include/hal/simulation/MockHooks.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,9 +7,11 @@
 
 #pragma once
 
+#include "hal/HALBase.h"
 #include "hal/Types.h"
 
 extern "C" {
+void HALSIM_SetRuntimeType(HAL_RuntimeType type);
 void HALSIM_WaitForProgramStart(void);
 void HALSIM_SetProgramStarted(void);
 HAL_Bool HALSIM_GetProgramStarted(void);
@@ -18,10 +20,14 @@
 void HALSIM_ResumeTiming(void);
 HAL_Bool HALSIM_IsTimingPaused(void);
 void HALSIM_StepTiming(uint64_t delta);
+void HALSIM_StepTimingAsync(uint64_t delta);
 
 typedef int32_t (*HALSIM_SendErrorHandler)(
     HAL_Bool isError, int32_t errorCode, HAL_Bool isLVCode, const char* details,
     const char* location, const char* callStack, HAL_Bool printMsg);
 void HALSIM_SetSendError(HALSIM_SendErrorHandler handler);
 
+typedef int32_t (*HALSIM_SendConsoleLineHandler)(const char* line);
+void HALSIM_SetSendConsoleLine(HALSIM_SendConsoleLineHandler handler);
+
 }  // extern "C"
diff --git a/hal/src/main/native/include/mockdata/NotifierData.h b/hal/src/main/native/include/hal/simulation/NotifierData.h
similarity index 91%
rename from hal/src/main/native/include/mockdata/NotifierData.h
rename to hal/src/main/native/include/hal/simulation/NotifierData.h
index b1ed50f..a5b68b6 100644
--- a/hal/src/main/native/include/mockdata/NotifierData.h
+++ b/hal/src/main/native/include/hal/simulation/NotifierData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -17,7 +17,7 @@
   HAL_NotifierHandle handle;
   char name[64];
   uint64_t timeout;
-  HAL_Bool running;
+  HAL_Bool waitTimeValid;
 };
 
 uint64_t HALSIM_GetNextNotifierTimeout(void);
diff --git a/hal/src/main/native/include/mockdata/NotifyListener.h b/hal/src/main/native/include/hal/simulation/NotifyListener.h
similarity index 90%
rename from hal/src/main/native/include/mockdata/NotifyListener.h
rename to hal/src/main/native/include/hal/simulation/NotifyListener.h
index a455803..a1430c4 100644
--- a/hal/src/main/native/include/mockdata/NotifyListener.h
+++ b/hal/src/main/native/include/hal/simulation/NotifyListener.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -31,8 +31,8 @@
 
   explicit operator bool() const { return callback != nullptr; }
 
-  CallbackFunction callback;
-  void* param;
+  CallbackFunction callback = nullptr;
+  void* param = nullptr;
 };
 
 }  // namespace hal
diff --git a/hal/src/main/native/include/mockdata/PCMData.h b/hal/src/main/native/include/hal/simulation/PCMData.h
similarity index 97%
rename from hal/src/main/native/include/mockdata/PCMData.h
rename to hal/src/main/native/include/hal/simulation/PCMData.h
index 66b1ec2..ad2188d 100644
--- a/hal/src/main/native/include/mockdata/PCMData.h
+++ b/hal/src/main/native/include/hal/simulation/PCMData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/PDPData.h b/hal/src/main/native/include/hal/simulation/PDPData.h
similarity index 95%
rename from hal/src/main/native/include/mockdata/PDPData.h
rename to hal/src/main/native/include/hal/simulation/PDPData.h
index 8315e3c..7ec11a4 100644
--- a/hal/src/main/native/include/mockdata/PDPData.h
+++ b/hal/src/main/native/include/hal/simulation/PDPData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/PWMData.h b/hal/src/main/native/include/hal/simulation/PWMData.h
similarity index 96%
rename from hal/src/main/native/include/mockdata/PWMData.h
rename to hal/src/main/native/include/hal/simulation/PWMData.h
index 2a8c63d..a536710 100644
--- a/hal/src/main/native/include/mockdata/PWMData.h
+++ b/hal/src/main/native/include/hal/simulation/PWMData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/RelayData.h b/hal/src/main/native/include/hal/simulation/RelayData.h
similarity index 95%
rename from hal/src/main/native/include/mockdata/RelayData.h
rename to hal/src/main/native/include/hal/simulation/RelayData.h
index c0b853d..1329d29 100644
--- a/hal/src/main/native/include/mockdata/RelayData.h
+++ b/hal/src/main/native/include/hal/simulation/RelayData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/hal/simulation/RoboRioData.h b/hal/src/main/native/include/hal/simulation/RoboRioData.h
new file mode 100644
index 0000000..49d32f3
--- /dev/null
+++ b/hal/src/main/native/include/hal/simulation/RoboRioData.h
@@ -0,0 +1,126 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#pragma once
+
+#include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void HALSIM_ResetRoboRioData(void);
+int32_t HALSIM_RegisterRoboRioFPGAButtonCallback(HAL_NotifyCallback callback,
+                                                 void* param,
+                                                 HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioFPGAButtonCallback(int32_t uid);
+HAL_Bool HALSIM_GetRoboRioFPGAButton(void);
+void HALSIM_SetRoboRioFPGAButton(HAL_Bool fPGAButton);
+
+int32_t HALSIM_RegisterRoboRioVInVoltageCallback(HAL_NotifyCallback callback,
+                                                 void* param,
+                                                 HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioVInVoltageCallback(int32_t uid);
+double HALSIM_GetRoboRioVInVoltage(void);
+void HALSIM_SetRoboRioVInVoltage(double vInVoltage);
+
+int32_t HALSIM_RegisterRoboRioVInCurrentCallback(HAL_NotifyCallback callback,
+                                                 void* param,
+                                                 HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioVInCurrentCallback(int32_t uid);
+double HALSIM_GetRoboRioVInCurrent(void);
+void HALSIM_SetRoboRioVInCurrent(double vInCurrent);
+
+int32_t HALSIM_RegisterRoboRioUserVoltage6VCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserVoltage6VCallback(int32_t uid);
+double HALSIM_GetRoboRioUserVoltage6V(void);
+void HALSIM_SetRoboRioUserVoltage6V(double userVoltage6V);
+
+int32_t HALSIM_RegisterRoboRioUserCurrent6VCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserCurrent6VCallback(int32_t uid);
+double HALSIM_GetRoboRioUserCurrent6V(void);
+void HALSIM_SetRoboRioUserCurrent6V(double userCurrent6V);
+
+int32_t HALSIM_RegisterRoboRioUserActive6VCallback(HAL_NotifyCallback callback,
+                                                   void* param,
+                                                   HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserActive6VCallback(int32_t uid);
+HAL_Bool HALSIM_GetRoboRioUserActive6V(void);
+void HALSIM_SetRoboRioUserActive6V(HAL_Bool userActive6V);
+
+int32_t HALSIM_RegisterRoboRioUserVoltage5VCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserVoltage5VCallback(int32_t uid);
+double HALSIM_GetRoboRioUserVoltage5V(void);
+void HALSIM_SetRoboRioUserVoltage5V(double userVoltage5V);
+
+int32_t HALSIM_RegisterRoboRioUserCurrent5VCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserCurrent5VCallback(int32_t uid);
+double HALSIM_GetRoboRioUserCurrent5V(void);
+void HALSIM_SetRoboRioUserCurrent5V(double userCurrent5V);
+
+int32_t HALSIM_RegisterRoboRioUserActive5VCallback(HAL_NotifyCallback callback,
+                                                   void* param,
+                                                   HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserActive5VCallback(int32_t uid);
+HAL_Bool HALSIM_GetRoboRioUserActive5V(void);
+void HALSIM_SetRoboRioUserActive5V(HAL_Bool userActive5V);
+
+int32_t HALSIM_RegisterRoboRioUserVoltage3V3Callback(
+    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserVoltage3V3Callback(int32_t uid);
+double HALSIM_GetRoboRioUserVoltage3V3(void);
+void HALSIM_SetRoboRioUserVoltage3V3(double userVoltage3V3);
+
+int32_t HALSIM_RegisterRoboRioUserCurrent3V3Callback(
+    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserCurrent3V3Callback(int32_t uid);
+double HALSIM_GetRoboRioUserCurrent3V3(void);
+void HALSIM_SetRoboRioUserCurrent3V3(double userCurrent3V3);
+
+int32_t HALSIM_RegisterRoboRioUserActive3V3Callback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserActive3V3Callback(int32_t uid);
+HAL_Bool HALSIM_GetRoboRioUserActive3V3(void);
+void HALSIM_SetRoboRioUserActive3V3(HAL_Bool userActive3V3);
+
+int32_t HALSIM_RegisterRoboRioUserFaults6VCallback(HAL_NotifyCallback callback,
+                                                   void* param,
+                                                   HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserFaults6VCallback(int32_t uid);
+int32_t HALSIM_GetRoboRioUserFaults6V(void);
+void HALSIM_SetRoboRioUserFaults6V(int32_t userFaults6V);
+
+int32_t HALSIM_RegisterRoboRioUserFaults5VCallback(HAL_NotifyCallback callback,
+                                                   void* param,
+                                                   HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserFaults5VCallback(int32_t uid);
+int32_t HALSIM_GetRoboRioUserFaults5V(void);
+void HALSIM_SetRoboRioUserFaults5V(int32_t userFaults5V);
+
+int32_t HALSIM_RegisterRoboRioUserFaults3V3Callback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify);
+void HALSIM_CancelRoboRioUserFaults3V3Callback(int32_t uid);
+int32_t HALSIM_GetRoboRioUserFaults3V3(void);
+void HALSIM_SetRoboRioUserFaults3V3(int32_t userFaults3V3);
+
+void HALSIM_RegisterRoboRioAllCallbacks(HAL_NotifyCallback callback,
+                                        void* param, HAL_Bool initialNotify);
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
diff --git a/hal/src/main/native/include/mockdata/SPIAccelerometerData.h b/hal/src/main/native/include/hal/simulation/SPIAccelerometerData.h
similarity index 96%
rename from hal/src/main/native/include/mockdata/SPIAccelerometerData.h
rename to hal/src/main/native/include/hal/simulation/SPIAccelerometerData.h
index c68da45..6515aa8 100644
--- a/hal/src/main/native/include/mockdata/SPIAccelerometerData.h
+++ b/hal/src/main/native/include/hal/simulation/SPIAccelerometerData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/hal/src/main/native/include/mockdata/SPIData.h b/hal/src/main/native/include/hal/simulation/SPIData.h
similarity index 94%
rename from hal/src/main/native/include/mockdata/SPIData.h
rename to hal/src/main/native/include/hal/simulation/SPIData.h
index da21643..149a1ef 100644
--- a/hal/src/main/native/include/mockdata/SPIData.h
+++ b/hal/src/main/native/include/hal/simulation/SPIData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
+#include "hal/simulation/NotifyListener.h"
 
 typedef void (*HAL_SpiReadAutoReceiveBufferCallback)(const char* name,
                                                      void* param,
diff --git a/hal/src/main/native/include/mockdata/SimCallbackRegistry.h b/hal/src/main/native/include/hal/simulation/SimCallbackRegistry.h
similarity index 73%
rename from hal/src/main/native/include/mockdata/SimCallbackRegistry.h
rename to hal/src/main/native/include/hal/simulation/SimCallbackRegistry.h
index 3e1aeb0..31f64ef 100644
--- a/hal/src/main/native/include/mockdata/SimCallbackRegistry.h
+++ b/hal/src/main/native/include/hal/simulation/SimCallbackRegistry.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -14,7 +14,7 @@
 #include <wpi/UidVector.h>
 #include <wpi/spinlock.h>
 
-#include "mockdata/NotifyListener.h"
+#include "hal/simulation/NotifyListener.h"
 
 namespace hal {
 
@@ -30,7 +30,7 @@
  public:
   void Cancel(int32_t uid) {
     std::scoped_lock lock(m_mutex);
-    if (m_callbacks) m_callbacks->erase(uid - 1);
+    if (m_callbacks && uid > 0) m_callbacks->erase(uid - 1);
   }
 
   void Reset() {
@@ -152,4 +152,42 @@
     DATA->LOWERNAME.Cancel(uid);                                              \
   }
 
+/**
+ * Define a stub standard C API for SimCallbackRegistry.
+ *
+ * Functions defined:
+ * - int32 NS_RegisterCAPINAMECallback(
+ *      int32_t index, TYPE callback, void* param)
+ * - void NS_CancelCAPINAMECallback(int32_t index, int32_t uid)
+ *
+ * @param TYPE the underlying callback type (e.g. HAL_BufferCallback)
+ * @param NS the "namespace" (e.g. HALSIM)
+ * @param CAPINAME the C API name (usually first letter capitalized)
+ */
+#define HAL_SIMCALLBACKREGISTRY_STUB_CAPI(TYPE, NS, CAPINAME)             \
+  int32_t NS##_Register##CAPINAME##Callback(int32_t index, TYPE callback, \
+                                            void* param) {                \
+    return 0;                                                             \
+  }                                                                       \
+                                                                          \
+  void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) {}
+
+/**
+ * Define a stub standard C API for SimCallbackRegistry (no index variant).
+ *
+ * Functions defined:
+ * - int32 NS_RegisterCAPINAMECallback(TYPE callback, void* param)
+ * - void NS_CancelCAPINAMECallback(int32_t uid)
+ *
+ * @param TYPE the underlying callback type (e.g. HAL_BufferCallback)
+ * @param NS the "namespace" (e.g. HALSIM)
+ * @param CAPINAME the C API name (usually first letter capitalized)
+ */
+#define HAL_SIMCALLBACKREGISTRY_STUB_CAPI_NOINDEX(TYPE, NS, CAPINAME)     \
+  int32_t NS##_Register##CAPINAME##Callback(TYPE callback, void* param) { \
+    return 0;                                                             \
+  }                                                                       \
+                                                                          \
+  void NS##_Cancel##CAPINAME##Callback(int32_t uid) {}
+
 }  // namespace hal
diff --git a/hal/src/main/native/include/mockdata/SimDataValue.h b/hal/src/main/native/include/hal/simulation/SimDataValue.h
similarity index 67%
rename from hal/src/main/native/include/mockdata/SimDataValue.h
rename to hal/src/main/native/include/hal/simulation/SimDataValue.h
index b6723bb..ff333a5 100644
--- a/hal/src/main/native/include/mockdata/SimDataValue.h
+++ b/hal/src/main/native/include/hal/simulation/SimDataValue.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,8 +13,8 @@
 #include <wpi/UidVector.h>
 #include <wpi/spinlock.h>
 
-#include "mockdata/NotifyListener.h"
-#include "mockdata/SimCallbackRegistry.h"
+#include "hal/simulation/NotifyListener.h"
+#include "hal/simulation/SimCallbackRegistry.h"
 
 namespace hal {
 
@@ -53,7 +53,7 @@
       lock.unlock();
       callback(name, param, &value);
     }
-    return newUid + 1;
+    return newUid;
   }
 
   void DoSet(T value, const char* name) {
@@ -224,4 +224,90 @@
                                                                              \
   void NS##_Set##CAPINAME(TYPE LOWERNAME) { DATA->LOWERNAME = LOWERNAME; }
 
+/**
+ * Define a stub standard C API for simulation data.
+ *
+ * Functions defined:
+ * - int32 NS_RegisterCAPINAMECallback(
+ *      int32_t index, HAL_NotifyCallback callback, void* param,
+ *      HAL_Bool initialNotify)
+ * - void NS_CancelCAPINAMECallback(int32_t index, int32_t uid)
+ * - TYPE NS_GetCAPINAME(int32_t index)
+ * - void NS_SetCAPINAME(int32_t index, TYPE value)
+ *
+ * @param TYPE the underlying value type (e.g. double)
+ * @param NS the "namespace" (e.g. HALSIM)
+ * @param CAPINAME the C API name (usually first letter capitalized)
+ * @param RETURN what to return from the Get function
+ */
+#define HAL_SIMDATAVALUE_STUB_CAPI(TYPE, NS, CAPINAME, RETURN)        \
+  int32_t NS##_Register##CAPINAME##Callback(                          \
+      int32_t index, HAL_NotifyCallback callback, void* param,        \
+      HAL_Bool initialNotify) {                                       \
+    return 0;                                                         \
+  }                                                                   \
+                                                                      \
+  void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) {} \
+                                                                      \
+  TYPE NS##_Get##CAPINAME(int32_t index) { return RETURN; }           \
+                                                                      \
+  void NS##_Set##CAPINAME(int32_t index, TYPE) {}
+
+/**
+ * Define a stub standard C API for simulation data (channel variant).
+ *
+ * Functions defined:
+ * - int32 NS_RegisterCAPINAMECallback(
+ *      int32_t index, int32_t channel, HAL_NotifyCallback callback,
+ *      void* param, HAL_Bool initialNotify)
+ * - void NS_CancelCAPINAMECallback(int32_t index, int32_t channel, int32_t uid)
+ * - TYPE NS_GetCAPINAME(int32_t index, int32_t channel)
+ * - void NS_SetCAPINAME(int32_t index, int32_t channel, TYPE value)
+ *
+ * @param TYPE the underlying value type (e.g. double)
+ * @param NS the "namespace" (e.g. HALSIM)
+ * @param CAPINAME the C API name (usually first letter capitalized)
+ * @param RETURN what to return from the Get function
+ */
+#define HAL_SIMDATAVALUE_STUB_CAPI_CHANNEL(TYPE, NS, CAPINAME, RETURN)       \
+  int32_t NS##_Register##CAPINAME##Callback(                                 \
+      int32_t index, int32_t channel, HAL_NotifyCallback callback,           \
+      void* param, HAL_Bool initialNotify) {                                 \
+    return 0;                                                                \
+  }                                                                          \
+                                                                             \
+  void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t channel,       \
+                                       int32_t uid) {}                       \
+                                                                             \
+  TYPE NS##_Get##CAPINAME(int32_t index, int32_t channel) { return RETURN; } \
+                                                                             \
+  void NS##_Set##CAPINAME(int32_t index, int32_t channel, TYPE) {}
+
+/**
+ * Define a stub standard C API for simulation data (no index variant).
+ *
+ * Functions defined:
+ * - int32 NS_RegisterCAPINAMECallback(
+ *      HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify)
+ * - void NS_CancelCAPINAMECallback(int32_t uid)
+ * - TYPE NS_GetCAPINAME(void)
+ * - void NS_SetCAPINAME(TYPE value)
+ *
+ * @param TYPE the underlying value type (e.g. double)
+ * @param NS the "namespace" (e.g. HALSIM)
+ * @param CAPINAME the C API name (usually first letter capitalized)
+ * @param RETURN what to return from the Get function
+ */
+#define HAL_SIMDATAVALUE_STUB_CAPI_NOINDEX(TYPE, NS, CAPINAME, RETURN)    \
+  int32_t NS##_Register##CAPINAME##Callback(                              \
+      HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify) { \
+    return 0;                                                             \
+  }                                                                       \
+                                                                          \
+  void NS##_Cancel##CAPINAME##Callback(int32_t uid) {}                    \
+                                                                          \
+  TYPE NS##_Get##CAPINAME(void) { return RETURN; }                        \
+                                                                          \
+  void NS##_Set##CAPINAME(TYPE) {}
+
 }  // namespace hal
diff --git a/hal/src/main/native/include/mockdata/SimDeviceData.h b/hal/src/main/native/include/hal/simulation/SimDeviceData.h
similarity index 93%
rename from hal/src/main/native/include/mockdata/SimDeviceData.h
rename to hal/src/main/native/include/hal/simulation/SimDeviceData.h
index 44398d7..e702c5c 100644
--- a/hal/src/main/native/include/mockdata/SimDeviceData.h
+++ b/hal/src/main/native/include/hal/simulation/SimDeviceData.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,7 +7,6 @@
 
 #pragma once
 
-#include "NotifyListener.h"
 #include "hal/Types.h"
 #include "hal/Value.h"
 
@@ -23,6 +22,9 @@
 extern "C" {
 #endif
 
+void HALSIM_SetSimDeviceEnabled(const char* prefix, HAL_Bool enabled);
+HAL_Bool HALSIM_IsSimDeviceEnabled(const char* name);
+
 int32_t HALSIM_RegisterSimDeviceCreatedCallback(
     const char* prefix, void* param, HALSIM_SimDeviceCallback callback,
     HAL_Bool initialNotify);
diff --git a/hal/src/main/native/include/mockdata/DriverStationData.h b/hal/src/main/native/include/mockdata/DriverStationData.h
deleted file mode 100644
index 1f69664..0000000
--- a/hal/src/main/native/include/mockdata/DriverStationData.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include "NotifyListener.h"
-#include "hal/DriverStationTypes.h"
-#include "hal/Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void HALSIM_ResetDriverStationData(void);
-int32_t HALSIM_RegisterDriverStationEnabledCallback(HAL_NotifyCallback callback,
-                                                    void* param,
-                                                    HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationEnabledCallback(int32_t uid);
-HAL_Bool HALSIM_GetDriverStationEnabled(void);
-void HALSIM_SetDriverStationEnabled(HAL_Bool enabled);
-
-int32_t HALSIM_RegisterDriverStationAutonomousCallback(
-    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationAutonomousCallback(int32_t uid);
-HAL_Bool HALSIM_GetDriverStationAutonomous(void);
-void HALSIM_SetDriverStationAutonomous(HAL_Bool autonomous);
-
-int32_t HALSIM_RegisterDriverStationTestCallback(HAL_NotifyCallback callback,
-                                                 void* param,
-                                                 HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationTestCallback(int32_t uid);
-HAL_Bool HALSIM_GetDriverStationTest(void);
-void HALSIM_SetDriverStationTest(HAL_Bool test);
-
-int32_t HALSIM_RegisterDriverStationEStopCallback(HAL_NotifyCallback callback,
-                                                  void* param,
-                                                  HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationEStopCallback(int32_t uid);
-HAL_Bool HALSIM_GetDriverStationEStop(void);
-void HALSIM_SetDriverStationEStop(HAL_Bool eStop);
-
-int32_t HALSIM_RegisterDriverStationFmsAttachedCallback(
-    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationFmsAttachedCallback(int32_t uid);
-HAL_Bool HALSIM_GetDriverStationFmsAttached(void);
-void HALSIM_SetDriverStationFmsAttached(HAL_Bool fmsAttached);
-
-int32_t HALSIM_RegisterDriverStationDsAttachedCallback(
-    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationDsAttachedCallback(int32_t uid);
-HAL_Bool HALSIM_GetDriverStationDsAttached(void);
-void HALSIM_SetDriverStationDsAttached(HAL_Bool dsAttached);
-
-int32_t HALSIM_RegisterDriverStationAllianceStationIdCallback(
-    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationAllianceStationIdCallback(int32_t uid);
-HAL_AllianceStationID HALSIM_GetDriverStationAllianceStationId(void);
-void HALSIM_SetDriverStationAllianceStationId(
-    HAL_AllianceStationID allianceStationId);
-
-int32_t HALSIM_RegisterDriverStationMatchTimeCallback(
-    HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify);
-void HALSIM_CancelDriverStationMatchTimeCallback(int32_t uid);
-double HALSIM_GetDriverStationMatchTime(void);
-void HALSIM_SetDriverStationMatchTime(double matchTime);
-
-void HALSIM_SetJoystickAxes(int32_t joystickNum, const HAL_JoystickAxes* axes);
-void HALSIM_SetJoystickPOVs(int32_t joystickNum, const HAL_JoystickPOVs* povs);
-void HALSIM_SetJoystickButtons(int32_t joystickNum,
-                               const HAL_JoystickButtons* buttons);
-void HALSIM_SetJoystickDescriptor(int32_t joystickNum,
-                                  const HAL_JoystickDescriptor* descriptor);
-
-void HALSIM_GetJoystickOutputs(int32_t joystickNum, int64_t* outputs,
-                               int32_t* leftRumble, int32_t* rightRumble);
-
-void HALSIM_SetMatchInfo(const HAL_MatchInfo* info);
-
-void HALSIM_RegisterDriverStationAllCallbacks(HAL_NotifyCallback callback,
-                                              void* param,
-                                              HAL_Bool initialNotify);
-
-void HALSIM_NotifyDriverStationNewData(void);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
diff --git a/hal/src/main/native/include/mockdata/RoboRioData.h b/hal/src/main/native/include/mockdata/RoboRioData.h
deleted file mode 100644
index 3acb0ec..0000000
--- a/hal/src/main/native/include/mockdata/RoboRioData.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include "NotifyListener.h"
-#include "hal/Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void HALSIM_ResetRoboRioData(int32_t index);
-int32_t HALSIM_RegisterRoboRioFPGAButtonCallback(int32_t index,
-                                                 HAL_NotifyCallback callback,
-                                                 void* param,
-                                                 HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioFPGAButtonCallback(int32_t index, int32_t uid);
-HAL_Bool HALSIM_GetRoboRioFPGAButton(int32_t index);
-void HALSIM_SetRoboRioFPGAButton(int32_t index, HAL_Bool fPGAButton);
-
-int32_t HALSIM_RegisterRoboRioVInVoltageCallback(int32_t index,
-                                                 HAL_NotifyCallback callback,
-                                                 void* param,
-                                                 HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioVInVoltageCallback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioVInVoltage(int32_t index);
-void HALSIM_SetRoboRioVInVoltage(int32_t index, double vInVoltage);
-
-int32_t HALSIM_RegisterRoboRioVInCurrentCallback(int32_t index,
-                                                 HAL_NotifyCallback callback,
-                                                 void* param,
-                                                 HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioVInCurrentCallback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioVInCurrent(int32_t index);
-void HALSIM_SetRoboRioVInCurrent(int32_t index, double vInCurrent);
-
-int32_t HALSIM_RegisterRoboRioUserVoltage6VCallback(int32_t index,
-                                                    HAL_NotifyCallback callback,
-                                                    void* param,
-                                                    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserVoltage6VCallback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioUserVoltage6V(int32_t index);
-void HALSIM_SetRoboRioUserVoltage6V(int32_t index, double userVoltage6V);
-
-int32_t HALSIM_RegisterRoboRioUserCurrent6VCallback(int32_t index,
-                                                    HAL_NotifyCallback callback,
-                                                    void* param,
-                                                    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserCurrent6VCallback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioUserCurrent6V(int32_t index);
-void HALSIM_SetRoboRioUserCurrent6V(int32_t index, double userCurrent6V);
-
-int32_t HALSIM_RegisterRoboRioUserActive6VCallback(int32_t index,
-                                                   HAL_NotifyCallback callback,
-                                                   void* param,
-                                                   HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserActive6VCallback(int32_t index, int32_t uid);
-HAL_Bool HALSIM_GetRoboRioUserActive6V(int32_t index);
-void HALSIM_SetRoboRioUserActive6V(int32_t index, HAL_Bool userActive6V);
-
-int32_t HALSIM_RegisterRoboRioUserVoltage5VCallback(int32_t index,
-                                                    HAL_NotifyCallback callback,
-                                                    void* param,
-                                                    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserVoltage5VCallback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioUserVoltage5V(int32_t index);
-void HALSIM_SetRoboRioUserVoltage5V(int32_t index, double userVoltage5V);
-
-int32_t HALSIM_RegisterRoboRioUserCurrent5VCallback(int32_t index,
-                                                    HAL_NotifyCallback callback,
-                                                    void* param,
-                                                    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserCurrent5VCallback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioUserCurrent5V(int32_t index);
-void HALSIM_SetRoboRioUserCurrent5V(int32_t index, double userCurrent5V);
-
-int32_t HALSIM_RegisterRoboRioUserActive5VCallback(int32_t index,
-                                                   HAL_NotifyCallback callback,
-                                                   void* param,
-                                                   HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserActive5VCallback(int32_t index, int32_t uid);
-HAL_Bool HALSIM_GetRoboRioUserActive5V(int32_t index);
-void HALSIM_SetRoboRioUserActive5V(int32_t index, HAL_Bool userActive5V);
-
-int32_t HALSIM_RegisterRoboRioUserVoltage3V3Callback(
-    int32_t index, HAL_NotifyCallback callback, void* param,
-    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserVoltage3V3Callback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioUserVoltage3V3(int32_t index);
-void HALSIM_SetRoboRioUserVoltage3V3(int32_t index, double userVoltage3V3);
-
-int32_t HALSIM_RegisterRoboRioUserCurrent3V3Callback(
-    int32_t index, HAL_NotifyCallback callback, void* param,
-    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserCurrent3V3Callback(int32_t index, int32_t uid);
-double HALSIM_GetRoboRioUserCurrent3V3(int32_t index);
-void HALSIM_SetRoboRioUserCurrent3V3(int32_t index, double userCurrent3V3);
-
-int32_t HALSIM_RegisterRoboRioUserActive3V3Callback(int32_t index,
-                                                    HAL_NotifyCallback callback,
-                                                    void* param,
-                                                    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserActive3V3Callback(int32_t index, int32_t uid);
-HAL_Bool HALSIM_GetRoboRioUserActive3V3(int32_t index);
-void HALSIM_SetRoboRioUserActive3V3(int32_t index, HAL_Bool userActive3V3);
-
-int32_t HALSIM_RegisterRoboRioUserFaults6VCallback(int32_t index,
-                                                   HAL_NotifyCallback callback,
-                                                   void* param,
-                                                   HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserFaults6VCallback(int32_t index, int32_t uid);
-int32_t HALSIM_GetRoboRioUserFaults6V(int32_t index);
-void HALSIM_SetRoboRioUserFaults6V(int32_t index, int32_t userFaults6V);
-
-int32_t HALSIM_RegisterRoboRioUserFaults5VCallback(int32_t index,
-                                                   HAL_NotifyCallback callback,
-                                                   void* param,
-                                                   HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserFaults5VCallback(int32_t index, int32_t uid);
-int32_t HALSIM_GetRoboRioUserFaults5V(int32_t index);
-void HALSIM_SetRoboRioUserFaults5V(int32_t index, int32_t userFaults5V);
-
-int32_t HALSIM_RegisterRoboRioUserFaults3V3Callback(int32_t index,
-                                                    HAL_NotifyCallback callback,
-                                                    void* param,
-                                                    HAL_Bool initialNotify);
-void HALSIM_CancelRoboRioUserFaults3V3Callback(int32_t index, int32_t uid);
-int32_t HALSIM_GetRoboRioUserFaults3V3(int32_t index);
-void HALSIM_SetRoboRioUserFaults3V3(int32_t index, int32_t userFaults3V3);
-
-void HALSIM_RegisterRoboRioAllCallbacks(int32_t index,
-                                        HAL_NotifyCallback callback,
-                                        void* param, HAL_Bool initialNotify);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
diff --git a/hal/src/main/native/include/simulation/AccelerometerSim.h b/hal/src/main/native/include/simulation/AccelerometerSim.h
deleted file mode 100644
index 07860f0..0000000
--- a/hal/src/main/native/include/simulation/AccelerometerSim.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/AccelerometerData.h"
-
-namespace frc {
-namespace sim {
-class AccelerometerSim {
- public:
-  explicit AccelerometerSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterActiveCallback(NotifyCallback callback,
-                                                        bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAccelerometerActiveCallback);
-    store->SetUid(HALSIM_RegisterAccelerometerActiveCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetActive() const { return HALSIM_GetAccelerometerActive(m_index); }
-
-  void SetActive(bool active) {
-    HALSIM_SetAccelerometerActive(m_index, active);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterRangeCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAccelerometerRangeCallback);
-    store->SetUid(HALSIM_RegisterAccelerometerRangeCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  HAL_AccelerometerRange GetRange() const {
-    return HALSIM_GetAccelerometerRange(m_index);
-  }
-
-  void SetRange(HAL_AccelerometerRange range) {
-    HALSIM_SetAccelerometerRange(m_index, range);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterXCallback(NotifyCallback callback,
-                                                   bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAccelerometerXCallback);
-    store->SetUid(HALSIM_RegisterAccelerometerXCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetX() const { return HALSIM_GetAccelerometerX(m_index); }
-
-  void SetX(double x) { HALSIM_SetAccelerometerX(m_index, x); }
-
-  std::unique_ptr<CallbackStore> RegisterYCallback(NotifyCallback callback,
-                                                   bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAccelerometerYCallback);
-    store->SetUid(HALSIM_RegisterAccelerometerYCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetY() const { return HALSIM_GetAccelerometerY(m_index); }
-
-  void SetY(double y) { HALSIM_SetAccelerometerY(m_index, y); }
-
-  std::unique_ptr<CallbackStore> RegisterZCallback(NotifyCallback callback,
-                                                   bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAccelerometerZCallback);
-    store->SetUid(HALSIM_RegisterAccelerometerZCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetZ() const { return HALSIM_GetAccelerometerZ(m_index); }
-
-  void SetZ(double z) { HALSIM_SetAccelerometerZ(m_index, z); }
-
-  void ResetData() { HALSIM_ResetAccelerometerData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/AnalogGyroSim.h b/hal/src/main/native/include/simulation/AnalogGyroSim.h
deleted file mode 100644
index b2cdb85..0000000
--- a/hal/src/main/native/include/simulation/AnalogGyroSim.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/AnalogGyroData.h"
-
-namespace frc {
-namespace sim {
-class AnalogGyroSim {
- public:
-  explicit AnalogGyroSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterAngleCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogGyroAngleCallback);
-    store->SetUid(HALSIM_RegisterAnalogGyroAngleCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetAngle() const { return HALSIM_GetAnalogGyroAngle(m_index); }
-
-  void SetAngle(double angle) { HALSIM_SetAnalogGyroAngle(m_index, angle); }
-
-  std::unique_ptr<CallbackStore> RegisterRateCallback(NotifyCallback callback,
-                                                      bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogGyroRateCallback);
-    store->SetUid(HALSIM_RegisterAnalogGyroRateCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetRate() const { return HALSIM_GetAnalogGyroRate(m_index); }
-
-  void SetRate(double rate) { HALSIM_SetAnalogGyroRate(m_index, rate); }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogGyroInitializedCallback);
-    store->SetUid(HALSIM_RegisterAnalogGyroInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const {
-    return HALSIM_GetAnalogGyroInitialized(m_index);
-  }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetAnalogGyroInitialized(m_index, initialized);
-  }
-
-  void ResetData() { HALSIM_ResetAnalogGyroData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/AnalogInSim.h b/hal/src/main/native/include/simulation/AnalogInSim.h
deleted file mode 100644
index 2a1bbea..0000000
--- a/hal/src/main/native/include/simulation/AnalogInSim.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/AnalogInData.h"
-
-namespace frc {
-namespace sim {
-class AnalogInSim {
- public:
-  explicit AnalogInSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogInInitializedCallback);
-    store->SetUid(HALSIM_RegisterAnalogInInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const { return HALSIM_GetAnalogInInitialized(m_index); }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetAnalogInInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterAverageBitsCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogInAverageBitsCallback);
-    store->SetUid(HALSIM_RegisterAnalogInAverageBitsCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetAverageBits() const { return HALSIM_GetAnalogInAverageBits(m_index); }
-
-  void SetAverageBits(int averageBits) {
-    HALSIM_SetAnalogInAverageBits(m_index, averageBits);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterOversampleBitsCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogInOversampleBitsCallback);
-    store->SetUid(HALSIM_RegisterAnalogInOversampleBitsCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetOversampleBits() const {
-    return HALSIM_GetAnalogInOversampleBits(m_index);
-  }
-
-  void SetOversampleBits(int oversampleBits) {
-    HALSIM_SetAnalogInOversampleBits(m_index, oversampleBits);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterVoltageCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogInVoltageCallback);
-    store->SetUid(HALSIM_RegisterAnalogInVoltageCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetVoltage() const { return HALSIM_GetAnalogInVoltage(m_index); }
-
-  void SetVoltage(double voltage) {
-    HALSIM_SetAnalogInVoltage(m_index, voltage);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterAccumulatorInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback,
-        &HALSIM_CancelAnalogInAccumulatorInitializedCallback);
-    store->SetUid(HALSIM_RegisterAnalogInAccumulatorInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetAccumulatorInitialized() const {
-    return HALSIM_GetAnalogInAccumulatorInitialized(m_index);
-  }
-
-  void SetAccumulatorInitialized(bool accumulatorInitialized) {
-    HALSIM_SetAnalogInAccumulatorInitialized(m_index, accumulatorInitialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterAccumulatorValueCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogInAccumulatorValueCallback);
-    store->SetUid(HALSIM_RegisterAnalogInAccumulatorValueCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int64_t GetAccumulatorValue() const {
-    return HALSIM_GetAnalogInAccumulatorValue(m_index);
-  }
-
-  void SetAccumulatorValue(int64_t accumulatorValue) {
-    HALSIM_SetAnalogInAccumulatorValue(m_index, accumulatorValue);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterAccumulatorCountCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogInAccumulatorCountCallback);
-    store->SetUid(HALSIM_RegisterAnalogInAccumulatorCountCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int64_t GetAccumulatorCount() const {
-    return HALSIM_GetAnalogInAccumulatorCount(m_index);
-  }
-
-  void SetAccumulatorCount(int64_t accumulatorCount) {
-    HALSIM_SetAnalogInAccumulatorCount(m_index, accumulatorCount);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterAccumulatorCenterCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogInAccumulatorCenterCallback);
-    store->SetUid(HALSIM_RegisterAnalogInAccumulatorCenterCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetAccumulatorCenter() const {
-    return HALSIM_GetAnalogInAccumulatorCenter(m_index);
-  }
-
-  void SetAccumulatorCenter(int accumulatorCenter) {
-    HALSIM_SetAnalogInAccumulatorCenter(m_index, accumulatorCenter);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterAccumulatorDeadbandCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback,
-        &HALSIM_CancelAnalogInAccumulatorDeadbandCallback);
-    store->SetUid(HALSIM_RegisterAnalogInAccumulatorDeadbandCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetAccumulatorDeadband() const {
-    return HALSIM_GetAnalogInAccumulatorDeadband(m_index);
-  }
-
-  void SetAccumulatorDeadband(int accumulatorDeadband) {
-    HALSIM_SetAnalogInAccumulatorDeadband(m_index, accumulatorDeadband);
-  }
-
-  void ResetData() { HALSIM_ResetAnalogInData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/AnalogOutSim.h b/hal/src/main/native/include/simulation/AnalogOutSim.h
deleted file mode 100644
index 6bb6e5a..0000000
--- a/hal/src/main/native/include/simulation/AnalogOutSim.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/AnalogOutData.h"
-
-namespace frc {
-namespace sim {
-class AnalogOutSim {
- public:
-  explicit AnalogOutSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterVoltageCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogOutVoltageCallback);
-    store->SetUid(HALSIM_RegisterAnalogOutVoltageCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetVoltage() const { return HALSIM_GetAnalogOutVoltage(m_index); }
-
-  void SetVoltage(double voltage) {
-    HALSIM_SetAnalogOutVoltage(m_index, voltage);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogOutInitializedCallback);
-    store->SetUid(HALSIM_RegisterAnalogOutInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const {
-    return HALSIM_GetAnalogOutInitialized(m_index);
-  }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetAnalogOutInitialized(m_index, initialized);
-  }
-
-  void ResetData() { HALSIM_ResetAnalogOutData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/AnalogTriggerSim.h b/hal/src/main/native/include/simulation/AnalogTriggerSim.h
deleted file mode 100644
index 2c41be1..0000000
--- a/hal/src/main/native/include/simulation/AnalogTriggerSim.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/AnalogTriggerData.h"
-
-namespace frc {
-namespace sim {
-class AnalogTriggerSim {
- public:
-  explicit AnalogTriggerSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelAnalogTriggerInitializedCallback);
-    store->SetUid(HALSIM_RegisterAnalogTriggerInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const {
-    return HALSIM_GetAnalogTriggerInitialized(m_index);
-  }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetAnalogTriggerInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterTriggerLowerBoundCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback,
-        &HALSIM_CancelAnalogTriggerTriggerLowerBoundCallback);
-    store->SetUid(HALSIM_RegisterAnalogTriggerTriggerLowerBoundCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetTriggerLowerBound() const {
-    return HALSIM_GetAnalogTriggerTriggerLowerBound(m_index);
-  }
-
-  void SetTriggerLowerBound(double triggerLowerBound) {
-    HALSIM_SetAnalogTriggerTriggerLowerBound(m_index, triggerLowerBound);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterTriggerUpperBoundCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback,
-        &HALSIM_CancelAnalogTriggerTriggerUpperBoundCallback);
-    store->SetUid(HALSIM_RegisterAnalogTriggerTriggerUpperBoundCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetTriggerUpperBound() const {
-    return HALSIM_GetAnalogTriggerTriggerUpperBound(m_index);
-  }
-
-  void SetTriggerUpperBound(double triggerUpperBound) {
-    HALSIM_SetAnalogTriggerTriggerUpperBound(m_index, triggerUpperBound);
-  }
-
-  void ResetData() { HALSIM_ResetAnalogTriggerData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/CallbackStore.h b/hal/src/main/native/include/simulation/CallbackStore.h
deleted file mode 100644
index b2d4bdf..0000000
--- a/hal/src/main/native/include/simulation/CallbackStore.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <functional>
-
-#include <wpi/StringRef.h>
-
-#include "hal/Value.h"
-
-namespace frc {
-namespace sim {
-
-using NotifyCallback = std::function<void(wpi::StringRef, const HAL_Value*)>;
-typedef void (*CancelCallbackFunc)(int32_t index, int32_t uid);
-typedef void (*CancelCallbackNoIndexFunc)(int32_t uid);
-typedef void (*CancelCallbackChannelFunc)(int32_t index, int32_t channel,
-                                          int32_t uid);
-
-void CallbackStoreThunk(const char* name, void* param, const HAL_Value* value);
-
-class CallbackStore {
- public:
-  CallbackStore(int32_t i, NotifyCallback cb, CancelCallbackNoIndexFunc ccf) {
-    index = i;
-    callback = cb;
-    this->ccnif = ccf;
-    cancelType = NoIndex;
-  }
-
-  CallbackStore(int32_t i, int32_t u, NotifyCallback cb,
-                CancelCallbackFunc ccf) {
-    index = i;
-    uid = u;
-    callback = cb;
-    this->ccf = ccf;
-    cancelType = Normal;
-  }
-
-  CallbackStore(int32_t i, int32_t c, int32_t u, NotifyCallback cb,
-                CancelCallbackChannelFunc ccf) {
-    index = i;
-    channel = c;
-    uid = u;
-    callback = cb;
-    this->cccf = ccf;
-    cancelType = Channel;
-  }
-
-  ~CallbackStore() {
-    switch (cancelType) {
-      case Normal:
-        ccf(index, uid);
-        break;
-      case Channel:
-        cccf(index, channel, uid);
-        break;
-      case NoIndex:
-        ccnif(uid);
-        break;
-    }
-  }
-
-  void SetUid(int32_t uid) { this->uid = uid; }
-
-  friend void CallbackStoreThunk(const char* name, void* param,
-                                 const HAL_Value* value);
-
- private:
-  int32_t index;
-  int32_t channel;
-  int32_t uid;
-
-  NotifyCallback callback;
-  union {
-    CancelCallbackFunc ccf;
-    CancelCallbackChannelFunc cccf;
-    CancelCallbackNoIndexFunc ccnif;
-  };
-  enum CancelType { Normal, Channel, NoIndex };
-  CancelType cancelType;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/DIOSim.h b/hal/src/main/native/include/simulation/DIOSim.h
deleted file mode 100644
index 57079b9..0000000
--- a/hal/src/main/native/include/simulation/DIOSim.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/DIOData.h"
-
-namespace frc {
-namespace sim {
-class DIOSim {
- public:
-  explicit DIOSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDIOInitializedCallback);
-    store->SetUid(HALSIM_RegisterDIOInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const { return HALSIM_GetDIOInitialized(m_index); }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetDIOInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterValueCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDIOValueCallback);
-    store->SetUid(HALSIM_RegisterDIOValueCallback(m_index, &CallbackStoreThunk,
-                                                  store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetValue() const { return HALSIM_GetDIOValue(m_index); }
-
-  void SetValue(bool value) { HALSIM_SetDIOValue(m_index, value); }
-
-  std::unique_ptr<CallbackStore> RegisterPulseLengthCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDIOPulseLengthCallback);
-    store->SetUid(HALSIM_RegisterDIOPulseLengthCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetPulseLength() const { return HALSIM_GetDIOPulseLength(m_index); }
-
-  void SetPulseLength(double pulseLength) {
-    HALSIM_SetDIOPulseLength(m_index, pulseLength);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterIsInputCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDIOIsInputCallback);
-    store->SetUid(HALSIM_RegisterDIOIsInputCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetIsInput() const { return HALSIM_GetDIOIsInput(m_index); }
-
-  void SetIsInput(bool isInput) { HALSIM_SetDIOIsInput(m_index, isInput); }
-
-  std::unique_ptr<CallbackStore> RegisterFilterIndexCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDIOFilterIndexCallback);
-    store->SetUid(HALSIM_RegisterDIOFilterIndexCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetFilterIndex() const { return HALSIM_GetDIOFilterIndex(m_index); }
-
-  void SetFilterIndex(int filterIndex) {
-    HALSIM_SetDIOFilterIndex(m_index, filterIndex);
-  }
-
-  void ResetData() { HALSIM_ResetDIOData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/DigitalPWMSim.h b/hal/src/main/native/include/simulation/DigitalPWMSim.h
deleted file mode 100644
index 5f5769d..0000000
--- a/hal/src/main/native/include/simulation/DigitalPWMSim.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/DigitalPWMData.h"
-
-namespace frc {
-namespace sim {
-class DigitalPWMSim {
- public:
-  explicit DigitalPWMSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDigitalPWMInitializedCallback);
-    store->SetUid(HALSIM_RegisterDigitalPWMInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const {
-    return HALSIM_GetDigitalPWMInitialized(m_index);
-  }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetDigitalPWMInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterDutyCycleCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDigitalPWMDutyCycleCallback);
-    store->SetUid(HALSIM_RegisterDigitalPWMDutyCycleCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetDutyCycle() const { return HALSIM_GetDigitalPWMDutyCycle(m_index); }
-
-  void SetDutyCycle(double dutyCycle) {
-    HALSIM_SetDigitalPWMDutyCycle(m_index, dutyCycle);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterPinCallback(NotifyCallback callback,
-                                                     bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDigitalPWMPinCallback);
-    store->SetUid(HALSIM_RegisterDigitalPWMPinCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetPin() const { return HALSIM_GetDigitalPWMPin(m_index); }
-
-  void SetPin(int pin) { HALSIM_SetDigitalPWMPin(m_index, pin); }
-
-  void ResetData() { HALSIM_ResetDigitalPWMData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/DriverStationSim.h b/hal/src/main/native/include/simulation/DriverStationSim.h
deleted file mode 100644
index e5071cc..0000000
--- a/hal/src/main/native/include/simulation/DriverStationSim.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/DriverStationData.h"
-
-namespace frc {
-namespace sim {
-class DriverStationSim {
- public:
-  std::unique_ptr<CallbackStore> RegisterEnabledCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        -1, callback, &HALSIM_CancelDriverStationEnabledCallback);
-    store->SetUid(HALSIM_RegisterDriverStationEnabledCallback(
-        &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetEnabled() const { return HALSIM_GetDriverStationEnabled(); }
-
-  void SetEnabled(bool enabled) { HALSIM_SetDriverStationEnabled(enabled); }
-
-  std::unique_ptr<CallbackStore> RegisterAutonomousCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        -1, callback, &HALSIM_CancelDriverStationAutonomousCallback);
-    store->SetUid(HALSIM_RegisterDriverStationAutonomousCallback(
-        &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetAutonomous() const { return HALSIM_GetDriverStationAutonomous(); }
-
-  void SetAutonomous(bool autonomous) {
-    HALSIM_SetDriverStationAutonomous(autonomous);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterTestCallback(NotifyCallback callback,
-                                                      bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        -1, callback, &HALSIM_CancelDriverStationTestCallback);
-    store->SetUid(HALSIM_RegisterDriverStationTestCallback(
-        &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetTest() const { return HALSIM_GetDriverStationTest(); }
-
-  void SetTest(bool test) { HALSIM_SetDriverStationTest(test); }
-
-  std::unique_ptr<CallbackStore> RegisterEStopCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        -1, callback, &HALSIM_CancelDriverStationEStopCallback);
-    store->SetUid(HALSIM_RegisterDriverStationEStopCallback(
-        &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetEStop() const { return HALSIM_GetDriverStationEStop(); }
-
-  void SetEStop(bool eStop) { HALSIM_SetDriverStationEStop(eStop); }
-
-  std::unique_ptr<CallbackStore> RegisterFmsAttachedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        -1, callback, &HALSIM_CancelDriverStationFmsAttachedCallback);
-    store->SetUid(HALSIM_RegisterDriverStationFmsAttachedCallback(
-        &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetFmsAttached() const { return HALSIM_GetDriverStationFmsAttached(); }
-
-  void SetFmsAttached(bool fmsAttached) {
-    HALSIM_SetDriverStationFmsAttached(fmsAttached);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterDsAttachedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        -1, callback, &HALSIM_CancelDriverStationDsAttachedCallback);
-    store->SetUid(HALSIM_RegisterDriverStationDsAttachedCallback(
-        &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetDsAttached() const { return HALSIM_GetDriverStationDsAttached(); }
-
-  void SetDsAttached(bool dsAttached) {
-    HALSIM_SetDriverStationDsAttached(dsAttached);
-  }
-
-  void NotifyNewData() { HALSIM_NotifyDriverStationNewData(); }
-
-  void ResetData() { HALSIM_ResetDriverStationData(); }
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/DutyCycleSim.h b/hal/src/main/native/include/simulation/DutyCycleSim.h
deleted file mode 100644
index f55dfc9..0000000
--- a/hal/src/main/native/include/simulation/DutyCycleSim.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/DutyCycleData.h"
-
-namespace frc {
-namespace sim {
-class DutyCycleSim {
- public:
-  explicit DutyCycleSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDutyCycleInitializedCallback);
-    store->SetUid(HALSIM_RegisterDutyCycleInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const {
-    return HALSIM_GetDutyCycleInitialized(m_index);
-  }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetDutyCycleInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterFrequencyCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDutyCycleFrequencyCallback);
-    store->SetUid(HALSIM_RegisterDutyCycleFrequencyCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetFrequency() const { return HALSIM_GetDutyCycleFrequency(m_index); }
-
-  void SetFrequency(int count) { HALSIM_SetDutyCycleFrequency(m_index, count); }
-
-  std::unique_ptr<CallbackStore> RegisterOutputCallback(NotifyCallback callback,
-                                                        bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelDutyCycleOutputCallback);
-    store->SetUid(HALSIM_RegisterDutyCycleOutputCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetOutput() const { return HALSIM_GetDutyCycleOutput(m_index); }
-
-  void SetOutput(double period) { HALSIM_SetDutyCycleOutput(m_index, period); }
-
-  void ResetData() { HALSIM_ResetDutyCycleData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/EncoderSim.h b/hal/src/main/native/include/simulation/EncoderSim.h
deleted file mode 100644
index f80e8a8..0000000
--- a/hal/src/main/native/include/simulation/EncoderSim.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/EncoderData.h"
-
-namespace frc {
-namespace sim {
-class EncoderSim {
- public:
-  explicit EncoderSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderInitializedCallback);
-    store->SetUid(HALSIM_RegisterEncoderInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const { return HALSIM_GetEncoderInitialized(m_index); }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetEncoderInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterCountCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderCountCallback);
-    store->SetUid(HALSIM_RegisterEncoderCountCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetCount() const { return HALSIM_GetEncoderCount(m_index); }
-
-  void SetCount(int count) { HALSIM_SetEncoderCount(m_index, count); }
-
-  std::unique_ptr<CallbackStore> RegisterPeriodCallback(NotifyCallback callback,
-                                                        bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderPeriodCallback);
-    store->SetUid(HALSIM_RegisterEncoderPeriodCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetPeriod() const { return HALSIM_GetEncoderPeriod(m_index); }
-
-  void SetPeriod(double period) { HALSIM_SetEncoderPeriod(m_index, period); }
-
-  std::unique_ptr<CallbackStore> RegisterResetCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderResetCallback);
-    store->SetUid(HALSIM_RegisterEncoderResetCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetReset() const { return HALSIM_GetEncoderReset(m_index); }
-
-  void SetReset(bool reset) { HALSIM_SetEncoderReset(m_index, reset); }
-
-  std::unique_ptr<CallbackStore> RegisterMaxPeriodCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderMaxPeriodCallback);
-    store->SetUid(HALSIM_RegisterEncoderMaxPeriodCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetMaxPeriod() const { return HALSIM_GetEncoderMaxPeriod(m_index); }
-
-  void SetMaxPeriod(double maxPeriod) {
-    HALSIM_SetEncoderMaxPeriod(m_index, maxPeriod);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterDirectionCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderDirectionCallback);
-    store->SetUid(HALSIM_RegisterEncoderDirectionCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetDirection() const { return HALSIM_GetEncoderDirection(m_index); }
-
-  void SetDirection(bool direction) {
-    HALSIM_SetEncoderDirection(m_index, direction);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterReverseDirectionCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderReverseDirectionCallback);
-    store->SetUid(HALSIM_RegisterEncoderReverseDirectionCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetReverseDirection() const {
-    return HALSIM_GetEncoderReverseDirection(m_index);
-  }
-
-  void SetReverseDirection(bool reverseDirection) {
-    HALSIM_SetEncoderReverseDirection(m_index, reverseDirection);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterSamplesToAverageCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderSamplesToAverageCallback);
-    store->SetUid(HALSIM_RegisterEncoderSamplesToAverageCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetSamplesToAverage() const {
-    return HALSIM_GetEncoderSamplesToAverage(m_index);
-  }
-
-  void SetSamplesToAverage(int samplesToAverage) {
-    HALSIM_SetEncoderSamplesToAverage(m_index, samplesToAverage);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterDistancePerPulseCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelEncoderDistancePerPulseCallback);
-    store->SetUid(HALSIM_RegisterEncoderDistancePerPulseCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetDistancePerPulse() const {
-    return HALSIM_GetEncoderDistancePerPulse(m_index);
-  }
-
-  void SetDistancePerPulse(double distancePerPulse) {
-    HALSIM_SetEncoderDistancePerPulse(m_index, distancePerPulse);
-  }
-
-  void ResetData() { HALSIM_ResetEncoderData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/PCMSim.h b/hal/src/main/native/include/simulation/PCMSim.h
deleted file mode 100644
index b6fcd5a..0000000
--- a/hal/src/main/native/include/simulation/PCMSim.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/PCMData.h"
-
-namespace frc {
-namespace sim {
-class PCMSim {
- public:
-  explicit PCMSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterSolenoidInitializedCallback(
-      int channel, NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, channel, -1, callback,
-        &HALSIM_CancelPCMSolenoidInitializedCallback);
-    store->SetUid(HALSIM_RegisterPCMSolenoidInitializedCallback(
-        m_index, channel, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetSolenoidInitialized(int channel) const {
-    return HALSIM_GetPCMSolenoidInitialized(m_index, channel);
-  }
-
-  void SetSolenoidInitialized(int channel, bool solenoidInitialized) {
-    HALSIM_SetPCMSolenoidInitialized(m_index, channel, solenoidInitialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterSolenoidOutputCallback(
-      int channel, NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, channel, -1, callback,
-        &HALSIM_CancelPCMSolenoidOutputCallback);
-    store->SetUid(HALSIM_RegisterPCMSolenoidOutputCallback(
-        m_index, channel, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetSolenoidOutput(int channel) const {
-    return HALSIM_GetPCMSolenoidOutput(m_index, channel);
-  }
-
-  void SetSolenoidOutput(int channel, bool solenoidOutput) {
-    HALSIM_SetPCMSolenoidOutput(m_index, channel, solenoidOutput);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterCompressorInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPCMCompressorInitializedCallback);
-    store->SetUid(HALSIM_RegisterPCMCompressorInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetCompressorInitialized() const {
-    return HALSIM_GetPCMCompressorInitialized(m_index);
-  }
-
-  void SetCompressorInitialized(bool compressorInitialized) {
-    HALSIM_SetPCMCompressorInitialized(m_index, compressorInitialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterCompressorOnCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPCMCompressorOnCallback);
-    store->SetUid(HALSIM_RegisterPCMCompressorOnCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetCompressorOn() const { return HALSIM_GetPCMCompressorOn(m_index); }
-
-  void SetCompressorOn(bool compressorOn) {
-    HALSIM_SetPCMCompressorOn(m_index, compressorOn);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterClosedLoopEnabledCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPCMClosedLoopEnabledCallback);
-    store->SetUid(HALSIM_RegisterPCMClosedLoopEnabledCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetClosedLoopEnabled() const {
-    return HALSIM_GetPCMClosedLoopEnabled(m_index);
-  }
-
-  void SetClosedLoopEnabled(bool closedLoopEnabled) {
-    HALSIM_SetPCMClosedLoopEnabled(m_index, closedLoopEnabled);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterPressureSwitchCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPCMPressureSwitchCallback);
-    store->SetUid(HALSIM_RegisterPCMPressureSwitchCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetPressureSwitch() const {
-    return HALSIM_GetPCMPressureSwitch(m_index);
-  }
-
-  void SetPressureSwitch(bool pressureSwitch) {
-    HALSIM_SetPCMPressureSwitch(m_index, pressureSwitch);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterCompressorCurrentCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPCMCompressorCurrentCallback);
-    store->SetUid(HALSIM_RegisterPCMCompressorCurrentCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetCompressorCurrent() const {
-    return HALSIM_GetPCMCompressorCurrent(m_index);
-  }
-
-  void SetCompressorCurrent(double compressorCurrent) {
-    HALSIM_SetPCMCompressorCurrent(m_index, compressorCurrent);
-  }
-
-  uint8_t GetAllSolenoidOutputs() {
-    uint8_t ret = 0;
-    HALSIM_GetPCMAllSolenoids(m_index, &ret);
-    return ret;
-  }
-
-  void SetAllSolenoidOutputs(uint8_t outputs) {
-    HALSIM_SetPCMAllSolenoids(m_index, outputs);
-  }
-
-  void ResetData() { HALSIM_ResetPCMData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/PDPSim.h b/hal/src/main/native/include/simulation/PDPSim.h
deleted file mode 100644
index 72d8233..0000000
--- a/hal/src/main/native/include/simulation/PDPSim.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/PDPData.h"
-
-namespace frc {
-namespace sim {
-class PDPSim {
- public:
-  explicit PDPSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPDPInitializedCallback);
-    store->SetUid(HALSIM_RegisterPDPInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const { return HALSIM_GetPDPInitialized(m_index); }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetPDPInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterTemperatureCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPDPTemperatureCallback);
-    store->SetUid(HALSIM_RegisterPDPTemperatureCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetTemperature() const { return HALSIM_GetPDPTemperature(m_index); }
-
-  void SetTemperature(double temperature) {
-    HALSIM_SetPDPTemperature(m_index, temperature);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterVoltageCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPDPVoltageCallback);
-    store->SetUid(HALSIM_RegisterPDPVoltageCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetVoltage() const { return HALSIM_GetPDPVoltage(m_index); }
-
-  void SetVoltage(double voltage) { HALSIM_SetPDPVoltage(m_index, voltage); }
-
-  std::unique_ptr<CallbackStore> RegisterCurrentCallback(
-      int channel, NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, channel, -1, callback, &HALSIM_CancelPDPCurrentCallback);
-    store->SetUid(HALSIM_RegisterPDPCurrentCallback(
-        m_index, channel, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetCurrent(int channel) const {
-    return HALSIM_GetPDPCurrent(m_index, channel);
-  }
-
-  void SetCurrent(int channel, double current) {
-    HALSIM_SetPDPCurrent(m_index, channel, current);
-  }
-
-  void GetAllCurrents(double* currents) {
-    HALSIM_GetPDPAllCurrents(m_index, currents);
-  }
-
-  void SetAllCurrents(const double* currents) {
-    HALSIM_SetPDPAllCurrents(m_index, currents);
-  }
-
-  void ResetData() { HALSIM_ResetPDPData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/PWMSim.h b/hal/src/main/native/include/simulation/PWMSim.h
deleted file mode 100644
index 7aba360..0000000
--- a/hal/src/main/native/include/simulation/PWMSim.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/PWMData.h"
-
-namespace frc {
-namespace sim {
-class PWMSim {
- public:
-  explicit PWMSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPWMInitializedCallback);
-    store->SetUid(HALSIM_RegisterPWMInitializedCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitialized() const { return HALSIM_GetPWMInitialized(m_index); }
-
-  void SetInitialized(bool initialized) {
-    HALSIM_SetPWMInitialized(m_index, initialized);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterRawValueCallback(
-      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));
-    return store;
-  }
-
-  int GetRawValue() const { return HALSIM_GetPWMRawValue(m_index); }
-
-  void SetRawValue(int rawValue) { HALSIM_SetPWMRawValue(m_index, rawValue); }
-
-  std::unique_ptr<CallbackStore> RegisterSpeedCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPWMSpeedCallback);
-    store->SetUid(HALSIM_RegisterPWMSpeedCallback(m_index, &CallbackStoreThunk,
-                                                  store.get(), initialNotify));
-    return store;
-  }
-
-  double GetSpeed() const { return HALSIM_GetPWMSpeed(m_index); }
-
-  void SetSpeed(double speed) { HALSIM_SetPWMSpeed(m_index, speed); }
-
-  std::unique_ptr<CallbackStore> RegisterPositionCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPWMPositionCallback);
-    store->SetUid(HALSIM_RegisterPWMPositionCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetPosition() const { return HALSIM_GetPWMPosition(m_index); }
-
-  void SetPosition(double position) {
-    HALSIM_SetPWMPosition(m_index, position);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterPeriodScaleCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPWMPeriodScaleCallback);
-    store->SetUid(HALSIM_RegisterPWMPeriodScaleCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetPeriodScale() const { return HALSIM_GetPWMPeriodScale(m_index); }
-
-  void SetPeriodScale(int periodScale) {
-    HALSIM_SetPWMPeriodScale(m_index, periodScale);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterZeroLatchCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelPWMZeroLatchCallback);
-    store->SetUid(HALSIM_RegisterPWMZeroLatchCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetZeroLatch() const { return HALSIM_GetPWMZeroLatch(m_index); }
-
-  void SetZeroLatch(bool zeroLatch) {
-    HALSIM_SetPWMZeroLatch(m_index, zeroLatch);
-  }
-
-  void ResetData() { HALSIM_ResetPWMData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/RelaySim.h b/hal/src/main/native/include/simulation/RelaySim.h
deleted file mode 100644
index 6958a40..0000000
--- a/hal/src/main/native/include/simulation/RelaySim.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/RelayData.h"
-
-namespace frc {
-namespace sim {
-class RelaySim {
- public:
-  explicit RelaySim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedForwardCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRelayInitializedForwardCallback);
-    store->SetUid(HALSIM_RegisterRelayInitializedForwardCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitializedForward() const {
-    return HALSIM_GetRelayInitializedForward(m_index);
-  }
-
-  void SetInitializedForward(bool initializedForward) {
-    HALSIM_SetRelayInitializedForward(m_index, initializedForward);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterInitializedReverseCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRelayInitializedReverseCallback);
-    store->SetUid(HALSIM_RegisterRelayInitializedReverseCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetInitializedReverse() const {
-    return HALSIM_GetRelayInitializedReverse(m_index);
-  }
-
-  void SetInitializedReverse(bool initializedReverse) {
-    HALSIM_SetRelayInitializedReverse(m_index, initializedReverse);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterForwardCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRelayForwardCallback);
-    store->SetUid(HALSIM_RegisterRelayForwardCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetForward() const { return HALSIM_GetRelayForward(m_index); }
-
-  void SetForward(bool forward) { HALSIM_SetRelayForward(m_index, forward); }
-
-  std::unique_ptr<CallbackStore> RegisterReverseCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRelayReverseCallback);
-    store->SetUid(HALSIM_RegisterRelayReverseCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetReverse() const { return HALSIM_GetRelayReverse(m_index); }
-
-  void SetReverse(bool reverse) { HALSIM_SetRelayReverse(m_index, reverse); }
-
-  void ResetData() { HALSIM_ResetRelayData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/RoboRioSim.h b/hal/src/main/native/include/simulation/RoboRioSim.h
deleted file mode 100644
index 9b020ae..0000000
--- a/hal/src/main/native/include/simulation/RoboRioSim.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/RoboRioData.h"
-
-namespace frc {
-namespace sim {
-class RoboRioSim {
- public:
-  explicit RoboRioSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterFPGAButtonCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioFPGAButtonCallback);
-    store->SetUid(HALSIM_RegisterRoboRioFPGAButtonCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetFPGAButton() const { return HALSIM_GetRoboRioFPGAButton(m_index); }
-
-  void SetFPGAButton(bool fPGAButton) {
-    HALSIM_SetRoboRioFPGAButton(m_index, fPGAButton);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterVInVoltageCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioVInVoltageCallback);
-    store->SetUid(HALSIM_RegisterRoboRioVInVoltageCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetVInVoltage() const { return HALSIM_GetRoboRioVInVoltage(m_index); }
-
-  void SetVInVoltage(double vInVoltage) {
-    HALSIM_SetRoboRioVInVoltage(m_index, vInVoltage);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterVInCurrentCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioVInCurrentCallback);
-    store->SetUid(HALSIM_RegisterRoboRioVInCurrentCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetVInCurrent() const { return HALSIM_GetRoboRioVInCurrent(m_index); }
-
-  void SetVInCurrent(double vInCurrent) {
-    HALSIM_SetRoboRioVInCurrent(m_index, vInCurrent);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserVoltage6VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserVoltage6VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserVoltage6VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetUserVoltage6V() const {
-    return HALSIM_GetRoboRioUserVoltage6V(m_index);
-  }
-
-  void SetUserVoltage6V(double userVoltage6V) {
-    HALSIM_SetRoboRioUserVoltage6V(m_index, userVoltage6V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserCurrent6VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserCurrent6VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserCurrent6VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetUserCurrent6V() const {
-    return HALSIM_GetRoboRioUserCurrent6V(m_index);
-  }
-
-  void SetUserCurrent6V(double userCurrent6V) {
-    HALSIM_SetRoboRioUserCurrent6V(m_index, userCurrent6V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserActive6VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserActive6VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserActive6VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetUserActive6V() const {
-    return HALSIM_GetRoboRioUserActive6V(m_index);
-  }
-
-  void SetUserActive6V(bool userActive6V) {
-    HALSIM_SetRoboRioUserActive6V(m_index, userActive6V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserVoltage5VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserVoltage5VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserVoltage5VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetUserVoltage5V() const {
-    return HALSIM_GetRoboRioUserVoltage5V(m_index);
-  }
-
-  void SetUserVoltage5V(double userVoltage5V) {
-    HALSIM_SetRoboRioUserVoltage5V(m_index, userVoltage5V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserCurrent5VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserCurrent5VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserCurrent5VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetUserCurrent5V() const {
-    return HALSIM_GetRoboRioUserCurrent5V(m_index);
-  }
-
-  void SetUserCurrent5V(double userCurrent5V) {
-    HALSIM_SetRoboRioUserCurrent5V(m_index, userCurrent5V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserActive5VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserActive5VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserActive5VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetUserActive5V() const {
-    return HALSIM_GetRoboRioUserActive5V(m_index);
-  }
-
-  void SetUserActive5V(bool userActive5V) {
-    HALSIM_SetRoboRioUserActive5V(m_index, userActive5V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserVoltage3V3Callback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserVoltage3V3Callback);
-    store->SetUid(HALSIM_RegisterRoboRioUserVoltage3V3Callback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetUserVoltage3V3() const {
-    return HALSIM_GetRoboRioUserVoltage3V3(m_index);
-  }
-
-  void SetUserVoltage3V3(double userVoltage3V3) {
-    HALSIM_SetRoboRioUserVoltage3V3(m_index, userVoltage3V3);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserCurrent3V3Callback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserCurrent3V3Callback);
-    store->SetUid(HALSIM_RegisterRoboRioUserCurrent3V3Callback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetUserCurrent3V3() const {
-    return HALSIM_GetRoboRioUserCurrent3V3(m_index);
-  }
-
-  void SetUserCurrent3V3(double userCurrent3V3) {
-    HALSIM_SetRoboRioUserCurrent3V3(m_index, userCurrent3V3);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserActive3V3Callback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserActive3V3Callback);
-    store->SetUid(HALSIM_RegisterRoboRioUserActive3V3Callback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetUserActive3V3() const {
-    return HALSIM_GetRoboRioUserActive3V3(m_index);
-  }
-
-  void SetUserActive3V3(bool userActive3V3) {
-    HALSIM_SetRoboRioUserActive3V3(m_index, userActive3V3);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserFaults6VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserFaults6VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserFaults6VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetUserFaults6V() const { return HALSIM_GetRoboRioUserFaults6V(m_index); }
-
-  void SetUserFaults6V(int userFaults6V) {
-    HALSIM_SetRoboRioUserFaults6V(m_index, userFaults6V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserFaults5VCallback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserFaults5VCallback);
-    store->SetUid(HALSIM_RegisterRoboRioUserFaults5VCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetUserFaults5V() const { return HALSIM_GetRoboRioUserFaults5V(m_index); }
-
-  void SetUserFaults5V(int userFaults5V) {
-    HALSIM_SetRoboRioUserFaults5V(m_index, userFaults5V);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterUserFaults3V3Callback(
-      NotifyCallback callback, bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelRoboRioUserFaults3V3Callback);
-    store->SetUid(HALSIM_RegisterRoboRioUserFaults3V3Callback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetUserFaults3V3() const {
-    return HALSIM_GetRoboRioUserFaults3V3(m_index);
-  }
-
-  void SetUserFaults3V3(int userFaults3V3) {
-    HALSIM_SetRoboRioUserFaults3V3(m_index, userFaults3V3);
-  }
-
-  void ResetData() { HALSIM_ResetRoboRioData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/SPIAccelerometerSim.h b/hal/src/main/native/include/simulation/SPIAccelerometerSim.h
deleted file mode 100644
index d7795ee..0000000
--- a/hal/src/main/native/include/simulation/SPIAccelerometerSim.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <memory>
-#include <utility>
-
-#include "CallbackStore.h"
-#include "mockdata/SPIAccelerometerData.h"
-
-namespace frc {
-namespace sim {
-class SPIAccelerometerSim {
- public:
-  explicit SPIAccelerometerSim(int index) { m_index = index; }
-
-  std::unique_ptr<CallbackStore> RegisterActiveCallback(NotifyCallback callback,
-                                                        bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelSPIAccelerometerActiveCallback);
-    store->SetUid(HALSIM_RegisterSPIAccelerometerActiveCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  bool GetActive() const { return HALSIM_GetSPIAccelerometerActive(m_index); }
-
-  void SetActive(bool active) {
-    HALSIM_SetSPIAccelerometerActive(m_index, active);
-  }
-
-  std::unique_ptr<CallbackStore> RegisterRangeCallback(NotifyCallback callback,
-                                                       bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelSPIAccelerometerRangeCallback);
-    store->SetUid(HALSIM_RegisterSPIAccelerometerRangeCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  int GetRange() const { return HALSIM_GetSPIAccelerometerRange(m_index); }
-
-  void SetRange(int range) { HALSIM_SetSPIAccelerometerRange(m_index, range); }
-
-  std::unique_ptr<CallbackStore> RegisterXCallback(NotifyCallback callback,
-                                                   bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelSPIAccelerometerXCallback);
-    store->SetUid(HALSIM_RegisterSPIAccelerometerXCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetX() const { return HALSIM_GetSPIAccelerometerX(m_index); }
-
-  void SetX(double x) { HALSIM_SetSPIAccelerometerX(m_index, x); }
-
-  std::unique_ptr<CallbackStore> RegisterYCallback(NotifyCallback callback,
-                                                   bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelSPIAccelerometerYCallback);
-    store->SetUid(HALSIM_RegisterSPIAccelerometerYCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetY() const { return HALSIM_GetSPIAccelerometerY(m_index); }
-
-  void SetY(double y) { HALSIM_SetSPIAccelerometerY(m_index, y); }
-
-  std::unique_ptr<CallbackStore> RegisterZCallback(NotifyCallback callback,
-                                                   bool initialNotify) {
-    auto store = std::make_unique<CallbackStore>(
-        m_index, -1, callback, &HALSIM_CancelSPIAccelerometerZCallback);
-    store->SetUid(HALSIM_RegisterSPIAccelerometerZCallback(
-        m_index, &CallbackStoreThunk, store.get(), initialNotify));
-    return store;
-  }
-
-  double GetZ() const { return HALSIM_GetSPIAccelerometerZ(m_index); }
-
-  void SetZ(double z) { HALSIM_SetSPIAccelerometerZ(m_index, z); }
-
-  void ResetData() { HALSIM_ResetSPIAccelerometerData(m_index); }
-
- private:
-  int m_index;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/SimDeviceSim.h b/hal/src/main/native/include/simulation/SimDeviceSim.h
deleted file mode 100644
index 5705a08..0000000
--- a/hal/src/main/native/include/simulation/SimDeviceSim.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include <functional>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "CallbackStore.h"
-#include "hal/SimDevice.h"
-#include "mockdata/SimDeviceData.h"
-
-namespace frc {
-namespace sim {
-class SimDeviceSim {
- public:
-  explicit SimDeviceSim(const char* name)
-      : m_handle{HALSIM_GetSimDeviceHandle(name)} {}
-
-  hal::SimValue GetValue(const char* name) const {
-    return HALSIM_GetSimValueHandle(m_handle, name);
-  }
-
-  hal::SimDouble GetDouble(const char* name) const {
-    return HALSIM_GetSimValueHandle(m_handle, name);
-  }
-
-  hal::SimEnum GetEnum(const char* name) const {
-    return HALSIM_GetSimValueHandle(m_handle, name);
-  }
-
-  hal::SimBoolean GetBoolean(const char* name) const {
-    return HALSIM_GetSimValueHandle(m_handle, name);
-  }
-
-  static std::vector<std::string> GetEnumOptions(hal::SimEnum val) {
-    int32_t numOptions;
-    const char** options = HALSIM_GetSimValueEnumOptions(val, &numOptions);
-    std::vector<std::string> rv;
-    rv.reserve(numOptions);
-    for (int32_t i = 0; i < numOptions; ++i) rv.emplace_back(options[i]);
-    return rv;
-  }
-
-  template <typename F>
-  void EnumerateValues(F callback) const {
-    return HALSIM_EnumerateSimValues(
-        m_handle, &callback,
-        [](const char* name, void* param, HAL_SimValueHandle handle,
-           HAL_Bool readonly, const struct HAL_Value* value) {
-          std::invoke(*static_cast<F*>(param), name, handle, readonly, value);
-        });
-  }
-
-  operator HAL_SimDeviceHandle() const { return m_handle; }
-
-  template <typename F>
-  static void EnumerateDevices(const char* prefix, F callback) {
-    return HALSIM_EnumerateSimDevices(
-        prefix, &callback,
-        [](const char* name, void* param, HAL_SimDeviceHandle handle) {
-          std::invoke(*static_cast<F*>(param), name, handle);
-        });
-  }
-
-  static void ResetData() { HALSIM_ResetSimDeviceData(); }
-
- private:
-  HAL_SimDeviceHandle m_handle;
-};
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/include/simulation/SimHooks.h b/hal/src/main/native/include/simulation/SimHooks.h
deleted file mode 100644
index 537cef3..0000000
--- a/hal/src/main/native/include/simulation/SimHooks.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#pragma once
-
-#include "mockdata/MockHooks.h"
-
-namespace frc {
-namespace sim {
-
-void WaitForProgramStart() { HALSIM_WaitForProgramStart(); }
-
-void SetProgramStarted() { HALSIM_SetProgramStarted(); }
-
-bool GetProgramStarted() { return HALSIM_GetProgramStarted(); }
-
-void RestartTiming() { HALSIM_RestartTiming(); }
-
-}  // namespace sim
-}  // namespace frc
diff --git a/hal/src/main/native/sim/AnalogGyro.cpp b/hal/src/main/native/sim/AnalogGyro.cpp
index b7d84d9..9666f4a 100644
--- a/hal/src/main/native/sim/AnalogGyro.cpp
+++ b/hal/src/main/native/sim/AnalogGyro.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,13 +7,10 @@
 
 #include "hal/AnalogGyro.h"
 
-#include <chrono>
-#include <thread>
-
-#include "AnalogInternal.h"
 #include "HALInitializer.h"
+#include "PortsInternal.h"
 #include "hal/AnalogAccumulator.h"
-#include "hal/AnalogInput.h"
+#include "hal/Errors.h"
 #include "hal/handles/IndexedHandleResource.h"
 #include "mockdata/AnalogGyroDataInternal.h"
 
diff --git a/hal/src/main/native/sim/AnalogInternal.cpp b/hal/src/main/native/sim/AnalogInternal.cpp
index 1e6a755..820dc97 100644
--- a/hal/src/main/native/sim/AnalogInternal.cpp
+++ b/hal/src/main/native/sim/AnalogInternal.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,7 +8,7 @@
 #include "AnalogInternal.h"
 
 #include "PortsInternal.h"
-#include "hal/AnalogInput.h"
+#include "hal/handles/IndexedHandleResource.h"
 
 namespace hal {
 IndexedHandleResource<HAL_AnalogInputHandle, hal::AnalogPort, kNumAnalogInputs,
diff --git a/hal/src/main/native/sim/AnalogInternal.h b/hal/src/main/native/sim/AnalogInternal.h
index bcc5c95..f4633f9 100644
--- a/hal/src/main/native/sim/AnalogInternal.h
+++ b/hal/src/main/native/sim/AnalogInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,10 +9,8 @@
 
 #include <stdint.h>
 
-#include <memory>
-
 #include "PortsInternal.h"
-#include "hal/Ports.h"
+#include "hal/handles/HandlesInternal.h"
 #include "hal/handles/IndexedHandleResource.h"
 
 namespace hal {
diff --git a/hal/src/main/native/sim/AnalogTrigger.cpp b/hal/src/main/native/sim/AnalogTrigger.cpp
index 3ddacee..62bfebc 100644
--- a/hal/src/main/native/sim/AnalogTrigger.cpp
+++ b/hal/src/main/native/sim/AnalogTrigger.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -85,6 +85,7 @@
   trigger->index = static_cast<uint8_t>(getHandleIndex(handle));
 
   SimAnalogTriggerData[trigger->index].initialized = true;
+  SimAnalogTriggerData[trigger->index].inputPort = analog_port->channel;
 
   trigger->trigState = false;
 
diff --git a/hal/src/main/native/sim/CANAPI.cpp b/hal/src/main/native/sim/CANAPI.cpp
index 08b0989..c410dea 100644
--- a/hal/src/main/native/sim/CANAPI.cpp
+++ b/hal/src/main/native/sim/CANAPI.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,16 +7,13 @@
 
 #include "hal/CANAPI.h"
 
-#include <atomic>
-#include <ctime>
-
 #include <wpi/DenseMap.h>
 
 #include "CANAPIInternal.h"
 #include "HALInitializer.h"
 #include "hal/CAN.h"
 #include "hal/Errors.h"
-#include "hal/HAL.h"
+#include "hal/HALBase.h"
 #include "hal/handles/UnlimitedHandleResource.h"
 
 using namespace hal;
diff --git a/hal/src/main/native/sim/CallbackStore.cpp b/hal/src/main/native/sim/CallbackStore.cpp
deleted file mode 100644
index d278b93..0000000
--- a/hal/src/main/native/sim/CallbackStore.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#include "simulation/CallbackStore.h"
-
-void frc::sim::CallbackStoreThunk(const char* name, void* param,
-                                  const HAL_Value* value) {
-  reinterpret_cast<CallbackStore*>(param)->callback(name, value);
-}
diff --git a/hal/src/main/native/sim/Counter.cpp b/hal/src/main/native/sim/Counter.cpp
index 37454d0..f0ea1c4 100644
--- a/hal/src/main/native/sim/Counter.cpp
+++ b/hal/src/main/native/sim/Counter.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,7 +10,6 @@
 #include "CounterInternal.h"
 #include "HALInitializer.h"
 #include "PortsInternal.h"
-#include "hal/Errors.h"
 #include "hal/handles/HandlesInternal.h"
 #include "hal/handles/LimitedHandleResource.h"
 
diff --git a/hal/src/main/native/sim/DIO.cpp b/hal/src/main/native/sim/DIO.cpp
index 2158136..f6347d9 100644
--- a/hal/src/main/native/sim/DIO.cpp
+++ b/hal/src/main/native/sim/DIO.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,6 @@
 
 #include "hal/DIO.h"
 
-#include <cmath>
-
 #include "DigitalInternal.h"
 #include "HALInitializer.h"
 #include "PortsInternal.h"
diff --git a/hal/src/main/native/sim/DigitalInternal.cpp b/hal/src/main/native/sim/DigitalInternal.cpp
index 070754a..db6455a 100644
--- a/hal/src/main/native/sim/DigitalInternal.cpp
+++ b/hal/src/main/native/sim/DigitalInternal.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,11 +7,11 @@
 
 #include "DigitalInternal.h"
 
-#include "ConstantsInternal.h"
 #include "PortsInternal.h"
 #include "hal/AnalogTrigger.h"
-#include "hal/HAL.h"
-#include "hal/Ports.h"
+#include "hal/Errors.h"
+#include "hal/handles/DigitalHandleResource.h"
+#include "hal/handles/HandlesInternal.h"
 
 namespace hal {
 
diff --git a/hal/src/main/native/sim/DigitalInternal.h b/hal/src/main/native/sim/DigitalInternal.h
index 9df4c51..d169c8a 100644
--- a/hal/src/main/native/sim/DigitalInternal.h
+++ b/hal/src/main/native/sim/DigitalInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,14 +9,9 @@
 
 #include <stdint.h>
 
-#include <memory>
-
 #include "PortsInternal.h"
 #include "hal/AnalogTrigger.h"
-#include "hal/Ports.h"
-#include "hal/Types.h"
 #include "hal/handles/DigitalHandleResource.h"
-#include "hal/handles/HandlesInternal.h"
 
 namespace hal {
 /**
diff --git a/hal/src/main/native/sim/DriverStation.cpp b/hal/src/main/native/sim/DriverStation.cpp
index e8404cf..aef8556 100644
--- a/hal/src/main/native/sim/DriverStation.cpp
+++ b/hal/src/main/native/sim/DriverStation.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -18,10 +18,12 @@
 
 #include <wpi/condition_variable.h>
 #include <wpi/mutex.h>
+#include <wpi/raw_ostream.h>
 
 #include "HALInitializer.h"
+#include "hal/cpp/fpga_clock.h"
+#include "hal/simulation/MockHooks.h"
 #include "mockdata/DriverStationDataInternal.h"
-#include "mockdata/MockHooks.h"
 
 static wpi::mutex msgMutex;
 static wpi::condition_variable* newDSDataAvailableCond;
@@ -29,6 +31,8 @@
 static int newDSDataAvailableCounter{0};
 static std::atomic_bool isFinalized{false};
 static std::atomic<HALSIM_SendErrorHandler> sendErrorHandler{nullptr};
+static std::atomic<HALSIM_SendConsoleLineHandler> sendConsoleLineHandler{
+    nullptr};
 
 namespace hal {
 namespace init {
@@ -47,6 +51,10 @@
   sendErrorHandler.store(handler);
 }
 
+void HALSIM_SetSendConsoleLine(HALSIM_SendConsoleLineHandler handler) {
+  sendConsoleLineHandler.store(handler);
+}
+
 int32_t HAL_SendError(HAL_Bool isError, int32_t errorCode, HAL_Bool isLVCode,
                       const char* details, const char* location,
                       const char* callStack, HAL_Bool printMsg) {
@@ -59,18 +67,16 @@
   static constexpr int KEEP_MSGS = 5;
   std::scoped_lock lock(msgMutex);
   static std::string prevMsg[KEEP_MSGS];
-  static std::chrono::time_point<std::chrono::steady_clock>
-      prevMsgTime[KEEP_MSGS];
+  static fpga_clock::time_point prevMsgTime[KEEP_MSGS];
   static bool initialized = false;
   if (!initialized) {
     for (int i = 0; i < KEEP_MSGS; i++) {
-      prevMsgTime[i] =
-          std::chrono::steady_clock::now() - std::chrono::seconds(2);
+      prevMsgTime[i] = fpga_clock::now() - std::chrono::seconds(2);
     }
     initialized = true;
   }
 
-  auto curTime = std::chrono::steady_clock::now();
+  auto curTime = fpga_clock::now();
   int i;
   for (i = 0; i < KEEP_MSGS; ++i) {
     if (prevMsg[i] == details) break;
@@ -105,6 +111,16 @@
   return retval;
 }
 
+int32_t HAL_SendConsoleLine(const char* line) {
+  auto handler = sendConsoleLineHandler.load();
+  if (handler) {
+    return handler(line);
+  }
+  wpi::outs() << line << "\n";
+  wpi::outs().flush();
+  return 0;
+}
+
 int32_t HAL_GetControlWord(HAL_ControlWord* controlWord) {
   controlWord->enabled = SimDriverStationData->enabled;
   controlWord->autonomous = SimDriverStationData->autonomous;
@@ -201,38 +217,29 @@
   // TODO
 }
 
-#ifdef __APPLE__
-static pthread_key_t lastCountKey;
-static pthread_once_t lastCountKeyOnce = PTHREAD_ONCE_INIT;
-
-static void InitLastCountKey(void) {
-  pthread_key_create(&lastCountKey, std::free);
-}
-#endif
-
 static int& GetThreadLocalLastCount() {
   // There is a rollover error condition here. At Packet# = n * (uintmax), this
   // will return false when instead it should return true. However, this at a
   // 20ms rate occurs once every 2.7 years of DS connected runtime, so not
   // worth the cycles to check.
-#ifdef __APPLE__
-  pthread_once(&lastCountKeyOnce, InitLastCountKey);
-  int* lastCountPtr = static_cast<int*>(pthread_getspecific(lastCountKey));
-  if (!lastCountPtr) {
-    lastCountPtr = static_cast<int*>(std::malloc(sizeof(int)));
-    *lastCountPtr = -1;
-    pthread_setspecific(lastCountKey, lastCountPtr);
-  }
-  int& lastCount = *lastCountPtr;
-#else
-  thread_local int lastCount{-1};
-#endif
+  thread_local int lastCount{0};
   return lastCount;
 }
 
-HAL_Bool HAL_WaitForCachedControlDataTimeout(double timeout) {
+HAL_Bool HAL_IsNewControlData(void) {
+  std::scoped_lock lock(newDSDataAvailableMutex);
   int& lastCount = GetThreadLocalLastCount();
+  int currentCount = newDSDataAvailableCounter;
+  if (lastCount == currentCount) return false;
+  lastCount = currentCount;
+  return true;
+}
+
+void HAL_WaitForDSData(void) { HAL_WaitForDSDataTimeout(0); }
+
+HAL_Bool HAL_WaitForDSDataTimeout(double timeout) {
   std::unique_lock lock(newDSDataAvailableMutex);
+  int& lastCount = GetThreadLocalLastCount();
   int currentCount = newDSDataAvailableCounter;
   if (lastCount != currentCount) {
     lastCount = currentCount;
@@ -242,7 +249,6 @@
   if (isFinalized.load()) {
     return false;
   }
-
   auto timeoutTime =
       std::chrono::steady_clock::now() + std::chrono::duration<double>(timeout);
 
@@ -256,42 +262,7 @@
       newDSDataAvailableCond->wait(lock);
     }
   }
-  return true;
-}
-
-HAL_Bool HAL_IsNewControlData(void) {
-  int& lastCount = GetThreadLocalLastCount();
-  int currentCount = 0;
-  {
-    std::scoped_lock lock(newDSDataAvailableMutex);
-    currentCount = newDSDataAvailableCounter;
-  }
-  if (lastCount == currentCount) return false;
-  lastCount = currentCount;
-  return true;
-}
-
-void HAL_WaitForDSData(void) { HAL_WaitForDSDataTimeout(0); }
-
-HAL_Bool HAL_WaitForDSDataTimeout(double timeout) {
-  if (isFinalized.load()) {
-    return false;
-  }
-  auto timeoutTime =
-      std::chrono::steady_clock::now() + std::chrono::duration<double>(timeout);
-
-  std::unique_lock lock(newDSDataAvailableMutex);
-  int currentCount = newDSDataAvailableCounter;
-  while (newDSDataAvailableCounter == currentCount) {
-    if (timeout > 0) {
-      auto timedOut = newDSDataAvailableCond->wait_until(lock, timeoutTime);
-      if (timedOut == std::cv_status::timeout) {
-        return false;
-      }
-    } else {
-      newDSDataAvailableCond->wait(lock);
-    }
-  }
+  lastCount = newDSDataAvailableCounter;
   return true;
 }
 
@@ -302,6 +273,7 @@
   // Since we could get other values, require our specific handle
   // to signal our threads
   if (refNum != refNumber) return 0;
+  SimDriverStationData->CallNewDataCallbacks();
   std::scoped_lock lock(newDSDataAvailableMutex);
   // Nofify all threads
   newDSDataAvailableCounter++;
diff --git a/hal/src/main/native/sim/Encoder.cpp b/hal/src/main/native/sim/Encoder.cpp
index 36122bf..32416f0 100644
--- a/hal/src/main/native/sim/Encoder.cpp
+++ b/hal/src/main/native/sim/Encoder.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,7 +10,6 @@
 #include "CounterInternal.h"
 #include "HALInitializer.h"
 #include "PortsInternal.h"
-#include "hal/Counter.h"
 #include "hal/Errors.h"
 #include "hal/handles/HandlesInternal.h"
 #include "hal/handles/LimitedHandleResource.h"
diff --git a/hal/src/main/native/sim/Extensions.cpp b/hal/src/main/native/sim/Extensions.cpp
index 951ad10..e638d6a 100644
--- a/hal/src/main/native/sim/Extensions.cpp
+++ b/hal/src/main/native/sim/Extensions.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,12 +7,13 @@
 
 #include "hal/Extensions.h"
 
+#include <vector>
+
 #include <wpi/Path.h>
 #include <wpi/SmallString.h>
 #include <wpi/StringRef.h>
 #include <wpi/raw_ostream.h>
-
-#include "hal/HAL.h"
+#include <wpi/spinlock.h>
 
 #if defined(WIN32) || defined(_WIN32)
 #include <windows.h>
@@ -23,9 +24,10 @@
 #if defined(WIN32) || defined(_WIN32)
 #define DELIM ';'
 #define HTYPE HMODULE
-#define DLOPEN(a) LoadLibrary(a)
+#define DLOPEN(a) LoadLibraryA(a)
 #define DLSYM GetProcAddress
 #define DLCLOSE FreeLibrary
+#define DLERROR "error #" << GetLastError()
 #else
 #define DELIM ':'
 #define HTYPE void*
@@ -33,8 +35,14 @@
 #define DLOPEN(a) dlopen(a, RTLD_LAZY)
 #define DLSYM dlsym
 #define DLCLOSE dlclose
+#define DLERROR dlerror()
 #endif
 
+static wpi::recursive_spinlock gExtensionRegistryMutex;
+static std::vector<std::pair<const char*, void*>> gExtensionRegistry;
+static std::vector<std::pair<void*, void (*)(void*, const char*, void*)>>
+    gExtensionListeners;
+
 namespace hal {
 namespace init {
 void InitializeExtensions() {}
@@ -63,14 +71,16 @@
 #else
     libraryName += ".so";
 #endif
-    wpi::outs() << "HAL Extensions: Trying modified name: "
-                << wpi::sys::path::stem(libraryName);
+    wpi::outs() << "HAL Extensions: Load failed: " << DLERROR
+                << "\nTrying modified name: "
+                << wpi::sys::path::stem(libraryName) << "\n";
     wpi::outs().flush();
     handle = DLOPEN(libraryName.c_str());
   }
 #endif
   if (!handle) {
-    wpi::outs() << "HAL Extensions: Failed to load library\n";
+    wpi::outs() << "HAL Extensions: Failed to load library: " << DLERROR
+                << '\n';
     wpi::outs().flush();
     return rc;
   }
@@ -112,6 +122,22 @@
   return rc;
 }
 
+void HAL_RegisterExtension(const char* name, void* data) {
+  std::scoped_lock lock(gExtensionRegistryMutex);
+  gExtensionRegistry.emplace_back(name, data);
+  for (auto&& listener : gExtensionListeners)
+    listener.second(listener.first, name, data);
+}
+
+void HAL_RegisterExtensionListener(void* param,
+                                   void (*func)(void*, const char* name,
+                                                void* data)) {
+  std::scoped_lock lock(gExtensionRegistryMutex);
+  gExtensionListeners.emplace_back(param, func);
+  for (auto&& extension : gExtensionRegistry)
+    func(param, extension.first, extension.second);
+}
+
 void HAL_SetShowExtensionsNotFoundMessages(HAL_Bool showMessage) {
   GetShowNotFoundMessage() = showMessage;
 }
diff --git a/hal/src/main/native/sim/HAL.cpp b/hal/src/main/native/sim/HAL.cpp
index 0dda617..64c4a10 100644
--- a/hal/src/main/native/sim/HAL.cpp
+++ b/hal/src/main/native/sim/HAL.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,16 @@
 
 #include "hal/HAL.h"
 
+#include <vector>
+
 #include <wpi/mutex.h>
 #include <wpi/raw_ostream.h>
+#include <wpi/spinlock.h>
+
+#ifdef _WIN32
+#include <Windows.h>
+#pragma comment(lib, "Winmm.lib")
+#endif  // _WIN32
 
 #include "ErrorsInternal.h"
 #include "HALInitializer.h"
@@ -17,10 +25,15 @@
 #include "hal/Errors.h"
 #include "hal/Extensions.h"
 #include "hal/handles/HandlesInternal.h"
+#include "hal/simulation/DriverStationData.h"
 #include "mockdata/RoboRioDataInternal.h"
 
 using namespace hal;
 
+static HAL_RuntimeType runtimeType{HAL_Mock};
+static wpi::spinlock gOnShutdownMutex;
+static std::vector<std::pair<void*, void (*)(void*)>> gOnShutdown;
+
 namespace hal {
 namespace init {
 void InitializeHAL() {
@@ -53,6 +66,7 @@
   InitializeAnalogInput();
   InitializeAnalogInternal();
   InitializeAnalogOutput();
+  InitializeAnalogTrigger();
   InitializeCAN();
   InitializeCompressor();
   InitializeConstants();
@@ -214,7 +228,9 @@
   }
 }
 
-HAL_RuntimeType HAL_GetRuntimeType(void) { return HAL_Mock; }
+HAL_RuntimeType HAL_GetRuntimeType(void) { return runtimeType; }
+
+void HALSIM_SetRuntimeType(HAL_RuntimeType type) { runtimeType = type; }
 
 int32_t HAL_GetFPGAVersion(int32_t* status) {
   return 2018;  // Automatically script this at some point
@@ -253,7 +269,7 @@
 }
 
 HAL_Bool HAL_GetSystemActive(int32_t* status) {
-  return true;  // Figure out if we need to handle this
+  return HALSIM_GetDriverStationEnabled();
 }
 
 HAL_Bool HAL_GetBrownedOut(int32_t* status) {
@@ -274,15 +290,49 @@
 
   hal::init::HAL_IsInitialized.store(true);
 
-  wpi::outs().SetUnbuffered();
-  if (HAL_LoadExtensions() < 0) return false;
   hal::RestartTiming();
   HAL_InitializeDriverStation();
 
   initialized = true;
+
+// Set Timer Precision to 1ms on Windows
+#ifdef _WIN32
+  TIMECAPS tc;
+  if (timeGetDevCaps(&tc, sizeof(tc)) == TIMERR_NOERROR) {
+    UINT target = min(1, tc.wPeriodMin);
+    timeBeginPeriod(target);
+    std::atexit([]() {
+      TIMECAPS tc;
+      if (timeGetDevCaps(&tc, sizeof(tc)) == TIMERR_NOERROR) {
+        UINT target = min(1, tc.wPeriodMin);
+        timeEndPeriod(target);
+      }
+    });
+  }
+#endif  // _WIN32
+
+  wpi::outs().SetUnbuffered();
+  if (HAL_LoadExtensions() < 0) return false;
+
   return true;  // Add initialization if we need to at a later point
 }
 
+void HAL_Shutdown(void) {
+  std::vector<std::pair<void*, void (*)(void*)>> funcs;
+  {
+    std::scoped_lock lock(gOnShutdownMutex);
+    funcs.swap(gOnShutdown);
+  }
+  for (auto&& func : funcs) {
+    func.second(func.first);
+  }
+}
+
+void HAL_OnShutdown(void* param, void (*func)(void*)) {
+  std::scoped_lock lock(gOnShutdownMutex);
+  gOnShutdown.emplace_back(param, func);
+}
+
 int64_t HAL_Report(int32_t resource, int32_t instanceNumber, int32_t context,
                    const char* feature) {
   return 0;  // Do nothing for now
diff --git a/hal/src/main/native/sim/HALInitializer.cpp b/hal/src/main/native/sim/HALInitializer.cpp
index a0456d4..5c2242b 100644
--- a/hal/src/main/native/sim/HALInitializer.cpp
+++ b/hal/src/main/native/sim/HALInitializer.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2018-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,7 +7,7 @@
 
 #include "HALInitializer.h"
 
-#include "hal/HAL.h"
+#include "hal/HALBase.h"
 
 namespace hal {
 namespace init {
diff --git a/hal/src/main/native/sim/HALInitializer.h b/hal/src/main/native/sim/HALInitializer.h
index c08df73..29efac5 100644
--- a/hal/src/main/native/sim/HALInitializer.h
+++ b/hal/src/main/native/sim/HALInitializer.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -48,6 +48,7 @@
 extern void InitializeAnalogInput();
 extern void InitializeAnalogInternal();
 extern void InitializeAnalogOutput();
+extern void InitializeAnalogTrigger();
 extern void InitializeCAN();
 extern void InitializeCompressor();
 extern void InitializeConstants();
diff --git a/hal/src/main/native/sim/Interrupts.cpp b/hal/src/main/native/sim/Interrupts.cpp
index a7dd285..7760f06 100644
--- a/hal/src/main/native/sim/Interrupts.cpp
+++ b/hal/src/main/native/sim/Interrupts.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -566,4 +566,9 @@
   interrupt->fireOnDown = fallingEdge;
   interrupt->fireOnUp = risingEdge;
 }
+
+void HAL_ReleaseWaitingInterrupt(HAL_InterruptHandle interruptHandle,
+                                 int32_t* status) {
+  // Requires a fairly large rewrite to get working
+}
 }  // extern "C"
diff --git a/hal/src/main/native/sim/MockHooks.cpp b/hal/src/main/native/sim/MockHooks.cpp
index 59086ae..8fe387f 100644
--- a/hal/src/main/native/sim/MockHooks.cpp
+++ b/hal/src/main/native/sim/MockHooks.cpp
@@ -1,10 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
+#include <algorithm>
 #include <atomic>
 #include <chrono>
 #include <cstdio>
@@ -14,45 +15,46 @@
 
 #include "MockHooksInternal.h"
 #include "NotifierInternal.h"
+#include "hal/simulation/NotifierData.h"
 
 static std::atomic<bool> programStarted{false};
 
 static std::atomic<uint64_t> programStartTime{0};
 static std::atomic<uint64_t> programPauseTime{0};
+static std::atomic<uint64_t> programStepTime{0};
 
 namespace hal {
 namespace init {
-void InitializeMockHooks() {}
+void InitializeMockHooks() { wpi::SetNowImpl(GetFPGATime); }
 }  // namespace init
 }  // namespace hal
 
 namespace hal {
 void RestartTiming() {
-  programStartTime = wpi::Now();
+  programStartTime = wpi::NowDefault();
+  programStepTime = 0;
   if (programPauseTime != 0) programPauseTime = programStartTime.load();
 }
 
 void PauseTiming() {
-  if (programPauseTime == 0) programPauseTime = wpi::Now();
+  if (programPauseTime == 0) programPauseTime = wpi::NowDefault();
 }
 
 void ResumeTiming() {
   if (programPauseTime != 0) {
-    programStartTime += wpi::Now() - programPauseTime;
+    programStartTime += wpi::NowDefault() - programPauseTime;
     programPauseTime = 0;
   }
 }
 
 bool IsTimingPaused() { return programPauseTime != 0; }
 
-void StepTiming(uint64_t delta) {
-  if (programPauseTime != 0) programPauseTime += delta;
-}
+void StepTiming(uint64_t delta) { programStepTime += delta; }
 
-int64_t GetFPGATime() {
+uint64_t GetFPGATime() {
   uint64_t curTime = programPauseTime;
-  if (curTime == 0) curTime = wpi::Now();
-  return curTime - programStartTime;
+  if (curTime == 0) curTime = wpi::NowDefault();
+  return curTime + programStepTime - programStartTime;
 }
 
 double GetFPGATimestamp() { return GetFPGATime() * 1.0e-6; }
@@ -92,6 +94,22 @@
 HAL_Bool HALSIM_IsTimingPaused(void) { return IsTimingPaused(); }
 
 void HALSIM_StepTiming(uint64_t delta) {
+  WaitNotifiers();
+
+  while (delta > 0) {
+    int32_t status = 0;
+    uint64_t curTime = HAL_GetFPGATime(&status);
+    uint64_t nextTimeout = HALSIM_GetNextNotifierTimeout();
+    uint64_t step = std::min(delta, nextTimeout - curTime);
+
+    StepTiming(step);
+    delta -= step;
+
+    WakeupWaitNotifiers();
+  }
+}
+
+void HALSIM_StepTimingAsync(uint64_t delta) {
   StepTiming(delta);
   WakeupNotifiers();
 }
diff --git a/hal/src/main/native/sim/MockHooksInternal.h b/hal/src/main/native/sim/MockHooksInternal.h
index a69e9bf..c53f120 100644
--- a/hal/src/main/native/sim/MockHooksInternal.h
+++ b/hal/src/main/native/sim/MockHooksInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 
 #include <stdint.h>
 
-#include "mockdata/MockHooks.h"
+#include "hal/simulation/MockHooks.h"
 
 namespace hal {
 void RestartTiming();
@@ -22,7 +22,7 @@
 
 void StepTiming(uint64_t delta);
 
-int64_t GetFPGATime();
+uint64_t GetFPGATime();
 
 double GetFPGATimestamp();
 
diff --git a/hal/src/main/native/sim/Notifier.cpp b/hal/src/main/native/sim/Notifier.cpp
index 211f7b2..a697275 100644
--- a/hal/src/main/native/sim/Notifier.cpp
+++ b/hal/src/main/native/sim/Notifier.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,23 +13,26 @@
 #include <cstring>
 #include <string>
 
+#include <wpi/SmallVector.h>
 #include <wpi/condition_variable.h>
 #include <wpi/mutex.h>
-#include <wpi/timestamp.h>
 
 #include "HALInitializer.h"
 #include "NotifierInternal.h"
-#include "hal/HAL.h"
+#include "hal/Errors.h"
+#include "hal/HALBase.h"
 #include "hal/cpp/fpga_clock.h"
 #include "hal/handles/UnlimitedHandleResource.h"
-#include "mockdata/NotifierData.h"
+#include "hal/simulation/NotifierData.h"
 
 namespace {
 struct Notifier {
   std::string name;
-  uint64_t waitTime;
+  uint64_t waitTime = UINT64_MAX;
   bool active = true;
-  bool running = false;
+  bool waitTimeValid = false;    // True if waitTime is set and in the future
+  bool waitingForAlarm = false;  // True if in HAL_WaitForNotifierAlarm()
+  uint64_t waitCount = 0;        // Counts calls to HAL_WaitForNotifierAlarm()
   wpi::mutex mutex;
   wpi::condition_variable cond;
 };
@@ -37,6 +40,9 @@
 
 using namespace hal;
 
+static wpi::mutex notifiersWaiterMutex;
+static wpi::condition_variable notifiersWaiterCond;
+
 class NotifierHandleContainer
     : public UnlimitedHandleResource<HAL_NotifierHandle, Notifier,
                                      HAL_HandleEnum::Notifier> {
@@ -46,10 +52,11 @@
       {
         std::scoped_lock lock(notifier->mutex);
         notifier->active = false;
-        notifier->running = false;
+        notifier->waitTimeValid = false;
       }
       notifier->cond.notify_all();  // wake up any waiting threads
     });
+    notifiersWaiterCond.notify_all();
   }
 };
 
@@ -76,6 +83,79 @@
     notifier->cond.notify_all();
   });
 }
+
+void WaitNotifiers() {
+  std::unique_lock ulock(notifiersWaiterMutex);
+  wpi::SmallVector<HAL_NotifierHandle, 8> waiters;
+
+  // Wait for all Notifiers to hit HAL_WaitForNotifierAlarm()
+  notifierHandles->ForEach([&](HAL_NotifierHandle handle, Notifier* notifier) {
+    std::scoped_lock lock(notifier->mutex);
+    if (notifier->active && !notifier->waitingForAlarm) {
+      waiters.emplace_back(handle);
+    }
+  });
+  for (;;) {
+    int count = 0;
+    int end = waiters.size();
+    while (count < end) {
+      auto& it = waiters[count];
+      if (auto notifier = notifierHandles->Get(it)) {
+        std::scoped_lock lock(notifier->mutex);
+        if (notifier->active && !notifier->waitingForAlarm) {
+          ++count;
+          continue;
+        }
+      }
+      // No longer need to wait for it, put at end so it can be erased
+      std::swap(it, waiters[--end]);
+    }
+    if (count == 0) break;
+    waiters.resize(count);
+    notifiersWaiterCond.wait_for(ulock, std::chrono::duration<double>(1));
+  }
+}
+
+void WakeupWaitNotifiers() {
+  std::unique_lock ulock(notifiersWaiterMutex);
+  int32_t status = 0;
+  uint64_t curTime = HAL_GetFPGATime(&status);
+  wpi::SmallVector<std::pair<HAL_NotifierHandle, uint64_t>, 8> waiters;
+
+  // Wake up Notifiers that have expired timeouts
+  notifierHandles->ForEach([&](HAL_NotifierHandle handle, Notifier* notifier) {
+    std::scoped_lock lock(notifier->mutex);
+
+    // Only wait for the Notifier if it has a valid timeout that's expired
+    if (notifier->active && notifier->waitTimeValid &&
+        curTime >= notifier->waitTime) {
+      waiters.emplace_back(handle, notifier->waitCount);
+      notifier->cond.notify_all();
+    }
+  });
+  for (;;) {
+    int count = 0;
+    int end = waiters.size();
+    while (count < end) {
+      auto& it = waiters[count];
+      if (auto notifier = notifierHandles->Get(it.first)) {
+        std::scoped_lock lock(notifier->mutex);
+
+        // waitCount is used here instead of waitingForAlarm because we want to
+        // wait until HAL_WaitForNotifierAlarm() is exited, then reentered
+        if (notifier->active && notifier->waitCount == it.second) {
+          ++count;
+          continue;
+        }
+      }
+      // No longer need to wait for it, put at end so it can be erased
+      it.swap(waiters[--end]);
+    }
+    if (count == 0) break;
+    waiters.resize(count);
+    notifiersWaiterCond.wait_for(ulock, std::chrono::duration<double>(1));
+  }
+}
 }  // namespace hal
 
 extern "C" {
@@ -106,7 +186,7 @@
   {
     std::scoped_lock lock(notifier->mutex);
     notifier->active = false;
-    notifier->running = false;
+    notifier->waitTimeValid = false;
   }
   notifier->cond.notify_all();
 }
@@ -119,7 +199,7 @@
   {
     std::scoped_lock lock(notifier->mutex);
     notifier->active = false;
-    notifier->running = false;
+    notifier->waitTimeValid = false;
   }
   notifier->cond.notify_all();
 }
@@ -132,7 +212,7 @@
   {
     std::scoped_lock lock(notifier->mutex);
     notifier->waitTime = triggerTime;
-    notifier->running = true;
+    notifier->waitTimeValid = (triggerTime != UINT64_MAX);
   }
 
   // We wake up any waiters to change how long they're sleeping for
@@ -146,7 +226,7 @@
 
   {
     std::scoped_lock lock(notifier->mutex);
-    notifier->running = false;
+    notifier->waitTimeValid = false;
   }
 }
 
@@ -155,26 +235,31 @@
   auto notifier = notifierHandles->Get(notifierHandle);
   if (!notifier) return 0;
 
+  std::unique_lock ulock(notifiersWaiterMutex);
   std::unique_lock lock(notifier->mutex);
+  notifier->waitingForAlarm = true;
+  ++notifier->waitCount;
+  ulock.unlock();
+  notifiersWaiterCond.notify_all();
   while (notifier->active) {
-    double waitTime;
-    if (!notifier->running || notifiersPaused) {
-      waitTime = (HAL_GetFPGATime(status) * 1e-6) + 1000.0;
-      // If not running, wait 1000 seconds
-    } else {
-      waitTime = notifier->waitTime * 1e-6;
+    uint64_t curTime = HAL_GetFPGATime(status);
+    if (notifier->waitTimeValid && curTime >= notifier->waitTime) {
+      notifier->waitTimeValid = false;
+      notifier->waitingForAlarm = false;
+      return curTime;
     }
 
-    auto timeoutTime =
-        hal::fpga_clock::epoch() + std::chrono::duration<double>(waitTime);
-    notifier->cond.wait_until(lock, timeoutTime);
-    if (!notifier->running) continue;
-    if (!notifier->active) break;
-    uint64_t curTime = HAL_GetFPGATime(status);
-    if (curTime < notifier->waitTime) continue;
-    notifier->running = false;
-    return curTime;
+    double waitDuration;
+    if (!notifier->waitTimeValid || notifiersPaused) {
+      // If not running, wait 1000 seconds
+      waitDuration = 1000.0;
+    } else {
+      waitDuration = (notifier->waitTime - curTime) * 1e-6;
+    }
+
+    notifier->cond.wait_for(lock, std::chrono::duration<double>(waitDuration));
   }
+  notifier->waitingForAlarm = false;
   return 0;
 }
 
@@ -182,7 +267,8 @@
   uint64_t timeout = UINT64_MAX;
   notifierHandles->ForEach([&](HAL_NotifierHandle, Notifier* notifier) {
     std::scoped_lock lock(notifier->mutex);
-    if (notifier->active && notifier->running && timeout > notifier->waitTime)
+    if (notifier->active && notifier->waitTimeValid &&
+        timeout > notifier->waitTime)
       timeout = notifier->waitTime;
   });
   return timeout;
@@ -213,7 +299,7 @@
         arr[num].name[sizeof(arr[num].name) - 1] = '\0';
       }
       arr[num].timeout = notifier->waitTime;
-      arr[num].running = notifier->running;
+      arr[num].waitTimeValid = notifier->waitTimeValid;
     }
     ++num;
   });
diff --git a/hal/src/main/native/sim/NotifierInternal.h b/hal/src/main/native/sim/NotifierInternal.h
index 84232d2..e6692ca 100644
--- a/hal/src/main/native/sim/NotifierInternal.h
+++ b/hal/src/main/native/sim/NotifierInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,4 +11,6 @@
 void PauseNotifiers();
 void ResumeNotifiers();
 void WakeupNotifiers();
+void WaitNotifiers();
+void WakeupWaitNotifiers();
 }  // namespace hal
diff --git a/hal/src/main/native/sim/PDP.cpp b/hal/src/main/native/sim/PDP.cpp
index dbe09d4..cc095d0 100644
--- a/hal/src/main/native/sim/PDP.cpp
+++ b/hal/src/main/native/sim/PDP.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,7 +11,7 @@
 #include "HALInitializer.h"
 #include "PortsInternal.h"
 #include "hal/CANAPI.h"
-#include "hal/handles/IndexedHandleResource.h"
+#include "hal/Errors.h"
 #include "mockdata/PDPDataInternal.h"
 
 using namespace hal;
diff --git a/hal/src/main/native/sim/PortsInternal.h b/hal/src/main/native/sim/PortsInternal.h
index cfbf1e7..d143aca 100644
--- a/hal/src/main/native/sim/PortsInternal.h
+++ b/hal/src/main/native/sim/PortsInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -17,7 +17,7 @@
 constexpr int32_t kNumCounters = 8;
 constexpr int32_t kNumDigitalHeaders = 10;
 constexpr int32_t kNumPWMHeaders = 10;
-constexpr int32_t kNumDigitalChannels = 26;
+constexpr int32_t kNumDigitalChannels = 31;
 constexpr int32_t kNumPWMChannels = 20;
 constexpr int32_t kNumDigitalPWMOutputs = 6;
 constexpr int32_t kNumEncoders = 8;
diff --git a/hal/src/main/native/sim/Power.cpp b/hal/src/main/native/sim/Power.cpp
index 95bb3dd..e8ce710 100644
--- a/hal/src/main/native/sim/Power.cpp
+++ b/hal/src/main/native/sim/Power.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -19,46 +19,42 @@
 
 // TODO: Fix the naming in here
 extern "C" {
-double HAL_GetVinVoltage(int32_t* status) {
-  return SimRoboRioData[0].vInVoltage;
-}
-double HAL_GetVinCurrent(int32_t* status) {
-  return SimRoboRioData[0].vInCurrent;
-}
+double HAL_GetVinVoltage(int32_t* status) { return SimRoboRioData->vInVoltage; }
+double HAL_GetVinCurrent(int32_t* status) { return SimRoboRioData->vInCurrent; }
 double HAL_GetUserVoltage6V(int32_t* status) {
-  return SimRoboRioData[0].userVoltage6V;
+  return SimRoboRioData->userVoltage6V;
 }
 double HAL_GetUserCurrent6V(int32_t* status) {
-  return SimRoboRioData[0].userCurrent6V;
+  return SimRoboRioData->userCurrent6V;
 }
 HAL_Bool HAL_GetUserActive6V(int32_t* status) {
-  return SimRoboRioData[0].userActive6V;
+  return SimRoboRioData->userActive6V;
 }
 int32_t HAL_GetUserCurrentFaults6V(int32_t* status) {
-  return SimRoboRioData[0].userFaults6V;
+  return SimRoboRioData->userFaults6V;
 }
 double HAL_GetUserVoltage5V(int32_t* status) {
-  return SimRoboRioData[0].userVoltage5V;
+  return SimRoboRioData->userVoltage5V;
 }
 double HAL_GetUserCurrent5V(int32_t* status) {
-  return SimRoboRioData[0].userCurrent5V;
+  return SimRoboRioData->userCurrent5V;
 }
 HAL_Bool HAL_GetUserActive5V(int32_t* status) {
-  return SimRoboRioData[0].userActive5V;
+  return SimRoboRioData->userActive5V;
 }
 int32_t HAL_GetUserCurrentFaults5V(int32_t* status) {
-  return SimRoboRioData[0].userFaults5V;
+  return SimRoboRioData->userFaults5V;
 }
 double HAL_GetUserVoltage3V3(int32_t* status) {
-  return SimRoboRioData[0].userVoltage3V3;
+  return SimRoboRioData->userVoltage3V3;
 }
 double HAL_GetUserCurrent3V3(int32_t* status) {
-  return SimRoboRioData[0].userCurrent3V3;
+  return SimRoboRioData->userCurrent3V3;
 }
 HAL_Bool HAL_GetUserActive3V3(int32_t* status) {
-  return SimRoboRioData[0].userActive3V3;
+  return SimRoboRioData->userActive3V3;
 }
 int32_t HAL_GetUserCurrentFaults3V3(int32_t* status) {
-  return SimRoboRioData[0].userFaults3V3;
+  return SimRoboRioData->userFaults3V3;
 }
 }  // extern "C"
diff --git a/hal/src/main/native/sim/Relay.cpp b/hal/src/main/native/sim/Relay.cpp
index bd1c8a8..acecec4 100644
--- a/hal/src/main/native/sim/Relay.cpp
+++ b/hal/src/main/native/sim/Relay.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -89,8 +89,8 @@
 
 HAL_Bool HAL_CheckRelayChannel(int32_t channel) {
   // roboRIO only has 4 headers, and the FPGA has
-  // seperate functions for forward and reverse,
-  // instead of seperate channel IDs
+  // separate functions for forward and reverse,
+  // instead of separate channel IDs
   return channel < kNumRelayHeaders && channel >= 0;
 }
 
diff --git a/hal/src/main/native/sim/Solenoid.cpp b/hal/src/main/native/sim/Solenoid.cpp
index 46bd285..1881a32 100644
--- a/hal/src/main/native/sim/Solenoid.cpp
+++ b/hal/src/main/native/sim/Solenoid.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2016-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2016-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -12,7 +12,7 @@
 #include "hal/Errors.h"
 #include "hal/handles/HandlesInternal.h"
 #include "hal/handles/IndexedHandleResource.h"
-#include "mockdata/PCMDataInternal.h"
+#include "hal/simulation/PCMData.h"
 
 namespace {
 struct Solenoid {
diff --git a/hal/src/main/native/sim/jni/DriverStationDataJNI.cpp b/hal/src/main/native/sim/jni/DriverStationDataJNI.cpp
deleted file mode 100644
index 82433b3..0000000
--- a/hal/src/main/native/sim/jni/DriverStationDataJNI.cpp
+++ /dev/null
@@ -1,481 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018-2019 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#include <jni.h>
-
-#include <cstring>
-
-#include <wpi/jni_util.h>
-
-#include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI.h"
-#include "mockdata/DriverStationData.h"
-#include "mockdata/MockHooks.h"
-
-using namespace wpi::java;
-
-extern "C" {
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    registerEnabledCallback
- * Signature: (Ljava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_registerEnabledCallback
-  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallbackNoIndex(
-      env, callback, initialNotify,
-      &HALSIM_RegisterDriverStationEnabledCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    cancelEnabledCallback
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_cancelEnabledCallback
-  (JNIEnv* env, jclass, jint handle)
-{
-  return sim::FreeCallbackNoIndex(env, handle,
-                                  &HALSIM_CancelDriverStationEnabledCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    getEnabled
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_getEnabled
-  (JNIEnv*, jclass)
-{
-  return HALSIM_GetDriverStationEnabled();
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setEnabled
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setEnabled
-  (JNIEnv*, jclass, jboolean value)
-{
-  HALSIM_SetDriverStationEnabled(value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    registerAutonomousCallback
- * Signature: (Ljava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_registerAutonomousCallback
-  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallbackNoIndex(
-      env, callback, initialNotify,
-      &HALSIM_RegisterDriverStationAutonomousCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    cancelAutonomousCallback
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_cancelAutonomousCallback
-  (JNIEnv* env, jclass, jint handle)
-{
-  return sim::FreeCallbackNoIndex(
-      env, handle, &HALSIM_CancelDriverStationAutonomousCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    getAutonomous
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_getAutonomous
-  (JNIEnv*, jclass)
-{
-  return HALSIM_GetDriverStationAutonomous();
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setAutonomous
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setAutonomous
-  (JNIEnv*, jclass, jboolean value)
-{
-  HALSIM_SetDriverStationAutonomous(value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    registerTestCallback
- * Signature: (Ljava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_registerTestCallback
-  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallbackNoIndex(
-      env, callback, initialNotify, &HALSIM_RegisterDriverStationTestCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    cancelTestCallback
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_cancelTestCallback
-  (JNIEnv* env, jclass, jint handle)
-{
-  return sim::FreeCallbackNoIndex(env, handle,
-                                  &HALSIM_CancelDriverStationTestCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    getTest
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_getTest
-  (JNIEnv*, jclass)
-{
-  return HALSIM_GetDriverStationTest();
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setTest
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setTest
-  (JNIEnv*, jclass, jboolean value)
-{
-  HALSIM_SetDriverStationTest(value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    registerEStopCallback
- * Signature: (Ljava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_registerEStopCallback
-  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallbackNoIndex(
-      env, callback, initialNotify, &HALSIM_RegisterDriverStationEStopCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    cancelEStopCallback
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_cancelEStopCallback
-  (JNIEnv* env, jclass, jint handle)
-{
-  return sim::FreeCallbackNoIndex(env, handle,
-                                  &HALSIM_CancelDriverStationEStopCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    getEStop
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_getEStop
-  (JNIEnv*, jclass)
-{
-  return HALSIM_GetDriverStationEStop();
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setEStop
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setEStop
-  (JNIEnv*, jclass, jboolean value)
-{
-  HALSIM_SetDriverStationEStop(value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    registerFmsAttachedCallback
- * Signature: (Ljava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_registerFmsAttachedCallback
-  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallbackNoIndex(
-      env, callback, initialNotify,
-      &HALSIM_RegisterDriverStationFmsAttachedCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    cancelFmsAttachedCallback
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_cancelFmsAttachedCallback
-  (JNIEnv* env, jclass, jint handle)
-{
-  return sim::FreeCallbackNoIndex(
-      env, handle, &HALSIM_CancelDriverStationFmsAttachedCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    getFmsAttached
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_getFmsAttached
-  (JNIEnv*, jclass)
-{
-  return HALSIM_GetDriverStationFmsAttached();
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setFmsAttached
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setFmsAttached
-  (JNIEnv*, jclass, jboolean value)
-{
-  HALSIM_SetDriverStationFmsAttached(value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    registerDsAttachedCallback
- * Signature: (Ljava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_registerDsAttachedCallback
-  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallbackNoIndex(
-      env, callback, initialNotify,
-      &HALSIM_RegisterDriverStationDsAttachedCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    cancelDsAttachedCallback
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_cancelDsAttachedCallback
-  (JNIEnv* env, jclass, jint handle)
-{
-  return sim::FreeCallbackNoIndex(
-      env, handle, &HALSIM_CancelDriverStationDsAttachedCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    getDsAttached
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_getDsAttached
-  (JNIEnv*, jclass)
-{
-  return HALSIM_GetDriverStationDsAttached();
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setDsAttached
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setDsAttached
-  (JNIEnv*, jclass, jboolean value)
-{
-  HALSIM_SetDriverStationDsAttached(value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setJoystickAxes
- * Signature: (B[F)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setJoystickAxes
-  (JNIEnv* env, jclass, jbyte joystickNum, jfloatArray axesArray)
-{
-  HAL_JoystickAxes axes;
-  {
-    wpi::java::JFloatArrayRef jArrayRef(env, axesArray);
-    auto arrayRef = jArrayRef.array();
-    auto arraySize = arrayRef.size();
-    int maxCount =
-        arraySize < HAL_kMaxJoystickAxes ? arraySize : HAL_kMaxJoystickAxes;
-    axes.count = maxCount;
-    for (int i = 0; i < maxCount; i++) {
-      axes.axes[i] = arrayRef[i];
-    }
-  }
-  HALSIM_SetJoystickAxes(joystickNum, &axes);
-  return;
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setJoystickPOVs
- * Signature: (B[S)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setJoystickPOVs
-  (JNIEnv* env, jclass, jbyte joystickNum, jshortArray povsArray)
-{
-  HAL_JoystickPOVs povs;
-  {
-    wpi::java::JShortArrayRef jArrayRef(env, povsArray);
-    auto arrayRef = jArrayRef.array();
-    auto arraySize = arrayRef.size();
-    int maxCount =
-        arraySize < HAL_kMaxJoystickPOVs ? arraySize : HAL_kMaxJoystickPOVs;
-    povs.count = maxCount;
-    for (int i = 0; i < maxCount; i++) {
-      povs.povs[i] = arrayRef[i];
-    }
-  }
-  HALSIM_SetJoystickPOVs(joystickNum, &povs);
-  return;
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setJoystickButtons
- * Signature: (BII)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setJoystickButtons
-  (JNIEnv* env, jclass, jbyte joystickNum, jint buttons, jint count)
-{
-  if (count > 32) {
-    count = 32;
-  }
-  HAL_JoystickButtons joystickButtons;
-  joystickButtons.count = count;
-  joystickButtons.buttons = buttons;
-  HALSIM_SetJoystickButtons(joystickNum, &joystickButtons);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setMatchInfo
- * Signature: (Ljava/lang/String;Ljava/lang/String;III)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setMatchInfo
-  (JNIEnv* env, jclass, jstring eventName, jstring gameSpecificMessage,
-   jint matchNumber, jint replayNumber, jint matchType)
-{
-  JStringRef eventNameRef{env, eventName};
-  JStringRef gameSpecificMessageRef{env, gameSpecificMessage};
-
-  HAL_MatchInfo halMatchInfo;
-  std::snprintf(halMatchInfo.eventName, sizeof(halMatchInfo.eventName), "%s",
-                eventNameRef.c_str());
-  std::snprintf(reinterpret_cast<char*>(halMatchInfo.gameSpecificMessage),
-                sizeof(halMatchInfo.gameSpecificMessage), "%s",
-                gameSpecificMessageRef.c_str());
-  halMatchInfo.gameSpecificMessageSize = gameSpecificMessageRef.size();
-  halMatchInfo.matchType = (HAL_MatchType)matchType;
-  halMatchInfo.matchNumber = matchNumber;
-  halMatchInfo.replayNumber = replayNumber;
-  HALSIM_SetMatchInfo(&halMatchInfo);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    registerAllCallbacks
- * Signature: (Ljava/lang/Object;Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_registerAllCallbacks
-  (JNIEnv* env, jclass, jobject callback, jboolean initialNotify)
-{
-  sim::AllocateCallbackNoIndex(
-      env, callback, initialNotify,
-      [](HAL_NotifyCallback cb, void* param, HAL_Bool in) {
-        HALSIM_RegisterDriverStationAllCallbacks(cb, param, in);
-        return 0;
-      });
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    notifyNewData
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_notifyNewData
-  (JNIEnv*, jclass)
-{
-  HALSIM_NotifyDriverStationNewData();
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    setSendError
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_setSendError
-  (JNIEnv*, jclass, jboolean shouldSend)
-{
-  if (shouldSend) {
-    HALSIM_SetSendError(nullptr);
-  } else {
-    HALSIM_SetSendError([](HAL_Bool isError, int32_t errorCode,
-                           HAL_Bool isLVCode, const char* details,
-                           const char* location, const char* callStack,
-                           HAL_Bool printMsg) { return 1; });
-  }
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI
- * Method:    resetData
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_DriverStationDataJNI_resetData
-  (JNIEnv*, jclass)
-{
-  HALSIM_ResetDriverStationData();
-}
-
-}  // extern "C"
diff --git a/hal/src/main/native/sim/jni/EncoderDataJNI.cpp b/hal/src/main/native/sim/jni/EncoderDataJNI.cpp
deleted file mode 100644
index 8992b0c..0000000
--- a/hal/src/main/native/sim/jni/EncoderDataJNI.cpp
+++ /dev/null
@@ -1,428 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#include <jni.h>
-
-#include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_EncoderDataJNI.h"
-#include "mockdata/EncoderData.h"
-
-extern "C" {
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerInitializedCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerInitializedCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderInitializedCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelInitializedCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelInitializedCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderInitializedCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getInitialized
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getInitialized
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderInitialized(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setInitialized
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setInitialized
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetEncoderInitialized(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerCountCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerCountCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderCountCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelCountCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelCountCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderCountCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getCount
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getCount
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderCount(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setCount
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setCount
-  (JNIEnv*, jclass, jint index, jint value)
-{
-  HALSIM_SetEncoderCount(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerPeriodCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerPeriodCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderPeriodCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelPeriodCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelPeriodCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderPeriodCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getPeriod
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getPeriod
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderPeriod(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setPeriod
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setPeriod
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetEncoderPeriod(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerResetCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerResetCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderResetCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelResetCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelResetCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderResetCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getReset
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getReset
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderReset(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setReset
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setReset
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetEncoderReset(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerMaxPeriodCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerMaxPeriodCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderMaxPeriodCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelMaxPeriodCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelMaxPeriodCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderMaxPeriodCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getMaxPeriod
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getMaxPeriod
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderMaxPeriod(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setMaxPeriod
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setMaxPeriod
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetEncoderMaxPeriod(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerDirectionCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerDirectionCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderDirectionCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelDirectionCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelDirectionCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderDirectionCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getDirection
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getDirection
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderDirection(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setDirection
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setDirection
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetEncoderDirection(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerReverseDirectionCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerReverseDirectionCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderReverseDirectionCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelReverseDirectionCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelReverseDirectionCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderReverseDirectionCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getReverseDirection
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getReverseDirection
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderReverseDirection(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setReverseDirection
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setReverseDirection
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetEncoderReverseDirection(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    registerSamplesToAverageCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_registerSamplesToAverageCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterEncoderSamplesToAverageCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    cancelSamplesToAverageCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_cancelSamplesToAverageCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelEncoderSamplesToAverageCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    getSamplesToAverage
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_getSamplesToAverage
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetEncoderSamplesToAverage(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    setSamplesToAverage
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_setSamplesToAverage
-  (JNIEnv*, jclass, jint index, jint value)
-{
-  HALSIM_SetEncoderSamplesToAverage(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_EncoderDataJNI
- * Method:    resetData
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_EncoderDataJNI_resetData
-  (JNIEnv*, jclass, jint index)
-{
-  HALSIM_ResetEncoderData(index);
-}
-
-}  // extern "C"
diff --git a/hal/src/main/native/sim/jni/RoboRioDataJNI.cpp b/hal/src/main/native/sim/jni/RoboRioDataJNI.cpp
deleted file mode 100644
index d69e895..0000000
--- a/hal/src/main/native/sim/jni/RoboRioDataJNI.cpp
+++ /dev/null
@@ -1,778 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#include <jni.h>
-
-#include "CallbackStore.h"
-#include "edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI.h"
-#include "mockdata/RoboRioData.h"
-
-extern "C" {
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerFPGAButtonCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerFPGAButtonCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioFPGAButtonCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelFPGAButtonCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelFPGAButtonCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioFPGAButtonCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getFPGAButton
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getFPGAButton
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioFPGAButton(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setFPGAButton
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setFPGAButton
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetRoboRioFPGAButton(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerVInVoltageCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerVInVoltageCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioVInVoltageCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelVInVoltageCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelVInVoltageCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioVInVoltageCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getVInVoltage
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getVInVoltage
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioVInVoltage(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setVInVoltage
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setVInVoltage
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioVInVoltage(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerVInCurrentCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerVInCurrentCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioVInCurrentCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelVInCurrentCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelVInCurrentCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioVInCurrentCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getVInCurrent
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getVInCurrent
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioVInCurrent(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setVInCurrent
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setVInCurrent
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioVInCurrent(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserVoltage6VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserVoltage6VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserVoltage6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserVoltage6VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserVoltage6VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserVoltage6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserVoltage6V
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserVoltage6V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserVoltage6V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserVoltage6V
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserVoltage6V
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioUserVoltage6V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserCurrent6VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserCurrent6VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserCurrent6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserCurrent6VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserCurrent6VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserCurrent6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserCurrent6V
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserCurrent6V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserCurrent6V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserCurrent6V
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserCurrent6V
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioUserCurrent6V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserActive6VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserActive6VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserActive6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserActive6VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserActive6VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserActive6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserActive6V
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserActive6V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserActive6V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserActive6V
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserActive6V
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetRoboRioUserActive6V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserVoltage5VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserVoltage5VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserVoltage5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserVoltage5VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserVoltage5VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserVoltage5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserVoltage5V
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserVoltage5V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserVoltage5V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserVoltage5V
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserVoltage5V
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioUserVoltage5V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserCurrent5VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserCurrent5VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserCurrent5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserCurrent5VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserCurrent5VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserCurrent5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserCurrent5V
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserCurrent5V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserCurrent5V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserCurrent5V
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserCurrent5V
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioUserCurrent5V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserActive5VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserActive5VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserActive5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserActive5VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserActive5VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserActive5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserActive5V
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserActive5V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserActive5V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserActive5V
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserActive5V
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetRoboRioUserActive5V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserVoltage3V3Callback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserVoltage3V3Callback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserVoltage3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserVoltage3V3Callback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserVoltage3V3Callback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserVoltage3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserVoltage3V3
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserVoltage3V3
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserVoltage3V3(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserVoltage3V3
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserVoltage3V3
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioUserVoltage3V3(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserCurrent3V3Callback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserCurrent3V3Callback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserCurrent3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserCurrent3V3Callback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserCurrent3V3Callback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserCurrent3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserCurrent3V3
- * Signature: (I)D
- */
-JNIEXPORT jdouble JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserCurrent3V3
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserCurrent3V3(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserCurrent3V3
- * Signature: (ID)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserCurrent3V3
-  (JNIEnv*, jclass, jint index, jdouble value)
-{
-  HALSIM_SetRoboRioUserCurrent3V3(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserActive3V3Callback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserActive3V3Callback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserActive3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserActive3V3Callback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserActive3V3Callback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserActive3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserActive3V3
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserActive3V3
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserActive3V3(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserActive3V3
- * Signature: (IZ)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserActive3V3
-  (JNIEnv*, jclass, jint index, jboolean value)
-{
-  HALSIM_SetRoboRioUserActive3V3(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserFaults6VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserFaults6VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserFaults6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserFaults6VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserFaults6VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserFaults6VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserFaults6V
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserFaults6V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserFaults6V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserFaults6V
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserFaults6V
-  (JNIEnv*, jclass, jint index, jint value)
-{
-  HALSIM_SetRoboRioUserFaults6V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserFaults5VCallback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserFaults5VCallback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserFaults5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserFaults5VCallback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserFaults5VCallback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserFaults5VCallback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserFaults5V
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserFaults5V
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserFaults5V(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserFaults5V
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserFaults5V
-  (JNIEnv*, jclass, jint index, jint value)
-{
-  HALSIM_SetRoboRioUserFaults5V(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    registerUserFaults3V3Callback
- * Signature: (ILjava/lang/Object;Z)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_registerUserFaults3V3Callback
-  (JNIEnv* env, jclass, jint index, jobject callback, jboolean initialNotify)
-{
-  return sim::AllocateCallback(env, index, callback, initialNotify,
-                               &HALSIM_RegisterRoboRioUserFaults3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    cancelUserFaults3V3Callback
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_cancelUserFaults3V3Callback
-  (JNIEnv* env, jclass, jint index, jint handle)
-{
-  return sim::FreeCallback(env, handle, index,
-                           &HALSIM_CancelRoboRioUserFaults3V3Callback);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    getUserFaults3V3
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_getUserFaults3V3
-  (JNIEnv*, jclass, jint index)
-{
-  return HALSIM_GetRoboRioUserFaults3V3(index);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    setUserFaults3V3
- * Signature: (II)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_setUserFaults3V3
-  (JNIEnv*, jclass, jint index, jint value)
-{
-  HALSIM_SetRoboRioUserFaults3V3(index, value);
-}
-
-/*
- * Class:     edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI
- * Method:    resetData
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_edu_wpi_first_hal_sim_mockdata_RoboRioDataJNI_resetData
-  (JNIEnv*, jclass, jint index)
-{
-  HALSIM_ResetRoboRioData(index);
-}
-
-}  // extern "C"
diff --git a/hal/src/main/native/sim/mockdata/AccelerometerDataInternal.h b/hal/src/main/native/sim/mockdata/AccelerometerDataInternal.h
index 9db0875..e2e0a80 100644
--- a/hal/src/main/native/sim/mockdata/AccelerometerDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/AccelerometerDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/AccelerometerData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/AccelerometerData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class AccelerometerData {
diff --git a/hal/src/main/native/sim/mockdata/AddressableLEDData.cpp b/hal/src/main/native/sim/mockdata/AddressableLEDData.cpp
index 5b44eaf..fe4611e 100644
--- a/hal/src/main/native/sim/mockdata/AddressableLEDData.cpp
+++ b/hal/src/main/native/sim/mockdata/AddressableLEDData.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -49,6 +49,16 @@
 }
 
 extern "C" {
+
+int32_t HALSIM_FindAddressableLEDForChannel(int32_t channel) {
+  for (int i = 0; i < kNumAddressableLEDs; ++i) {
+    if (SimAddressableLEDData[i].initialized &&
+        SimAddressableLEDData[i].outputPort == channel)
+      return i;
+  }
+  return -1;
+}
+
 void HALSIM_ResetAddressableLEDData(int32_t index) {
   SimAddressableLEDData[index].ResetData();
 }
diff --git a/hal/src/main/native/sim/mockdata/AddressableLEDDataInternal.h b/hal/src/main/native/sim/mockdata/AddressableLEDDataInternal.h
index 9d6e215..f0b7998 100644
--- a/hal/src/main/native/sim/mockdata/AddressableLEDDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/AddressableLEDDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,9 +11,9 @@
 
 #include <wpi/spinlock.h>
 
-#include "mockdata/AddressableLEDData.h"
-#include "mockdata/SimCallbackRegistry.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/AddressableLEDData.h"
+#include "hal/simulation/SimCallbackRegistry.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class AddressableLEDData {
diff --git a/hal/src/main/native/sim/mockdata/AnalogGyroDataInternal.h b/hal/src/main/native/sim/mockdata/AnalogGyroDataInternal.h
index 427d2fb..ff12b60 100644
--- a/hal/src/main/native/sim/mockdata/AnalogGyroDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/AnalogGyroDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/AnalogGyroData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/AnalogGyroData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class AnalogGyroData {
diff --git a/hal/src/main/native/sim/mockdata/AnalogInDataInternal.h b/hal/src/main/native/sim/mockdata/AnalogInDataInternal.h
index cd8348d..90d707c 100644
--- a/hal/src/main/native/sim/mockdata/AnalogInDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/AnalogInDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/AnalogInData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/AnalogInData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class AnalogInData {
diff --git a/hal/src/main/native/sim/mockdata/AnalogOutDataInternal.h b/hal/src/main/native/sim/mockdata/AnalogOutDataInternal.h
index da7d49f..779ee96 100644
--- a/hal/src/main/native/sim/mockdata/AnalogOutDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/AnalogOutDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/AnalogOutData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/AnalogOutData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class AnalogOutData {
diff --git a/hal/src/main/native/sim/mockdata/AnalogTriggerData.cpp b/hal/src/main/native/sim/mockdata/AnalogTriggerData.cpp
index 64d1a97..ba33522 100644
--- a/hal/src/main/native/sim/mockdata/AnalogTriggerData.cpp
+++ b/hal/src/main/native/sim/mockdata/AnalogTriggerData.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -28,6 +28,16 @@
 }
 
 extern "C" {
+
+int32_t HALSIM_FindAnalogTriggerForChannel(int32_t channel) {
+  for (int i = 0; i < kNumAnalogTriggers; ++i) {
+    if (SimAnalogTriggerData[i].initialized &&
+        SimAnalogTriggerData[i].inputPort == channel)
+      return i;
+  }
+  return -1;
+}
+
 void HALSIM_ResetAnalogTriggerData(int32_t index) {
   SimAnalogTriggerData[index].ResetData();
 }
diff --git a/hal/src/main/native/sim/mockdata/AnalogTriggerDataInternal.h b/hal/src/main/native/sim/mockdata/AnalogTriggerDataInternal.h
index 61b3c19..74fe5f8 100644
--- a/hal/src/main/native/sim/mockdata/AnalogTriggerDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/AnalogTriggerDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/AnalogTriggerData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/AnalogTriggerData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class AnalogTriggerData {
@@ -31,6 +31,7 @@
   SimDataValue<HALSIM_AnalogTriggerMode, MakeTriggerModeValue,
                GetTriggerModeName>
       triggerMode{static_cast<HALSIM_AnalogTriggerMode>(0)};
+  std::atomic<int32_t> inputPort;
 
   virtual void ResetData();
 };
diff --git a/hal/src/main/native/sim/mockdata/CanDataInternal.h b/hal/src/main/native/sim/mockdata/CanDataInternal.h
index ffdd351..df5b290 100644
--- a/hal/src/main/native/sim/mockdata/CanDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/CanDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/CanData.h"
-#include "mockdata/SimCallbackRegistry.h"
+#include "hal/simulation/CanData.h"
+#include "hal/simulation/SimCallbackRegistry.h"
 
 namespace hal {
 
diff --git a/hal/src/main/native/sim/mockdata/DIODataInternal.h b/hal/src/main/native/sim/mockdata/DIODataInternal.h
index 49e0f75..c3266d5 100644
--- a/hal/src/main/native/sim/mockdata/DIODataInternal.h
+++ b/hal/src/main/native/sim/mockdata/DIODataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/DIOData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/DIOData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class DIOData {
diff --git a/hal/src/main/native/sim/mockdata/DigitalPWMData.cpp b/hal/src/main/native/sim/mockdata/DigitalPWMData.cpp
index 78ee749..541d7cf 100644
--- a/hal/src/main/native/sim/mockdata/DigitalPWMData.cpp
+++ b/hal/src/main/native/sim/mockdata/DigitalPWMData.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -27,6 +27,14 @@
 }
 
 extern "C" {
+int32_t HALSIM_FindDigitalPWMForChannel(int32_t channel) {
+  for (int i = 0; i < kNumDigitalPWMOutputs; ++i) {
+    if (SimDigitalPWMData[i].initialized && SimDigitalPWMData[i].pin == channel)
+      return i;
+  }
+  return -1;
+}
+
 void HALSIM_ResetDigitalPWMData(int32_t index) {
   SimDigitalPWMData[index].ResetData();
 }
diff --git a/hal/src/main/native/sim/mockdata/DigitalPWMDataInternal.h b/hal/src/main/native/sim/mockdata/DigitalPWMDataInternal.h
index 09d5903..f2c7a5e 100644
--- a/hal/src/main/native/sim/mockdata/DigitalPWMDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/DigitalPWMDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/DigitalPWMData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/DigitalPWMData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class DigitalPWMData {
diff --git a/hal/src/main/native/sim/mockdata/DriverStationData.cpp b/hal/src/main/native/sim/mockdata/DriverStationData.cpp
index ece98c8..dae1dd4 100644
--- a/hal/src/main/native/sim/mockdata/DriverStationData.cpp
+++ b/hal/src/main/native/sim/mockdata/DriverStationData.cpp
@@ -1,25 +1,15 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include <cstdlib>
 #include <cstring>
-#include <string>
 
 #include "DriverStationDataInternal.h"
 #include "hal/DriverStation.h"
 
-namespace hal {
-struct JoystickOutputStore {
-  int64_t outputs = 0;
-  int32_t leftRumble = 0;
-  int32_t rightRumble = 0;
-};
-}  // namespace hal
-
 using namespace hal;
 
 namespace hal {
@@ -47,103 +37,322 @@
 
   {
     std::scoped_lock lock(m_joystickDataMutex);
-    m_joystickAxes = std::make_unique<HAL_JoystickAxes[]>(6);
-    m_joystickPOVs = std::make_unique<HAL_JoystickPOVs[]>(6);
-    m_joystickButtons = std::make_unique<HAL_JoystickButtons[]>(6);
-    m_joystickOutputs = std::make_unique<JoystickOutputStore[]>(6);
-    m_joystickDescriptor = std::make_unique<HAL_JoystickDescriptor[]>(6);
-
-    for (int i = 0; i < 6; i++) {
-      m_joystickAxes[i].count = 0;
-      m_joystickPOVs[i].count = 0;
-      m_joystickButtons[i].count = 0;
-      m_joystickDescriptor[i].isXbox = 0;
-      m_joystickDescriptor[i].type = -1;
-      m_joystickDescriptor[i].name[0] = '\0';
+    m_joystickAxesCallbacks.Reset();
+    m_joystickPOVsCallbacks.Reset();
+    m_joystickButtonsCallbacks.Reset();
+    m_joystickOutputsCallbacks.Reset();
+    m_joystickDescriptorCallbacks.Reset();
+    for (int i = 0; i < kNumJoysticks; i++) {
+      m_joystickData[i].axes = HAL_JoystickAxes{};
+      m_joystickData[i].povs = HAL_JoystickPOVs{};
+      m_joystickData[i].buttons = HAL_JoystickButtons{};
+      m_joystickData[i].descriptor = HAL_JoystickDescriptor{};
+      m_joystickData[i].descriptor.type = -1;
+      m_joystickData[i].descriptor.name[0] = '\0';
     }
   }
   {
     std::scoped_lock lock(m_matchInfoMutex);
-
-    m_matchInfo = std::make_unique<HAL_MatchInfo>();
+    m_matchInfoCallbacks.Reset();
+    m_matchInfo = HAL_MatchInfo{};
   }
+  m_newDataCallbacks.Reset();
 }
 
-void DriverStationData::GetJoystickAxes(int32_t joystickNum,
-                                        HAL_JoystickAxes* axes) {
-  std::scoped_lock lock(m_joystickDataMutex);
-  *axes = m_joystickAxes[joystickNum];
-}
-void DriverStationData::GetJoystickPOVs(int32_t joystickNum,
-                                        HAL_JoystickPOVs* povs) {
-  std::scoped_lock lock(m_joystickDataMutex);
-  *povs = m_joystickPOVs[joystickNum];
-}
-void DriverStationData::GetJoystickButtons(int32_t joystickNum,
-                                           HAL_JoystickButtons* buttons) {
-  std::scoped_lock lock(m_joystickDataMutex);
-  *buttons = m_joystickButtons[joystickNum];
-}
+#define DEFINE_CPPAPI_CALLBACKS(name, data, data2)                             \
+  int32_t DriverStationData::RegisterJoystick##name##Callback(                 \
+      int32_t joystickNum, HAL_Joystick##name##Callback callback, void* param, \
+      HAL_Bool initialNotify) {                                                \
+    if (joystickNum < 0 || joystickNum >= kNumJoysticks) return 0;             \
+    std::scoped_lock lock(m_joystickDataMutex);                                \
+    int32_t uid = m_joystick##name##Callbacks.Register(callback, param);       \
+    if (initialNotify) {                                                       \
+      callback(GetJoystick##name##Name(), param, joystickNum,                  \
+               &m_joystickData[joystickNum].data##data2);                      \
+    }                                                                          \
+    return uid;                                                                \
+  }                                                                            \
+                                                                               \
+  void DriverStationData::CancelJoystick##name##Callback(int32_t uid) {        \
+    m_joystick##name##Callbacks.Cancel(uid);                                   \
+  }
+
+#define DEFINE_CPPAPI(name, data, data2)                                   \
+  DEFINE_CPPAPI_CALLBACKS(name, data, data2)                               \
+                                                                           \
+  void DriverStationData::GetJoystick##name(int32_t joystickNum,           \
+                                            HAL_Joystick##name* d) {       \
+    if (joystickNum < 0 || joystickNum >= kNumJoysticks) return;           \
+    std::scoped_lock lock(m_joystickDataMutex);                            \
+    *d = m_joystickData[joystickNum].data##data2;                          \
+  }                                                                        \
+                                                                           \
+  void DriverStationData::SetJoystick##name(int32_t joystickNum,           \
+                                            const HAL_Joystick##name* d) { \
+    if (joystickNum < 0 || joystickNum >= kNumJoysticks) return;           \
+    std::scoped_lock lock(m_joystickDataMutex);                            \
+    m_joystickData[joystickNum].data##data2 = *d;                          \
+    m_joystick##name##Callbacks(joystickNum, d);                           \
+  }
+
+DEFINE_CPPAPI(Axes, axes, )
+DEFINE_CPPAPI(POVs, povs, )
+DEFINE_CPPAPI(Buttons, buttons, )
+
+DEFINE_CPPAPI_CALLBACKS(Descriptor, descriptor, )
+
 void DriverStationData::GetJoystickDescriptor(
     int32_t joystickNum, HAL_JoystickDescriptor* descriptor) {
+  if (joystickNum < 0 || joystickNum >= kNumJoysticks) return;
   std::scoped_lock lock(m_joystickDataMutex);
-  *descriptor = m_joystickDescriptor[joystickNum];
-  // Always ensure name is null terminated
-  descriptor->name[255] = '\0';
-}
-void DriverStationData::GetJoystickOutputs(int32_t joystickNum,
-                                           int64_t* outputs,
-                                           int32_t* leftRumble,
-                                           int32_t* rightRumble) {
-  std::scoped_lock lock(m_joystickDataMutex);
-  *leftRumble = m_joystickOutputs[joystickNum].leftRumble;
-  *outputs = m_joystickOutputs[joystickNum].outputs;
-  *rightRumble = m_joystickOutputs[joystickNum].rightRumble;
-}
-void DriverStationData::GetMatchInfo(HAL_MatchInfo* info) {
-  std::scoped_lock lock(m_matchInfoMutex);
-  *info = *m_matchInfo;
-}
-
-void DriverStationData::SetJoystickAxes(int32_t joystickNum,
-                                        const HAL_JoystickAxes* axes) {
-  std::scoped_lock lock(m_joystickDataMutex);
-  m_joystickAxes[joystickNum] = *axes;
-}
-void DriverStationData::SetJoystickPOVs(int32_t joystickNum,
-                                        const HAL_JoystickPOVs* povs) {
-  std::scoped_lock lock(m_joystickDataMutex);
-  m_joystickPOVs[joystickNum] = *povs;
-}
-void DriverStationData::SetJoystickButtons(int32_t joystickNum,
-                                           const HAL_JoystickButtons* buttons) {
-  std::scoped_lock lock(m_joystickDataMutex);
-  m_joystickButtons[joystickNum] = *buttons;
+  *descriptor = m_joystickData[joystickNum].descriptor;
 }
 
 void DriverStationData::SetJoystickDescriptor(
     int32_t joystickNum, const HAL_JoystickDescriptor* descriptor) {
+  if (joystickNum < 0 || joystickNum >= kNumJoysticks) return;
   std::scoped_lock lock(m_joystickDataMutex);
-  m_joystickDescriptor[joystickNum] = *descriptor;
+  m_joystickData[joystickNum].descriptor = *descriptor;
+  // Always ensure name is null terminated
+  m_joystickData[joystickNum].descriptor.name[255] = '\0';
+  m_joystickDescriptorCallbacks(joystickNum, descriptor);
+}
+
+int32_t DriverStationData::RegisterJoystickOutputsCallback(
+    int32_t joystickNum, HAL_JoystickOutputsCallback callback, void* param,
+    HAL_Bool initialNotify) {
+  if (joystickNum < 0 || joystickNum >= DriverStationData::kNumJoysticks)
+    return 0;
+  std::scoped_lock lock(m_joystickDataMutex);
+  int32_t uid = m_joystickOutputsCallbacks.Register(callback, param);
+  if (initialNotify) {
+    const auto& outputs = m_joystickData[joystickNum].outputs;
+    callback(DriverStationData::GetJoystickOutputsName(), param, joystickNum,
+             outputs.outputs, outputs.leftRumble, outputs.rightRumble);
+  }
+  return uid;
+}
+
+void DriverStationData::CancelJoystickOutputsCallback(int32_t uid) {
+  m_joystickOutputsCallbacks.Cancel(uid);
+}
+
+void DriverStationData::GetJoystickOutputs(int32_t joystickNum,
+                                           int64_t* outputs,
+                                           int32_t* leftRumble,
+                                           int32_t* rightRumble) {
+  if (joystickNum < 0 || joystickNum >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  *leftRumble = m_joystickData[joystickNum].outputs.leftRumble;
+  *outputs = m_joystickData[joystickNum].outputs.outputs;
+  *rightRumble = m_joystickData[joystickNum].outputs.rightRumble;
 }
 
 void DriverStationData::SetJoystickOutputs(int32_t joystickNum, int64_t outputs,
                                            int32_t leftRumble,
                                            int32_t rightRumble) {
+  if (joystickNum < 0 || joystickNum >= kNumJoysticks) return;
   std::scoped_lock lock(m_joystickDataMutex);
-  m_joystickOutputs[joystickNum].leftRumble = leftRumble;
-  m_joystickOutputs[joystickNum].outputs = outputs;
-  m_joystickOutputs[joystickNum].rightRumble = rightRumble;
+  m_joystickData[joystickNum].outputs.leftRumble = leftRumble;
+  m_joystickData[joystickNum].outputs.outputs = outputs;
+  m_joystickData[joystickNum].outputs.rightRumble = rightRumble;
+  m_joystickOutputsCallbacks(joystickNum, outputs, leftRumble, rightRumble);
+}
+
+int32_t DriverStationData::RegisterMatchInfoCallback(
+    HAL_MatchInfoCallback callback, void* param, HAL_Bool initialNotify) {
+  std::scoped_lock lock(m_matchInfoMutex);
+  int32_t uid = m_matchInfoCallbacks.Register(callback, param);
+  if (initialNotify) {
+    callback(GetMatchInfoName(), param, &m_matchInfo);
+  }
+  return uid;
+}
+
+void DriverStationData::CancelMatchInfoCallback(int32_t uid) {
+  m_matchInfoCallbacks.Cancel(uid);
+}
+
+void DriverStationData::GetMatchInfo(HAL_MatchInfo* info) {
+  std::scoped_lock lock(m_matchInfoMutex);
+  *info = m_matchInfo;
 }
 
 void DriverStationData::SetMatchInfo(const HAL_MatchInfo* info) {
   std::scoped_lock lock(m_matchInfoMutex);
-  *m_matchInfo = *info;
-  *(std::end(m_matchInfo->eventName) - 1) = '\0';
+  m_matchInfo = *info;
+  *(std::end(m_matchInfo.eventName) - 1) = '\0';
+  m_matchInfoCallbacks(info);
+}
+
+int32_t DriverStationData::RegisterNewDataCallback(HAL_NotifyCallback callback,
+                                                   void* param,
+                                                   HAL_Bool initialNotify) {
+  int32_t uid = m_newDataCallbacks.Register(callback, param);
+  if (initialNotify) {
+    HAL_Value empty;
+    empty.type = HAL_UNASSIGNED;
+    callback(GetNewDataName(), param, &empty);
+  }
+  return uid;
+}
+
+void DriverStationData::CancelNewDataCallback(int32_t uid) {
+  m_newDataCallbacks.Cancel(uid);
+}
+
+void DriverStationData::CallNewDataCallbacks() {
+  HAL_Value empty;
+  empty.type = HAL_UNASSIGNED;
+  m_newDataCallbacks(&empty);
 }
 
 void DriverStationData::NotifyNewData() { HAL_ReleaseDSMutex(); }
 
+void DriverStationData::SetJoystickButton(int32_t stick, int32_t button,
+                                          HAL_Bool state) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  if (state)
+    m_joystickData[stick].buttons.buttons |= 1 << (button - 1);
+  else
+    m_joystickData[stick].buttons.buttons &= ~(1 << (button - 1));
+  m_joystickButtonsCallbacks(stick, &m_joystickData[stick].buttons);
+}
+
+void DriverStationData::SetJoystickAxis(int32_t stick, int32_t axis,
+                                        double value) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  if (axis < 0 || axis >= HAL_kMaxJoystickAxes) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].axes.axes[axis] = value;
+  m_joystickAxesCallbacks(stick, &m_joystickData[stick].axes);
+}
+
+void DriverStationData::SetJoystickPOV(int32_t stick, int32_t pov,
+                                       int32_t value) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  if (pov < 0 || pov >= HAL_kMaxJoystickPOVs) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].povs.povs[pov] = value;
+  m_joystickPOVsCallbacks(stick, &m_joystickData[stick].povs);
+}
+
+void DriverStationData::SetJoystickButtons(int32_t stick, uint32_t buttons) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].buttons.buttons = buttons;
+  m_joystickButtonsCallbacks(stick, &m_joystickData[stick].buttons);
+}
+
+void DriverStationData::SetJoystickAxisCount(int32_t stick, int32_t count) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].axes.count = count;
+  m_joystickData[stick].descriptor.axisCount = count;
+  m_joystickAxesCallbacks(stick, &m_joystickData[stick].axes);
+  m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
+}
+
+void DriverStationData::SetJoystickPOVCount(int32_t stick, int32_t count) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].povs.count = count;
+  m_joystickData[stick].descriptor.povCount = count;
+  m_joystickPOVsCallbacks(stick, &m_joystickData[stick].povs);
+  m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
+}
+
+void DriverStationData::SetJoystickButtonCount(int32_t stick, int32_t count) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].buttons.count = count;
+  m_joystickData[stick].descriptor.buttonCount = count;
+  m_joystickButtonsCallbacks(stick, &m_joystickData[stick].buttons);
+  m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
+}
+
+void DriverStationData::GetJoystickCounts(int32_t stick, int32_t* axisCount,
+                                          int32_t* buttonCount,
+                                          int32_t* povCount) {
+  if (stick < 0 || stick >= kNumJoysticks) {
+    *axisCount = 0;
+    *buttonCount = 0;
+    *povCount = 0;
+    return;
+  }
+  std::scoped_lock lock(m_joystickDataMutex);
+  *axisCount = m_joystickData[stick].axes.count;
+  *buttonCount = m_joystickData[stick].buttons.count;
+  *povCount = m_joystickData[stick].povs.count;
+}
+
+void DriverStationData::SetJoystickIsXbox(int32_t stick, HAL_Bool isXbox) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].descriptor.isXbox = isXbox;
+  m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
+}
+
+void DriverStationData::SetJoystickType(int32_t stick, int32_t type) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].descriptor.type = type;
+  m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
+}
+
+void DriverStationData::SetJoystickName(int32_t stick, const char* name) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  std::strncpy(m_joystickData[stick].descriptor.name, name,
+               sizeof(m_joystickData[stick].descriptor.name) - 1);
+  *(std::end(m_joystickData[stick].descriptor.name) - 1) = '\0';
+  m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
+}
+
+void DriverStationData::SetJoystickAxisType(int32_t stick, int32_t axis,
+                                            int32_t type) {
+  if (stick < 0 || stick >= kNumJoysticks) return;
+  if (axis < 0 || axis >= HAL_kMaxJoystickAxes) return;
+  std::scoped_lock lock(m_joystickDataMutex);
+  m_joystickData[stick].descriptor.axisTypes[axis] = type;
+  m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
+}
+
+void DriverStationData::SetGameSpecificMessage(const char* message) {
+  std::scoped_lock lock(m_matchInfoMutex);
+  std::strncpy(reinterpret_cast<char*>(m_matchInfo.gameSpecificMessage),
+               message, sizeof(m_matchInfo.gameSpecificMessage) - 1);
+  *(std::end(m_matchInfo.gameSpecificMessage) - 1) = '\0';
+  m_matchInfo.gameSpecificMessageSize = std::strlen(message);
+  m_matchInfoCallbacks(&m_matchInfo);
+}
+
+void DriverStationData::SetEventName(const char* name) {
+  std::scoped_lock lock(m_matchInfoMutex);
+  std::strncpy(m_matchInfo.eventName, name, sizeof(m_matchInfo.eventName) - 1);
+  *(std::end(m_matchInfo.eventName) - 1) = '\0';
+  m_matchInfoCallbacks(&m_matchInfo);
+}
+
+void DriverStationData::SetMatchType(HAL_MatchType type) {
+  std::scoped_lock lock(m_matchInfoMutex);
+  m_matchInfo.matchType = type;
+  m_matchInfoCallbacks(&m_matchInfo);
+}
+
+void DriverStationData::SetMatchNumber(int32_t matchNumber) {
+  std::scoped_lock lock(m_matchInfoMutex);
+  m_matchInfo.matchNumber = matchNumber;
+  m_matchInfoCallbacks(&m_matchInfo);
+}
+
+void DriverStationData::SetReplayNumber(int32_t replayNumber) {
+  std::scoped_lock lock(m_matchInfoMutex);
+  m_matchInfo.replayNumber = replayNumber;
+  m_matchInfoCallbacks(&m_matchInfo);
+}
+
 extern "C" {
 void HALSIM_ResetDriverStationData(void) { SimDriverStationData->ResetData(); }
 
@@ -160,21 +369,42 @@
 DEFINE_CAPI(HAL_AllianceStationID, AllianceStationId, allianceStationId)
 DEFINE_CAPI(double, MatchTime, matchTime)
 
-void HALSIM_SetJoystickAxes(int32_t joystickNum, const HAL_JoystickAxes* axes) {
-  SimDriverStationData->SetJoystickAxes(joystickNum, axes);
+#undef DEFINE_CAPI
+#define DEFINE_CAPI(name, data)                                                \
+  int32_t HALSIM_RegisterJoystick##name##Callback(                             \
+      int32_t joystickNum, HAL_Joystick##name##Callback callback, void* param, \
+      HAL_Bool initialNotify) {                                                \
+    return SimDriverStationData->RegisterJoystick##name##Callback(             \
+        joystickNum, callback, param, initialNotify);                          \
+  }                                                                            \
+                                                                               \
+  void HALSIM_CancelJoystick##name##Callback(int32_t uid) {                    \
+    SimDriverStationData->CancelJoystick##name##Callback(uid);                 \
+  }                                                                            \
+                                                                               \
+  void HALSIM_GetJoystick##name(int32_t joystickNum, HAL_Joystick##name* d) {  \
+    SimDriverStationData->GetJoystick##name(joystickNum, d);                   \
+  }                                                                            \
+                                                                               \
+  void HALSIM_SetJoystick##name(int32_t joystickNum,                           \
+                                const HAL_Joystick##name* d) {                 \
+    SimDriverStationData->SetJoystick##name(joystickNum, d);                   \
+  }
+
+DEFINE_CAPI(Axes, axes)
+DEFINE_CAPI(POVs, povs)
+DEFINE_CAPI(Buttons, buttons)
+DEFINE_CAPI(Descriptor, descriptor)
+
+int32_t HALSIM_RegisterJoystickOutputsCallback(
+    int32_t joystickNum, HAL_JoystickOutputsCallback callback, void* param,
+    HAL_Bool initialNotify) {
+  return SimDriverStationData->RegisterJoystickOutputsCallback(
+      joystickNum, callback, param, initialNotify);
 }
 
-void HALSIM_SetJoystickPOVs(int32_t joystickNum, const HAL_JoystickPOVs* povs) {
-  SimDriverStationData->SetJoystickPOVs(joystickNum, povs);
-}
-
-void HALSIM_SetJoystickButtons(int32_t joystickNum,
-                               const HAL_JoystickButtons* buttons) {
-  SimDriverStationData->SetJoystickButtons(joystickNum, buttons);
-}
-void HALSIM_SetJoystickDescriptor(int32_t joystickNum,
-                                  const HAL_JoystickDescriptor* descriptor) {
-  SimDriverStationData->SetJoystickDescriptor(joystickNum, descriptor);
+void HALSIM_CancelJoystickOutputsCallback(int32_t uid) {
+  SimDriverStationData->CancelJoystickOutputsCallback(uid);
 }
 
 void HALSIM_GetJoystickOutputs(int32_t joystickNum, int64_t* outputs,
@@ -183,14 +413,115 @@
                                            rightRumble);
 }
 
+void HALSIM_SetJoystickOutputs(int32_t joystickNum, int64_t outputs,
+                               int32_t leftRumble, int32_t rightRumble) {
+  SimDriverStationData->SetJoystickOutputs(joystickNum, outputs, leftRumble,
+                                           rightRumble);
+}
+
+int32_t HALSIM_RegisterMatchInfoCallback(HAL_MatchInfoCallback callback,
+                                         void* param, HAL_Bool initialNotify) {
+  return SimDriverStationData->RegisterMatchInfoCallback(callback, param,
+                                                         initialNotify);
+}
+
+void HALSIM_CancelMatchInfoCallback(int32_t uid) {
+  SimDriverStationData->CancelMatchInfoCallback(uid);
+}
+
+void HALSIM_GetMatchInfo(HAL_MatchInfo* info) {
+  SimDriverStationData->GetMatchInfo(info);
+}
+
 void HALSIM_SetMatchInfo(const HAL_MatchInfo* info) {
   SimDriverStationData->SetMatchInfo(info);
 }
 
+int32_t HALSIM_RegisterDriverStationNewDataCallback(HAL_NotifyCallback callback,
+                                                    void* param,
+                                                    HAL_Bool initialNotify) {
+  return SimDriverStationData->RegisterNewDataCallback(callback, param,
+                                                       initialNotify);
+}
+
+void HALSIM_CancelDriverStationNewDataCallback(int32_t uid) {
+  SimDriverStationData->CancelNewDataCallback(uid);
+}
+
 void HALSIM_NotifyDriverStationNewData(void) {
   SimDriverStationData->NotifyNewData();
 }
 
+void HALSIM_SetJoystickButton(int32_t stick, int32_t button, HAL_Bool state) {
+  SimDriverStationData->SetJoystickButton(stick, button, state);
+}
+
+void HALSIM_SetJoystickAxis(int32_t stick, int32_t axis, double value) {
+  SimDriverStationData->SetJoystickAxis(stick, axis, value);
+}
+
+void HALSIM_SetJoystickPOV(int32_t stick, int32_t pov, int32_t value) {
+  SimDriverStationData->SetJoystickPOV(stick, pov, value);
+}
+
+void HALSIM_SetJoystickButtonsValue(int32_t stick, uint32_t buttons) {
+  SimDriverStationData->SetJoystickButtons(stick, buttons);
+}
+
+void HALSIM_SetJoystickAxisCount(int32_t stick, int32_t count) {
+  SimDriverStationData->SetJoystickAxisCount(stick, count);
+}
+
+void HALSIM_SetJoystickPOVCount(int32_t stick, int32_t count) {
+  SimDriverStationData->SetJoystickPOVCount(stick, count);
+}
+
+void HALSIM_SetJoystickButtonCount(int32_t stick, int32_t count) {
+  SimDriverStationData->SetJoystickButtonCount(stick, count);
+}
+
+void HALSIM_GetJoystickCounts(int32_t stick, int32_t* axisCount,
+                              int32_t* buttonCount, int32_t* povCount) {
+  SimDriverStationData->GetJoystickCounts(stick, axisCount, buttonCount,
+                                          povCount);
+}
+
+void HALSIM_SetJoystickIsXbox(int32_t stick, HAL_Bool isXbox) {
+  SimDriverStationData->SetJoystickIsXbox(stick, isXbox);
+}
+
+void HALSIM_SetJoystickType(int32_t stick, int32_t type) {
+  SimDriverStationData->SetJoystickType(stick, type);
+}
+
+void HALSIM_SetJoystickName(int32_t stick, const char* name) {
+  SimDriverStationData->SetJoystickName(stick, name);
+}
+
+void HALSIM_SetJoystickAxisType(int32_t stick, int32_t axis, int32_t type) {
+  SimDriverStationData->SetJoystickAxisType(stick, axis, type);
+}
+
+void HALSIM_SetGameSpecificMessage(const char* message) {
+  SimDriverStationData->SetGameSpecificMessage(message);
+}
+
+void HALSIM_SetEventName(const char* name) {
+  SimDriverStationData->SetEventName(name);
+}
+
+void HALSIM_SetMatchType(HAL_MatchType type) {
+  SimDriverStationData->SetMatchType(type);
+}
+
+void HALSIM_SetMatchNumber(int32_t matchNumber) {
+  SimDriverStationData->SetMatchNumber(matchNumber);
+}
+
+void HALSIM_SetReplayNumber(int32_t replayNumber) {
+  SimDriverStationData->SetReplayNumber(replayNumber);
+}
+
 #define REGISTER(NAME) \
   SimDriverStationData->NAME.RegisterCallback(callback, param, initialNotify)
 
diff --git a/hal/src/main/native/sim/mockdata/DriverStationDataInternal.h b/hal/src/main/native/sim/mockdata/DriverStationDataInternal.h
index fdeb3c6..2a50742 100644
--- a/hal/src/main/native/sim/mockdata/DriverStationDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/DriverStationDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -11,11 +11,11 @@
 
 #include <wpi/spinlock.h>
 
-#include "mockdata/DriverStationData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/DriverStationData.h"
+#include "hal/simulation/SimCallbackRegistry.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
-struct JoystickOutputStore;
 
 class DriverStationData {
   HAL_SIMDATAVALUE_DEFINE_NAME(Enabled)
@@ -26,6 +26,13 @@
   HAL_SIMDATAVALUE_DEFINE_NAME(DsAttached)
   HAL_SIMDATAVALUE_DEFINE_NAME(AllianceStationId)
   HAL_SIMDATAVALUE_DEFINE_NAME(MatchTime)
+  HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickAxes)
+  HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickPOVs)
+  HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickButtons)
+  HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickDescriptor)
+  HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickOutputs)
+  HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(MatchInfo)
+  HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(NewData)
 
   static LLVM_ATTRIBUTE_ALWAYS_INLINE HAL_Value
   MakeAllianceStationIdValue(HAL_AllianceStationID value) {
@@ -36,28 +43,82 @@
   DriverStationData();
   void ResetData();
 
+  int32_t RegisterJoystickAxesCallback(int32_t joystickNum,
+                                       HAL_JoystickAxesCallback callback,
+                                       void* param, HAL_Bool initialNotify);
+  void CancelJoystickAxesCallback(int32_t uid);
   void GetJoystickAxes(int32_t joystickNum, HAL_JoystickAxes* axes);
-  void GetJoystickPOVs(int32_t joystickNum, HAL_JoystickPOVs* povs);
-  void GetJoystickButtons(int32_t joystickNum, HAL_JoystickButtons* buttons);
-  void GetJoystickDescriptor(int32_t joystickNum,
-                             HAL_JoystickDescriptor* descriptor);
-  void GetJoystickOutputs(int32_t joystickNum, int64_t* outputs,
-                          int32_t* leftRumble, int32_t* rightRumble);
-  void GetMatchInfo(HAL_MatchInfo* info);
-  void FreeMatchInfo(const HAL_MatchInfo* info);
-
   void SetJoystickAxes(int32_t joystickNum, const HAL_JoystickAxes* axes);
+
+  int32_t RegisterJoystickPOVsCallback(int32_t joystickNum,
+                                       HAL_JoystickPOVsCallback callback,
+                                       void* param, HAL_Bool initialNotify);
+  void CancelJoystickPOVsCallback(int32_t uid);
+  void GetJoystickPOVs(int32_t joystickNum, HAL_JoystickPOVs* povs);
   void SetJoystickPOVs(int32_t joystickNum, const HAL_JoystickPOVs* povs);
+
+  int32_t RegisterJoystickButtonsCallback(int32_t joystickNum,
+                                          HAL_JoystickButtonsCallback callback,
+                                          void* param, HAL_Bool initialNotify);
+  void CancelJoystickButtonsCallback(int32_t uid);
+  void GetJoystickButtons(int32_t joystickNum, HAL_JoystickButtons* buttons);
   void SetJoystickButtons(int32_t joystickNum,
                           const HAL_JoystickButtons* buttons);
+
+  int32_t RegisterJoystickDescriptorCallback(
+      int32_t joystickNum, HAL_JoystickDescriptorCallback callback, void* param,
+      HAL_Bool initialNotify);
+  void CancelJoystickDescriptorCallback(int32_t uid);
+  void GetJoystickDescriptor(int32_t joystickNum,
+                             HAL_JoystickDescriptor* descriptor);
   void SetJoystickDescriptor(int32_t joystickNum,
                              const HAL_JoystickDescriptor* descriptor);
+
+  int32_t RegisterJoystickOutputsCallback(int32_t joystickNum,
+                                          HAL_JoystickOutputsCallback callback,
+                                          void* param, HAL_Bool initialNotify);
+  void CancelJoystickOutputsCallback(int32_t uid);
+  void GetJoystickOutputs(int32_t joystickNum, int64_t* outputs,
+                          int32_t* leftRumble, int32_t* rightRumble);
   void SetJoystickOutputs(int32_t joystickNum, int64_t outputs,
                           int32_t leftRumble, int32_t rightRumble);
+
+  int32_t RegisterMatchInfoCallback(HAL_MatchInfoCallback callback, void* param,
+                                    HAL_Bool initialNotify);
+  void CancelMatchInfoCallback(int32_t uid);
+  void GetMatchInfo(HAL_MatchInfo* info);
   void SetMatchInfo(const HAL_MatchInfo* info);
 
+  void FreeMatchInfo(const HAL_MatchInfo* info);
+
+  int32_t RegisterNewDataCallback(HAL_NotifyCallback callback, void* param,
+                                  HAL_Bool initialNotify);
+  void CancelNewDataCallback(int32_t uid);
+  void CallNewDataCallbacks();
+
   void NotifyNewData();
 
+  void SetJoystickButton(int32_t stick, int32_t button, HAL_Bool state);
+  void SetJoystickAxis(int32_t stick, int32_t axis, double value);
+  void SetJoystickPOV(int32_t stick, int32_t pov, int32_t value);
+  void SetJoystickButtons(int32_t stick, uint32_t buttons);
+  void SetJoystickAxisCount(int32_t stick, int32_t count);
+  void SetJoystickPOVCount(int32_t stick, int32_t count);
+  void SetJoystickButtonCount(int32_t stick, int32_t count);
+  void GetJoystickCounts(int32_t stick, int32_t* axisCount,
+                         int32_t* buttonCount, int32_t* povCount);
+
+  void SetJoystickIsXbox(int32_t stick, HAL_Bool isXbox);
+  void SetJoystickType(int32_t stick, int32_t type);
+  void SetJoystickName(int32_t stick, const char* name);
+  void SetJoystickAxisType(int32_t stick, int32_t axis, int32_t type);
+
+  void SetGameSpecificMessage(const char* message);
+  void SetEventName(const char* name);
+  void SetMatchType(HAL_MatchType type);
+  void SetMatchNumber(int32_t matchNumber);
+  void SetReplayNumber(int32_t replayNumber);
+
   SimDataValue<HAL_Bool, HAL_MakeBoolean, GetEnabledName> enabled{false};
   SimDataValue<HAL_Bool, HAL_MakeBoolean, GetAutonomousName> autonomous{false};
   SimDataValue<HAL_Bool, HAL_MakeBoolean, GetTestName> test{false};
@@ -71,16 +132,40 @@
   SimDataValue<double, HAL_MakeDouble, GetMatchTimeName> matchTime{0.0};
 
  private:
+  SimCallbackRegistry<HAL_JoystickAxesCallback, GetJoystickAxesName>
+      m_joystickAxesCallbacks;
+  SimCallbackRegistry<HAL_JoystickPOVsCallback, GetJoystickPOVsName>
+      m_joystickPOVsCallbacks;
+  SimCallbackRegistry<HAL_JoystickButtonsCallback, GetJoystickButtonsName>
+      m_joystickButtonsCallbacks;
+  SimCallbackRegistry<HAL_JoystickOutputsCallback, GetJoystickOutputsName>
+      m_joystickOutputsCallbacks;
+  SimCallbackRegistry<HAL_JoystickDescriptorCallback, GetJoystickDescriptorName>
+      m_joystickDescriptorCallbacks;
+  SimCallbackRegistry<HAL_MatchInfoCallback, GetMatchInfoName>
+      m_matchInfoCallbacks;
+  SimCallbackRegistry<HAL_NotifyCallback, GetNewDataName> m_newDataCallbacks;
+
+  struct JoystickOutputStore {
+    int64_t outputs = 0;
+    int32_t leftRumble = 0;
+    int32_t rightRumble = 0;
+  };
+
+  struct JoystickData {
+    HAL_JoystickAxes axes;
+    HAL_JoystickPOVs povs;
+    HAL_JoystickButtons buttons;
+    JoystickOutputStore outputs;
+    HAL_JoystickDescriptor descriptor;
+  };
+
+  static constexpr int kNumJoysticks = 6;
   wpi::spinlock m_joystickDataMutex;
+  JoystickData m_joystickData[kNumJoysticks];
+
   wpi::spinlock m_matchInfoMutex;
-
-  std::unique_ptr<HAL_JoystickAxes[]> m_joystickAxes;
-  std::unique_ptr<HAL_JoystickPOVs[]> m_joystickPOVs;
-  std::unique_ptr<HAL_JoystickButtons[]> m_joystickButtons;
-
-  std::unique_ptr<JoystickOutputStore[]> m_joystickOutputs;
-  std::unique_ptr<HAL_JoystickDescriptor[]> m_joystickDescriptor;
-  std::unique_ptr<HAL_MatchInfo> m_matchInfo;
+  HAL_MatchInfo m_matchInfo;
 };
 extern DriverStationData* SimDriverStationData;
 }  // namespace hal
diff --git a/hal/src/main/native/sim/mockdata/DutyCycleData.cpp b/hal/src/main/native/sim/mockdata/DutyCycleData.cpp
index 04806e0..660522d 100644
--- a/hal/src/main/native/sim/mockdata/DutyCycleData.cpp
+++ b/hal/src/main/native/sim/mockdata/DutyCycleData.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -30,6 +30,15 @@
 }
 
 extern "C" {
+int32_t HALSIM_FindDutyCycleForChannel(int32_t channel) {
+  for (int i = 0; i < kNumDutyCycles; ++i) {
+    if (SimDutyCycleData[i].initialized &&
+        SimDutyCycleData[i].digitalChannel == channel)
+      return i;
+  }
+  return -1;
+}
+
 void HALSIM_ResetDutyCycleData(int32_t index) {
   SimDutyCycleData[index].ResetData();
 }
diff --git a/hal/src/main/native/sim/mockdata/DutyCycleDataInternal.h b/hal/src/main/native/sim/mockdata/DutyCycleDataInternal.h
index 2f98b07..e69f9aa 100644
--- a/hal/src/main/native/sim/mockdata/DutyCycleDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/DutyCycleDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,8 +10,8 @@
 #include <atomic>
 #include <limits>
 
-#include "mockdata/DutyCycleData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/DutyCycleData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class DutyCycleData {
diff --git a/hal/src/main/native/sim/mockdata/EncoderData.cpp b/hal/src/main/native/sim/mockdata/EncoderData.cpp
index 33bd073..0b17ac3 100644
--- a/hal/src/main/native/sim/mockdata/EncoderData.cpp
+++ b/hal/src/main/native/sim/mockdata/EncoderData.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -36,6 +36,16 @@
 }
 
 extern "C" {
+int32_t HALSIM_FindEncoderForChannel(int32_t channel) {
+  for (int i = 0; i < kNumEncoders; ++i) {
+    if (!SimEncoderData[i].initialized) continue;
+    if (SimEncoderData[i].digitalChannelA == channel ||
+        SimEncoderData[i].digitalChannelB == channel)
+      return i;
+  }
+  return -1;
+}
+
 void HALSIM_ResetEncoderData(int32_t index) {
   SimEncoderData[index].ResetData();
 }
@@ -57,7 +67,6 @@
                                SimEncoderData, LOWERNAME)
 
 DEFINE_CAPI(HAL_Bool, Initialized, initialized)
-DEFINE_CAPI(int32_t, Count, count)
 DEFINE_CAPI(double, Period, period)
 DEFINE_CAPI(HAL_Bool, Reset, reset)
 DEFINE_CAPI(double, MaxPeriod, maxPeriod)
@@ -66,6 +75,54 @@
 DEFINE_CAPI(int32_t, SamplesToAverage, samplesToAverage)
 DEFINE_CAPI(double, DistancePerPulse, distancePerPulse)
 
+int32_t HALSIM_RegisterEncoderCountCallback(int32_t index,
+                                            HAL_NotifyCallback callback,
+                                            void* param,
+                                            HAL_Bool initialNotify) {
+  return SimEncoderData[index].count.RegisterCallback(callback, param,
+                                                      initialNotify);
+}
+
+void HALSIM_CancelEncoderCountCallback(int32_t index, int32_t uid) {
+  SimEncoderData[index].count.CancelCallback(uid);
+}
+
+int32_t HALSIM_GetEncoderCount(int32_t index) {
+  return SimEncoderData[index].count;
+}
+
+void HALSIM_SetEncoderCount(int32_t index, int32_t count) {
+  SimEncoderData[index].count = count;
+  SimEncoderData[index].reset = false;
+}
+
+void HALSIM_SetEncoderDistance(int32_t index, double distance) {
+  auto& simData = SimEncoderData[index];
+  simData.count = distance / simData.distancePerPulse;
+  simData.reset = false;
+}
+
+double HALSIM_GetEncoderDistance(int32_t index) {
+  auto& simData = SimEncoderData[index];
+  return simData.count * simData.distancePerPulse;
+}
+
+void HALSIM_SetEncoderRate(int32_t index, double rate) {
+  auto& simData = SimEncoderData[index];
+  if (rate == 0) {
+    simData.period = std::numeric_limits<double>::infinity();
+    return;
+  }
+
+  simData.period = simData.distancePerPulse / rate;
+}
+
+double HALSIM_GetEncoderRate(int32_t index) {
+  auto& simData = SimEncoderData[index];
+
+  return simData.distancePerPulse / simData.period;
+}
+
 #define REGISTER(NAME) \
   SimEncoderData[index].NAME.RegisterCallback(callback, param, initialNotify)
 
diff --git a/hal/src/main/native/sim/mockdata/EncoderDataInternal.h b/hal/src/main/native/sim/mockdata/EncoderDataInternal.h
index 389289c..3848f1d 100644
--- a/hal/src/main/native/sim/mockdata/EncoderDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/EncoderDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,8 +10,8 @@
 #include <atomic>
 #include <limits>
 
-#include "mockdata/EncoderData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/EncoderData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class EncoderData {
diff --git a/hal/src/main/native/sim/mockdata/I2CData.cpp b/hal/src/main/native/sim/mockdata/I2CData.cpp
index b228c3b..713064e 100644
--- a/hal/src/main/native/sim/mockdata/I2CData.cpp
+++ b/hal/src/main/native/sim/mockdata/I2CData.cpp
@@ -1,12 +1,10 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include <iostream>
-
 #include "../PortsInternal.h"
 #include "I2CDataInternal.h"
 
diff --git a/hal/src/main/native/sim/mockdata/I2CDataInternal.h b/hal/src/main/native/sim/mockdata/I2CDataInternal.h
index c799bb7..4822222 100644
--- a/hal/src/main/native/sim/mockdata/I2CDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/I2CDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,9 +7,9 @@
 
 #pragma once
 
-#include "mockdata/I2CData.h"
-#include "mockdata/SimCallbackRegistry.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/I2CData.h"
+#include "hal/simulation/SimCallbackRegistry.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class I2CData {
diff --git a/hal/src/main/native/sim/mockdata/PCMDataInternal.h b/hal/src/main/native/sim/mockdata/PCMDataInternal.h
index 0c7b99b..0d3752e 100644
--- a/hal/src/main/native/sim/mockdata/PCMDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/PCMDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,8 +8,8 @@
 #pragma once
 
 #include "../PortsInternal.h"
-#include "mockdata/PCMData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/PCMData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class PCMData {
diff --git a/hal/src/main/native/sim/mockdata/PDPDataInternal.h b/hal/src/main/native/sim/mockdata/PDPDataInternal.h
index 8d45416..3392eaa 100644
--- a/hal/src/main/native/sim/mockdata/PDPDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/PDPDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,8 +8,8 @@
 #pragma once
 
 #include "../PortsInternal.h"
-#include "mockdata/PDPData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/PDPData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class PDPData {
diff --git a/hal/src/main/native/sim/mockdata/PWMDataInternal.h b/hal/src/main/native/sim/mockdata/PWMDataInternal.h
index 248b7b3..028e25a 100644
--- a/hal/src/main/native/sim/mockdata/PWMDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/PWMDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/PWMData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/PWMData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class PWMData {
diff --git a/hal/src/main/native/sim/mockdata/RelayDataInternal.h b/hal/src/main/native/sim/mockdata/RelayDataInternal.h
index cb38388..d62ea2f 100644
--- a/hal/src/main/native/sim/mockdata/RelayDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/RelayDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/RelayData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/RelayData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class RelayData {
diff --git a/hal/src/main/native/sim/mockdata/RoboRioData.cpp b/hal/src/main/native/sim/mockdata/RoboRioData.cpp
index 5cff1d9..76406f5 100644
--- a/hal/src/main/native/sim/mockdata/RoboRioData.cpp
+++ b/hal/src/main/native/sim/mockdata/RoboRioData.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -13,8 +13,8 @@
 namespace hal {
 namespace init {
 void InitializeRoboRioData() {
-  static RoboRioData srrd[1];
-  ::hal::SimRoboRioData = srrd;
+  static RoboRioData srrd;
+  ::hal::SimRoboRioData = &srrd;
 }
 }  // namespace init
 }  // namespace hal
@@ -22,30 +22,28 @@
 RoboRioData* hal::SimRoboRioData;
 void RoboRioData::ResetData() {
   fpgaButton.Reset(false);
-  vInVoltage.Reset(0.0);
+  vInVoltage.Reset(12.0);
   vInCurrent.Reset(0.0);
   userVoltage6V.Reset(6.0);
   userCurrent6V.Reset(0.0);
-  userActive6V.Reset(false);
+  userActive6V.Reset(true);
   userVoltage5V.Reset(5.0);
   userCurrent5V.Reset(0.0);
-  userActive5V.Reset(false);
+  userActive5V.Reset(true);
   userVoltage3V3.Reset(3.3);
   userCurrent3V3.Reset(0.0);
-  userActive3V3.Reset(false);
+  userActive3V3.Reset(true);
   userFaults6V.Reset(0);
   userFaults5V.Reset(0);
   userFaults3V3.Reset(0);
 }
 
 extern "C" {
-void HALSIM_ResetRoboRioData(int32_t index) {
-  SimRoboRioData[index].ResetData();
-}
+void HALSIM_ResetRoboRioData(void) { SimRoboRioData->ResetData(); }
 
-#define DEFINE_CAPI(TYPE, CAPINAME, LOWERNAME)                  \
-  HAL_SIMDATAVALUE_DEFINE_CAPI(TYPE, HALSIM, RoboRio##CAPINAME, \
-                               SimRoboRioData, LOWERNAME)
+#define DEFINE_CAPI(TYPE, CAPINAME, LOWERNAME)                          \
+  HAL_SIMDATAVALUE_DEFINE_CAPI_NOINDEX(TYPE, HALSIM, RoboRio##CAPINAME, \
+                                       SimRoboRioData, LOWERNAME)
 
 DEFINE_CAPI(HAL_Bool, FPGAButton, fpgaButton)
 DEFINE_CAPI(double, VInVoltage, vInVoltage)
@@ -64,10 +62,9 @@
 DEFINE_CAPI(int32_t, UserFaults3V3, userFaults3V3)
 
 #define REGISTER(NAME) \
-  SimRoboRioData[index].NAME.RegisterCallback(callback, param, initialNotify)
+  SimRoboRioData->NAME.RegisterCallback(callback, param, initialNotify)
 
-void HALSIM_RegisterRoboRioAllCallbacks(int32_t index,
-                                        HAL_NotifyCallback callback,
+void HALSIM_RegisterRoboRioAllCallbacks(HAL_NotifyCallback callback,
                                         void* param, HAL_Bool initialNotify) {
   REGISTER(fpgaButton);
   REGISTER(vInVoltage);
diff --git a/hal/src/main/native/sim/mockdata/RoboRioDataInternal.h b/hal/src/main/native/sim/mockdata/RoboRioDataInternal.h
index cc74fa2..2fb3456 100644
--- a/hal/src/main/native/sim/mockdata/RoboRioDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/RoboRioDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/RoboRioData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/RoboRioData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class RoboRioData {
@@ -30,22 +30,22 @@
 
  public:
   SimDataValue<HAL_Bool, HAL_MakeBoolean, GetFPGAButtonName> fpgaButton{false};
-  SimDataValue<double, HAL_MakeDouble, GetVInVoltageName> vInVoltage{0.0};
+  SimDataValue<double, HAL_MakeDouble, GetVInVoltageName> vInVoltage{12.0};
   SimDataValue<double, HAL_MakeDouble, GetVInCurrentName> vInCurrent{0.0};
   SimDataValue<double, HAL_MakeDouble, GetUserVoltage6VName> userVoltage6V{6.0};
   SimDataValue<double, HAL_MakeDouble, GetUserCurrent6VName> userCurrent6V{0.0};
   SimDataValue<HAL_Bool, HAL_MakeBoolean, GetUserActive6VName> userActive6V{
-      false};
+      true};
   SimDataValue<double, HAL_MakeDouble, GetUserVoltage5VName> userVoltage5V{5.0};
   SimDataValue<double, HAL_MakeDouble, GetUserCurrent5VName> userCurrent5V{0.0};
   SimDataValue<HAL_Bool, HAL_MakeBoolean, GetUserActive5VName> userActive5V{
-      false};
+      true};
   SimDataValue<double, HAL_MakeDouble, GetUserVoltage3V3Name> userVoltage3V3{
       3.3};
   SimDataValue<double, HAL_MakeDouble, GetUserCurrent3V3Name> userCurrent3V3{
       0.0};
   SimDataValue<HAL_Bool, HAL_MakeBoolean, GetUserActive3V3Name> userActive3V3{
-      false};
+      true};
   SimDataValue<int32_t, HAL_MakeInt, GetUserFaults6VName> userFaults6V{0};
   SimDataValue<int32_t, HAL_MakeInt, GetUserFaults5VName> userFaults5V{0};
   SimDataValue<int32_t, HAL_MakeInt, GetUserFaults3V3Name> userFaults3V3{0};
diff --git a/hal/src/main/native/sim/mockdata/SPIAccelerometerDataInternal.h b/hal/src/main/native/sim/mockdata/SPIAccelerometerDataInternal.h
index 661e01b..59c6685 100644
--- a/hal/src/main/native/sim/mockdata/SPIAccelerometerDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/SPIAccelerometerDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,8 +7,8 @@
 
 #pragma once
 
-#include "mockdata/SPIAccelerometerData.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/SPIAccelerometerData.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 class SPIAccelerometerData {
diff --git a/hal/src/main/native/sim/mockdata/SPIData.cpp b/hal/src/main/native/sim/mockdata/SPIData.cpp
index 3afc606..106ab7f 100644
--- a/hal/src/main/native/sim/mockdata/SPIData.cpp
+++ b/hal/src/main/native/sim/mockdata/SPIData.cpp
@@ -1,12 +1,10 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include <iostream>
-
 #include "../PortsInternal.h"
 #include "SPIDataInternal.h"
 
diff --git a/hal/src/main/native/sim/mockdata/SPIDataInternal.h b/hal/src/main/native/sim/mockdata/SPIDataInternal.h
index 44868d2..ff0a6c9 100644
--- a/hal/src/main/native/sim/mockdata/SPIDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/SPIDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2017-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -7,9 +7,9 @@
 
 #pragma once
 
-#include "mockdata/SPIData.h"
-#include "mockdata/SimCallbackRegistry.h"
-#include "mockdata/SimDataValue.h"
+#include "hal/simulation/SPIData.h"
+#include "hal/simulation/SimCallbackRegistry.h"
+#include "hal/simulation/SimDataValue.h"
 
 namespace hal {
 
diff --git a/hal/src/main/native/sim/mockdata/SimDeviceData.cpp b/hal/src/main/native/sim/mockdata/SimDeviceData.cpp
index a703257..6c0a7f2 100644
--- a/hal/src/main/native/sim/mockdata/SimDeviceData.cpp
+++ b/hal/src/main/native/sim/mockdata/SimDeviceData.cpp
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include "mockdata/SimDeviceData.h"  // NOLINT(build/include_order)
+#include "hal/simulation/SimDeviceData.h"  // NOLINT(build/include_order)
 
 #include <algorithm>
 
@@ -49,12 +49,43 @@
   return deviceImpl->values[handle].get();
 }
 
+void SimDeviceData::SetDeviceEnabled(const char* prefix, bool enabled) {
+  std::scoped_lock lock(m_mutex);
+  auto it =
+      std::find_if(m_prefixEnabled.begin(), m_prefixEnabled.end(),
+                   [=](const auto& elem) { return elem.first == prefix; });
+  if (it != m_prefixEnabled.end()) {
+    it->second = enabled;
+    return;
+  }
+  m_prefixEnabled.emplace_back(prefix, enabled);
+  // keep it sorted by name
+  // string comparison sorts shorter before longer, so reverse the sort
+  std::sort(m_prefixEnabled.begin(), m_prefixEnabled.end(),
+            [](const auto& l, const auto& r) { return l.first >= r.first; });
+}
+
+bool SimDeviceData::IsDeviceEnabled(const char* name) {
+  std::scoped_lock lock(m_mutex);
+  for (const auto& elem : m_prefixEnabled) {
+    if (wpi::StringRef{name}.startswith(elem.first)) return elem.second;
+  }
+  return true;
+}
+
 HAL_SimDeviceHandle SimDeviceData::CreateDevice(const char* name) {
   std::scoped_lock lock(m_mutex);
 
+  // don't create if disabled
+  for (const auto& elem : m_prefixEnabled) {
+    if (wpi::StringRef{name}.startswith(elem.first)) {
+      if (elem.second) break;  // enabled
+      return 0;                // disabled
+    }
+  }
+
   // check for duplicates and don't overwrite them
-  auto it = m_deviceMap.find(name);
-  if (it != m_deviceMap.end()) return 0;
+  if (m_deviceMap.count(name) > 0) return 0;
 
   // don't allow more than 4096 devices (limit driven by 12-bit allocation in
   // value changed callback uid)
@@ -326,12 +357,21 @@
   std::scoped_lock lock(m_mutex);
   m_devices.clear();
   m_deviceMap.clear();
+  m_prefixEnabled.clear();
   m_deviceCreated.Reset();
   m_deviceFreed.Reset();
 }
 
 extern "C" {
 
+void HALSIM_SetSimDeviceEnabled(const char* prefix, HAL_Bool enabled) {
+  SimSimDeviceData->SetDeviceEnabled(prefix, enabled);
+}
+
+HAL_Bool HALSIM_IsSimDeviceEnabled(const char* name) {
+  return SimSimDeviceData->IsDeviceEnabled(name);
+}
+
 int32_t HALSIM_RegisterSimDeviceCreatedCallback(
     const char* prefix, void* param, HALSIM_SimDeviceCallback callback,
     HAL_Bool initialNotify) {
diff --git a/hal/src/main/native/sim/mockdata/SimDeviceDataInternal.h b/hal/src/main/native/sim/mockdata/SimDeviceDataInternal.h
index 2582eca..63c2288 100644
--- a/hal/src/main/native/sim/mockdata/SimDeviceDataInternal.h
+++ b/hal/src/main/native/sim/mockdata/SimDeviceDataInternal.h
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
+/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -19,8 +19,8 @@
 #include <wpi/spinlock.h>
 
 #include "hal/Value.h"
-#include "mockdata/SimCallbackRegistry.h"
-#include "mockdata/SimDeviceData.h"
+#include "hal/simulation/SimCallbackRegistry.h"
+#include "hal/simulation/SimDeviceData.h"
 
 namespace hal {
 
@@ -150,6 +150,7 @@
 
   wpi::UidVector<std::shared_ptr<Device>, 4> m_devices;
   wpi::StringMap<std::weak_ptr<Device>> m_deviceMap;
+  std::vector<std::pair<std::string, bool>> m_prefixEnabled;
 
   wpi::recursive_spinlock m_mutex;
 
@@ -161,6 +162,9 @@
   Value* LookupValue(HAL_SimValueHandle handle);
 
  public:
+  void SetDeviceEnabled(const char* prefix, bool enabled);
+  bool IsDeviceEnabled(const char* name);
+
   HAL_SimDeviceHandle CreateDevice(const char* name);
   void FreeDevice(HAL_SimDeviceHandle handle);
   HAL_SimValueHandle CreateValue(HAL_SimDeviceHandle device, const char* name,
diff --git a/hal/src/test/java/edu/wpi/first/hal/sim/AccelerometerSimTest.java b/hal/src/test/java/edu/wpi/first/hal/sim/AccelerometerSimTest.java
deleted file mode 100644
index 383165c..0000000
--- a/hal/src/test/java/edu/wpi/first/hal/sim/AccelerometerSimTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import org.junit.jupiter.api.Test;
-
-import edu.wpi.first.hal.AccelerometerJNI;
-import edu.wpi.first.hal.HAL;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class AccelerometerSimTest {
-  static class TriggeredStore {
-    public boolean m_wasTriggered;
-    public boolean m_setValue = true;
-  }
-
-  @Test
-  void testCallbacks() {
-    HAL.initialize(500, 0);
-    AccelerometerSim sim = new AccelerometerSim();
-    sim.resetData();
-
-    TriggeredStore store = new TriggeredStore();
-
-    try (CallbackStore cb = sim.registerActiveCallback((s, v) -> {
-      store.m_wasTriggered = true;
-      store.m_setValue = v.getBoolean();
-    }, false)) {
-      assertFalse(store.m_wasTriggered);
-      AccelerometerJNI.setAccelerometerActive(true);
-      assertTrue(store.m_wasTriggered);
-      assertTrue(store.m_setValue);
-    }
-  }
-}
diff --git a/hal/src/test/java/edu/wpi/first/hal/sim/SimDeviceSimTest.java b/hal/src/test/java/edu/wpi/first/hal/sim/SimDeviceSimTest.java
deleted file mode 100644
index 29452a0..0000000
--- a/hal/src/test/java/edu/wpi/first/hal/sim/SimDeviceSimTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-package edu.wpi.first.hal.sim;
-
-import org.junit.jupiter.api.Test;
-
-import edu.wpi.first.hal.SimBoolean;
-import edu.wpi.first.hal.SimDevice;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class SimDeviceSimTest {
-  @Test
-  void testBasic() {
-    SimDevice dev = SimDevice.create("test");
-    SimBoolean devBool = dev.createBoolean("bool", false, false);
-
-    SimDeviceSim sim = new SimDeviceSim("test");
-    SimBoolean simBool = sim.getBoolean("bool");
-
-    assertFalse(simBool.get());
-    simBool.set(true);
-    assertTrue(devBool.get());
-  }
-}
diff --git a/hal/src/test/native/cpp/can/CANTest.cpp b/hal/src/test/native/cpp/can/CANTest.cpp
index 6f5549c..427bb54 100644
--- a/hal/src/test/native/cpp/can/CANTest.cpp
+++ b/hal/src/test/native/cpp/can/CANTest.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -8,7 +8,7 @@
 #include "gtest/gtest.h"
 #include "hal/CANAPI.h"
 #include "hal/HAL.h"
-#include "mockdata/CanData.h"
+#include "hal/simulation/CanData.h"
 
 namespace hal {
 struct CANTestStore {
diff --git a/hal/src/test/native/cpp/mockdata/AnalogInDataTests.cpp b/hal/src/test/native/cpp/mockdata/AnalogInDataTests.cpp
index 791be79..c102480 100644
--- a/hal/src/test/native/cpp/mockdata/AnalogInDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/AnalogInDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/AnalogInput.h"
 #include "hal/HAL.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/AnalogInData.h"
+#include "hal/simulation/AnalogInData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/AnalogOutDataTests.cpp b/hal/src/test/native/cpp/mockdata/AnalogOutDataTests.cpp
index 8f6d6f0..d6c9f70 100644
--- a/hal/src/test/native/cpp/mockdata/AnalogOutDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/AnalogOutDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/AnalogOutput.h"
 #include "hal/HAL.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/AnalogOutData.h"
+#include "hal/simulation/AnalogOutData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/DIODataTests.cpp b/hal/src/test/native/cpp/mockdata/DIODataTests.cpp
index 19fe994..248f841 100644
--- a/hal/src/test/native/cpp/mockdata/DIODataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/DIODataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/DIO.h"
 #include "hal/HAL.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/DIOData.h"
+#include "hal/simulation/DIOData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/DriverStationDataTests.cpp b/hal/src/test/native/cpp/mockdata/DriverStationDataTests.cpp
index 5505c06..5cb28c4 100644
--- a/hal/src/test/native/cpp/mockdata/DriverStationDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/DriverStationDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2019 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -10,7 +10,7 @@
 #include "gtest/gtest.h"
 #include "hal/HAL.h"
 #include "hal/Solenoid.h"
-#include "mockdata/DriverStationData.h"
+#include "hal/simulation/DriverStationData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/I2CDataTests.cpp b/hal/src/test/native/cpp/mockdata/I2CDataTests.cpp
index 3a8e01c..b78564b 100644
--- a/hal/src/test/native/cpp/mockdata/I2CDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/I2CDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/HAL.h"
 #include "hal/I2C.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/I2CData.h"
+#include "hal/simulation/I2CData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/PCMDataTests.cpp b/hal/src/test/native/cpp/mockdata/PCMDataTests.cpp
index 50a8ae3..5fc19aa 100644
--- a/hal/src/test/native/cpp/mockdata/PCMDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/PCMDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/HAL.h"
 #include "hal/Solenoid.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/PCMData.h"
+#include "hal/simulation/PCMData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/PDPDataTests.cpp b/hal/src/test/native/cpp/mockdata/PDPDataTests.cpp
index a46454f..f980c7c 100644
--- a/hal/src/test/native/cpp/mockdata/PDPDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/PDPDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/HAL.h"
 #include "hal/PDP.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/PDPData.h"
+#include "hal/simulation/PDPData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/PWMDataTests.cpp b/hal/src/test/native/cpp/mockdata/PWMDataTests.cpp
index 447a510..daca364 100644
--- a/hal/src/test/native/cpp/mockdata/PWMDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/PWMDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/HAL.h"
 #include "hal/PWM.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/PWMData.h"
+#include "hal/simulation/PWMData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/RelayDataTests.cpp b/hal/src/test/native/cpp/mockdata/RelayDataTests.cpp
index 408657a..edc0fb4 100644
--- a/hal/src/test/native/cpp/mockdata/RelayDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/RelayDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/HAL.h"
 #include "hal/Relay.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/RelayData.h"
+#include "hal/simulation/RelayData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/SPIDataTests.cpp b/hal/src/test/native/cpp/mockdata/SPIDataTests.cpp
index 64c8555..423db6d 100644
--- a/hal/src/test/native/cpp/mockdata/SPIDataTests.cpp
+++ b/hal/src/test/native/cpp/mockdata/SPIDataTests.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-2020 FIRST. All Rights Reserved.                        */
 /* Open Source Software - may be modified and shared by FRC teams. The code   */
 /* must be accompanied by the FIRST BSD license file in the root directory of */
 /* the project.                                                               */
@@ -9,7 +9,7 @@
 #include "hal/HAL.h"
 #include "hal/SPI.h"
 #include "hal/handles/HandlesInternal.h"
-#include "mockdata/SPIData.h"
+#include "hal/simulation/SPIData.h"
 
 namespace hal {
 
diff --git a/hal/src/test/native/cpp/mockdata/SimDeviceDataTests.cpp b/hal/src/test/native/cpp/mockdata/SimDeviceDataTests.cpp
new file mode 100644
index 0000000..8f65f5c
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/SimDeviceDataTests.cpp
@@ -0,0 +1,25 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2020 FIRST. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project.                                                               */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/SimDevice.h"
+#include "hal/simulation/SimDeviceData.h"
+
+namespace hal {
+
+TEST(SimDeviceSimTests, TestEnabled) {
+  ASSERT_TRUE(HALSIM_IsSimDeviceEnabled("foo"));
+  HALSIM_SetSimDeviceEnabled("f", false);
+  HALSIM_SetSimDeviceEnabled("foob", true);
+  ASSERT_FALSE(HALSIM_IsSimDeviceEnabled("foo"));
+  ASSERT_TRUE(HALSIM_IsSimDeviceEnabled("foobar"));
+  ASSERT_TRUE(HALSIM_IsSimDeviceEnabled("bar"));
+
+  ASSERT_EQ(HAL_CreateSimDevice("foo"), 0);
+}
+
+}  // namespace hal
diff --git a/hal/src/test/native/cpp/sim/AccelerometerSimTest.cpp b/hal/src/test/native/cpp/sim/AccelerometerSimTest.cpp
deleted file mode 100644
index 54be6e3..0000000
--- a/hal/src/test/native/cpp/sim/AccelerometerSimTest.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#include "gtest/gtest.h"
-#include "hal/Accelerometer.h"
-#include "hal/HAL.h"
-#include "simulation/AccelerometerSim.h"
-
-using namespace frc::sim;
-
-namespace hal {
-
-TEST(AcclerometerSimTests, TestActiveCallback) {
-  HAL_Initialize(500, 0);
-
-  AccelerometerSim sim{0};
-
-  sim.ResetData();
-
-  bool wasTriggered = false;
-  bool lastValue = false;
-
-  auto cb = sim.RegisterActiveCallback(
-      [&](wpi::StringRef name, const HAL_Value* value) {
-        wasTriggered = true;
-        lastValue = value->data.v_boolean;
-      },
-      false);
-
-  EXPECT_FALSE(wasTriggered);
-
-  HAL_SetAccelerometerActive(true);
-
-  EXPECT_TRUE(wasTriggered);
-  EXPECT_TRUE(lastValue);
-}
-
-}  // namespace hal
diff --git a/hal/src/test/native/cpp/sim/SimDeviceSimTest.cpp b/hal/src/test/native/cpp/sim/SimDeviceSimTest.cpp
deleted file mode 100644
index ba0646d..0000000
--- a/hal/src/test/native/cpp/sim/SimDeviceSimTest.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#include <wpi/StringRef.h>
-
-#include "gtest/gtest.h"
-#include "hal/SimDevice.h"
-#include "simulation/SimDeviceSim.h"
-
-using namespace frc::sim;
-
-namespace hal {
-
-TEST(SimDeviceSimTests, TestBasic) {
-  SimDevice dev{"test"};
-  SimBoolean devBool = dev.CreateBoolean("bool", false, false);
-
-  SimDeviceSim sim{"test"};
-  SimBoolean simBool = sim.GetBoolean("bool");
-  EXPECT_FALSE(simBool.Get());
-  simBool.Set(true);
-  EXPECT_TRUE(devBool.Get());
-}
-
-TEST(SimDeviceSimTests, TestEnumerateDevices) {
-  SimDevice dev{"test"};
-
-  bool foundit = false;
-  SimDeviceSim::EnumerateDevices(
-      "te", [&](const char* name, HAL_SimDeviceHandle handle) {
-        if (wpi::StringRef(name) == "test") foundit = true;
-      });
-  EXPECT_TRUE(foundit);
-}
-
-}  // namespace hal
diff --git a/hal/src/test/native/cpp/sim/SimInitializationTest.cpp b/hal/src/test/native/cpp/sim/SimInitializationTest.cpp
deleted file mode 100644
index fdd34cd..0000000
--- a/hal/src/test/native/cpp/sim/SimInitializationTest.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
-#include "gtest/gtest.h"
-#include "hal/HAL.h"
-#include "simulation/AccelerometerSim.h"
-#include "simulation/AnalogGyroSim.h"
-#include "simulation/AnalogInSim.h"
-#include "simulation/AnalogOutSim.h"
-#include "simulation/AnalogTriggerSim.h"
-#include "simulation/DIOSim.h"
-#include "simulation/DigitalPWMSim.h"
-#include "simulation/DriverStationSim.h"
-#include "simulation/EncoderSim.h"
-#include "simulation/PCMSim.h"
-#include "simulation/PDPSim.h"
-#include "simulation/PWMSim.h"
-#include "simulation/RelaySim.h"
-#include "simulation/RoboRioSim.h"
-#include "simulation/SPIAccelerometerSim.h"
-
-using namespace frc::sim;
-
-namespace hal {
-
-TEST(SimInitializationTests, TestAllInitialize) {
-  HAL_Initialize(500, 0);
-  AccelerometerSim acsim{0};
-  AnalogGyroSim agsim{0};
-  AnalogInSim aisim{0};
-  AnalogOutSim aosim{0};
-  AnalogTriggerSim atsim{0};
-  DigitalPWMSim dpsim{0};
-  DIOSim diosim{0};
-  DriverStationSim dssim;
-  (void)dssim;
-  EncoderSim esim{0};
-  PCMSim pcmsim{0};
-  PDPSim pdpsim{0};
-  PWMSim pwmsim{0};
-  RelaySim rsim{0};
-  RoboRioSim rrsim{0};
-  SPIAccelerometerSim sasim{0};
-}
-}  // namespace hal
