diff --git a/wpilibc/Athena/src/SolenoidBase.cpp b/wpilibc/Athena/src/SolenoidBase.cpp
new file mode 100644
index 0000000..dfdf1eb
--- /dev/null
+++ b/wpilibc/Athena/src/SolenoidBase.cpp
@@ -0,0 +1,105 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. All Rights Reserved.
+ */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#include "SolenoidBase.h"
+
+void* SolenoidBase::m_ports[m_maxModules][m_maxPorts];
+std::unique_ptr<Resource> SolenoidBase::m_allocated;
+
+/**
+ * Constructor
+ *
+ * @param moduleNumber The CAN PCM ID.
+ */
+SolenoidBase::SolenoidBase(uint8_t moduleNumber)
+    : m_moduleNumber(moduleNumber) {
+  for (uint32_t i = 0; i < kSolenoidChannels; i++) {
+    void* port = getPortWithModule(moduleNumber, i);
+    int32_t status = 0;
+    SolenoidBase::m_ports[moduleNumber][i] =
+        initializeSolenoidPort(port, &status);
+    wpi_setErrorWithContext(status, getHALErrorMessage(status));
+    freePort(port);
+  }
+}
+
+/**
+ * Set the value of a solenoid.
+ *
+ * @param value The value you want to set on the module.
+ * @param mask The channels you want to be affected.
+ */
+void SolenoidBase::Set(uint8_t value, uint8_t mask, int module) {
+  int32_t status = 0;
+  for (int i = 0; i < m_maxPorts; i++) {
+    uint8_t local_mask = 1 << i;
+    if (mask & local_mask)
+      setSolenoid(m_ports[module][i], value & local_mask, &status);
+  }
+  wpi_setErrorWithContext(status, getHALErrorMessage(status));
+}
+
+/**
+ * Read all 8 solenoids as a single byte
+ *
+ * @return The current value of all 8 solenoids on the module.
+ */
+uint8_t SolenoidBase::GetAll(int module) const {
+  uint8_t value = 0;
+  int32_t status = 0;
+  value = getAllSolenoids(m_ports[module][0], &status);
+  wpi_setErrorWithContext(status, getHALErrorMessage(status));
+  return value;
+}
+/**
+ * Reads complete solenoid blacklist for all 8 solenoids as a single byte.
+ *
+ * 		If a solenoid is shorted, it is added to the blacklist and
+ * 		disabled until power cycle, or until faults are cleared.
+ * 		@see ClearAllPCMStickyFaults()
+ *
+ * @return The solenoid blacklist of all 8 solenoids on the module.
+ */
+uint8_t SolenoidBase::GetPCMSolenoidBlackList(int module) const {
+  int32_t status = 0;
+  return getPCMSolenoidBlackList(m_ports[module][0], &status);
+}
+/**
+ * @return true if PCM sticky fault is set : The common
+ * 			highside solenoid voltage rail is too low,
+ * 	 		most likely a solenoid channel is shorted.
+ */
+bool SolenoidBase::GetPCMSolenoidVoltageStickyFault(int module) const {
+  int32_t status = 0;
+  return getPCMSolenoidVoltageStickyFault(m_ports[module][0], &status);
+}
+/**
+ * @return true if PCM is in fault state : The common
+ * 			highside solenoid voltage rail is too low,
+ * 	 		most likely a solenoid channel is shorted.
+ */
+bool SolenoidBase::GetPCMSolenoidVoltageFault(int module) const {
+  int32_t status = 0;
+  return getPCMSolenoidVoltageFault(m_ports[module][0], &status);
+}
+/**
+ * Clear ALL sticky faults inside PCM that Compressor is wired to.
+ *
+ * If a sticky fault is set, then it will be persistently cleared.  Compressor
+ * drive
+ * 		maybe momentarily disable while flags are being cleared. Care
+ * should be
+ * 		taken to not call this too frequently, otherwise normal
+ * compressor
+ * 		functionality may be prevented.
+ *
+ * If no sticky faults are set then this call will have no effect.
+ */
+void SolenoidBase::ClearAllPCMStickyFaults(int module) {
+  int32_t status = 0;
+  return clearAllPCMStickyFaults_sol(m_ports[module][0], &status);
+}
