diff --git a/simulation/gz_msgs/build.gradle b/simulation/gz_msgs/build.gradle
index 44f9692..353f4ad 100644
--- a/simulation/gz_msgs/build.gradle
+++ b/simulation/gz_msgs/build.gradle
@@ -1,95 +1,95 @@
-plugins {
-    id 'cpp'
-    id 'java'
-    id 'com.google.protobuf' version '0.8.8'
-    id 'edu.wpi.first.NativeUtils'
-}
-
-description = "A C++ and Java library to pass FRC Simulation Messages in and out of Gazebo."
-
-/* The simulation does not run on real hardware; so we always skip Athena */
-ext.skiplinuxathena = true
-ext.skiplinuxraspbian = true
-apply from: "${rootDir}/shared/config.gradle"
-
-/* Use a sort of poor man's autoconf to find the protobuf development
-   files; on Debian, those are supplied by libprotobuf-dev.
-
-   This should get skipped on Windows.
-
-   TODO:  Add Windows support for the simulation code */
-
-def protobuf_version = ""
-try {
-    protobuf_version = "pkg-config --modversion protobuf".execute().text.trim()
-    println "Protobuf version is [${protobuf_version}]"
-} catch(Exception ex) {
-}
-
-if (!protobuf_version?.trim()) {
-    println "Protobuf is not available. (pkg-config --modversion protobuf failed)"
-    protobuf_version = "+"
-    if (project.hasProperty("makeSim")) {
-        /* Force the build even though we did not find protobuf. */
-        println "makeSim set. Forcing build - failure likely."
-    }
-    else {
-        ext.skip_gz_msgs = true
-        println "Skipping gz_msgs."
-    }
-}
-
-tasks.whenTaskAdded { task ->
-    task.onlyIf { !project.hasProperty('skip_gz_msgs') }
-}
-
-dependencies {
-      compile "com.google.protobuf:protobuf-java:${protobuf_version}"
-      compile "com.google.protobuf:protoc:${protobuf_version}"
-}
-
-/* There is a nice gradle plugin for protobuf, and the protoc tool
-   is included; using it simplifies our build process.
-   The trick is that we have to use the same version as the system
-   copy of libprotobuf-dev */
-protobuf {
-    protoc {
-        artifact = "com.google.protobuf:protoc:${protobuf_version}"
-    }
-
-    generatedFilesBaseDir = "$buildDir/generated"
-    generateProtoTasks {
-        all().each { task ->
-            task.builtins {
-                cpp {
-                    outputSubDir = 'simulation/gz_msgs'
-                }
-            }
-        }
-    }
-}
-
-model {
-    components {
-        gz_msgs(NativeLibrarySpec) {
-            sources {
-                cpp {
-                    source {
-                        srcDir "$buildDir/generated/main/simulation/gz_msgs"
-                        builtBy tasks.generateProto
-                    }
-                    exportedHeaders {
-                        srcDir "src/include"
-                        srcDir "$buildDir/generated/main"
-                    }
-                }
-            }
-            /* We must compile with -fPIC to link the static library into an so */
-            binaries {
-                all {
-                    cppCompiler.args "-fPIC"
-                }
-            }
-        }
-    }
-}
+plugins {
+    id 'cpp'
+    id 'java'
+    id 'com.google.protobuf' version '0.8.8'
+    id 'edu.wpi.first.NativeUtils'
+}
+
+description = "A C++ and Java library to pass FRC Simulation Messages in and out of Gazebo."
+
+/* The simulation does not run on real hardware; so we always skip Athena */
+ext.skiplinuxathena = true
+ext.skiplinuxraspbian = true
+apply from: "${rootDir}/shared/config.gradle"
+
+/* Use a sort of poor man's autoconf to find the protobuf development
+   files; on Debian, those are supplied by libprotobuf-dev.
+
+   This should get skipped on Windows.
+
+   TODO:  Add Windows support for the simulation code */
+
+def protobuf_version = ""
+try {
+    protobuf_version = "pkg-config --modversion protobuf".execute().text.trim()
+    println "Protobuf version is [${protobuf_version}]"
+} catch(Exception ex) {
+}
+
+if (!protobuf_version?.trim()) {
+    println "Protobuf is not available. (pkg-config --modversion protobuf failed)"
+    protobuf_version = "+"
+    if (project.hasProperty("makeSim")) {
+        /* Force the build even though we did not find protobuf. */
+        println "makeSim set. Forcing build - failure likely."
+    }
+    else {
+        ext.skip_gz_msgs = true
+        println "Skipping gz_msgs."
+    }
+}
+
+tasks.whenTaskAdded { task ->
+    task.onlyIf { !project.hasProperty('skip_gz_msgs') }
+}
+
+dependencies {
+      implementation "com.google.protobuf:protobuf-java:${protobuf_version}"
+      implementation "com.google.protobuf:protoc:${protobuf_version}"
+}
+
+/* There is a nice gradle plugin for protobuf, and the protoc tool
+   is included; using it simplifies our build process.
+   The trick is that we have to use the same version as the system
+   copy of libprotobuf-dev */
+protobuf {
+    protoc {
+        artifact = "com.google.protobuf:protoc:${protobuf_version}"
+    }
+
+    generatedFilesBaseDir = "$buildDir/generated"
+    generateProtoTasks {
+        all().each { task ->
+            task.builtins {
+                cpp {
+                    outputSubDir = 'simulation/gz_msgs'
+                }
+            }
+        }
+    }
+}
+
+model {
+    components {
+        gz_msgs(NativeLibrarySpec) {
+            sources {
+                cpp {
+                    source {
+                        srcDir "$buildDir/generated/main/simulation/gz_msgs"
+                        builtBy tasks.generateProto
+                    }
+                    exportedHeaders {
+                        srcDir "src/include"
+                        srcDir "$buildDir/generated/main"
+                    }
+                }
+            }
+            /* We must compile with -fPIC to link the static library into an so */
+            binaries {
+                all {
+                    cppCompiler.args "-fPIC"
+                }
+            }
+        }
+    }
+}
diff --git a/simulation/halsim_ds_socket/build.gradle b/simulation/halsim_ds_socket/build.gradle
index 46e48f4..440e5d9 100644
--- a/simulation/halsim_ds_socket/build.gradle
+++ b/simulation/halsim_ds_socket/build.gradle
@@ -48,6 +48,9 @@
             project(':hal').addHalDependency(it, 'shared')
             lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
             lib library: pluginName, linkage: 'shared'
+            if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
+                nativeUtils.useRequiredLibrary(it, 'netcomm_shared', 'chipobject_shared', 'visa_shared', 'ni_runtime_shared')
+            }
         }
     }
 }
diff --git a/simulation/halsim_ds_socket/src/dev/native/cpp/main.cpp b/simulation/halsim_ds_socket/src/dev/native/cpp/main.cpp
index aba88fb..2c1e83a 100644
--- a/simulation/halsim_ds_socket/src/dev/native/cpp/main.cpp
+++ b/simulation/halsim_ds_socket/src/dev/native/cpp/main.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* 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.                                                               */
@@ -7,7 +7,8 @@
 
 #include <thread>
 
-#include <hal/HAL.h>
+#include <hal/DriverStation.h>
+#include <hal/HALBase.h>
 #include <wpi/Format.h>
 #include <wpi/raw_ostream.h>
 
diff --git a/simulation/halsim_ds_socket/src/test/native/cpp/main.cpp b/simulation/halsim_ds_socket/src/test/native/cpp/main.cpp
index fd8f022..c6b6c58 100644
--- a/simulation/halsim_ds_socket/src/test/native/cpp/main.cpp
+++ b/simulation/halsim_ds_socket/src/test/native/cpp/main.cpp
@@ -5,7 +5,7 @@
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include <hal/HAL.h>
+#include <hal/HALBase.h>
 
 #include "gtest/gtest.h"
 
diff --git a/simulation/halsim_gui/build.gradle b/simulation/halsim_gui/build.gradle
index 5ac68ea..5df5302 100644
--- a/simulation/halsim_gui/build.gradle
+++ b/simulation/halsim_gui/build.gradle
@@ -1,40 +1,40 @@
-if (!project.hasProperty('onlylinuxathena') && !project.hasProperty('onlylinuxraspbian') && !project.hasProperty('onlylinuxaarch64bionic')) {
-
-    description = "A plugin that creates a simulation gui"
-
-    ext {
-        includeWpiutil = true
-        pluginName = 'halsim_gui'
-    }
-
-    apply plugin: 'google-test-test-suite'
-
-
-    ext {
-        staticGtestConfigs = [:]
-    }
-
-    staticGtestConfigs["${pluginName}Test"] = []
-    apply from: "${rootDir}/shared/googletest.gradle"
-
-    apply from: "${rootDir}/shared/plugins/setupBuild.gradle"
-
-    model {
-        binaries {
-            all {
-                nativeUtils.useRequiredLibrary(it, 'imgui_static')
-                if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio || it.targetPlatform.name == nativeUtils.wpi.platforms.raspbian || it.targetPlatform.name == nativeUtils.wpi.platforms.aarch64bionic) {
-                    it.buildable = false
-                    return
-                }
-                if (it.targetPlatform.operatingSystem.isWindows()) {
-                    it.linker.args << 'Gdi32.lib' << 'Shell32.lib'
-                } else if (it.targetPlatform.operatingSystem.isMacOsX()) {
-                    it.linker.args << '-framework' << 'Cocoa' << '-framework' << 'IOKit' << '-framework' << 'CoreFoundation' << '-framework' << 'CoreVideo'
-                } else {
-                    it.linker.args << '-lX11' << '-lvulkan'
-                }
-            }
-        }
-    }
-}
+if (!project.hasProperty('onlylinuxathena') && !project.hasProperty('onlylinuxraspbian') && !project.hasProperty('onlylinuxaarch64bionic')) {
+
+    description = "A plugin that creates a simulation gui"
+
+    ext {
+        includeWpiutil = true
+        pluginName = 'halsim_gui'
+    }
+
+    apply plugin: 'google-test-test-suite'
+
+
+    ext {
+        staticGtestConfigs = [:]
+    }
+
+    staticGtestConfigs["${pluginName}Test"] = []
+    apply from: "${rootDir}/shared/googletest.gradle"
+
+    apply from: "${rootDir}/shared/plugins/setupBuild.gradle"
+
+    model {
+        binaries {
+            all {
+                nativeUtils.useRequiredLibrary(it, 'imgui_static')
+                if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio || it.targetPlatform.name == nativeUtils.wpi.platforms.raspbian || it.targetPlatform.name == nativeUtils.wpi.platforms.aarch64bionic) {
+                    it.buildable = false
+                    return
+                }
+                if (it.targetPlatform.operatingSystem.isWindows()) {
+                    it.linker.args << 'Gdi32.lib' << 'Shell32.lib'
+                } else if (it.targetPlatform.operatingSystem.isMacOsX()) {
+                    it.linker.args << '-framework' << 'Cocoa' << '-framework' << 'IOKit' << '-framework' << 'CoreFoundation' << '-framework' << 'CoreVideo'
+                } else {
+                    it.linker.args << '-lX11' << '-lvulkan'
+                }
+            }
+        }
+    }
+}
diff --git a/simulation/halsim_gui/src/main/native/cpp/AddressableLEDGui.cpp b/simulation/halsim_gui/src/main/native/cpp/AddressableLEDGui.cpp
new file mode 100644
index 0000000..606eac5
--- /dev/null
+++ b/simulation/halsim_gui/src/main/native/cpp/AddressableLEDGui.cpp
@@ -0,0 +1,160 @@
+/*----------------------------------------------------------------------------*/
+/* 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 "AddressableLEDGui.h"
+
+#include <cstdio>
+#include <cstring>
+#include <vector>
+
+#include <hal/Ports.h>
+#include <imgui.h>
+#include <imgui_internal.h>
+#include <mockdata/AddressableLEDData.h>
+#include <wpi/SmallVector.h>
+#include <wpi/StringRef.h>
+
+#include "ExtraGuiWidgets.h"
+#include "HALSimGui.h"
+
+using namespace halsimgui;
+
+namespace {
+struct LEDDisplaySettings {
+  int numColumns = 10;
+  LEDConfig config;
+};
+}  // namespace
+
+static std::vector<LEDDisplaySettings> displaySettings;
+
+// read/write columns setting to ini file
+static void* AddressableLEDReadOpen(ImGuiContext* ctx,
+                                    ImGuiSettingsHandler* handler,
+                                    const char* name) {
+  int num;
+  if (wpi::StringRef{name}.getAsInteger(10, num)) return nullptr;
+  if (num < 0) return nullptr;
+  if (num >= static_cast<int>(displaySettings.size()))
+    displaySettings.resize(num + 1);
+  return &displaySettings[num];
+}
+
+static void AddressableLEDReadLine(ImGuiContext* ctx,
+                                   ImGuiSettingsHandler* handler, void* entry,
+                                   const char* lineStr) {
+  auto* settings = static_cast<LEDDisplaySettings*>(entry);
+  // format: columns=#
+  wpi::StringRef line{lineStr};
+  auto [name, value] = line.split('=');
+  name = name.trim();
+  value = value.trim();
+  if (name == "columns") {
+    int num;
+    if (value.getAsInteger(10, num)) return;
+    settings->numColumns = num;
+  } else if (name == "serpentine") {
+    int num;
+    if (value.getAsInteger(10, num)) return;
+    settings->config.serpentine = num != 0;
+  } else if (name == "order") {
+    int num;
+    if (value.getAsInteger(10, num)) return;
+    settings->config.order = static_cast<LEDConfig::Order>(num);
+  } else if (name == "start") {
+    int num;
+    if (value.getAsInteger(10, num)) return;
+    settings->config.start = static_cast<LEDConfig::Start>(num);
+  }
+}
+
+static void AddressableLEDWriteAll(ImGuiContext* ctx,
+                                   ImGuiSettingsHandler* handler,
+                                   ImGuiTextBuffer* out_buf) {
+  for (size_t i = 0; i < displaySettings.size(); ++i) {
+    out_buf->appendf(
+        "[AddressableLED][%d]\ncolumns=%d\nserpentine=%d\norder=%d\n"
+        "start=%d\n\n",
+        static_cast<int>(i), displaySettings[i].numColumns,
+        displaySettings[i].config.serpentine ? 1 : 0,
+        static_cast<int>(displaySettings[i].config.order),
+        static_cast<int>(displaySettings[i].config.start));
+  }
+}
+
+static void DisplayAddressableLEDs() {
+  bool hasAny = false;
+  static const int numLED = HAL_GetNumAddressableLEDs();
+  if (numLED > static_cast<int>(displaySettings.size()))
+    displaySettings.resize(numLED);
+
+  for (int i = 0; i < numLED; ++i) {
+    if (!HALSIM_GetAddressableLEDInitialized(i)) continue;
+    hasAny = true;
+
+    if (numLED > 1) ImGui::Text("LEDs[%d]", i);
+
+    static HAL_AddressableLEDData data[HAL_kAddressableLEDMaxLength];
+    int length = HALSIM_GetAddressableLEDData(i, data);
+    bool running = HALSIM_GetAddressableLEDRunning(i);
+
+    ImGui::PushItemWidth(ImGui::GetFontSize() * 6);
+    ImGui::LabelText("Length", "%d", length);
+    ImGui::LabelText("Running", "%s", running ? "Yes" : "No");
+    ImGui::InputInt("Columns", &displaySettings[i].numColumns);
+    {
+      static const char* options[] = {"Row Major", "Column Major"};
+      int val = displaySettings[i].config.order;
+      if (ImGui::Combo("Order", &val, options, 2))
+        displaySettings[i].config.order = static_cast<LEDConfig::Order>(val);
+    }
+    {
+      static const char* options[] = {"Upper Left", "Lower Left", "Upper Right",
+                                      "Lower Right"};
+      int val = displaySettings[i].config.start;
+      if (ImGui::Combo("Start", &val, options, 4))
+        displaySettings[i].config.start = static_cast<LEDConfig::Start>(val);
+    }
+    ImGui::Checkbox("Serpentine", &displaySettings[i].config.serpentine);
+    if (displaySettings[i].numColumns < 1) displaySettings[i].numColumns = 1;
+    ImGui::PopItemWidth();
+
+    // show as LED indicators
+    static int values[HAL_kAddressableLEDMaxLength];
+    static ImU32 colors[HAL_kAddressableLEDMaxLength];
+
+    if (!running) {
+      colors[0] = IM_COL32(128, 128, 128, 255);
+      for (int j = 0; j < length; ++j) values[j] = -1;
+    } else {
+      for (int j = 0; j < length; ++j) {
+        values[j] = j + 1;
+        colors[j] = IM_COL32(data[j].r, data[j].g, data[j].b, 255);
+      }
+    }
+
+    DrawLEDs(values, length, displaySettings[i].numColumns, colors, 0, 0,
+             displaySettings[i].config);
+  }
+  if (!hasAny) ImGui::Text("No addressable LEDs");
+}
+
+void AddressableLEDGui::Initialize() {
+  // hook ini handler to save columns settings
+  ImGuiSettingsHandler iniHandler;
+  iniHandler.TypeName = "AddressableLED";
+  iniHandler.TypeHash = ImHashStr(iniHandler.TypeName);
+  iniHandler.ReadOpenFn = AddressableLEDReadOpen;
+  iniHandler.ReadLineFn = AddressableLEDReadLine;
+  iniHandler.WriteAllFn = AddressableLEDWriteAll;
+  ImGui::GetCurrentContext()->SettingsHandlers.push_back(iniHandler);
+
+  HALSimGui::AddWindow("Addressable LEDs", DisplayAddressableLEDs,
+                       ImGuiWindowFlags_AlwaysAutoResize);
+  HALSimGui::SetWindowVisibility("Addressable LEDs", HALSimGui::kHide);
+  HALSimGui::SetDefaultWindowPos("Addressable LEDs", 290, 100);
+}
diff --git a/simulation/halsim_gui/src/main/native/cpp/AddressableLEDGui.h b/simulation/halsim_gui/src/main/native/cpp/AddressableLEDGui.h
new file mode 100644
index 0000000..e376b9b
--- /dev/null
+++ b/simulation/halsim_gui/src/main/native/cpp/AddressableLEDGui.h
@@ -0,0 +1,17 @@
+/*----------------------------------------------------------------------------*/
+/* 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
+
+namespace halsimgui {
+
+class AddressableLEDGui {
+ public:
+  static void Initialize();
+};
+
+}  // namespace halsimgui
diff --git a/simulation/halsim_gui/src/main/native/cpp/DIOGui.cpp b/simulation/halsim_gui/src/main/native/cpp/DIOGui.cpp
index 93a07f9..7c9eae5 100644
--- a/simulation/halsim_gui/src/main/native/cpp/DIOGui.cpp
+++ b/simulation/halsim_gui/src/main/native/cpp/DIOGui.cpp
@@ -15,6 +15,7 @@
 #include <imgui.h>
 #include <mockdata/DIOData.h>
 #include <mockdata/DigitalPWMData.h>
+#include <mockdata/DutyCycleData.h>
 #include <mockdata/EncoderData.h>
 #include <mockdata/SimDeviceData.h>
 
@@ -33,11 +34,14 @@
   static int numDIO = HAL_GetNumDigitalChannels();
   static int numPWM = HAL_GetNumDigitalPWMOutputs();
   static int numEncoder = HAL_GetNumEncoders();
+  static int numDutyCycle = HAL_GetNumDutyCycles();
   static auto pwmMap = std::make_unique<int[]>(numDIO);
   static auto encoderMap = std::make_unique<int[]>(numDIO);
+  static auto dutyCycleMap = std::make_unique<int[]>(numDIO);
 
   std::memset(pwmMap.get(), 0, numDIO * sizeof(pwmMap[0]));
   std::memset(encoderMap.get(), 0, numDIO * sizeof(encoderMap[0]));
+  std::memset(dutyCycleMap.get(), 0, numDIO * sizeof(dutyCycleMap[0]));
 
   for (int i = 0; i < numPWM; ++i) {
     if (HALSIM_GetDigitalPWMInitialized(i)) {
@@ -56,6 +60,13 @@
     }
   }
 
+  for (int i = 0; i < numDutyCycle; ++i) {
+    if (HALSIM_GetDutyCycleInitialized(i)) {
+      int channel = HALSIM_GetDutyCycleDigitalChannel(i);
+      if (channel >= 0 && channel < numDIO) dutyCycleMap[channel] = i + 1;
+    }
+  }
+
   ImGui::PushItemWidth(ImGui::GetFontSize() * 8);
   for (int i = 0; i < numDIO; ++i) {
     if (HALSIM_GetDIOInitialized(i)) {
@@ -80,6 +91,16 @@
                            HALSIM_GetEncoderDigitalChannelB(encoderMap[i] - 1));
           ImGui::PopStyleColor();
         }
+      } else if (dutyCycleMap[i] > 0) {
+        std::snprintf(name, sizeof(name), "PWM[%d]", i);
+        if (auto simDevice =
+                HALSIM_GetDutyCycleSimDevice(dutyCycleMap[i] - 1)) {
+          LabelSimDevice(name, simDevice);
+        } else {
+          double val = HALSIM_GetDutyCycleOutput(dutyCycleMap[i] - 1);
+          if (ImGui::InputDouble(name, &val))
+            HALSIM_SetDutyCycleOutput(dutyCycleMap[i] - 1, val);
+        }
       } else if (!HALSIM_GetDIOIsInput(i)) {
         std::snprintf(name, sizeof(name), "Out[%d]", i);
         if (auto simDevice = HALSIM_GetDIOSimDevice(i)) {
diff --git a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp
index 3cca903..1e2f879 100644
--- a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp
+++ b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp
@@ -14,6 +14,7 @@
 #include <imgui.h>
 #include <imgui_internal.h>
 #include <mockdata/DriverStationData.h>
+#include <mockdata/MockHooks.h>
 #include <wpi/Format.h>
 #include <wpi/SmallString.h>
 #include <wpi/StringRef.h>
@@ -328,7 +329,7 @@
 
   // Send new data every 20 ms (may be slower depending on GUI refresh rate)
   static double lastNewDataTime = 0.0;
-  if ((curTime - lastNewDataTime) > 0.02) {
+  if ((curTime - lastNewDataTime) > 0.02 && !HALSIM_IsTimingPaused()) {
     lastNewDataTime = curTime;
     HALSIM_NotifyDriverStationNewData();
   }
@@ -367,7 +368,7 @@
                          ImGuiInputTextFlags_EnterReturnsTrue)) {
     HALSIM_SetDriverStationMatchTime(matchTime);
     startMatchTime = curTime - matchTime;
-  } else if (!HALSIM_GetDriverStationEnabled()) {
+  } else if (!HALSIM_GetDriverStationEnabled() || HALSIM_IsTimingPaused()) {
     startMatchTime = curTime - matchTime;
   } else if (matchTimeEnabled) {
     HALSIM_SetDriverStationMatchTime(curTime - startMatchTime);
diff --git a/simulation/halsim_gui/src/main/native/cpp/ExtraGuiWidgets.cpp b/simulation/halsim_gui/src/main/native/cpp/ExtraGuiWidgets.cpp
index 81a6855..3b1ba28 100644
--- a/simulation/halsim_gui/src/main/native/cpp/ExtraGuiWidgets.cpp
+++ b/simulation/halsim_gui/src/main/native/cpp/ExtraGuiWidgets.cpp
@@ -9,31 +9,88 @@
 
 namespace halsimgui {
 
-void DrawLEDs(int* values, int numValues, int cols, const ImU32* colors,
-              float size, float spacing) {
-  if (numValues == 0) return;
+void DrawLEDs(const int* values, int numValues, int cols, const ImU32* colors,
+              float size, float spacing, const LEDConfig& config) {
+  if (numValues == 0 || cols < 1) return;
   if (size == 0) size = ImGui::GetFontSize() / 2.0;
   if (spacing == 0) spacing = ImGui::GetFontSize() / 3.0;
 
+  int rows = (numValues + cols - 1) / cols;
+  float inc = size + spacing;
+
   ImDrawList* drawList = ImGui::GetWindowDrawList();
   const ImVec2 p = ImGui::GetCursorScreenPos();
-  float x = p.x + size / 2, y = p.y + size / 2;
-  int rows = 1;
-  for (int i = 0; i < numValues; ++i) {
-    if (i >= (rows * cols)) {
-      ++rows;
-      x = p.x + size / 2;
-      y += size + spacing;
-    }
-    if (values[i] > 0)
-      drawList->AddRectFilled(ImVec2(x, y), ImVec2(x + size, y + size),
-                              colors[values[i] - 1]);
-    else if (values[i] < 0)
-      drawList->AddRect(ImVec2(x, y), ImVec2(x + size, y + size),
-                        colors[-values[i] - 1], 0.0f, 0, 1.0);
-    x += size + spacing;
+
+  float ystart, yinc;
+  if (config.start & 1) {
+    // lower
+    ystart = p.y + size / 2 + inc * (rows - 1);
+    yinc = -inc;
+  } else {
+    // upper
+    ystart = p.y + size / 2;
+    yinc = inc;
   }
-  ImGui::Dummy(ImVec2((size + spacing) * cols, (size + spacing) * rows));
+
+  float xstart, xinc;
+  if (config.start & 2) {
+    // right
+    xstart = p.x + size / 2 + inc * (cols - 1);
+    xinc = -inc;
+  } else {
+    // left
+    xstart = p.x + size / 2;
+    xinc = inc;
+  }
+
+  float x = xstart, y = ystart;
+  if (config.order == LEDConfig::RowMajor) {
+    // row major
+    int row = 1;
+    for (int i = 0; i < numValues; ++i) {
+      if (i >= (row * cols)) {
+        ++row;
+        if (config.serpentine) {
+          x -= xinc;
+          xinc = -xinc;
+        } else {
+          x = xstart;
+        }
+        y += yinc;
+      }
+      if (values[i] > 0)
+        drawList->AddRectFilled(ImVec2(x, y), ImVec2(x + size, y + size),
+                                colors[values[i] - 1]);
+      else if (values[i] < 0)
+        drawList->AddRect(ImVec2(x, y), ImVec2(x + size, y + size),
+                          colors[-values[i] - 1], 0.0f, 0, 1.0);
+      x += xinc;
+    }
+  } else {
+    // column major
+    int col = 1;
+    for (int i = 0; i < numValues; ++i) {
+      if (i >= (col * rows)) {
+        ++col;
+        if (config.serpentine) {
+          y -= yinc;
+          yinc = -yinc;
+        } else {
+          y = ystart;
+        }
+        x += xinc;
+      }
+      if (values[i] > 0)
+        drawList->AddRectFilled(ImVec2(x, y), ImVec2(x + size, y + size),
+                                colors[values[i] - 1]);
+      else if (values[i] < 0)
+        drawList->AddRect(ImVec2(x, y), ImVec2(x + size, y + size),
+                          colors[-values[i] - 1], 0.0f, 0, 1.0);
+      y += yinc;
+    }
+  }
+
+  ImGui::Dummy(ImVec2(inc * cols, inc * rows));
 }
 
 }  // namespace halsimgui
diff --git a/simulation/halsim_gui/src/main/native/cpp/PDPGui.cpp b/simulation/halsim_gui/src/main/native/cpp/PDPGui.cpp
index 038046e..da29ac3 100644
--- a/simulation/halsim_gui/src/main/native/cpp/PDPGui.cpp
+++ b/simulation/halsim_gui/src/main/native/cpp/PDPGui.cpp
@@ -8,6 +8,7 @@
 #include "PDPGui.h"
 
 #include <cstdio>
+#include <memory>
 
 #include <hal/Ports.h>
 #include <imgui.h>
@@ -21,6 +22,7 @@
   bool hasAny = false;
   static int numPDP = HAL_GetNumPDPModules();
   static int numChannels = HAL_GetNumPDPChannels();
+  static auto channelCurrents = std::make_unique<double[]>(numChannels);
   ImGui::PushItemWidth(ImGui::GetFontSize() * 13);
   for (int i = 0; i < numPDP; ++i) {
     if (HALSIM_GetPDPInitialized(i)) {
@@ -42,6 +44,7 @@
           HALSIM_SetPDPVoltage(i, volts);
 
         // channel currents; show as two columns laid out like PDP
+        HALSIM_GetPDPAllCurrents(i, channelCurrents.get());
         ImGui::Text("Channel Current (A)");
         ImGui::Columns(2, "channels", false);
         for (int left = 0, right = numChannels - 1; left < right;
@@ -49,13 +52,13 @@
           double val;
 
           std::snprintf(name, sizeof(name), "[%d]", left);
-          val = HALSIM_GetPDPCurrent(i, left);
+          val = channelCurrents[left];
           if (ImGui::InputDouble(name, &val))
             HALSIM_SetPDPCurrent(i, left, val);
           ImGui::NextColumn();
 
           std::snprintf(name, sizeof(name), "[%d]", right);
-          val = HALSIM_GetPDPCurrent(i, right);
+          val = channelCurrents[right];
           if (ImGui::InputDouble(name, &val))
             HALSIM_SetPDPCurrent(i, right, val);
           ImGui::NextColumn();
diff --git a/simulation/halsim_gui/src/main/native/cpp/PWMGui.cpp b/simulation/halsim_gui/src/main/native/cpp/PWMGui.cpp
index 8303f04..430502d 100644
--- a/simulation/halsim_gui/src/main/native/cpp/PWMGui.cpp
+++ b/simulation/halsim_gui/src/main/native/cpp/PWMGui.cpp
@@ -9,9 +9,11 @@
 
 #include <cstdio>
 #include <cstring>
+#include <memory>
 
 #include <hal/Ports.h>
 #include <imgui.h>
+#include <mockdata/AddressableLEDData.h>
 #include <mockdata/PWMData.h>
 
 #include "HALSimGui.h"
@@ -20,6 +22,19 @@
 
 static void DisplayPWMs() {
   bool hasOutputs = false;
+  static const int numPWM = HAL_GetNumPWMChannels();
+  static const int numLED = HAL_GetNumAddressableLEDs();
+  static auto ledMap = std::make_unique<int[]>(numPWM);
+
+  std::memset(ledMap.get(), 0, numPWM * sizeof(ledMap[0]));
+
+  for (int i = 0; i < numLED; ++i) {
+    if (HALSIM_GetAddressableLEDInitialized(i)) {
+      int channel = HALSIM_GetAddressableLEDOutputPort(i);
+      if (channel >= 0 && channel < numPWM) ledMap[channel] = i + 1;
+    }
+  }
+
   // struct History {
   //  History() { std::memset(data, 0, 90 * sizeof(float)); }
   //  History(const History&) = delete;
@@ -30,7 +45,6 @@
   //};
   // static std::vector<std::unique_ptr<History>> history;
   bool first = true;
-  static const int numPWM = HAL_GetNumPWMChannels();
   for (int i = 0; i < numPWM; ++i) {
     if (HALSIM_GetPWMInitialized(i)) {
       hasOutputs = true;
@@ -42,8 +56,12 @@
 
       char name[32];
       std::snprintf(name, sizeof(name), "PWM[%d]", i);
-      float val = HALSimGui::AreOutputsDisabled() ? 0 : HALSIM_GetPWMSpeed(i);
-      ImGui::Value(name, val, "%0.3f");
+      if (ledMap[i] > 0) {
+        ImGui::Text("%s: LED[%d]", name, ledMap[i] - 1);
+      } else {
+        float val = HALSimGui::AreOutputsDisabled() ? 0 : HALSIM_GetPWMSpeed(i);
+        ImGui::Value(name, val, "%0.3f");
+      }
 
       // lazily build history storage
       // if (static_cast<unsigned int>(i) > history.size())
diff --git a/simulation/halsim_gui/src/main/native/cpp/TimingGui.cpp b/simulation/halsim_gui/src/main/native/cpp/TimingGui.cpp
new file mode 100644
index 0000000..9897a7a
--- /dev/null
+++ b/simulation/halsim_gui/src/main/native/cpp/TimingGui.cpp
@@ -0,0 +1,60 @@
+/*----------------------------------------------------------------------------*/
+/* 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 "TimingGui.h"
+
+#include <cstdio>
+#include <cstring>
+#include <vector>
+
+#include <hal/HALBase.h>
+#include <imgui.h>
+#include <mockdata/MockHooks.h>
+#include <mockdata/NotifierData.h>
+
+#include "HALSimGui.h"
+
+using namespace halsimgui;
+
+static void DisplayTiming() {
+  int32_t status = 0;
+  uint64_t curTime = HAL_GetFPGATime(&status);
+
+  if (ImGui::Button("Run")) HALSIM_ResumeTiming();
+  ImGui::SameLine();
+  if (ImGui::Button("Pause")) HALSIM_PauseTiming();
+  ImGui::SameLine();
+  ImGui::PushButtonRepeat(true);
+  if (ImGui::Button("Step")) {
+    HALSIM_PauseTiming();
+    uint64_t nextTimeout = HALSIM_GetNextNotifierTimeout();
+    if (nextTimeout != UINT64_MAX) HALSIM_StepTiming(nextTimeout - curTime);
+  }
+  ImGui::PopButtonRepeat();
+  ImGui::PushItemWidth(ImGui::GetFontSize() * 4);
+  ImGui::LabelText("FPGA Time", "%.3f", curTime / 1000000.0);
+  ImGui::PopItemWidth();
+
+  static std::vector<HALSIM_NotifierInfo> notifiers;
+  int32_t num = HALSIM_GetNotifierInfo(notifiers.data(), notifiers.size());
+  if (static_cast<uint32_t>(num) > notifiers.size()) {
+    notifiers.resize(num);
+    HALSIM_GetNotifierInfo(notifiers.data(), notifiers.size());
+  }
+  if (num > 0) ImGui::Separator();
+  ImGui::PushItemWidth(ImGui::GetFontSize() * 4);
+  for (int32_t i = 0; i < num; ++i)
+    ImGui::LabelText(notifiers[i].name, "%.3f",
+                     notifiers[i].timeout / 1000000.0);
+  ImGui::PopItemWidth();
+}
+
+void TimingGui::Initialize() {
+  HALSimGui::AddWindow("Timing", DisplayTiming,
+                       ImGuiWindowFlags_AlwaysAutoResize);
+  HALSimGui::SetDefaultWindowPos("Timing", 5, 150);
+}
diff --git a/simulation/halsim_gui/src/main/native/cpp/TimingGui.h b/simulation/halsim_gui/src/main/native/cpp/TimingGui.h
new file mode 100644
index 0000000..49f33cc
--- /dev/null
+++ b/simulation/halsim_gui/src/main/native/cpp/TimingGui.h
@@ -0,0 +1,17 @@
+/*----------------------------------------------------------------------------*/
+/* 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
+
+namespace halsimgui {
+
+class TimingGui {
+ public:
+  static void Initialize();
+};
+
+}  // namespace halsimgui
diff --git a/simulation/halsim_gui/src/main/native/cpp/main.cpp b/simulation/halsim_gui/src/main/native/cpp/main.cpp
index c049d1c..d5e0b16 100644
--- a/simulation/halsim_gui/src/main/native/cpp/main.cpp
+++ b/simulation/halsim_gui/src/main/native/cpp/main.cpp
@@ -9,6 +9,7 @@
 #include <wpi/raw_ostream.h>
 
 #include "AccelerometerGui.h"
+#include "AddressableLEDGui.h"
 #include "AnalogGyroGui.h"
 #include "AnalogInputGui.h"
 #include "AnalogOutGui.h"
@@ -23,6 +24,7 @@
 #include "RoboRioGui.h"
 #include "SimDeviceGui.h"
 #include "SolenoidGui.h"
+#include "TimingGui.h"
 
 using namespace halsimgui;
 
@@ -32,6 +34,7 @@
 #endif
     int HALSIM_InitExtension(void) {
   HALSimGui::Add(AccelerometerGui::Initialize);
+  HALSimGui::Add(AddressableLEDGui::Initialize);
   HALSimGui::Add(AnalogGyroGui::Initialize);
   HALSimGui::Add(AnalogInputGui::Initialize);
   HALSimGui::Add(AnalogOutGui::Initialize);
@@ -45,6 +48,7 @@
   HALSimGui::Add(RoboRioGui::Initialize);
   HALSimGui::Add(SimDeviceGui::Initialize);
   HALSimGui::Add(SolenoidGui::Initialize);
+  HALSimGui::Add(TimingGui::Initialize);
 
   wpi::outs() << "Simulator GUI Initializing.\n";
   if (!HALSimGui::Initialize()) return 0;
diff --git a/simulation/halsim_gui/src/main/native/include/ExtraGuiWidgets.h b/simulation/halsim_gui/src/main/native/include/ExtraGuiWidgets.h
index 11d83ba..7374cac 100644
--- a/simulation/halsim_gui/src/main/native/include/ExtraGuiWidgets.h
+++ b/simulation/halsim_gui/src/main/native/include/ExtraGuiWidgets.h
@@ -12,6 +12,33 @@
 namespace halsimgui {
 
 /**
+ * DrawLEDs() configuration for 2D arrays.
+ */
+struct LEDConfig {
+  /**
+   * Whether the major order is serpentined (e.g. the first row goes left to
+   * right, the second row right to left, the third row left to right, and so
+   * on).
+   */
+  bool serpentine = false;
+
+  /**
+   * The input array order (row-major or column-major).
+   */
+  enum Order { RowMajor = 0, ColumnMajor } order = RowMajor;
+
+  /**
+   * The starting location of the array (0 location).
+   */
+  enum Start {
+    UpperLeft = 0,
+    LowerLeft,
+    UpperRight,
+    LowerRight
+  } start = UpperLeft;
+};
+
+/**
  * Draw a 2D array of LEDs.
  *
  * Values are indices into colors array.  Positive values are filled (lit),
@@ -27,8 +54,10 @@
  *             if 0, defaults to 1/2 of font size
  * @param spacing spacing between each LED (both horizontal and vertical);
  *                if 0, defaults to 1/3 of font size
+ * @param config 2D array configuration
  */
-void DrawLEDs(int* values, int numValues, int cols, const ImU32* colors,
-              float size = 0.0f, float spacing = 0.0f);
+void DrawLEDs(const int* values, int numValues, int cols, const ImU32* colors,
+              float size = 0.0f, float spacing = 0.0f,
+              const LEDConfig& config = LEDConfig{});
 
 }  // namespace halsimgui
diff --git a/simulation/halsim_gui/src/test/native/cpp/main.cpp b/simulation/halsim_gui/src/test/native/cpp/main.cpp
index ba0d9b0..c6b6c58 100644
--- a/simulation/halsim_gui/src/test/native/cpp/main.cpp
+++ b/simulation/halsim_gui/src/test/native/cpp/main.cpp
@@ -1,17 +1,17 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-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 <hal/HAL.h>
-
-#include "gtest/gtest.h"
-
-int main(int argc, char** argv) {
-  HAL_Initialize(500, 0);
-  ::testing::InitGoogleTest(&argc, argv);
-  int ret = RUN_ALL_TESTS();
-  return ret;
-}
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-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 <hal/HALBase.h>
+
+#include "gtest/gtest.h"
+
+int main(int argc, char** argv) {
+  HAL_Initialize(500, 0);
+  ::testing::InitGoogleTest(&argc, argv);
+  int ret = RUN_ALL_TESTS();
+  return ret;
+}
diff --git a/simulation/halsim_print/src/dev/native/cpp/main.cpp b/simulation/halsim_print/src/dev/native/cpp/main.cpp
index d9f92e9..eb9eef1 100644
--- a/simulation/halsim_print/src/dev/native/cpp/main.cpp
+++ b/simulation/halsim_print/src/dev/native/cpp/main.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* 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.                                                               */
@@ -8,7 +8,7 @@
 #include <chrono>
 #include <thread>
 
-#include <hal/HAL.h>
+#include <hal/HALBase.h>
 
 int main() {
   HAL_Initialize(500, 0);
diff --git a/simulation/lowfi_simulation/build.gradle b/simulation/lowfi_simulation/build.gradle
index d86e4d6..e6e8143 100644
--- a/simulation/lowfi_simulation/build.gradle
+++ b/simulation/lowfi_simulation/build.gradle
@@ -30,16 +30,6 @@
 
     project(':').libraryBuild.dependsOn build
 
-    ext {
-        chipObjectComponents = ["$nativeName".toString(), "${nativeName}Dev".toString(), "${nativeName}Base".toString(),
-                                "${nativeName}Test".toString()]
-        netCommComponents = ["$nativeName".toString(), "${nativeName}Dev".toString(), "${nativeName}Base".toString(),
-                             "${nativeName}Test".toString()]
-        useNiJava = false
-    }
-
-    apply from: "${rootDir}/shared/nilibraries.gradle"
-
     nativeUtils.exportsConfigs {
         lowfi_sim {
             x86ExcludeSymbols = ['_CT??_R0?AV_System_error', '_CT??_R0?AVexception', '_CT??_R0?AVfailure',
@@ -125,6 +115,9 @@
                     project(':hal').addHalDependency(it, 'shared')
                     lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
                     lib library: nativeName, linkage: 'shared'
+                    if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
+                        nativeUtils.useRequiredLibrary(it, 'netcomm_shared', 'chipobject_shared', 'visa_shared', 'ni_runtime_shared')
+                    }
                 }
             }
         }
@@ -137,6 +130,9 @@
                 lib project: ':cameraserver', library: 'cameraserver', linkage: 'shared'
                 lib project: ':wpilibc', library: 'wpilibc', linkage: 'shared'
                 lib library: nativeName, linkage: 'shared'
+                if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
+                    nativeUtils.useRequiredLibrary(it, 'netcomm_shared', 'chipobject_shared', 'visa_shared', 'ni_runtime_shared')
+                }
             }
         }
     }
diff --git a/simulation/lowfi_simulation/publish.gradle b/simulation/lowfi_simulation/publish.gradle
index 9a3204e..1fa3aaf 100644
--- a/simulation/lowfi_simulation/publish.gradle
+++ b/simulation/lowfi_simulation/publish.gradle
@@ -7,8 +7,8 @@
 def outputsFolder = file("$project.buildDir/outputs")
 
 task cppSourcesZip(type: Zip) {
-    destinationDir = outputsFolder
-    baseName = zipBaseName
+    destinationDirectory = outputsFolder
+    archiveBaseName = zipBaseName
     classifier = "sources"
 
     from(licenseFile) {
@@ -21,8 +21,8 @@
 }
 
 task cppHeadersZip(type: Zip) {
-    destinationDir = outputsFolder
-    baseName = zipBaseName
+    destinationDirectory = outputsFolder
+    archiveBaseName = zipBaseName
     classifier = "headers"
 
     from(licenseFile) {
diff --git a/simulation/lowfi_simulation/src/dev/native/cpp/main.cpp b/simulation/lowfi_simulation/src/dev/native/cpp/main.cpp
index 4dc5f43..eb83810 100644
--- a/simulation/lowfi_simulation/src/dev/native/cpp/main.cpp
+++ b/simulation/lowfi_simulation/src/dev/native/cpp/main.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2017-2018 FIRST. All Rights Reserved.                        */
+/* 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.                                                               */
@@ -7,7 +7,7 @@
 
 #include <iostream>
 
-#include <hal/HAL.h>
+#include <hal/HALBase.h>
 
 int main() {
   std::cout << "Hello World" << std::endl;
diff --git a/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/MotorEncoderSimulatorTest.cpp b/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/MotorEncoderSimulatorTest.cpp
index 83e9ddc..9166de3 100644
--- a/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/MotorEncoderSimulatorTest.cpp
+++ b/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/MotorEncoderSimulatorTest.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* 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.                                                               */
@@ -49,7 +49,7 @@
   frc::sim::lowfi::MotorEncoderConnector connector(motorSim, encoderSim);
 
   talon.Set(0.5);
-  motorSim.Update(.02);
+  motorSim.Update(0.02);
   connector.Update();
 
   // Position
@@ -64,7 +64,7 @@
 TEST(MotorEncoderConnectorTest, TestWithDistancePerPulseFullSpeed) {
   frc::Talon talon{3};
   frc::Encoder encoder{3, 1};
-  encoder.SetDistancePerPulse(.001);
+  encoder.SetDistancePerPulse(0.001);
 
   frc::sim::lowfi::SimpleMotorModel motorModelSim(6000);
   frc::sim::lowfi::WpiMotorSim motorSim(3, motorModelSim);
@@ -88,7 +88,7 @@
 TEST(MotorEncoderConnectorTest, TestWithDistancePerPulseRealistic) {
   frc::Talon talon{3};
   frc::Encoder encoder{3, 1};
-  encoder.SetDistancePerPulse(.001);
+  encoder.SetDistancePerPulse(0.001);
 
   frc::sim::lowfi::SimpleMotorModel motorModelSim(6000);
   frc::sim::lowfi::WpiMotorSim motorSim(3, motorModelSim);
@@ -97,7 +97,7 @@
 
   talon.Set(0.5);
 
-  motorSim.Update(.02);
+  motorSim.Update(0.02);
   connector.Update();
 
   // Position
diff --git a/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/motormodel/SimpleMotorModelSimulationTest.cpp b/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/motormodel/SimpleMotorModelSimulationTest.cpp
index e60cf1e..21c5e7e 100644
--- a/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/motormodel/SimpleMotorModelSimulationTest.cpp
+++ b/simulation/lowfi_simulation/src/test/native/cpp/lowfisim/motormodel/SimpleMotorModelSimulationTest.cpp
@@ -1,5 +1,5 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2018 FIRST. All Rights Reserved.                             */
+/* 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.                                                               */
@@ -13,7 +13,7 @@
 
   // Test forward voltage
   motorModelSim.SetVoltage(6);
-  motorModelSim.Update(.5);
+  motorModelSim.Update(0.5);
 
   EXPECT_DOUBLE_EQ(50, motorModelSim.GetPosition());
   EXPECT_DOUBLE_EQ(100, motorModelSim.GetVelocity());
@@ -26,7 +26,7 @@
   // Test negative voltage
   motorModelSim.Reset();
   motorModelSim.SetVoltage(-3);
-  motorModelSim.Update(.06);
+  motorModelSim.Update(0.06);
 
   EXPECT_DOUBLE_EQ(-3, motorModelSim.GetPosition());
   EXPECT_DOUBLE_EQ(-50, motorModelSim.GetVelocity());
diff --git a/simulation/lowfi_simulation/src/test/native/cpp/main.cpp b/simulation/lowfi_simulation/src/test/native/cpp/main.cpp
index 0e00efa..c6b6c58 100644
--- a/simulation/lowfi_simulation/src/test/native/cpp/main.cpp
+++ b/simulation/lowfi_simulation/src/test/native/cpp/main.cpp
@@ -1,11 +1,11 @@
 /*----------------------------------------------------------------------------*/
-/* Copyright (c) 2015-2018 FIRST. All Rights Reserved.                        */
+/* Copyright (c) 2015-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 <hal/HAL.h>
+#include <hal/HALBase.h>
 
 #include "gtest/gtest.h"
 
